《Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising》阅读笔记

 

一、论文

下载:《Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising》

由于其良好的去噪性能,用于图像去噪的判别模型学习近来受到了广泛的关注。 在本文中,我们通过研究前馈去噪卷积神经网络(DnCNN)的构建向前迈出了一步,以涵盖非常深入的体系结构,学习算法和正则化方法在图像去噪中的进展。 具体而言,利用残差学习和批量归一化来加快训练过程并提高去噪性能。与现有的区别性降噪模型不同,后者通常会在特定噪声水平上训练特定的加性高斯白噪声(AWGN)模型,我们的DnCNN模型能够处理未知噪声水平的高斯去噪(即盲高斯去噪)。 使用残差学习策略,DnCNN会隐式删除隐藏层中的潜在清洁图像。 此属性促使我们训练单个DnCNN模型,以处理多种常规图像去噪任务,例如高斯去噪,单图像超分辨率和JPEG图像解块。 我们广泛的实验表明,我们的DnCNN模型不仅可以在几种常规的图像去噪任务中表现出很高的效率,而且可以受益于GPU计算而得以有效实施。

相关论文,网络结构类似,作者相同:下载《Learning Deep CNN Denoiser Prior for Image Restoration》

基于模型的优化方法和判别式学习方法已成为解决低视力中各种逆问题的两种主要策略。 通常,这两种方法都有各自的优缺点,例如,基于模型的优化方法可以灵活地处理不同的逆问题,但出于性能良好的目的,使用复杂的先验算法通常很耗时; 同时,判别式学习方法测试速度较快,但其应用范围受到专门任务的极大限制。 最近的工作表明,借助于可变分割技术,可以将去噪器先验插入为基于模型的优化方法的模块部分,以解决其他逆问题(例如,去模糊)。 当通过判别学习获得降噪器时,这样的集成会带来相当大的优势。 但是,仍然缺乏与快速判别去噪器集成的研究。 为此,本文旨在训练一组快速有效的CNN(卷积神经网络)去噪器,并将其集成到基于模型的优化方法中,以解决其他逆问题。 实验结果表明,学习到的去噪器集不仅可以实现有希望的高斯去噪结果,还可以用作为各种低级视觉应用提供良好性能的先决条件。

网络结构以及去噪效果

《Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising》阅读笔记_第1张图片

使用了空洞卷积,而且不同层的空洞因子不同。 

《Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising》阅读笔记_第2张图片

二、学习资料

DnCNN论文阅读笔记   

前馈去噪卷积神经网络

三、模型结构

《Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising》阅读笔记_第3张图片

《Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising》阅读笔记_第4张图片

这个模型比较简单。

四、代码

下载:https://github.com/cszn/DnCNN/tree/master/TrainingCodes/dncnn_pytorch

class DnCNN(nn.Module):
 
    def __init__(self, depth=17, n_channels=64, image_channels=1, use_bnorm=True, kernel_size=3):
        super(DnCNN, self).__init__()
        kernel_size = 3
        padding = 1
        layers = []
        layers.append(nn.Conv2d(in_channels=image_channels, out_channels=n_channels, kernel_size=kernel_size, padding=padding, bias=True))
        layers.append(nn.ReLU(inplace=True))
        for _ in range(depth-2):
            layers.append(nn.Conv2d(in_channels=n_channels, out_channels=n_channels, kernel_size=kernel_size, padding=padding, bias=False))
            layers.append(nn.BatchNorm2d(n_channels, eps=0.0001, momentum=0.95))
            layers.append(nn.ReLU(inplace=True))
        layers.append(nn.Conv2d(in_channels=n_channels, out_channels=image_channels, kernel_size=kernel_size, padding=padding, bias=False))
        self.dncnn = nn.Sequential(*layers)
        self._initialize_weights()
 
    def forward(self, x):
        y = x
        out = self.dncnn(x)
        return y-out

 代码详解:

DnCNN代码学习—main_train.py

DnCNN代码学习—main_testpy

DnCNN代码学习—data_generator.py

DnCNN是看的第一篇的论文和代码,受益良多。

你可能感兴趣的:(阅读论文)