新闻中心

【图像去噪】第六期论文复现赛——DnCNN

2025-07-22
浏览次数:
返回列表
本文围绕DnCNN图像去噪算法展开复现研究。该算法基于残差学习和批量归一化,适用于图像复原。复现采用PaddlePaddle框架,在BSD68测试集、噪声15条件下,10次测试平均PSNR达31.73757,达标。文中还介绍了数据集、文件结构、环境依赖、核心代码及训练、评估等操作流程。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【图像去噪】第六期论文复现赛——dncnn -

论文复现——图像去噪算法 DnCNN

DnCNN: Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising

官方源码:https://github.com/cszn/DnCNN

官方Pytorch实现:https://github.com/SaoYan/DnCNN-PyTorch

复现地址:https://github.com/sldyns/DnCNN_paddle

1. 简介

由于深度学习的进步以及卷积神经网络在视觉方向取得的巨大成功,使得更多学者聚焦于此。作者注意到在残差网络之前,预测残差图像的策略已经被用于一些低水平视觉问题,如单幅图像超分辨率和彩色图像去噪。他认为在图像复原领域(尤其是在噪音程度较小的情况下),含噪图像与无噪图像的残差非常小,所以理论上残差学习非常适合运用到图像复原上。

而批量归一化操作通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,这减轻了内部协变量的移位,同时使梯度变大,避免了梯度消失的问题,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

这样的网络设计就是在隐层中将干净图像 x 从含噪图像 y 中消去。在超分领域,低分辨率图片就是高分辨率图片的双三次上采样操作形成的,故超分领域的残差图片和去高斯噪声领域的残差图片是等价的,同理还有JPEG解锁领域的残差图片。因而DnCNN网络同时具有良好的盲去噪能力.

【图像去噪】第六期论文复现赛——DnCNN -        

2. 复现精度

在 BSD68 测试集上做了10次测试,达到验收指标:*erage PSNR, noise 15: 31.73

DnCNN-B Noise Level15
Pytorch 31.73
Paddle 31.73757 (10 times)

3. 数据集与文件结构

3.1 数据集

官方代码提供的训练数据集地址:https://github.com/SaoYan/DnCNN-PyTorch/tree/master/data/train

测试数据集地址:https://github.com/cszn/FFDNet/tree/master/testsets/BSD68

**注:**所有数据已经存放在 work/data/ 文件夹下了,可以无需下载.

3.2 文件结构

DnCNN_Paddle    |-- data
         |-- BSD68                  # 测试所用的BSD68数据集
         |-- train                     # 训练所用的数据,包含400张图片
    |-- logs
         |-- net.pdparams        # 训练过程保存的模型参数文件
         |-- vdlrecords.1649579479.log # 完整的训练日志
    |-- test_tipc                     # TIPC: Linux GPU/CPU 基础训练推理测试
    |-- dataset.py                  # 数据及预处理相关代码
    |-- export_model.py       # 预训练模型的导出代码
    |-- LICENSE                     # LICENSE文件
    |-- models.py                  # 模型定义代码
    |-- README.md              # README.md文件
    |-- val.py                         # 模型评估代码
    |-- predict.py                  # 模型预测代码
    |-- train.py                      # 单机单卡训练文件
    |-- train2.py                    # 单机多卡训练文件
    |-- utils.py                       # 一些工具文件
    |-- infer.py                      # 模型推理代码
   

4. 环境依赖

PaddlePaddle >= 2.2.0

scikit-image == 0.19.2

In [ ]
!pip install scikit-image
   

5. 核心代码

DnCNN 的结构并不复杂,主要为多层 CNN 配合 BatchNorm 和 ReLU,实现的残差学习.

美图云修 美图云修

商业级AI影像处理工具

美图云修 50 查看详情 美图云修
class DnCNN(nn.Layer):
    def __init__(self, channels, num_of_layers=17):
        super(DnCNN, self).__init__()
        kernel_size = 3
        padding = 1
        features = 64
        layers = []
        layers.append(nn.Conv2D(in_channels=channels, out_channels=features, kernel_size=kernel_size, padding=padding, bias_attr=False, weight_attr=nn.initializer.KaimingNormal()))

        layers.append(nn.ReLU())        for _ in range(num_of_layers-2):
            layers.append(nn.Conv2D(in_channels=features, out_channels=features, kernel_size=kernel_size, padding=padding, bias_attr=False, weight_attr=nn.initializer.KaimingNormal()))

            layers.append(nn.BatchNorm2D(features, weight_attr=ParamAttr(initializer=nn.initializer.Constant(value=1.)), bias_attr=ParamAttr(initializer=nn.initializer.Constant(value=0.))))
            
            layers.append(nn.ReLU())

        layers.append(nn.Conv2D(in_channels=features, out_channels=channels, kernel_size=kernel_size, padding=padding, bias_attr=False, weight_attr=nn.initializer.KaimingNormal()))

        self.dncnn = paddle.nn.Sequential(*layers)    def forward(self, x):
        y = x
        out = self.dncnn(x)        return y-out
   

6. 快速开始

6.1 初次训练

In [ ]
!cd work && python train.py --preprocess True --data_dir data/train --val_dir data/BSD68 --num_of_layers 17 --noiseL 15 --val_noiseL 15
   

参数说明:

  • --preprocess True 表示需要作数据预处理
  • --data_dir data/train 训练数据路径
  • --val_dir data/BSD68 验证数据路径
  • --num_of_layers 17 模型层数为17层
  • --noiseL 15 训练的噪声水平为15
  • --val_noiseL 15 验证的噪声水平为15

初次训练指定 --preprocess True,则会生成 train.h5 和 val.h5 两个文件,再次训练则不需要指定改参数:

6.2 重新训练

In [3]
!cd work && python train.py --num_of_layers 17 --noiseL 15 --val_noiseL 15
       
hijack_call.c:658 cuInit error unknown error
       

6.3 日志读取

训练过程会将日志记录和模型参数保存在 work/logs/ 文件夹下.

日志是用 VisualDL 工具记录,可以用 Ai Studio 自带的 数据模型可视化 功能查看

6.4 模型评估

在 BSD58 数据集上作了 10 次测试,噪声强度为 15

In [ ]
!cd work && python val.py --log_dir logs --data_path data/BSD68/ --test_noiseL 15
   

输出如下:

10 times test on test data, Averate PSNR: 31.73937683053843, Variance: 1.7706766908902732e-05

显著达到了验收精度.

6.5 模型预测

在 BSD58 数据集上作预测,噪声强度为 15,结果存放在 work/results/ 文件夹下.

In [ ]
!cd work && python predict.py --log_dir logs --data_path data/BSD68/ --s*e_path results/ --test_noiseL 15 --s*e_images
   

输出为:

PSNR on test data 31.739193
       

work/results/couple 中的图片为 原始图像、带噪图像、去噪结果,3 张图片拼接得到的:

【图像去噪】第六期论文复现赛——DnCNN -        

6.6 单张图像去噪测试

导入单张图像,测试去噪效果,首先需要在work/test_images里上传一张图片.

In [1]
# 先上传一张图片,import os.path as ospfrom IPython.display import displayfrom PIL import Image
img_path = 'butterfly.png' # 改成自己上传的图片名称full_img_path = osp.join(osp.abspath('work/test_images/'), img_path)
img = Image.open(full_img_path).convert('RGB')print('以下为上传的图片:')
display(img)
       
以下为上传的图片:
       
<PIL.Image.Image image mode=RGB size=256x256 at 0x7F9DDC048910>
                In [7]
!cd work && python predict_single.py --clean_img $full_img_path --s*e_images --log_dir logs
       
Loading model ...

W0602 17:50:55.775449  2009 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 10.1
W0602 17:50:55.779913  2009 device_context.cc:465] device: 0, cuDNN Version: 7.6.
only clean image provided, noise level is 15
PSNR 33.144904
        In [8]
# 去噪效果查看import globfrom IPython.display import displayfrom PIL import Image

imgs = glob.glob('work/test_images/*')for path in imgs:    print(path)
    img = Image.open(path)
    display(img)
       
work/test_images/butterfly.png
       
<PIL.PngImagePlugin.PngImageFile image mode=L size=256x256 at 0x7FAD6D3D6D10>
               
work/test_images/butterfly_noised.png
       
<PIL.PngImagePlugin.PngImageFile image mode=L size=256x256 at 0x7FAD6D3ED810>
               
work/test_images/butterfly_denoised.png
       
<PIL.PngImagePlugin.PngImageFile image mode=L size=256x256 at 0x7FAD6D3ED950>
               

以上就是【图像去噪】第六期论文复现赛——DnCNN的详细内容,更多请关注其它相关文章!


# python  # linux  # 第六期  # 美图  # 中文网  # udio  # red  # ai  # 工具  # git  # 小河区seo哪家好  # 淄博网站建设要素  # 杭州滨江网站建设公司  # 黔西南视频营销推广方案  # 支付行业网站建设运营  # 淘客推广到网站  # 助手营销推广神器  # 渭南关键词排名渠道商  # 烟台网站优化行业有哪些  # 白酒推广素材库网站  # 操作指南  # 变大  # 开源  # 命令行  # 放在  # 离线  # 上传 


相关栏目: 【 行业资讯67740 】 【 技术百科0 】 【 网络运营39195


相关推荐: 单片机蓝牙怎么开启设备  如何激活固态硬盘  怎么下载360桌面壁纸  如何引用typescript中的方法  soup是什么意思  sql isnull函数如何使用  苹果16有哪些不同  酷狗音乐pc版的每日推荐在哪 酷狗音乐PC版每日推荐查找指南  征信不好如何恢复正常 征信不好要怎么样才能恢复正常教程  使用typescript对团队有什么要求  typescript适合什么用  夸克加载什么要会员  early什么意思  比亚迪秦nfc功能是什么意思  如何给电脑加装固态硬盘  shell如何注释所有命令  win7怎么取消360显示的壁纸  ai文件在线打开工具有哪些  typescript中范围如何设定  固态硬盘质量如何  typescript怎么拼接  固态硬盘如何4k对其  春运预约抢票能抢到吗  什么是域名解析地址  市盈率静是什么意思  如何在昇腾Ascend 910B上运行Qwen2.5教程  夸克学习都有什么课程  新网站如何填写域名解析  折叠手机屏易坏吗为什么  问一下市盈率是什么意思  datediff函数怎么用视频  苹果16改掉了哪些  win10系统如何打开cmd命令  如何以命令符运行程序  得物怎样不扣手续费 如何通过得物不支付手续费  市盈率ttm写的亏损是什么意思  单片机计时程序怎么写  爱奇艺视频怎么下载到手机u盘怎么转换格式方法  j*a怎么让数组倒换  ai文件里无法找到链接文件要怎么解决步骤  openwrt有哪些功能  ao3镜像网站永久地址入口  为什么选择typescript  虚拟机如何用命令清除垃圾  j*a 怎么清空数组元素  如何创建sql命令  5G手机导航怎么旋转  苹果16有哪些变化尺寸  建伍遥控器power是什么意思  营收和gmv区别_营收和gmv有什么区别 

搜索