zoukankan      html  css  js  c++  java
  • DnCNN-Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising

    论文原文:https://arxiv.org/pdf/1608.03981.pdf

    笔记参考:【图像去噪】DnCNN论文详解

    文章贡献:

    1. 针对高斯去噪提出了以一个端对端的可训练的深度神经网络。与现有的基于深度神经网络的直接估计潜在的干净图像的方法不同,该网络采用残差学习策略从噪声观测中去除潜在的干净图像。
    2. 文章发现,残差学习和批处理归一化对CNN的学习有很大的好处,它们不仅可以加快训练速度,而且可以提高去噪性能。对于具有一定噪声水平的高斯去噪,DnCNN在定量度量和视觉质量方面都优于最先进的方法。
    3. DnCNN可以很容易地扩展到处理一般的图像去噪任务。可以通过训练单一的DnCNN模型来进行高斯盲去噪,并在特定的噪声水平下取得比其他方法更好的性能。此外,它有希望解决三个常见的图像去噪任务,即盲高斯去噪,SISR(超分辨率)和JPEG去块。

    网络:

    在网络架构设计上,对VGG进行修改,使其适合图像去噪,并根据目前去噪方法中使用的有效patch大小来设置网络深度。

    在模型学习中,采用了残差学习公式,并将其与批处理归一化相结合,实现了快速训练,提高了去噪性能。

    模型:

    class DnCNN(nn.Module):
        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=False))
            layers.append(nn.ReLU(inplace=True))
            for _ in range(num_of_layers-2):
                layers.append(nn.Conv2d(in_channels=features, out_channels=features, kernel_size=kernel_size, padding=padding, bias=False))
                layers.append(nn.BatchNorm2d(features))
                layers.append(nn.ReLU(inplace=True))
            layers.append(nn.Conv2d(in_channels=features, out_channels=channels, kernel_size=kernel_size, padding=padding, bias=False))
            self.dncnn = nn.Sequential(*layers)
        def forward(self, x):
            out = self.dncnn(x)
            return out

    第一部分:Conv(3 * 3 * c * 64)+ReLu (c代表图片通道数)

    第二部分:Conv(3 * 3 * 64 * 64)+BN(batch normalization)+ReLu

    第三部分:Conv(3 * 3 * 64)

    每一层都zero padding,使得每一层的输入、输出尺寸保持一致。以此防止产生人工边界(boundary artifacts)。第二部分每一层在卷积与reLU之间都加了批量标准化(batch normalization、BN)。

    批量标准化batch normalization:

    SGD(随机梯度下降法)广泛应用于CNN的训练方法中,但是训练的性能却很大程度受内部协变量移位这一问题所影响。BN就是在每一层的非线性处理之前加入标准化、缩放、移位操作来减轻内部协变量的移位。可以给训练带来更快的速度,更好的表现,使网络对初始化变量的影响没有那么大。

    内部协变量移位(internal covariate shift):深层神经网络在做非线性变换前的激活输入值,随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。

    批量标准化(batch normalization):就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,即把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,所以输入的小变化才就会导致损失函数有较大的变化,意思就是让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

    结果:

  • 相关阅读:
    浮动与浮动的清除
    【最全】经典排序算法(C语言)
    Python类中的self到底是干啥的
    浅析Python3中的bytes和str类型
    Shell十三问[转]
    VMware下对虚拟机Ubuntu14系统所在分区sda1进行磁盘扩容
    C语言运算符优先级
    mysql主要性能监控指标
    sql 优化
    npm install安装时忘记--save解决方法
  • 原文地址:https://www.cnblogs.com/mujin-chuyang/p/13838485.html
Copyright © 2011-2022 走看看