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
由于深度学习的进步以及卷积神经网络在视觉方向取得的巨大成功,使得更多学者聚焦于此。作者注意到在残差网络之前,预测残差图像的策略已经被用于一些低水平视觉问题,如单幅图像超分辨率和彩色图像去噪。他认为在图像复原领域(尤其是在噪音程度较小的情况下),含噪图像与无噪图像的残差非常小,所以理论上残差学习非常适合运用到图像复原上。
而批量归一化操作通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,这减轻了内部协变量的移位,同时使梯度变大,避免了梯度消失的问题,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
这样的网络设计就是在隐层中将干净图像 x 从含噪图像 y 中消去。在超分领域,低分辨率图片就是高分辨率图片的双三次上采样操作形成的,故超分领域的残差图片和去高斯噪声领域的残差图片是等价的,同理还有JPEG解锁领域的残差图片。因而DnCNN网络同时具有良好的盲去噪能力.
在 BSD68 测试集上做了10次测试,达到验收指标:average PSNR, noise 15: 31.73
DnCNN-B | Noise Level15 |
---|---|
Pytorch | 31.73 |
Paddle | 31.73757 (10 times) |
官方代码提供的训练数据集地址:https://github.com/SaoYan/DnCNN-PyTorch/tree/master/data/train
测试数据集地址:https://github.com/cszn/FFDNet/tree/master/testsets/BSD68
**注:**所有数据已经存放在 data/
文件夹下了,可以无需下载.
文件结构
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 # 模型推理代码
PaddlePaddle >= 2.2.0
scikit-image == 0.19.2
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
两个文件,再次训练则不需要指定改参数:
python train.py --num_of_layers 17 --noiseL 15 --val_noiseL 15
python -m paddle.distributed.launch --selected_gpus '0,1' train2.py --num_of_layers 17 --noiseL 15 --val_noiseL 15
此处为用两张卡,指定 GPU 为 0 和 1.
训练过程会将日志记录和模型参数保存在 logs/
文件夹下.
日志是用 VisualDL 工具记录的,在根目录下,可通过以下方式查看:
visualdl --logdir ./logs/
或通过:
from visualdl.server import app
app.run(logdir="logs")
在 BSD58 数据集上作了 10 次测试,噪声强度为 15
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
显著达到了验收精度.
在 BSD58 数据集上作预测,噪声强度为 15,结果存放在 results/
文件夹下
python predict.py --log_dir logs --data_path data/BSD68/ --save_path results/ --test_noiseL 15 --save_images
输出为:
PSNR on test data 31.739193
results/couple
中的图片为 原始图像、带噪图像、去噪结果,3 张图片拼接得到的:
需要安装 reprod_log:
pip3 install reprod_log --force-reinstall
模型动转静导出:
python export_model.py --num_of_layers 17 --logdir logs --save-inference-dir output/
最终在output/
文件夹下会生成下面的3个文件:
output
|----model.pdiparams : 模型参数文件
|----model.pdmodel : 模型结构文件
|----model.pdiparams.info: 模型参数信息文件
模型推理:
python infer.py --model-dir output --use-gpu True --benchmark False --img-path data/BSD68/test002.png
输出结果为:
image_name: data/BSD68/test002.png, psnr: 32.762483771446746
首先安装AutoLog(规范化日志输出工具)
pip install https://paddleocr.bj.bcebos.com/libs/auto_log-1.2.0-py3-none-any.whl
在linux下,进入 DnCNN_paddle 文件夹,运行命令:
bash test_tipc/prepare.sh ./test_tipc/configs/DnCNN/train_infer_python.txt 'lite_train_lite_infer'
bash test_tipc/test_train_inference_python.sh ./test_tipc/configs/DnCNN/train_infer_python.txt 'lite_train_lite_infer'
本项目的发布受Apache 2.0 license许可认证。