- 人工智能
- 深度学习
- 计算机视觉
- 图像处理
- 视频处理
【免费下载链接】BasicSR
Open Source Image and Video Restoration Toolbox for Super-resolution, Denoise, Deblurring, etc. Currently, it includes EDSR, RCAN, SRResNet, SRGAN, ESRGAN, EDVR, BasicVSR, SwinIR, ECBSR, etc. Also support StyleGAN2, DFDNet.
本文围绕 BasicSR 的数据准备工作展开,覆盖三大核心内容:其一,如何理解并切换硬盘、LMDB、Memcached 三种数据存储后端,以及 LMDB 的目录结构、元信息格式与制作流程;其二,如何为图像超分(DIV2K 等)与视频超分(REDS、Vimeo90K)数据集完成从下载、裁剪/重组到 LMDB 构建、dataloader 验证的完整准备链路;其三,如何用prefetch_mode预读取机制进一步缓解 IO 瓶颈。读完本篇,你可以按脚本化流程把任意标准复原数据集配置成 BasicSR 训练可直接读取的格式,并从源码层面理解每一环的实现原理。
一、数据存储格式:三种后端与统一抽象
1.1 支持的后端
BasicSR 目前支持三种数据存储形式:
- 以图像/视频帧格式直接存放在硬盘上;
- 制作成LMDB,可以加速训练时的 IO 与解码(decompression)速度;
- 若机器上安装了Memcached(常见于集群环境),也可以直接使用。
1.2 通过配置文件切换后端
三种后端的切换完全通过训练 yaml 的io_backend字段完成,无需改动任何代码。以支持 DIV2K 的 PairedImageDataset 为例:
(1)直接读取硬盘数据
type: PairedImageDataset dataroot_gt: datasets/DIV2K/DIV2K_train_HR_sub dataroot_lq: datasets/DIV2K/DIV2K_train_LR_bicubic/X4_sub io_backend: type: disk(2)使用 LMDB
使用前需要先制作 LMDB(见 1.4 节)。注意:BasicSR 在标准 LMDB 之上附加了 meta 信息,且二进制内容的编码方式与一般来源不同,因此其他来源的 LMDB 不能直接拿来使用,必须用仓库自带脚本重新制作。
type: PairedImageDataset dataroot_gt: datasets/DIV2K/DIV2K_train_HR_sub.lmdb dataroot_lq: datasets/DIV2K/DIV2K_train_LR_bicubic_X4_sub.lmdb io_backend: type: lmdb(3)使用 Memcached
机器/集群必须先支持 Memcached,并按实际部署修改配置:
type: PairedImageDataset dataroot_gt: datasets/DIV2K_train_HR_sub dataroot_lq: datasets/DIV2K_train_LR_bicubicX4_sub io_backend: type: memcached server_list_cfg: /mnt/lustre/share/memcached_client/server_list.conf client_cfg: /mnt/lustre/share/memcached_client/client.conf sys_path: /mnt/lustre/share/pymc/py3仓库中的训练配置也验证了这种切换方式。例如 train_EDSR_Mx4.yml 中,disk 与 lmdb 两套dataroot/io_backend配置以注释形式并排给出,用户按需启用其一即可:
type: PairedImageDataset dataroot_gt: datasets/DIV2K/DIV2K_train_HR_sub dataroot_lq: datasets/DIV2K/DIV2K_train_LR_bicubic/X4_sub # (for lmdb) # dataroot_gt: datasets/DIV2K/DIV2K_train_HR_sub.lmdb # dataroot_lq: datasets/DIV2K/DIV2K_train_LR_bicubic_X4_sub.lmdb filename_tmpl: '{}' io_backend: type: disk # (for lmdb) # type: lmdb1.3 实现原理:FileClient 抽象层
后端的统一抽象实现在 file_client.py。该设计借鉴自 MMCV 的 FileClient,为了兼容 BasicSR(主要是适配 LMDB)做了接口改动。从源码结构看:
FileClient内部维护一个后端注册表_backends = {'disk': HardDiskBackend, 'memcached': MemcachedBackend, 'lmdb': LmdbBackend},构造时传入的backend字符串即对应 yaml 中io_backend.type的取值;HardDiskBackend.get()直接用open(filepath, 'rb')读取字节流,同时支持get_text();LmdbBackend以只读方式打开 lmdb 环境(默认readonly=True, lock=False, readahead=False),get(filepath, client_key)把传入的文件名当作 lmdb 的 key,在只读事务中txn.get(filepath.encode('ascii'))取回字节;client_key机制允许同一个 FileClient 挂多个 lmdb 环境;MemcachedBackend依赖mc库,构造时把sys_path追加到sys.path再import mc,通过MemcachedClient的Get拉取数据。
这样一来,自定义 dataloader 时只需调用FileClient.get()即可透明地支持不同存储形式,具体调用写法可参考 PairedImageDataset 的实现。
1.4 LMDB 具体说明
为什么用 LMDB:训练时数据量巨大,LMDB 把零散的小图片集中到一个数据库文件中,显著加快 IO 与 CPU 解码;测试时数据量小,一般没有必要使用。加速效果取决于机器配置,有三个影响因素需要注意:
- 有些机器会定期清理缓存,而 LMDB 依赖页缓存机制。若数据一直缓存不进去需要排查——执行
free -h后,LMDB 占用的缓存会体现在buff/cache条目下; - 机器内存是否足够容纳整个 LMDB。若装不下,缓存需要不断换入换出,速度会受影响;
- 首次缓存 LMDB 数据集时会影响训练速度,建议训练前进入 LMDB 目录手动预热:
cat data.mdb > /dev/null。
目录结构与 meta 信息:除标准的data.mdb与lock.mdb外,BasicSR 额外写入一个meta_info.txt记录附加信息:
DIV2K_train_HR_sub.lmdb ├── data.mdb ├── lock.mdb ├── meta_info.txtmeta_info.txt采用纯文本以保证可读性,内容形如:
0001_s001.png (480,480,3) 1 0001_s002.png (480,480,3) 1 0001_s003.png (480,480,3) 1 0001_s004.png (480,480,3) 1 ...每行记录一张图像的三个字段:
- 图像名称(带后缀):
0001_s001.png; - 图像尺寸:
(480,480,3)表示 480×480×3; - 其他参数:在复原任务中通常以 PNG 存储,该值表示 OpenCV 的 PNG 压缩级别
IMWRITE_PNG_COMPRESSION,可取 [0, 9] 的整数,越大压缩越强(存储空间更小、压缩耗时更长)。
这一点在源码中得到印证:lmdb_util.py 中make_lmdb_from_imgs每写入一张图就同步写一行 meta,格式正是f'{key}.png ({h},{w},{c}) {compress_level}',且以不含后缀的图像名作为 lmdb key。
二进制内容:LMDB 中存的是cv2.imencode('.png', img, [cv2.IMWRITE_PNG_COMPRESSION, compress_level])编码后的 PNG 字节,可通过compress_level在存储空间与读取(含解码)速度之间做权衡。make_lmdb_from_imgs还提供batch(默认 5000 张提交一次事务)、multiprocessing_read(多进程读图入内存加速,要求服务器内存充足)、n_thread(默认 40)、map_size(缺省时按首张图大小估算)等参数;LmdbMaker 类则面向"边生成数据边写 LMDB"的场景,默认map_size=1024**4(1TB)。
如何制作 LMDB:仓库提供统一入口脚本 create_lmdb.py,内置 DIV2K、REDS、Vimeo90K 三个数据集的制作函数,其他数据集可仿照实现。脚本支持--dataset命令行参数:
python scripts/data_preparation/create_lmdb.py --dataset DIV2K # 或 --dataset REDS / --dataset Vimeo90K三个函数的要点(运行前务必按实际环境修改其中的路径与配置):
create_lmdb_for_div2k():依次处理DIV2K_train_HR_sub、DIV2K_train_LR_bicubic/{X2,X3,X4}_sub四个子图文件夹(需先运行extract_subimages.py),key 取去掉.png后缀的文件名;create_lmdb_for_reds():处理train_sharp与train_sharp_bicubic(需先重组 train/val,见 3.1 节),key 形如000/00000000(递归扫描子目录),并开启multiprocessing_read=True加速;create_lmdb_for_vimeo90k():基于sep_trainlist.txt生成 key,GT 模式只保留每段的第 4 帧(im4.png),LQ 模式保留 7 帧,同样使用多进程读图。
1.5 数据预读取(Data Pre-fetcher)
除了 LMDB,还可以用预读取机制进一步加速 IO,实现在 prefetch_dataloader.py,通过配置文件的prefetch_mode指定。目前提供三种模式:
(1)None(默认):不使用预读取。若已用 LMDB 或 IO 本身不成问题,可保持默认。
prefetch_mode: ~(2)prefetch_mode: cuda:使用 CUDA prefetcher(原理参见 NVIDIA/apex 的相关实践),会把数据提前搬到 GPU,会额外占用显存,且此模式下必须同时设置pin_memory: true。
prefetch_mode: cuda pin_memory: true(3)prefetch_mode: cpu:使用 CPU prefetcher,队列长度由num_prefetch_queue控制(默认 1)。注意原文档提示:实测该模式加速效果不明显。
prefetch_mode: cpu num_prefetch_queue: 1 # 1 by defaulttrain_EDSR_Mx4.yml 中的默认配置即prefetch_mode: ~配合num_worker_per_gpu: 6,可结合磁盘后端直接使用。
二、图像超分数据集
2.0 目录约定
推荐用软链接把数据集根目录挂到datasets下:ln -s xxx yyy。若你的目录结构不同,需要相应修改配置文件中的路径。
2.1 DIV2K
DIV2K 是图像超分中最广泛使用的数据集。需要说明的是:许多研究工作假设 MATLAB 双三次下采样核,但该核并不是真实场景隐含退化核的良好近似,针对这一差距的课题即"盲复原(blind restoration)"。
准备步骤
下载数据:从 DIV2K 官网下载训练/验证集(800 张训练 + 100 张验证)。
裁剪子图(Crop to sub-images):DIV2K 是 2K 分辨率(例如 2048×1080),而训练 patch 通常较小(常见 128×128 或 192×192)。若每次读取整图却只用一小部分会浪费 IO,因此先把 2K 图裁剪成带重叠的 480×480 子图(子图尺寸与配置文件中的训练 patch 尺寸
gt_size是两回事:480×480 子图存盘后,训练时由 dataloader 再随机裁剪出gt_size × gt_size的 patch)。运行脚本 extract_subimages.py:python scripts/data_preparation/extract_subimages.py使用前需修改脚本内的路径与配置。从源码看,脚本对四个文件夹(HR、X2、X3、X4)分别设置裁剪参数,
n_thread=20多进程并行、compression_level=3控制 PNG 压缩级别,各尺度的crop_size/step保持与 HR 相同的重叠比例:文件夹 crop_size step DIV2K_train_HR 480 240 DIV2K_train_LR_bicubic/X2 240 120 DIV2K_train_LR_bicubic/X3 160 80 DIV2K_train_LR_bicubic/X4 120 60 子图命名规则为
{原名}_s{序号:03d}.png(脚本会先去掉文件名中的 x2/x3/x4/x8 标记),这正好对应 1.4 节 meta 信息示例中的0001_s001.png。(可选)制作 LMDB:
python scripts/data_preparation/create_lmdb.py --dataset DIV2K,使用其中的create_lmdb_for_div2k函数,并按需修改路径与配置。测试 dataloader:运行仓库自带的数据集测试脚本验证读写正常(注意先按本机路径修改脚本内配置):test_paired_image_dataset.py、test_paired_image_dataset.py。
(可选)生成 meta_info_file:若下游需要使用
meta_info_file,运行python scripts/data_preparation/generate_meta_info.py生成。
2.2 常见图像超分数据集一览
仓库文档整理了常用图像超分数据集清单,按用途分为经典训练集、经典测试集、2K 分辨率训练集与户外场景/复原基准:
| 类别 | 数据集 | 说明 |
|---|---|---|
| 经典 SR 训练 | T91 | 91 张训练图 |
| 经典 SR 训练 | BSDS200 | BSD500 的训练子集 |
| 经典 SR 训练 | General100 | 100 张训练图 |
| 经典 SR 测试 | Set5 | Set5 测试集 |
| 经典 SR 测试 | Set14 | Set14 测试集 |
| 经典 SR 测试 | BSDS100 | BSD500 的测试子集 |
| 经典 SR 测试 | urban100 | 100 张建筑图(规则结构) |
| 经典 SR 测试 | manga109 | 109 张日本漫画图 |
| 经典 SR 测试 | historical | 10 张无 GT 的灰色低分辨率图 |
| 2K 分辨率 | DIV2K | NTIRE17 提出(800 训练 + 100 验证) |
| 2K 分辨率 | Flickr2K | 2650 张 2K 训练图 |
| 2K 分辨率 | DF2K | DIV2K 与 Flickr2K 合并的训练集 |
| OST(户外场景) | OST Training | 7 个类别的丰富纹理图像 |
| OST(户外场景) | OST300 | 300 张户外场景测试图 |
| 复原基准 | PIRM | PIRM 的 self-val / val / test 数据集 |
这些数据集可从各数据集官网或项目提供的网盘(Google Drive / 百度网盘)获取,下载后按 2.0 节的datasets目录约定组织即可。
三、视频超分数据集
3.1 REDS
REDS 的官方划分将 train/val 分开存放,而 BasicSR 的做法是将训练与验证数据合并到同一文件夹:原始训练集含 240 个 clip(编号 000–239),脚本把验证 clip 重命名为 240–269。
验证集划分:官方验证划分与 EDVR 比赛用划分不同:
| 名称 | clips | 总数 |
|---|---|---|
| REDSOfficial | [240, 269] | 30 clips |
| REDS4 | 原训练集中的 000、011、015、020 四个 clip | 4 clips |
其余 clip 全部用于训练。注意:不需要显式分离训练/验证集,dataloader 会自动完成这件事。仓库内的元信息文件也印证了两种划分方式并存:meta_info_REDS_GT.txt、meta_info_REDS4_test_GT.txt 与 meta_info_REDSofficial4_test_GT.txt 分别对应完整集合与两种测试划分。
准备步骤
- 从 REDS 官网下载数据(train_sharp、val_sharp、train_sharp_bicubic/X4、val_sharp_bicubic/X4);
- 合并 train/val 数据:
python scripts/data_preparation/regroup_reds_dataset.py。从 regroup_reds_dataset.py 源码看,它对train_sharp←val_sharp与train_sharp_bicubic/X4←val_sharp_bicubic/X4分别执行:把 val 目录下每个 clip 文件夹的编号加 240 后复制到 train 目录(cp -r,原 val 目录保留); - (可选)制作 LMDB:
python scripts/data_preparation/create_lmdb.py --dataset REDS(对应create_lmdb_for_reds),记得修改路径与配置; - 测试 dataloader:运行 test_reds_dataset.py,按实际路径修改其中的配置。
3.2 Vimeo90K
准备步骤
- 下载数据:下载官网提供的 "The original training + test set (82GB)"(vimeo_septuplet.zip),即 Ground-Truth 数据;压缩包内有
sep_trainlist.txt用于区分训练样本; - 生成低分辨率图像:Vimeo90K 测试集的低分辨率图使用 MATLAB 双三次下采样核生成。运行 generate_LR_Vimeo90K.m(在 MATLAB 中执行)生成 LR 帧(文档中标注此处仍有 TODO,可结合仓库提供的测试配置核对生成结果);
- (可选)制作 LMDB:
python scripts/data_preparation/create_lmdb.py --dataset Vimeo90K(对应create_lmdb_for_vimeo90k,GT 只入库每段第 4 帧),按实际修改路径与配置; - 测试 dataloader:运行 test_vimeo90k_dataset.py,按实际路径修改配置。
四、StyleGAN2 训练数据集:FFHQ
BasicSR 支持 StyleGAN2 人脸生成训练,训练数据采用 FFHQ 数据集,推荐直接下载其 tfrecords 版本(读取 tfrecords 需安装 TensorFlow)。
准备步骤
下载 FFHQ 的 tfrecords 文件;
将 tfrecords 解包为图像文件夹或LMDB,脚本对每个分辨率单独建文件夹/LMDB:
python scripts/data_preparation/extract_images_from_tfrecords.py相关配置可参考 train_StyleGAN2_256_Cmul2_FFHQ.yml 中的 dataroot 组织方式,数据集读写可用 test_ffhq_dataset.py 验证。
五、小结:数据准备的完整检查清单
| 环节 | 命令/配置 | 关键源码/脚本 |
|---|---|---|
| 切换存储后端 | yamlio_backend.type: disk / lmdb / memcached | file_client.py |
| 裁剪 DIV2K 子图 | python scripts/data_preparation/extract_subimages.py | extract_subimages.py |
| 合并 REDS train/val | python scripts/data_preparation/regroup_reds_dataset.py | regroup_reds_dataset.py |
| 生成 Vimeo90K LR | MATLAB 运行 generate_LR_Vimeo90K.m | — |
| 制作 LMDB | python scripts/data_preparation/create_lmdb.py --dataset {DIV2K,REDS,Vimeo90K} | create_lmdb.py、lmdb_util.py |
| 生成 meta_info | python scripts/data_preparation/generate_meta_info.py | generate_meta_info.py |
| 预读取加速 | yamlprefetch_mode: ~ / cuda / cpu | prefetch_dataloader.py |
| 验证 dataloader | 运行 tests 目录下的对应测试脚本 | test_paired_image_dataset.py、test_reds_dataset.py、test_vimeo90k_dataset.py |
掌握以上内容后,即可把硬盘数据、LMDB 或集群 Memcached 三种形态的数据接入 BasicSR 的训练流程:先用仓库脚本完成"下载 → 裁剪/重组 → (可选)LMDB → 测试脚本验证"的流水线,再在 yaml 中通过io_backend与prefetch_mode两个旋钮调优数据吞吐。
- 人工智能
- 深度学习
- 计算机视觉
- 图像处理
- 视频处理
【免费下载链接】BasicSR
Open Source Image and Video Restoration Toolbox for Super-resolution, Denoise, Deblurring, etc. Currently, it includes EDSR, RCAN, SRResNet, SRGAN, ESRGAN, EDVR, BasicVSR, SwinIR, ECBSR, etc. Also support StyleGAN2, DFDNet.
相关推荐
BasicSR项目数据集准备全指南
BasicSR项目数据集准备全指南 前言 在计算机视觉领域,高质量的数据集是模型训练的基础。BasicSR作为一个功能强大的图像和视频超分辨率框架,对数据集的准
人工智能深度学习计算机视觉图像处理视频处理BasicSR项目数据集准备全指南
BasicSR项目数据集准备全指南 前言 在图像和视频超分辨率研究领域,高质量的数据集准备是模型训练的关键第一步。BasicSR作为一个功能强大的图像视频复原工
人工智能深度学习计算机视觉图像处理视频处理Fashion-MNIST 服装图像基准数据集实战指南:数据加载、自动基准测试与可视化
Fashion MNIST 服装图像基准数据集实战指南:数据加载、自动基准测试与可视化 本文以 Zalando 出品的 Fashion MNIST 数据集为讲解
数据集机器学习深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考