目标:

  1. 学习模型中经典的网络模块
  2. 学习常用的损失函数
  3. 了解目前的进展
  4. 尝试发现一些我不了解的trick

说明:

  1. 研究的论文其实蛮多是关于super resolution,这里我将这两个大类简单地理解为一个概念。具体的概念分析可参考:https://www.zhihu.com/question/65791339?sort=created,简单来说图像复原 = denoising + SR + inpainting(图像修复)
  2. 我需要处理的输入图像分辨率较大,2K左右,需特别关注一些有利于压缩的操作。

参考:
https://github.com/icpm/super-resolution
https://github.com/kozistr/Awesome-GANs

https://blog.csdn.net/abluemouse/article/details/78710553
https://zhuanlan.zhihu.com/p/104407869
https://zhuanlan.zhihu.com/p/165050802

一些知识

整体目标

VDSR论文作者提到:输入的LR图像和输出的HR图像很大程度上是相似的,因为它们的低频信息相近,训练这部分会花费大量的时间,实际只需要学习LR和HR图像间高频部分的差别即可。因此,残差网络结构用适合用于解决超分问题。denoising任务中直接连接输入和输出能降低模型和学习复杂度

尽可能地多学习高频特征

Resblock的发展脉落

图源见水印:
Image Restoration的简单整理 - 图1

网络尾部的重建部分通常会采用PixelShuffle上采样(如EDSR、RCAN等)

Denoising和SR的区别

SR是由LR图像到HR图像。Denoising的输入输出分辨率相同,因此无需SR中的上采样层

SRGAN(SRResNet)(2016)

这是SR领域中目前引用量最高的论文
https://arxiv.org/abs/1609.04802

model

Image Restoration的简单整理 - 图2

Generator

  • 激活函数选择了PRelu(补课:PRelu是leaky relu的变体,根据数据集确实负值时的斜率)
  • 最后几层都没有BN
  • 有sum操作无concat操作
  • PixelShuffle(不确定是不是shuffleNet中的shuffle操作,如果后续的经典论文中也用到了这个结构我就来细看,2016, https://arxiv.org/abs/1609.05158,nn.pixelshuffle,作用是上采样)
  • ResBlock后面没有relu层

Discriminator

  • Leaky ReLU
  • 没什么太好讲的,网络结构很清楚

    loss

    Gen loss

  • content loss(VGG19 或 MSE loss)

  • adv loss (sigmoid)

Disc loss

  • adv loss (sigmoid)

    other tricks

    暂无

EDSR (2017)

https://openaccess.thecvf.com/content_cvpr_2017_workshops/w12/papers/Lim_Enhanced_Deep_Residual_CVPR_2017_paper.pdf

model

Image Restoration的简单整理 - 图3
Generator
主要是基于SRGAN做了修改,去除其中多余的模块,从而扩大模型尺寸提高结果

  • 主要是对Resblock进行了修改,见下图
    Image Restoration的简单整理 - 图4
    • 最有提升的点在于去掉BN层(BN会是网络训练时使数据包含忽略图像像素(或者特征)之间的绝对差异(因为均值归零,方差归一),而只存在相对差异。所以在不需要绝对差异的任务中(比如分类),BN提升效果。而对于图像超分辨率这种需要利用绝对差异的任务,BN会适得其反。)


other tricks

  • 残差缩放(过多的残差块会使训练过程中的数值不稳定,残差缩放在残差块相加前,让经过卷积处理的一路剩以一个小数,作者用了0.1。参考:https://www.pianshen.com/article/2449328261/

RCAN(2018)

反对EDSR中简单地堆叠Resblock,RCAN作者认为应该更好地利用特征,提出了channel attention对特征图中的通道赋予不同的权重,增加通道的差异性。

  1. class CALayer(nn.Module):
  2. def __init__(self, channel, reduction=16):
  3. super(CALayer, self).__init__()
  4. # global average pooling: feature --> point
  5. self.avg_pool = nn.AdaptiveAvgPool2d(1) # shape: (1, 1, channel),所以是channel attention
  6. # feature channel downscale and upscale --> channel weight
  7. self.conv_du = nn.Sequential(
  8. nn.Conv2d(channel, channel // reduction, 1, padding=0, bias=True),
  9. nn.ReLU(inplace=True),
  10. nn.Conv2d(channel // reduction, channel, 1, padding=0, bias=True),
  11. nn.Sigmoid()
  12. )
  13. def forward(self, x):
  14. y = self.avg_pool(x)
  15. y = self.conv_du(y)
  16. return x * y

Deep Generative Prior (ECCV2020 oral)

https://zhuanlan.zhihu.com/p/165050802

PANet

https://zhuanlan.zhihu.com/p/137496566
https://github.com/SHI-Labs/Pyramid-Attention-Networks

这个好像给很多任务都单独去训练了一个模型,不确定整体效果怎么样