性能炸裂的HINet

HINet: Half Instance Normalization Network for Image Restoration

image1

Paper: https://arxiv.org/pdf/2105.06086.pdf

Code: https://github.com/megvii-model/HINet

Introduction

Normalization被广泛用于high-level的计算机视觉任务,例如分类、分割、以及风格迁移等。但不能简单地将其应用到low-level的任务中,比如超分中使用BN层不会提高效果。该论文将Instance Normalization,该论文将Instance Normalization当作基础模块,名为Half Instance Normalization Block (HIN Block),基于HIN Block构建多阶段网络HINet。

主要贡献如下:

  1. 基于Instance Normalization构建HIN模块应用于图像复原领域,该论文是首个直接采用IN在图像复原任务中达到SOTA的方案;
  2. 基于HIN模块设计多阶段网络HINet,以更少的计算量以及推理时间达到SOTA;
  3. 将Instance Normalization作为一种特征增强方法进行扩展,并将其直接应用到图像恢复任务中;

Instance Normalization

IN层由2017年在https://arxiv.org/pdf/1607.08022v3.pdf提出,初次被用于风格迁移,用来代替BN层。IN与BN的主要区别是IN是对于批次内单张图片进行归一化,而BN是基于一个batch进行归一化。个人理解是在图像恢复,超分,去噪以及风格迁移这类追求细节的领域,基于batch归一化会导致图像趋于平均以及特有细节丢失,锐利度不够,同时在超分可能会出现网格伪影,如ESRGAN提到。而IN对每个图片单独做归一化,可以保证每个图像实例之间的独立。如下图([参考文章](https://zhuanlan.zhihu.com/p/56542480))所示,公式1表示BN的计算过程是基于batch进行归一化,IN则是基于单张图像归一化。

image1

Approach

HINet
image1

HINet模型主要分为两个阶段,每个阶段都是由UNet组成子网络,UNet内部首先采用1个3×3卷积提取初始特征,随后特征被送到Encoder-Decoder结构中,Encoder由4×4卷积进行下采样,Encoder使用2×2卷积进行上采样。分别进行4次下采样以及4次上采样。

在Encoder中采用HIN Block用于提取low-level特征,在Decoder中采用Res Block用于提取高级特征,并通过Skip Connect与Encoder提取的特征进行信息融合从而减少不断上采样带来的信息损失,最后通过3×3卷积得到最终的残差输出。阶段1与阶段2通过SAM以及CSFF相连接(MSPNet)。

Supervised Attention Module
image1

SAM全名supervised attention module,有监督的注意力模块,SAM用于提取阶段1的特征,与特征2的输入相融合,使用SAM有助于将当前阶段的重要特征传递给阶段2。为了更好理解,我这里展示HINet作者的SAM代码(MSPNet原网络使用1×1卷积,在这里被替换成了33卷积),首先F_in表示阶段1Decoder的输出,同时也是SAM的输入,通过一个3×3卷积conv2得到残差R_s,之后和退化图像Degraded相加,进行特征融合。在这里退化图像为整体网络的输入,此时得到了阶段1 的最终输出X_s。又通过3×3卷积conv3+Sigmoid构建像素注意力机制,生成Attention Maps,通过3×3卷积conv1以及与Attention Maps点乘的方式重新校准F_in,该注意力特征与初始输入F_in相加,得到注意力增强的F_out,输入阶段2

## Supervised Attention Module
class SAM(nn.Module):
    def __init__(self, n_feat, kernel_size=3, bias=True):
        super(SAM, self).__init__()
        self.conv1 = conv(n_feat, n_feat, kernel_size, bias=bias)
        self.conv2 = conv(n_feat, 3, kernel_size, bias=bias)
        self.conv3 = conv(3, n_feat, kernel_size, bias=bias)

    def forward(self, x, x_img):
        x1 = self.conv1(x)
        img = self.conv2(x) + x_img
        x2 = torch.sigmoid(self.conv3(img))
        x1 = x1*x2
        x1 = x1+x
        return x1, img
CSFF
image1

CSFF全名cross-stage feature fusion,在这里是用于将阶段1的浅层特征传递到阶段2。分别得到阶段1在Encoder以及Decoder得到的Feature Maps,分别经过33卷积,再与阶段2的Encoder的Feature Maps进行特征融合。通过这种方式可以帮助网络从前到后传播多尺度特征。

Loss Function

基于PSNR定义损失函数image1,其中X_i表示阶段i的输入,R_i表示阶段i的输出,Y表示每个阶段的GT。训练中采用R_1与R_2进行共同训练,推理时使用阶段2的R_2+X_2作为最终输出。

HIN Block
image1

上图展示了HIN Block与Res Block的流程,相比Res Block,HINet主要将3×3卷积后的F_mid从中间分成F_mid1以及F_mid2,F_mid1经过IN进行归一化,F_mid2则不经过任何模块,二者通过拼接合并在一起。其余操作则与Res Block一致。

Experiments

效果图

image1

看看最终效果,上图展示了在各种数据集的恢复结果,可以看到在降噪、去模糊、去雨等任务中均可以达到比较好的效果。

SIDD去噪数据集

image1

GoPro去模糊数据集

image1

去雨数据集

image1

   转载规则


《性能炸裂的HINet》 Severus 采用 知识共享署名 4.0 国际许可协议 进行许可。
 本篇
性能炸裂的HINet 性能炸裂的HINet
HINet: Half Instance Normalization Network for Image Restoration Paper: https://arxiv.org/pdf/2105.06086.pdf Code: http
2021-07-17 Severus
下一篇 
Canny、Sobel、Laplace区别 Canny、Sobel、Laplace区别
Canny、Sobel、Laplace区别边缘其实就是图像上灰度级变化很快的点的集合。 如何计算出这些变化率很快的点? 1.导数,连续函数上某点斜率,导数越大表示变化率越大,变化率越大的地方就越是“边缘”,但是在计算机中不常用,因为在斜率9
2021-06-20 Severus
  目录