资讯动态

NAFNet 在 SIDD 数据集上的图像去噪复现指南:数据准备、分布式训练与评测全流程

发布时间:2026/10/14 16:16:37 来源:尧图企业网站定制
人工智能计算机视觉图像处理深度学习【免费下载链接】NAFNetThe state-of-the-art image restoration model without nonlinear activation functions.项目地址https://gitcode.com/gh_mirrors/na/NAFNet点击查看免费下载本篇技术指南基于 NAFNet 开源仓库的 docs/SIDD.md 文档系统讲解在 SIDDSmartphone Image Denoising Dataset上完整复现 NAFNet 去噪结果的三个环节训练数据的裁剪与 LMDB 打包、四个模型配置NAFNet/Baseline × width32/width64的分布式训练、以及预训练模型的下载与评测。读者读完后可以掌握整套从原始图像到 PSNR/SSIM 评测结果的可复现流程并理解 NAFNet 无激活函数架构SimpleGate Simplified Channel Attention与配置文件之间的对应关系。一、数据准备从原始 SIDD 图像到 LMDB 训练集SIDD 是智能手机拍摄的含噪图像数据集本仓库以噪声图像LQ— 干净图像GT配对的形式组织训练数据并使用 LMDB 格式加速 IO。1.1 下载训练集并放置到指定目录按原文档要求下载 SIDD 训练集原文档提供 google drive 与百度网盘两个渠道具体链接见 docs/SIDD.md 原文并将其解压放置到仓库根目录下./datasets/SIDD/Data目录下应包含带_NOISY与_GT后缀的成对图像仓库通过文件名关键词区分噪声图与干净图。1.2 运行裁剪脚本生成 512×512 训练块并打包 LMDB数据放好后在仓库根目录执行python scripts/data_preparation/sidd.py该脚本scripts/data_preparation/sidd.py内部依次完成两件事滑动窗口裁剪将原始图像裁剪为 512×512 的训练块生成 LMDB调用create_lmdb_for_SIDD()将裁剪结果打包。脚本内的关键配置参数如下参数取值作用input_folder./datasets/SIDD/Data原始 SIDD 训练集目录save_folder./datasets/SIDD/train/input_crops与./datasets/SIDD/train/gt_crops裁剪后的噪声块与干净块保存目录crop_size512裁剪块边长step384滑动窗口步长相邻块有 128 像素重叠thresh_size0边缘残差阈值控制是否补裁最后一块keywords_NOISY/_GT分别扫描噪声图和干净图n_thread20多进程裁剪线程数compression_level3PNG 压缩级别写入cv2.IMWRITE_PNG_COMPRESSION裁剪逻辑上脚本在高度方向生成h_space arange(0, h - crop_size 1, step)宽度方向同理若边缘剩余尺寸大于thresh_size此处为 0会补裁最后一块以保证全图覆盖。裁剪出的块按{img_name}_s{index:03d}.png命名index从 1 递增文件名中的_NOISY/_GT关键词会被移除从而保证噪声块与干净块一一对应。裁剪完成后create_lmdb_for_SIDD()定义于 basicsr/utils/create_lmdb.py把两个目录分别打包./datasets/SIDD/train/input_crops - ./datasets/SIDD/train/input_crops.lmdb ./datasets/SIDD/train/gt_crops - ./datasets/SIDD/train/gt_crops.lmdbLMDB 打包由 basicsr/utils/lmdb_util.py 中的make_lmdb_from_imgs()完成每个 lmdb 目录内包含标准data.mdb、lock.mdb以及一份meta_info.txt每行记录图片名 (高,宽,通道数) 压缩级别如000_s001.png (512,512,3) 1。LMDB 的 key 为不带扩展名的图片名训练时PairedImageDataset会按 key 同时读取 LQ 与 GT 两张图。1.3 下载验证集直接提供 LMDB 格式验证集无需自行裁剪原文档直接提供 LMDB 格式的评测数据同样为 google drive / 百度网盘渠道链接见 docs/SIDD.md 原文。将其解压到./datasets/SIDD/val/最终目录结构应形如./datasets/SIDD/val/input_crops.lmdb ./datasets/SIDD/val/gt_crops.lmdb说明仓库还注释了一段从ValidationNoisyBlocksSrgb.mat/ValidationGtBlocksSrgb.mat生成验证块并转 LMDB 的参考代码见 basicsr/utils/create_lmdb.py如果无法下载现成验证 LMDB可参考该逻辑自行生成但仓库默认评测路径以官方提供的 LMDB 为准。1.4 运行环境依赖仓库的 requirements.txt 列出了运行所需依赖与 SIDD 流程直接相关的核心包包括lmdbLMDB 数据库读写opencv-python图像读取、裁剪与 PNG 编码numpy、scipy、scikit-image数值计算与指标计算pyyaml解析options/下的 YAML 配置文件tqdm进度条显示tb-nightlyTensorBoard 日志配置中use_tb_logger: true。二、模型训练四个配置的分布式训练2.1 训练命令原文档给出四组训练命令均通过 PyTorch 分布式启动器以 8 卡并行训练NAFNet-SIDD-width32python -m torch.distributed.launch --nproc_per_node8 --master_port4321 basicsr/train.py -opt options/train/SIDD/NAFNet-width32.yml --launcher pytorchNAFNet-SIDD-width64python -m torch.distributed.launch --nproc_per_node8 --master_port4321 basicsr/train.py -opt options/train/SIDD/NAFNet-width64.yml --launcher pytorchBaseline-SIDD-width32python -m torch.distributed.launch --nproc_per_node8 --master_port4321 basicsr/train.py -opt options/train/SIDD/Baseline-width32.yml --launcher pytorchBaseline-SIDD-width64python -m torch.distributed.launch --nproc_per_node8 --master_port4321 basicsr/train.py -opt options/train/SIDD/Baseline-width64.yml --launcher pytorch默认按 8 卡分布式训练如果卡数不足将--nproc_per_node改为实际 GPU 数量即可同时建议同步调整num_gpu等配置。--master_port用于指定分布式通信端口避免多任务冲突时修改。入口脚本 basicsr/train.py 会解析-opt指向的 YAML并根据--launchernone/pytorch/slurm决定是否启用分布式pytorch模式下还需配合--local_rank由torch.distributed.launch自动注入。2.2 训练配置文件逐项解读以 options/train/SIDD/NAFNet-width32.yml 为例逐段解读关键配置name: NAFNet-SIDD-width32 # 实验名决定 experiments 下的输出目录 model_type: ImageRestorationModel scale: 1 # 去噪为 1:1 任务无分辨率变化 num_gpu: 8 manual_seed: 10 # 随机种子保证可复现数据集配置训练集与验证集均使用PairedImageDataset通过io_backend.type: lmdb指定从 LMDB 读取datasets: train: name: SIDD type: PairedImageDataset dataroot_gt: ./datasets/SIDD/train/gt_crops.lmdb dataroot_lq: ./datasets/SIDD/train/input_crops.lmdb filename_tmpl: {} io_backend: type: lmdb gt_size: 256 # 训练时随机裁剪的块大小 use_flip: false # SIDD 训练不使用翻转/旋转增强 use_rot: false use_shuffle: true num_worker_per_gpu: 4 # width64 配置中为 8 batch_size_per_gpu: 4 # width64 配置中为 8 dataset_enlarge_ratio: 1 prefetch_mode: ~ val: name: SIDD_val type: PairedImageDataset dataroot_gt: ./datasets/SIDD/val/gt_crops.lmdb dataroot_lq: ./datasets/SIDD/val/input_crops.lmdb io_backend: type: lmdb数据读取链路basicsr/data/paired_image_dataset.pylmdb模式下通过paired_paths_from_lmdb从 LMDB 的meta_info.txt解析出全部 LQ/GT 路径对运行时由FileClient见 basicsr/utils/file_client.py按 key 读取字节流再经imfrombytes解码为[0,1]范围的 float32 图像。训练阶段还会执行paired_random_crop随机裁剪到gt_size此处为 256。网络结构network_g定义了生成网络width32 与 width64 的唯一差异是widthnetwork_g: type: NAFNet width: 32 # width64 配置中为 64 enc_blk_nums: [2, 2, 4, 8] # 编码器四阶段 NAFBlock 数量 middle_blk_num: 12 # 中间瓶颈层 NAFBlock 数量 dec_blk_nums: [2, 2, 2, 2] # 解码器四阶段 NAFBlock 数量而 Baseline 配置options/train/SIDD/Baseline-width32.yml则额外指定了dw_expand: 1与ffn_expand: 2两个结构超参数网络类型为Baseline。优化器与学习率调度train: optim_g: type: AdamW lr: !!float 1e-3 weight_decay: 0. betas: [0.9, 0.9] scheduler: type: TrueCosineAnnealingLR T_max: 200000 # width64 配置中为 400000 eta_min: !!float 1e-7 total_iter: 200000 # width64 配置中为 400000 warmup_iter: -1 # 无 warm up pixel_opt: type: PSNRLoss loss_weight: 1 reduction: mean训练损失为PSNRLoss定义于 basicsr/models/losses/losses.py其本质是 PSNR 的对数形式scale * log(MSE 1e-8)scale 10 / ln(10)支持toY选项在 Y 通道计算。优化器在 basicsr/models/image_restoration_model.py 的setup_optimizers中根据optim_g.type动态实例化支持 Adam / SGD / AdamW。验证与指标val: val_freq: !!float 2e4 # 每 20000 iter 验证一次 save_img: false # 训练期验证不保存图像 use_image: false metrics: psnr: type: calculate_psnr crop_border: 0 # 不裁边 test_y_channel: false # 在 RGB 全通道计算 ssim: type: calculate_ssim crop_border: 0 test_y_channel: false日志与分布式logger: print_freq: 200 # 每 200 iter 打印一次日志 save_checkpoint_freq: !!float 5e3 # 每 5000 iter 保存一次 checkpoint use_tb_logger: true wandb: project: ~ resume_id: ~ dist_params: backend: nccl port: 295002.3 两个 width 配置的差异一览配置项NAFNet-width32 / Baseline-width32NAFNet-width64 / Baseline-width64width3264num_worker_per_gpu48batch_size_per_gpu48T_max/total_iter200000400000其余结构/训练参数一致一致width64 模型通道数翻倍、单卡 batch 翻倍因此总迭代数也翻倍400k以充分收敛。三、模型评测预训练权重下载与测试命令3.1 下载预训练模型原文档为四个模型分别提供了预训练权重下载入口google drive / 百度网盘链接见 docs/SIDD.md 原文。下载后统一放置到./experiments/pretrained_models/四个权重文件与配置的对应关系如下模型权重文件名依测试配置推断NAFNet-SIDD-width32NAFNet-SIDD-width32.pthNAFNet-SIDD-width64NAFNet-SIDD-width64.pthBaseline-SIDD-width32Baseline-SIDD-width32.pthBaseline-SIDD-width64Baseline-SIDD-width64.pth3.2 测试命令测试默认单卡执行--nproc_per_node1入口为 basicsr/test.pyNAFNet-SIDD-width32python -m torch.distributed.launch --nproc_per_node1 --master_port4321 basicsr/test.py -opt ./options/test/SIDD/NAFNet-width32.yml --launcher pytorchNAFNet-SIDD-width64python -m torch.distributed.launch --nproc_per_node1 --master_port4321 basicsr/test.py -opt ./options/test/SIDD/NAFNet-width64.yml --launcher pytorchBaseline-SIDD-width32python -m torch.distributed.launch --nproc_per_node1 --master_port4321 basicsr/test.py -opt ./options/test/SIDD/Baseline-width32.yml --launcher pytorchBaseline-SIDD-width64python -m torch.distributed.launch --nproc_per_node1 --master_port4321 basicsr/test.py -opt ./options/test/SIDD/Baseline-width64.yml --launcher pytorch原文档同时说明若需要分布式验证可将--nproc_per_node改为实际 GPU 数量。test.py同样复用parse_options(is_trainFalse)解析配置测试数据集从datasets的val阶段创建加载器模型则由 basicsr/models/image_restoration_model.py 的ImageRestorationModel构建并在初始化时通过path.pretrain_network_g加载预训练权重。3.3 测试配置文件要点以 options/test/SIDD/NAFNet-width32.yml 为例测试配置与训练配置的关键差异在于name: NAFNet-SIDD-width32-test model_type: ImageRestorationModel scale: 1 num_gpu: 1 # 单卡设为 0 可切到 CPU 模式 datasets: val: name: SIDD_val type: PairedImageDataset dataroot_gt: ./datasets/SIDD/val/gt_crops.lmdb dataroot_lq: ./datasets/SIDD/val/input_crops.lmdb io_backend: type: lmdb network_g: type: NAFNet # 必须与权重对应的网络结构一致 width: 32 enc_blk_nums: [2, 2, 4, 8] middle_blk_num: 12 dec_blk_nums: [2, 2, 2, 2] path: pretrain_network_g: experiments/pretrained_models/NAFNet-SIDD-width32.pth strict_load_g: true # 严格按 key 加载权重 resume_state: ~ val: save_img: true # 测试阶段保存恢复结果图 grids: false use_image: false metrics: psnr: type: calculate_psnr crop_border: 0 test_y_channel: false ssim: type: calculate_ssim crop_border: 0 test_y_channel: false测试时save_img: true会把每个验证样本的恢复结果保存到实验输出目录同时test.py会在测试集上计算 PSNR / SSIM 并写入日志。crop_border: 0表示指标计算不裁边test_y_channel: false表示直接在全 RGB 通道计算若设为true则先转 Y 通道。四、源码级原理NAFNet 无激活函数设计在 SIDD 配置中的体现4.1 NAFBlock 与 SIDD 配置的对应关系network_g中的width、enc_blk_nums、middle_blk_num、dec_blk_nums直接决定 basicsr/models/archs/NAFNet_arch.py 中NAFNet类的网络形态3×3 卷积intro将 3 通道输入映射到width通道编码器按enc_blk_numsSIDD 配置为[2, 2, 4, 8]堆叠NAFBlock每阶段后用 stride-2 卷积下采样、通道翻倍瓶颈层由middle_blk_num12个NAFBlock组成此时通道数为width × 16width32 即 512 通道解码器按dec_blk_nums[2, 2, 2, 2]堆叠上采样采用 1×1 卷积 PixelShuffle(2)最终 3×3 卷积ending输出 3 通道恢复图像。NAFBlockbasicsr/models/archs/NAFNet_arch.py的核心是完全去除非线性激活函数SimpleGate将通道沿维度一分为二后逐元素相乘x1 * x2替代 GELU/ReLU 等显式激活Simplified Channel Attention (SCA)全局平均池化 1×1 卷积后直接与特征相乘去掉了 SE 模块中的 ReLUSigmoid两条残差路径分别由可学习的beta、gamma参数初始化为 0缩放网络从恒等映射逐步学习整个 block 仅由 LayerNorm2d、1×1/3×3 卷积组成全部为线性运算。4.2 Baseline 与 NAFNet 的差异basicsr/models/archs/Baseline_arch.py 中的BaselineBlock与NAFBlock结构一一对应差异仅在于用 GELU 替代 SimpleGate用标准 SE 通道注意力AdaptiveAvgPool → 1×1 conv → ReLU → 1×1 conv → Sigmoid替代 SCA。因此 SIDD 的四个实验构成了一组干净的消融对比固定数据、优化器、损失与迭代预算仅改变网络宽度32/64与有无激活函数这一结构变量。这也解释了为何 Baseline 配置中额外出现dw_expand与ffn_expand两个结构参数对应BaselineBlock的DW_Expand、FFN_Expand构造参数而 NAFNet 配置未显式列出使用源码默认值 2。4.3 端到端调用链小结以训练为例完整的调用链为python -m torch.distributed.launch basicsr/train.py -opt options/train/SIDD/NAFNet-width32.yml --launcher pytorch └─ basicsr/train.py 解析 YAMLparse_options ├─ create_dataset - PairedImageDataset读取 train/*.lmdb ├─ create_model - ImageRestorationModel │ ├─ define_network - NAFNet按 network_g 构造 │ ├─ PSNRLoss / AdamW / TrueCosineAnnealingLR └─ 训练循环每 5000 iter 存 checkpoint每 20000 iter 在 SIDD_val 上算 PSNR/SSIM测试同理只是入口换成basicsr/test.py并从experiments/pretrained_models/加载.pth权重。五、复现要点与注意事项目录结构必须与配置一致训练配置硬编码了./datasets/SIDD/train/input_crops.lmdb、./datasets/SIDD/train/gt_crops.lmdb与./datasets/SIDD/val/*.lmdb的相对路径请严格按第一节的目录放置GPU 数量训练命令默认 8 卡、测试默认 1 卡按实际硬件调整--nproc_per_node并确保配置中num_gpu与实际一致分布式端口--master_port与dist_params.port冲突或与其他任务抢占时改用未占用端口网络结构与权重必须匹配width32 的权重只能用 width32 的测试配置加载strict_load_g: true下任何 key 不匹配都会报错指标口径仓库默认在 RGB 全通道、不裁边crop_border: 0的设定下计算 PSNR/SSIM与其他论文口径如 Y 通道比较时需注意统一随机种子manual_seed: 10与set_random_seed(seed rank)basicsr/train.py保证分布式环境下每个 rank 的采样可复现。通过以上流程即可在本地硬件上复现 NAFNet 在 SIDD 上的去噪训练与评测全链路如需进一步了解其他数据集如 GoPro 去模糊、REDS 视频恢复的复现步骤可参考仓库中的 docs/GoPro.md 与 docs/REDS.md。赞分享人工智能计算机视觉图像处理深度学习【免费下载链接】NAFNetThe state-of-the-art image restoration model without nonlinear activation functions.项目地址https://gitcode.com/gh_mirrors/na/NAFNet点击查看免费下载相关推荐NAFNet GoPro 运动去模糊复现指南数据准备、分布式训练与单卡评测全流程NAFNet GoPro 运动去模糊复现指南数据准备、分布式训练与单卡评测全流程 本文围绕 NAFNet 仓库中 docs/GoPro.md https://人工智能计算机视觉图像处理深度学习mmagic 中 SIDD 数据集准备全指南从 MAT 文件导出到 Restormer/NAFNet 去噪训练配置mmagic 中 SIDD 数据集准备全指南从 MAT 文件导出到 Restormer/NAFNet 去噪训练配置 SIDDSmartphone Image媒体生成计算机视觉深度学习人工智能大模型MMagic 中 SIDD 真实图像去噪数据集的准备与使用指南MMagic 中 SIDD 真实图像去噪数据集的准备与使用指南 导读 本文以 tools/dataset_converters/sidd/README.md h媒体生成计算机视觉深度学习人工智能大模型创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑