ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MMagic 中的 NAFNet:无非线性激活的图像复原基线网络实战指南

MMagic 中的 NAFNet:无非线性激活的图像复原基线网络实战指南 媒体生成计算机视觉深度学习人工智能大模型【免费下载链接】mmagicOpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic : Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.项目地址https://gitcode.com/gh_mirrors/mm/mmagic点击查看免费下载NAFNetNonlinear Activation Free Network来自论文Simple Baselines for Image RestorationECCV 2022其核心贡献是发现 Sigmoid、ReLU、GELU、Softmax 等非线性激活函数并非图像复原网络所必需可以用乘法或直接移除来替代。本文以 configs/nafnet/README.md 为骨架结合 mmagic/models/editors/nafnet/ 源码与两套官方训练/测试配置系统讲解 NAFNet 的原理、网络结构、配置细节以及在 MMagic 中的训练、测试与推理方法。读完本文你将理解 NAFNet 的无激活设计为何能兼顾效果与效率并能直接复现 SIDD 图像去噪与 GoPro 图像去模糊实验。一、NAFNet 是什么简单基线与无激活设计1.1 论文与任务定位NAFNet 发表于 ECCV 2022论文题目为Simple Baselines for Image Restoration任务类型为Image Restoration图像复原。论文的核心观察是近年来图像复原领域的 SOTA 方法在效果提升的同时系统复杂度也不断上升这阻碍了方法的便捷分析与对比。为此作者提出一个简单基线Simple Baseline该基线不仅超越当时 SOTA而且计算高效。在此基础上论文进一步揭示了一个反直觉的结论Sigmoid、ReLU、GELU、Softmax 等非线性激活函数不是必需的——它们可以被乘法操作替代甚至直接移除。由此得到的网络被命名为NAFNetNonlinear Activation Free Network即无非线性激活网络。在 README.md 中记录了两个代表性 benchmark 结果GoPro 图像去模糊PSNR 达到 33.69 dB超越此前 SOTA 0.38 dB且计算成本仅为前者的 8.4%SIDD 图像去噪PSNR 达到 40.30 dB超越此前 SOTA 0.28 dB计算成本不足其一半。说明以上数据来自论文与 README 的表述。论文原始引用格式见 configs/nafnet/README.md 的 Citation 一节Chen Liangyu, Chu Xiaojie, Zhang Xiangyu, Sun Jian, arXiv:2204.04676。1.2 一个 NAFNet 块内到底去掉了什么理解无激活设计的关键在 NAFBlock。一个 NAFBlock 由两个部分组成Part 1主路径LayerNorm2d → 1×1 卷积通道扩展 DW_Expand2 倍→ 3×3 深度卷积 →SimpleGate→ 与SCASimplified Channel Attention输出逐元素相乘 → 1×1 卷积Part 2FFN 路径LayerNorm2d → 1×1 卷积通道扩展 FFN_Expand2 倍→SimpleGate→ 1×1 卷积。其中两个关键算子取代了传统非线性激活SimpleGate简单门控定义在 nafnet_net.py。输入特征在通道维上对半切分x.chunk(2, dim1)然后两半逐元素相乘x1 * x2。它用乘法提供了网络所需的非线性表达能力取代了 GELU 等激活。SCASimplified Channel Attention简化通道注意力由AdaptiveAvgPool2d(1) 单个 1×1 卷积构成。与传统 SE 模块相比去掉了中间的 ReLU 与末端的 Sigmoid对照 BaselineBlock 中仍使用nn.GELU()和nn.Sigmoid()的 SE 结构仅保留一个 1×1 卷积从而做到无激活。此外每个块还引入了两个可学习缩放参数beta与gamma初始化为 0形状(1, C, 1, 1)残差连接为inp x * beta与y x * gamma。Dropout 默认关闭drop_out_rate0.时替换为nn.Identity()。1.3 NAFNet 与 NAFNetLocal 的区别仓库在 nafnet_net.py 中注册了两个变体均由MODELS.register_module()注册NAFNet原始版本SCA 内部使用全局平均池化nn.AdaptiveAvgPool2d(1)NAFNetLocal基于 naf_avgpool2d.py 中Local_Base与NAFAvgPool2d的局部平均池化版本——每个像素只在局部区域聚合统计信息而非全局平均池化。在初始化时NAFNetLocal会以train_size默认(1, 3, 256, 256)base_size为 1.5 倍通过convert()将网络内所有AdaptiveAvgPool2d替换为NAFAvgPool2d并执行一次前向以完成结构重建。NAFNet 的完整前向流程nafnet_net.pycheck_image_size将输入 padding 到padder_size 2 ** len(enc_blk_nums)的整数倍intro3×3 卷积把 RGB 输入映射到mid_channels依次经过 4 个 encoder每级 NAFBlock 堆叠 stride-2 卷积下采样通道逐级翻倍经过middle_blks最深层 NAFBlock 堆叠依次经过 4 个 decoder1×1 卷积 PixelShuffle(2) 上采样与 encoder 特征做残差相加ending卷积映射回 3 通道最后与输入inp相加全局残差学习输出复原结果。二、官方配置逐字段解析NAFNet 在 MMagic 中提供两套完整训练配置位于 configs/nafnet/配置任务数据集图像尺寸训练迭代nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py去噪SIDD256×256400knafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py去模糊GoPro1280×720400k2.1 模型配置modelSIDD 去噪配置使用NAFNetmodel dict( typeBaseEditModel, generatordict( typeNAFNet, img_channels3, mid_channels64, enc_blk_nums[2, 2, 4, 8], middle_blk_num12, dec_blk_nums[2, 2, 2, 2], ), pixel_lossdict(typePSNRLoss), train_cfgdict(), test_cfgdict(), data_preprocessordict( typeDataPreprocessor, mean[0.0, 0.0, 0.0], std[255.0, 255.0, 255.0], ))GoPro 去模糊配置则使用NAFNetLocal块分配为enc_blk_nums[1, 1, 1, 28]、middle_blk_num1、dec_blk_nums[1, 1, 1, 1]gopro 配置。各字段含义与取值参数含义SIDD 值GoPro 值img_channels输入/输出通道数RGB333mid_channels中间特征通道数6464enc_blk_nums每级 encoder 的 NAFBlock 数[2,2,4,8][1,1,1,28]middle_blk_num最深层 NAFBlock 数121dec_blk_nums每级 decoder 的 NAFBlock 数[2,2,2,2][1,1,1,1]结构提示encoder 逐级下采样 4 次后最深特征通道为mid_channels * 16 1024网络要求输入尺寸可被2^416整除源码中的padder_size会自动补齐。从结构看SIDD 配置把算力集中在宽而深的中间层64 通道 12 个 middle block而 GoPro 配置把算力集中在最深 encoder 级28 个块两者都符合 NAFNet 论文中简单基线 高效堆叠的设计取向。pixel_loss使用PSNRLossdata_preprocessor将输入像素归一化到[0, 1]std[255, 255, 255]。2.2 数据增强流水线train_pipeline两套配置的train_pipeline完全一致sidd 配置train_pipeline [ dict(typeLoadImageFromFile, keyimg), dict(typeLoadImageFromFile, keygt), dict(typeSetValues, dictionarydict(scale1)), dict(typeFlip, keys[img, gt], flip_ratio0.5, directionhorizontal), dict(typeFlip, keys[img, gt], flip_ratio0.5, directionvertical), dict(typeRandomTransposeHW, keys[img, gt], transpose_ratio0.5), dict(typePairedRandomCrop, gt_patch_size256), dict(typePackInputs) ]scale1标明该任务不涉及超分缩放NAFNet 输出与输入同尺寸水平/垂直翻转 RandomTransposeHW概率 0.5 转置 H/W构成八种几何增强组合PairedRandomCrop以gt_patch_size256对img/gt成对裁剪val_pipeline仅做LoadImageFromFilechannel_orderrgbPackInputs不做随机增强。2.3 数据集与评测配置数据集统一使用BasicImageDataset定义于 mmagic/datasets/basic_image_dataset.py。SIDD 去噪的关键差异在filename_tmpldatasetdict( typedataset_type, metainfodict(dataset_typesidd, task_namedenoising), data_root./data/SIDD/train, data_prefixdict(gtgt, imgnoisy), filename_tmpldict(img{}_NOISY, gt{}_GT), pipelinetrain_pipeline)即 SIDD 数据集中每张图像对应xxx_GT.png干净图与xxx_NOISY.png含噪图通过filename_tmpl成对拼接文件名。GoPro 配置则用data_prefixdict(gtsharp, imgblur)指向 sharp/blur 子目录gopro 配置。训练/验证循环与评测器两套配置一致train_cfg dict( typeIterBasedTrainLoop, max_iters400_000, val_interval20000) val_cfg dict(typeMultiValLoop) test_cfg dict(typeMultiTestLoop) val_evaluator [ dict(typeMAE), dict(typePSNR), dict(typeSSIM), ]采用基于迭代的训练循环IterBasedTrainLoop共 40 万次迭代、每 2 万次迭代验证一次同时输出 MAE、PSNR、SSIM 三个指标。README 中的指标说明a(b)中a为 MMagic 复现值、b为论文原值PSNR 在 RGB 三通道上评估SSIM 为 RGB 通道均值论文原版使用 3D SSIM 卷积核因此两者数值存在差异例如 SIDD 的 SSIM 0.9253 对应论文 0.9614。2.4 优化器与学习率调度optim_wrapper dict( constructorDefaultOptimWrapperConstructor, typeOptimWrapper, optimizerdict(typeAdamW, lr1e-3, weight_decay1e-3, betas(0.9, 0.9))) param_scheduler dict( typeCosineAnnealingLR, by_epochFalse, T_max400_000, eta_min1e-7)优化器AdamW学习率1e-3权重衰减1e-3betas(0.9, 0.9)调度器余弦退火CosineAnnealingLRT_max与max_iters对齐为 400 000最终学习率降至1e-7default_hooks中CheckpointHook每 5000 次迭代保存一次权重save_optimizerTrue便于断点续训LoggerHook每 100 次迭代打印日志基础运行时配置继承自 configs/base/default_runtime.py其中save_bestPSNR, rulegreater表示按 PSNR 择优保存最优权重GoPro 配置额外设置了randomness dict(seed10, diff_rank_seedTrue)gopro 配置用于保证多卡训练时各 rank 种子不同、结果可复现。三、训练与测试实战3.1 训练命令README 的 Quick Start 给出了三种训练方式以 SIDD 配置为例GoPro 配置用法相同只需替换配置路径# CPU 训练 CUDA_VISIBLE_DEVICES-1 python tools/train.py configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py # 单卡训练 python tools/train.py configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py # 多卡8 卡分布式训练 ./tools/dist_train.sh configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py 8入口脚本为 tools/train.py。配置中batch_size8且注释# gpus 4即 4 卡 × 每卡 8 的等效批大小配置sidd 配置使用InfiniteSampler无限采样适配基于迭代的训练循环。更完整的训练说明可参考 docs/en/user_guides/train_test.md。3.2 测试命令# CPU 测试 CUDA_VISIBLE_DEVICES-1 python tools/test.py configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py /path/to/checkpoint # 单卡测试 python tools/test.py configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py /path/to/checkpoint # 多卡8 卡分布式测试 ./tools/dist_test.sh configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py /path/to/checkpoint 8/path/to/checkpoint需替换为权重文件路径。预训练权重可从 metafile.yml 中登记的下载地址获取SIDD 为NAFNet-SIDD-midc64.pth40.3045 PSNR / 0.9253 SSIMGoPro 为NAFNet-GoPro-midc64.pth33.7246 PSNR / 0.9479 SSIMREADME 注明训练日志log即将发布。测试入口脚本为 tools/test.py。3.3 预训练权重与模型卡片NAFNet 的模型卡片记录在 configs/nafnet/metafile.ymlCollection 元信息论文标题Simple Baselines for Image Restoration、arXiv 链接、任务类型 image restoration、年份 2022两个 Model 条目分别登记了配置路径、数据集、PSNR/SSIM 指标、GPU 信息1 张 A100与权重下载地址。你可以用mim等工具按模型卡片名称检索下载也可以直接用python tools/test.py加载上述.pth权重完成评测。四、源码级验证结构与前向一致性的测试保障NAFNet 的实现有专门的单元测试见 tests/test_models/test_editors/test_nafnet/test_nafnet.pytest_nafnet以img_channels3, mid_channels64, enc_blk_nums[2,2,4,8], middle_blk_num12, dec_blk_nums[2,2,2,2]与 SIDD 配置完全一致构建模型喂入(1, 3, 64, 64)随机张量断言输出为 tensor 且形状与输入一致——验证了 NAFNet 的输入输出同尺寸性质test_nafnet_local以enc_blk_nums[1,1,1,28], middle_blk_num1, dec_blk_nums[1,1,1,1]与 GoPro 配置一致构建NAFNetLocal同样验证前向输出形状测试同时在 CPU 与 GPUtorch.cuda.is_available()上执行。这两个测试恰好分别对应两套官方配置的网络结构可用于快速验证安装环境与模型前向链路是否正常。模型注册入口在 mmagic/models/editors/nafnet/init.py对外导出NAFNet、NAFNetLocal、NAFBaseline、NAFBaselineLocal四个类后两者为论文中的 Baseline 对照实现定义于 nafbaseline_net.py其中保留了 GELU 与 SESigmoid正好与 NAFNet 形成有无激活的对照实验。五、从 Baseline 到 NAFNet无激活改造的对照仓库同时保留了Baseline 系列nafbaseline_net.py便于复现论文中的消融对比。BaselineBlock与NAFBlock的差异集中在两处激活函数Baseline 在深度卷积后使用nn.GELU()在 SE 通道注意力中使用nn.ReLU(inplaceTrue)nn.Sigmoid()NAFNet 全部移除改用SimpleGate乘法门控与单卷积SCA通道展开Baseline 的DW_Expand默认为 1深度卷积不扩展通道NAFNet 为 2扩展后经 SimpleGate 对半切分回到原通道数即先扩展、门控后收缩见 nafnet_net.py 的类注释。因此从结构上可以清晰看到论文非线性激活不是必需的可以被乘法替代这一论断的工程落地乘法门控SimpleGate承担了特征交互的非线性角色简化通道注意力SCA承担了通道重标定角色两者都不含任何经典激活函数。六、常见问题与使用提示输入尺寸要求NAFNet 内部有 4 次 2× 下采样要求输入 H/W 可被 16 整除不满足时源码check_image_size会自动 padding 并在输出裁剪回原尺寸nafnet_net.py因此任意尺寸图片均可直接推理。任务定位NAFNet 是同分辨率复原网络去噪、去模糊、去雨等不是超分网络训练流水线中显式设置scale1。数据目录训练前需按配置中的data_root准备数据SIDD 需满足{}_NOISY/{}_GT命名对GoPro 需分blur/sharp子目录。显存与算力README 记录官方实验使用单张 A100本仓库不包含实测显存数据实际训练时应结合自身 GPU 显存调整batch_size与gt_patch_size。进一步阅读完整的训练/测试流程说明见 docs/en/user_guides/train_test.md其余图像复原算法如 Restormer、SwinIR的配置位于 configs/ 对应目录可横向对比。文中涉及的配置、源码与测试路径均可在当前仓库中直接查看配置目录 configs/nafnet/、网络实现 mmagic/models/editors/nafnet/、单元测试 tests/test_models/test_editors/test_nafnet/。赞分享媒体生成计算机视觉深度学习人工智能大模型【免费下载链接】mmagicOpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic : Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.项目地址https://gitcode.com/gh_mirrors/mm/mmagic点击查看免费下载相关推荐NAFNet完整使用指南无需非线性激活函数的最先进图像恢复模型NAFNet完整使用指南无需非线性激活函数的最先进图像恢复模型 NAFNet是目前最先进的图像恢复模型它独特地移除了非线性激活函数在保持高性能的同时显著降人工智能计算机视觉图像处理深度学习自托管服务器监控工具 Checkmate 社区参与指南新手如何从反馈问题一路走到提交代码自托管服务器监控工具 Checkmate 社区参与指南新手如何从反馈问题一路走到提交代码 凌晨两点一台生产服务器悄悄挂掉而值班同学十分钟后才收到消息。Ch媒体生成计算机视觉深度学习人工智能大模型PaddleGAN 中的 NAFNet 图像去噪实战从无激活函数网络原理到推理、训练与测试全流程PaddleGAN 中的 NAFNet 图像去噪实战从无激活函数网络原理到推理、训练与测试全流程 NAFNetNonlinear Activation Fr人工智能深度学习计算机视觉媒体生成视频处理图像处理上一篇在 Next.js 中接入 Scalar API Referencescalar/nextjs-api-reference 实战指南与版本演进解析下一篇Rolldown 分块合并Chunk Merging实战side-effectful barrel 的已加载即并入优化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表