DnCNN( feed-forward denoising convolutional neural networks)去噪
基于图像先验的去噪方法存在
1)测试阶段通常涉及一个复杂的优化问题,使得去噪过程耗时,计算效率不够高2)这些模型存在需要手动设置的参数。
论文中提出了DnCNN的思路,将残差学习和批处理结合,且在隐藏层内去除潜在的干净图像。
去噪神经网络的感受野大小决定了能否利用更多的图像上下文信息,其大小与去噪算法中的effective batch(2*d+1)有关。
三种结构,分别如图1三种颜色的框表示,DnCNN有两种特征,采用残差学习网络并采用批处理归一化来加速训练,提高去噪性能。通过与ReLU进行卷积,DnCNN可以通过隐藏层逐步将图像结构从噪声观测中分离出来。
图1 DnCNN网络架构
补充知识:
- 感受野(Receptive Field),在CNN中第n层特征图的一个像素对应于第一层(输入图像)的像素数,为该层的RF。
网络第1层输入,第n层输出。第k层和第k + 1层之间的滤波器,其尺寸为f k,步长为sk。
采用递归的思想求解感受野。
图2 感受野递归求解原理图
感受野求解公式:
- 残差网络
为什么引入残差网络?
由于当网络层数加深,会存在三种问题:
1.计算量增加——可采用GPU辅助计算;
2.过拟合——采集海量数据,并采用Dropout正则化方法;
3.梯度消失/梯度爆炸——Batch normalization;
但在训练网络过程中,网络深度加深可能导致网络退化。高层特征较少,考虑将低层的特征传递给高层——利用直接映射连接不同的网络。
建立残差网络:
残差网络由残差块组成,残差块可以表示为
图3 残差块结构图
1×1cov用于降维使得浅层网络维度与深层网络相同。
残差块代码如下:
def res_block_v1(x, input_filter, output_filter):
res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(x)
res_x = BatchNormalization()(res_x)
res_x = Activation('relu')(res_x)
res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(res_x)
res_x = BatchNormalization()(res_x)
if input_filter == output_filter:
identity = x
else: #需要升维或者降维
identity = Conv2D(kernel_size=(1,1), filters=output_filter, strides=1, padding='same')(x)
x = keras.layers.add([identity, res_x])
output = Activation('relu')(x)
return output
残差网络建立步骤:
- 建立plain_VGG网络
- 在Plain VGG的卷积网络之间插入Identity Mapping
应用残差网络的原理:
残差网络不会出现梯度消失或者梯度爆炸,在实验之后可得残差块中的激活函数Relu以图4顺序出现,误差最小,效果最好。
图4 改进后残差块结构图
改进后代码:
def res_block_v2(x, input_filter, output_filter):
res_x = BatchNormalization()(x)
res_x = Activation('relu')(res_x)
res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(res_x)
res_x = BatchNormalization()(res_x)
res_x = Activation('relu')(res_x)
res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(res_x)
if input_filter == output_filter:
identity = x
else: #需要升维或者降维
identity = Conv2D(kernel_size=(1,1), filters=output_filter, strides=1, padding='same')(x)
output= keras.layers.add([identity, res_x])
return output
思考:
感觉DnCNN也是利用到了VGG网络的一个提高,主要储备知识:深度学习相关概念明晰。
经过分析得到每一个模型都有其优劣,所以重要的是选择合适的模型进行去噪,最后选取一个比较好的方案提升去噪效果。