基于matlab实现的DnCNN网络

超越高斯去噪器:深度CNN图像去噪的残差学习

新闻: DRUNet

  • 最先进的去噪性能

  • 可用于即插即用的图像恢复

建议使用PyTorch代码进行训练和测试。MatConvnet和PyTorch的模型参数相同。

合并批量归一化(PyTorch)

python 复制代码
import torch
import torch.nn as nn


def merge_bn(model):
    ''' 将所有'Conv+BN'(或'TConv+BN')合并为'Conv'(或'TConv')
    基于 https://github.com/pytorch/pytorch/pull/901
    作者:Kai Zhang (cskaizhang@gmail.com) 
    https://github.com/cszn/DnCNN
    2019年1月1日
    '''
    prev_m = None
    for k, m in list(model.named_children()):
        if (isinstance(m, nn.BatchNorm2d) or isinstance(m, nn.BatchNorm1d)) and (isinstance(prev_m, nn.Conv2d) or isinstance(prev_m, nn.Linear) or isinstance(prev_m, nn.ConvTranspose2d)):

            w = prev_m.weight.data

            if prev_m.bias is None:
                zeros = torch.Tensor(prev_m.out_channels).zero_().type(w.type())
                prev_m.bias = nn.Parameter(zeros)
            b = prev_m.bias.data

            invstd = m.running_var.clone().add_(m.eps).pow_(-0.5)
            if isinstance(prev_m, nn.ConvTranspose2d):
                w.mul_(invstd.view(1, w.size(1), 1, 1).expand_as(w))
            else:
                w.mul_(invstd.view(w.size(0), 1, 1, 1).expand_as(w))
            b.add_(-m.running_mean).mul_(invstd)
            if m.affine:
                if isinstance(prev_m, nn.ConvTranspose2d):
                    w.mul_(m.weight.data.view(1, w.size(1), 1, 1).expand_as(w))
                else:
                    w.mul_(m.weight.data.view(w.size(0), 1, 1, 1).expand_as(w))
                b.mul_(m.weight.data).add_(m.bias.data)

            del model._modules[k]
        prev_m = m
        merge_bn(m)


def tidy_sequential(model):
    for k, m in list(model.named_children()):
        if isinstance(m, nn.Sequential):
            if m.__len__() == 1:
                model._modules[k] = m.__getitem__(0)
        tidy_sequential(m)

训练 (MatConvNet)

测试 (MatConvNet 或 Matlab)

  • 演示\] `Demo_test_DnCNN-.m`。

  • 测试集\] BSD68和Set10用于高斯去噪评估;Set5、Set14、BSD100和Urban100数据集用于SISR评估;Classic5和LIVE1用于JPEG图像去块评估。

我基于FFDNet训练了新的灵活DnCNN(FDnCNN)模型。

FDnCNN可以通过单一模型处理[0, 75]范围的噪声级别。

<Demo_FDnCNN_Gray.m>

<Demo_FDnCNN_Gray_Clip.m>

<Demo_FDnCNN_Color.m>

<Demo_FDnCNN_Color_Clip.m>

网络架构和设计原理

  • 网络架构
  • 批量归一化和残差学习对高斯去噪有益(特别是对于单一噪声级别)。受加性白高斯噪声(AWGN)污染的噪声图像的残差遵循恒定的高斯分布,这在训练过程中稳定了批量归一化。

    • 来自一批训练的噪声块、干净块和残差(噪声)块的直方图。噪声级别为25,块大小为40x40,批量大小为128。
复制代码
* 来自另一批训练的噪声块、干净块和残差(噪声)块的直方图。噪声级别为25,块大小为40x40,批量大小为128。
复制代码
 * 无噪声图像超分辨率没有这种特性。
  • 预测残差可以解释为在起点(即噪声图像)执行一个梯度下降推理步骤。

    • DnCNN中的参数主要代表图像先验(任务无关),因此可以为不同任务学习单一模型,如图像去噪、图像超分辨率和JPEG图像去块。

    • 左侧是受不同退化影响的输入图像,右侧是DnCNN-3恢复的图像。

结果

高斯去噪

BSD68数据集上不同方法的平均PSNR(dB)结果。

噪声级别 BM3D WNNM EPLL MLP CSF TNRD DnCNN DnCNN-B FDnCNN DRUNet
15 31.07 31.37 31.21 - 31.24 31.42 31.73 31.61 31.69 31.91
25 28.57 28.83 28.68 28.96 28.74 28.92 29.23 29.16 29.22 29.48
50 25.62 25.87 25.67 26.03 - 25.97 26.23 26.23 26.27 26.59

视觉结果

左侧是受AWGN污染的噪声图像,中间是DnCNN去噪的图像,右侧是真实图像。

通过单一(DnCNN-3)模型进行高斯去噪、单图像超分辨率和JPEG图像去块

BSD68数据集上噪声级别15、25和50的高斯去噪、Set5、Set14、BSD100和Urban100数据集上缩放因子2、3和40的单图像超分辨率、Classic5和LIVE11数据集上质量因子10、20、30和40的JPEG图像去块的平均PSNR(dB)/SSIM结果。

高斯去噪

数据集 噪声级别 BM3D TNRD DnCNN-3
15 31.08 / 0.8722 31.42 / 0.8826 31.46 / 0.8826
BSD68 25 28.57 / 0.8017 28.92 / 0.8157 29.02 / 0.8190
50 25.62 / 0.6869 25.97 / 0.7029 26.10 / 0.7076

单图像超分辨率

数据集 缩放因子 TNRD VDSR DnCNN-3
2 36.86 / 0.9556 37.56 / 0.9591 37.58 / 0.9590
Set5 3 33.18 / 0.9152 33.67 / 0.9220 33.75 / 0.9222
4 30.85 / 0.8732 31.35 / 0.8845 31.40 / 0.8845
2 32.51 / 0.9069 33.02 / 0.9128 33.03 / 0.9128
Set14 3 29.43 / 0.8232 29.77 / 0.8318 29.81 / 0.8321
4 27.66 / 0.7563 27.99 / 0.7659 28.04 / 0.7672
2 31.40 / 0.8878 31.89 / 0.8961 31.90 / 0.8961
BSD100 3 28.50 / 0.7881 28.82 / 0.7980 28.85 / 0.7981
4 27.00 / 0.7140 27.28 / 0.7256 27.29 / 0.7253
2 29.70 / 0.8994 30.76 / 0.9143 30.74 / 0.9139
Urban100 3 26.42 / 0.8076 27.13 / 0.8283 27.15 / 0.8276
4 24.61 / 0.7291 25.17 / 0.7528 25.20 / 0.7521

JPEG图像去块

数据集 质量因子 AR-CNN TNRD DnCNN-3
Classic5 10 29.03 / 0.7929 29.28 / 0.7992 29.40 / 0.8026
20 31.15 / 0.8517 31.47 / 0.8576 31.63 / 0.8610
30 32.51 / 0.8806 32.78 / 0.8837 32.91 / 0.8861
40 33.34 / 0.8953 - 33.77 / 0.9003

要求和依赖

或者只需要MATLAB R2015b来测试模型。

https://github.com/cszn/DnCNN/blob/4a4b5b8bcac5a5ac23433874d4362329b25522ba/Demo_test_DnCNN.m#L64-L65

引用

BibTex 复制代码
@article{zhang2017beyond,
  title={Beyond a {Gaussian} denoiser: Residual learning of deep {CNN} for image denoising},
  author={Zhang, Kai and Zuo, Wangmeng and Chen, Yunjin and Meng, Deyu and Zhang, Lei},
  journal={IEEE Transactions on Image Processing},
  year={2017},
  volume={26}, 
  number={7}, 
  pages={3142-3155}, 
}
@article{zhang2020plug,
  title={Plug-and-Play Image Restoration with Deep Denoiser Prior},
  author={Zhang, Kai and Li, Yawei and Zuo, Wangmeng and Zhang, Lei and Van Gool, Luc and Timofte, Radu},
  journal={arXiv preprint},
  year={2020}
}

====================================================================

用于图像去噪和恢复的卷积神经网络

复制代码
@Inbook{zuo2018convolutional,
author={Zuo, Wangmeng and Zhang, Kai and Zhang, Lei},
editor={Bertalm{\'i}o, Marcelo},
title={Convolutional Neural Networks for Image Denoising and Restoration},
bookTitle={Denoising of Photographic Images and Video: Fundamentals, Open Challenges and New Trends},
year={2018},
publisher={Springer International Publishing},
address={Cham},
pages={93--123},
isbn={978-3-319-96029-6},
doi={10.1007/978-3-319-96029-6_4},
url={https://doi.org/10.1007/978-3-319-96029-6_4}

挑战和可能的解决方案(来自上述书籍章节)

虽然针对AWGN去除的图像去噪已经得到了很好的研究,但关于真实图像去噪的工作却很少。

主要困难在于实际噪声比AWGN复杂得多,并且彻底评估去噪器的性能并非易事。图4.15显示了现实世界中的四种典型噪声类型。

可以看出,这些噪声的特征非常不同,单一的噪声级别可能不足以参数化这些噪声类型。在大多数情况下,去噪器只能在特定的噪声模型下很好地工作。

例如,为AWGN去除而训练的去噪模型对混合高斯和泊松噪声去除无效。

这在直觉上是合理的,因为基于CNN的方法可以被视为公式(4.3)的一般情况,重要的数据保真项对应于退化过程。尽管如此,由于以下原因,AWGN去除的图像去噪仍然很有价值。首先,它是评估不同基于CNN的去噪方法有效性的理想试验台。

其次,在通过变量分裂技术展开推理中,许多图像恢复问题可以通过顺序解决一系列高斯去噪子问题来解决,这进一步拓宽了应用领域。

为了提高CNN去噪器的实用性,最直接的方法可能是捕获足够数量的真实噪声-干净训练对进行训练,以便覆盖真实的退化空间。这种解决方案的优势在于不需要知道复杂的退化过程。然而,由于需要仔细的后处理步骤,如空间对齐和光照校正,推导噪声图像对应的干净图并非易事。或者,可以模拟真实退化过程从干净图像合成噪声图像。但是,准确建模复杂的退化过程并不容易。特别是,不同相机的噪声模型可能不同。尽管如此,为训练粗略建模某种噪声类型然后使用所学的CNN模型进行特定类型的去噪在实践中更受欢迎。

除了训练数据之外,鲁棒的架构和鲁棒的训练对于CNN去噪器的成功也起着至关重要的作用.

对于鲁棒架构,设计涉及由粗到精过程的深度多尺度CNN是一个有前景的方向。

这样的网络有望继承多尺度的优点:

(i) 在较大尺度上噪声级别降低;

(ii) 多尺度过程可以缓解普遍存在的低频噪声;

(iii) 在去噪之前对图像进行下采样可以有效地扩大感受野。

对于鲁棒训练,使用生成对抗网络(GAN)训练的去噪器对真实图像去噪的有效性仍有待进一步研究。基于GAN的去噪的主要思想是引入对抗损失以改善去噪图像的感知质量。此外,GAN的一个显著优势是它可以进行无监督学习。更具体地说,

可以在训练中使用没有真实值的噪声图像。到目前为止,我们已经提供了几种可能的解决方案来提高CNN去噪器的实用性。我们应该注意,这些解决方案可以结合起来进一步提高性能。

源码地址:https://download.csdn.net/download/FL1623863129/92178742

相关推荐
Java小混子几秒前
golang项目CRUD示例
开发语言·后端·golang
想搞艺术的程序员3 分钟前
Go 优雅关闭实践指南:从原理到框架落地
开发语言·后端·golang
m5655bj8 分钟前
Python 查找并高亮显示指定 Excel 数据
开发语言·python·excel
洛克希德马丁31 分钟前
Qt 配置Webassemble环境
开发语言·qt·webassembly·emscripten·emsdk
武子康31 分钟前
Java-167 Neo4j CQL 实战:CREATE/MATCH 与关系建模速通 案例实测
java·开发语言·数据库·python·sql·nosql·neo4j
自由的好好干活34 分钟前
C#桌面框架与Qt对比及选型(国产操作系统开发视角)
开发语言·qt·c#
upward_tomato38 分钟前
python中模拟浏览器操作之playwright使用说明以及打包浏览器驱动问题
开发语言·python
lsx20240643 分钟前
jEasyUI 合并单元格详解
开发语言
散峰而望1 小时前
C++入门(算法) - 习题
开发语言·c++·算法·github
在下胡三汉1 小时前
创建轻量级 3D 资产 - Three.js 中的 GLTF 案例
开发语言·javascript·3d