news 2026/9/25 3:23:10

BasicSR 数据准备实战指南:数据存储格式、LMDB 加速与图像/视频数据集构建

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BasicSR 数据准备实战指南:数据存储格式、LMDB 加速与图像/视频数据集构建
  • 人工智能
  • 深度学习
  • 计算机视觉
  • 图像处理
  • 视频处理

【免费下载链接】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.

项目地址:https://gitcode.com/gh_mirrors/ba/BasicSR
点击查看免费下载

本文围绕 BasicSR 的数据准备工作展开,覆盖三大核心内容:其一,如何理解并切换硬盘、LMDB、Memcached 三种数据存储后端,以及 LMDB 的目录结构、元信息格式与制作流程;其二,如何为图像超分(DIV2K 等)与视频超分(REDS、Vimeo90K)数据集完成从下载、裁剪/重组到 LMDB 构建、dataloader 验证的完整准备链路;其三,如何用prefetch_mode预读取机制进一步缓解 IO 瓶颈。读完本篇,你可以按脚本化流程把任意标准复原数据集配置成 BasicSR 训练可直接读取的格式,并从源码层面理解每一环的实现原理。

一、数据存储格式:三种后端与统一抽象

1.1 支持的后端

BasicSR 目前支持三种数据存储形式:

  1. 以图像/视频帧格式直接存放在硬盘上;
  2. 制作成LMDB,可以加速训练时的 IO 与解码(decompression)速度;
  3. 若机器上安装了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: lmdb

1.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 解码;测试时数据量小,一般没有必要使用。加速效果取决于机器配置,有三个影响因素需要注意:

  1. 有些机器会定期清理缓存,而 LMDB 依赖页缓存机制。若数据一直缓存不进去需要排查——执行free -h后,LMDB 占用的缓存会体现在buff/cache条目下;
  2. 机器内存是否足够容纳整个 LMDB。若装不下,缓存需要不断换入换出,速度会受影响;
  3. 首次缓存 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.txt

meta_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 default

train_EDSR_Mx4.yml 中的默认配置即prefetch_mode: ~配合num_worker_per_gpu: 6,可结合磁盘后端直接使用。

二、图像超分数据集

2.0 目录约定

推荐用软链接把数据集根目录挂到datasets下:ln -s xxx yyy。若你的目录结构不同,需要相应修改配置文件中的路径。

2.1 DIV2K

DIV2K 是图像超分中最广泛使用的数据集。需要说明的是:许多研究工作假设 MATLAB 双三次下采样核,但该核并不是真实场景隐含退化核的良好近似,针对这一差距的课题即"盲复原(blind restoration)"。

准备步骤

  1. 下载数据:从 DIV2K 官网下载训练/验证集(800 张训练 + 100 张验证)。

  2. 裁剪子图(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_sizestep
    DIV2K_train_HR480240
    DIV2K_train_LR_bicubic/X2240120
    DIV2K_train_LR_bicubic/X316080
    DIV2K_train_LR_bicubic/X412060

    子图命名规则为{原名}_s{序号:03d}.png(脚本会先去掉文件名中的 x2/x3/x4/x8 标记),这正好对应 1.4 节 meta 信息示例中的0001_s001.png。

  3. (可选)制作 LMDB:python scripts/data_preparation/create_lmdb.py --dataset DIV2K,使用其中的create_lmdb_for_div2k函数,并按需修改路径与配置。

  4. 测试 dataloader:运行仓库自带的数据集测试脚本验证读写正常(注意先按本机路径修改脚本内配置):test_paired_image_dataset.py、test_paired_image_dataset.py。

  5. (可选)生成 meta_info_file:若下游需要使用meta_info_file,运行python scripts/data_preparation/generate_meta_info.py生成。

2.2 常见图像超分数据集一览

仓库文档整理了常用图像超分数据集清单,按用途分为经典训练集、经典测试集、2K 分辨率训练集与户外场景/复原基准:

类别数据集说明
经典 SR 训练T9191 张训练图
经典 SR 训练BSDS200BSD500 的训练子集
经典 SR 训练General100100 张训练图
经典 SR 测试Set5Set5 测试集
经典 SR 测试Set14Set14 测试集
经典 SR 测试BSDS100BSD500 的测试子集
经典 SR 测试urban100100 张建筑图(规则结构)
经典 SR 测试manga109109 张日本漫画图
经典 SR 测试historical10 张无 GT 的灰色低分辨率图
2K 分辨率DIV2KNTIRE17 提出(800 训练 + 100 验证)
2K 分辨率Flickr2K2650 张 2K 训练图
2K 分辨率DF2KDIV2K 与 Flickr2K 合并的训练集
OST(户外场景)OST Training7 个类别的丰富纹理图像
OST(户外场景)OST300300 张户外场景测试图
复原基准PIRMPIRM 的 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 四个 clip4 clips

其余 clip 全部用于训练。注意:不需要显式分离训练/验证集,dataloader 会自动完成这件事。仓库内的元信息文件也印证了两种划分方式并存:meta_info_REDS_GT.txt、meta_info_REDS4_test_GT.txt 与 meta_info_REDSofficial4_test_GT.txt 分别对应完整集合与两种测试划分。

准备步骤

  1. 从 REDS 官网下载数据(train_sharp、val_sharp、train_sharp_bicubic/X4、val_sharp_bicubic/X4);
  2. 合并 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 目录保留);
  3. (可选)制作 LMDB:python scripts/data_preparation/create_lmdb.py --dataset REDS(对应create_lmdb_for_reds),记得修改路径与配置;
  4. 测试 dataloader:运行 test_reds_dataset.py,按实际路径修改其中的配置。

3.2 Vimeo90K

准备步骤

  1. 下载数据:下载官网提供的 "The original training + test set (82GB)"(vimeo_septuplet.zip),即 Ground-Truth 数据;压缩包内有sep_trainlist.txt用于区分训练样本;
  2. 生成低分辨率图像:Vimeo90K 测试集的低分辨率图使用 MATLAB 双三次下采样核生成。运行 generate_LR_Vimeo90K.m(在 MATLAB 中执行)生成 LR 帧(文档中标注此处仍有 TODO,可结合仓库提供的测试配置核对生成结果);
  3. (可选)制作 LMDB:python scripts/data_preparation/create_lmdb.py --dataset Vimeo90K(对应create_lmdb_for_vimeo90k,GT 只入库每段第 4 帧),按实际修改路径与配置;
  4. 测试 dataloader:运行 test_vimeo90k_dataset.py,按实际路径修改配置。

四、StyleGAN2 训练数据集:FFHQ

BasicSR 支持 StyleGAN2 人脸生成训练,训练数据采用 FFHQ 数据集,推荐直接下载其 tfrecords 版本(读取 tfrecords 需安装 TensorFlow)。

准备步骤

  1. 下载 FFHQ 的 tfrecords 文件;

  2. 将 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 / memcachedfile_client.py
裁剪 DIV2K 子图python scripts/data_preparation/extract_subimages.pyextract_subimages.py
合并 REDS train/valpython scripts/data_preparation/regroup_reds_dataset.pyregroup_reds_dataset.py
生成 Vimeo90K LRMATLAB 运行 generate_LR_Vimeo90K.m—
制作 LMDBpython scripts/data_preparation/create_lmdb.py --dataset {DIV2K,REDS,Vimeo90K}create_lmdb.py、lmdb_util.py
生成 meta_infopython scripts/data_preparation/generate_meta_info.pygenerate_meta_info.py
预读取加速yamlprefetch_mode: ~ / cuda / cpuprefetch_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.

项目地址:https://gitcode.com/gh_mirrors/ba/BasicSR
点击查看免费下载

相关推荐

上一篇:Textual 样式指南:使用 `scrollbar-corner-color` 定制横向与纵向滚动条交汇处的角落颜色
下一篇:Prometheus Operator监控医疗系统:设备状态与患者指标

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 3:20:14

基于微信小程序的四六级词汇系统:SSM全栈开发与艾宾浩斯复习实战

简介:这份资源是面向英语四六级备考学习者与小程序开发初学者的毕业设计文档,围绕基于微信小程序的四六级词汇系统展开,解决考生随时随地背词、管理学习数据的需求。压缩包内共1个docx文件,约3.79MB,内容涵盖摘要、绪论…

作者头像 李华
网站建设 2026/9/25 3:19:17

源师兄开源硬件全解析:原理图、PCB与引脚图资料一站式汇总

源师兄开源硬件全解析:原理图、PCB与引脚图资料一站式汇总 【免费下载链接】源师兄L0_开源大师兄 基于海思3861芯片平台的源师兄开源项目硬件资料,包括硬件原理图和PCB layout文档。 项目地址: https://gitcode.com/yuanshixiong/ysx-v0 源师兄&a…

作者头像 李华