新闻中心
【图像去噪】第六期论文复现赛——DnCNN
本文围绕DnCNN图像去噪算法展开复现研究。该算法基于残差学习和批量归一化,适用于图像复原。复现采用PaddlePaddle框架,在BSD68测试集、噪声15条件下,10次测试平均PSNR达31.73757,达标。文中还介绍了数据集、文件结构、环境依赖、核心代码及训练、评估等操作流程。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

论文复现——图像去噪算法 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网络同时具有良好的盲去噪能力.
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 张图片拼接得到的:
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.144904In [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 】
相关推荐:
如何去掉拍电脑的纹路详细教程
为什么夸克流畅播失败
如何退出数据库命令行
光刻机的作用及工作原理
苹果16新增哪些功能
智能锁type-c接口是什么
春运抢票何时开始抢票的
怎么在项目中使用typescript
华为5g手机怎么选择
mac 如何启动命令行模式
苹果16送哪些配件
如何查看固态硬盘分区
element ui是什么
爱奇艺fun会员可以几个人用?
debug中如何用n命令命名程序文件名
什么叫typescript
夸克网盘下载为什么要钱
锤子手机怎么不出5g
夸克po什么意思
为什么ai老是说链接面板中缺少某些文件
单片机显存怎么设置最佳
迅达热水器显示power是什么意思
市盈率ttm写的亏损是什么意思
固态硬盘如何安装win10系统安装
夸克加载什么要会员
ssd固态硬盘如何安装
华为5g手机怎么用4g网络
夸克还原排版是什么意思
ai文件里无法找到链接文件怎么解决
硬盘和固态硬盘如何区分
计数器上power是什么意思
雅迪电动车上的power是什么意思
萝卜快跑的收费标准是什么
linux如何查看命令的参数
typescript需要学多久
j*a怎么存放数组中
镜像ao3链接入口
命令行如何运行c
网络光刻机是干什么用的
为什么夸克运行不了
市盈率是什么意思高好还是低好
春运抢票失败怎么抢
typescript中怎么引用js文件
春运抢票最快几天能成功
如何通过命令行聊天
如何打开win10命令
如何用命令行连接本地数据库
市盈率为负数是什么意思
折叠手机屏易坏吗为什么
爱奇艺会员qq登录可以几个人用?


2025-07-22
浏览次数:次
返回列表
def forward(self, x):
y = x
out = self.dncnn(x) return y-out