在下面的图中可以看到使用上述模型的预测图像的去噪效果。
MWRCAnet
上述去噪架构由百度Research Vision和HITVPC&HUAWEI团队提出。
arxiv:2005.04117。作为NTIRE 2020年竞赛的一部分,本文介绍了10多个用于真实世界图像去噪的架构。我使用的是一个赢得了第二排名的架构,如上所示。该体系结构包括一个称为Residual Channel attention block的特殊块。
classdwt(Layer): def__init__(self, **kwargs): super().__init__(**kwargs) defget_config(self): config=super().get_config().copy() returnconfigdefcall(self, x): x1=x[:, 0::2, 0::2, :] #x(2i−1, 2j−1) x2=x[:, 1::2, 0::2, :] #x(2i, 2j-1) x3=x[:, 0::2, 1::2, :] #x(2i−1, 2j) x4=x[:, 1::2, 1::2, :] #x(2i, 2j) print(x1) x_LL=x1+x2+x3+x4x_LH=-x1-x3+x2+x4x_HL=-x1+x3-x2+x4x_HH=x1-x3-x2+x4returnConcatenate(axis=-1)([x_LL, x_LH, x_HL, x_HH]) classiwt(Layer): def__init__(self, **kwargs): super().__init__(**kwargs) defget_config(self): config=super().get_config().copy() returnconfigdefcall(self, x): x_LL=x[:, :, :, 0:x.shape[3]//4]x_LH=x[:, :, :, x.shape[3]//4:x.shape[3]//4*2]x_HL=x[:, :, :, x.shape[3]//4*2:x.shape[3]//4*3]x_HH=x[:, :, :, x.shape[3]//4*3:]x1= (x_LL-x_LH-x_HL+x_HH)/4x2= (x_LL-x_LH+x_HL-x_HH)/4x3= (x_LL+x_LH-x_HL-x_HH)/4x4= (x_LL+x_LH+x_HL+x_HH)/4y1=K.stack([x1,x3], axis=2) y2=K.stack([x2,x4], axis=2) shape=K.shape(x) returnK.reshape(K.concatenate([y1,y2], axis=-1), K.stack([shape[0],\shape[1]*2, shape[2]*2, shape[3]//4]))defchannel_attention(input_feature,channel,ratio): x=GlobalAveragePooling2D()(input_feature) x=Reshape((1,1,channel))(x) assertx.shape[1:] == (1,1,channel) x=Conv2D(channel// ratio,1,activation='relu',kernel_initializer='he_normal',\use_bias=True,bias_initializer='zeros')(x) assertx.shape[1:] == (1,1,channel//ratio)x=Conv2D(channel,1,activation='sigmoid',kernel_initializer='he_normal',\use_bias=True,bias_initializer='zeros')(x) x=multiply([input_feature, x]) returnx#channel_attention(first_input,64,4) defRCAB(prev_input,filters,kernal_size,blocks): foriinrange(blocks): if (i==0): x=Conv2D(filters,kernal_size,padding='same')(prev_input) else: x=Conv2D(filters,kernal_size,padding='same')(lip) x=PReLU(alpha_initializer='he_normal')(x) x=Conv2D(filters,1,padding='same')(x) x=channel_attention(x,filters,4) if (i==0): lip=Add()([prev_input,x]) else: lip=Add()([lip,x]) x=Conv2D(filters,kernal_size,padding='same')(x) x=Add()([prev_input,x]) returnx#returnModel(inputs=prev_input,outputs=x) defModel_Creation(): first_input=Input(shape=(256,256,3)) #encoder3first=dwt()(first_input) inp=Conv2D(64,3,padding='same')(first) inp=PReLU(alpha_initializer='he_normal')(inp) second=RCAB(inp,64,3,3) #encoder2out_dwt_second=dwt()(second) inp=Conv2D(256,3,padding='same')(out_dwt_second) inp=PReLU(alpha_initializer='he_normal')(inp) third=RCAB(inp,256,3,3) #encoder1out_dwt_third=dwt()(third) inp=Conv2D(512,3,padding='same')(out_dwt_third) inp=PReLU(alpha_initializer='he_normal')(inp) inp=RCAB(inp,512,3,3) #decoder1inp=RCAB(inp,512,3,3) inp=Conv2D(1024,3,padding='same')(inp) inp=PReLU(alpha_initializer='he_normal')(inp) inp=iwt()(inp) inp=Add()([third,inp]) #decoder2inp=RCAB(inp,256,3,3) inp=Conv2D(256,3,padding='same')(inp) inp=PReLU(alpha_initializer='he_normal')(inp) inp=iwt()(inp) inp=Add()([second,inp]) #decoder3inp=RCAB(inp,64,3,3) inp=Conv2D(12,3,padding='same')(inp) inp=PReLU(alpha_initializer='he_normal')(inp) inp=iwt()(inp) out=Add()([first_input,inp]) returnModel(inputs=first_input,outputs=out) model=Model_Creation()
在下图中,使用上述模型可以在预测图像中看到去噪效果。
EDSR模型(Enhanced Deep Residual Network):
arxiv:1707.02921概念:实际上,这个网络模型是为了提高调整后的图像的质量,当它们再次转换到一个更高的维度。我对上述架构进行了修改,用于对摄影图像进行图像去噪
##########################################EDSRMODEL#####################################defEDSR(scale, num_filters=256, res_blocks=8, res_block_scaling=None): x_input=Input(shape=(256, 256, 3)) #assignvalueofxtox_resblockforfurtheroperationsx=x_res_block=Conv2D(num_filters, 3, padding='same')(x_input) #Goesinnumberofresblockforiinrange(res_blocks): x_res_block=ResBlock(x_res_block, num_filters, res_block_scaling) #convolutionx_res_block=Conv2D(num_filters, 3, padding='same',kernel_initializer='he_normal')(x_res_block) x_res_block=LeakyReLU(alpha=0.1)(x_res_block) #addres_blockoutputandoriginalnormalizwdinputx=Add()([x, x_res_block]) #upsamplingx=Upsampling(x, scale, num_filters) x=Conv2D(3, 3, padding='same')(x) x=AveragePooling2D(pool_size=(2,2),strides=(2,2),padding='same')(x) x=Conv2D(3, 3, padding='same')(x) returnModel(x_input, x, name="EDSR") ##################################ResBlockArchitecture################################defResBlock(x_input, num_filters): '''This function Implementes Proposed ResBlock Architecture as per EDSR paper'''#proposedResBlock==>Conv-->Relu-->Conv-->Scaling(mul) -->Addx=Conv2D(num_filters, 3, padding='same', kernel_initializer='he_normal')(x_input) x=LeakyReLU(alpha=0.1)(x) x=Conv2D(num_filters, 3, padding='same',kernel_initializer='he_normal')(x) x=LeakyReLU(alpha=0.1)(x) x=AveragePooling2D(pool_size=(2,2),strides=(1,1),padding='same')(x) returnx#########################################Upsampling#######################################defUpsampling(x, scale, num_filters): '''This function upsampling as mentioned in EDSR paper'''defupsample(x, factor, **kwargs): x=Conv2D(num_filters* (factor**2), 3, padding='same', **kwargs)(x) returnLambda(shuffle_pixels(scale=factor))(x) ifscale==2: x=upsample(x, 2, name='conv2d_1_scale_2') elifscale==3: x=upsample(x, 3, name='conv2d_1_scale_3') elifscale==4: x=upsample(x, 2, name='conv2d_1_scale_2') x=upsample(x, 2, name='conv2d_2_scale_2') returnxmodel=EDSR(2, num_filters=128, res_blocks=8, res_block_scaling=None)
在下面的图中可以看到使用上述模型的预测图像的去噪效果。
效果总结
PSNR
如上图所示,mwrcanet体系结构显示了PSNR值的最高。
SSIM
如上图所示,samsung_mrdnet显示了SSIM方面的最高改进。
我还做过的其他尝试:
我用adam optimizer尝试了各种初始学习率,0.0001效果最好
尝试了3种不同的架构,涉及不同的研究
最初,我使用了图像后,调整他们,但调整使信息损失。所以我把原始图像切成小块,用它来训练。这对提高结果有很好的效果。
例如,如果图像大小是30003000,我从一个完整的图像中获得了300300总共100张图像,以避免在调整大小后丢失信息
由于mrdn模型是过拟合的,采用了正则化和dropout
使用新的概念,如PRelu激活,iwt和dwt(小波变换)与mwrcanet模型
结论
三种模型均获得了较好的结果。在PSNR值方面,mwrcanet优于其他所有架构。在SSIM方面,三星- mrdn优于其他任何架构。但是mwrcanet架构产生的结果非常接近于人眼的干净图像。从EDSR架构修改中获得的结果也非常好,接近顶层架构,我认为这是一个基线模型
进一步的讨论
在此,将所有三个颜色通道同时输入到模型中,得到去噪图像。我们可以尝试将单独的通道分别输入,得到每个部分对应的去噪图像,然后将它们组合。所以对于每个通道,我们可以获得单独的权值或者给每个通道,使用单一的架构得到去噪后的通道图像,使用于训练的数据点数量增加3倍。我已经把原始图像切成碎片,但我没有重新组合它们。我们可以对图像的去噪部分进行估计,并将其组合生成一幅大图像。
最后本文的代码:https://github.com/Anand310892/Real-world-photographic-image-denoiser