image restorationlatent

keywords image restoration
release time 2020.4.20
journal CVPR2020 oral
intorduction 实现了三个domain的图像转换,出色地实现了图像修复
institution Microsoft
other

这篇文章和我目前的工作内容非常贴!!好好学习一下里面对一些内容的叙述方法~
PS: 这篇文章有两个版本,journal版本比CVPR的版本多了很多细节,推荐journal版本。

Title

Bringing Old Photos Back to Life

Information

论文地址:https://arxiv.org/pdf/2009.07047v1.pdf
github地址:https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life

Summary

作者将图像复原的问题分解成 图像的Decoder/Encoder + latent translation的问题。将真实受损老照片和生成的受损老照片用VAE映射到同一个latent space,再用一个考虑了global和local的网络将其映射到干净照片的latent space,最后生成图片。

Contribution(s)

  1. latent restoration
  2. three domain

    Problem Statement

    恢复受损严重(severe degradation)的老照片。
    作者把degradation分为两类:非结构化受损(噪声、模糊、色彩淡化、低分辨率),结构化受损(孔缝、划痕、污点)
    现有图像复原方法都很依赖生成图像的质量;仅考虑非结构化受损/结构化受损的一方面,没有全部考虑。因此总结一下面临的挑战:无法监督学习,degradation复杂,无法准确构造老照片的数据集。

    Method(s)

    Restoration via latent space translation

    作者为了减化问题,将老照片修复当成是image translation问题。区别于一般的image translation学习两个不同domain间的联系,本文需要学习三个domain:真实的老照片R,生成的受损老照片X、对应的修复好的ground truth Y。三维domain的转换在本文算法中至关重要。
    X和Y中的图片是一一对应的,也就是说x是根据y生成的受损照片。想直接学习从R到Y的映射很难,因为不配对无法使用监督学习。为此,作者将translation分解成两个步骤,如下图所示。
    Bringing Old Photos Back to Life - 图1

  3. 将R、X、Y映射到latent code Z(映射网络用E表示,图中的蓝色实线、紫色实线)。由于R(真实老照片)和X(生成的老照片)都受损,他们应表现出相同特征,latent code应该在同一空间内。为此作者将R和X的latent space加了些限制,做了对齐。

  4. 学习从X的latent space到Y的latent space的映射(映射网络用T表示,图中的黄虚线)
  5. 学习从latent code生成修复后照片Y的生成网络G
  6. 最终,修复一张老照片的流程为:Bringing Old Photos Back to Life - 图2

    Domain alignment in the VAE latent space

    Bringing Old Photos Back to Life - 图3
    整个结构可以分成两个阶段,如上图中的阿拉伯数字所示。本节介绍网络结构的第一阶段:学习图像和latent code间的映射。
    上文也提到了,需要将真实老照片和生成老照片映射到同一个latent space中。为了达到这一目标,真实老照片和生成老照片的映射共用一个VAE1(包括Encoder和Generator)。全部的VAE都假设latent codes呈高斯先验,这样图像可以通过采样重建。此外,作者还采用了re-parameterization trick(文献46)支持随机采样可微,这样就能用数据集R和X来分别优化VAE1。

用R来优化VAE1的损失函数如下:
Bringing Old Photos Back to Life - 图4
解释一下这个公式,第一部分是KL散度,用来惩罚潜在分布和高斯先验的偏差,第二部分指VAE重建图像得到的输出需要和输入一致,第三部分则是引入LSGAN中的least-square loss,用来提高VAE生成图像的真实性。用X优化VAE1和用Y优化VAE2的方法同理。(这里的Bringing Old Photos Back to Life - 图5作者在实现中取10)

为了使R和X映射到的latent space尽可能紧凑(这样可以缩小domain gap),作者首先采用了VAE而非vanilla autoencoder,这是因为用KL散度约束的VAE latent编码会更紧凑。接着,作者还训练了一个Discriminator,用来区分某一latent code是来自R还是来自X(即上图中的adv标识)。Discriminator的loss被定义为:Bringing Old Photos Back to Life - 图6

最后整个VAE1的优化目标为:Bringing Old Photos Back to Life - 图7

Restoration through latent mapping

Bringing Old Photos Back to Life - 图8
修复网络的第二阶段,学习从生成老照片到修复后照片的latent code的映射M。
作者认为学习latent restoratioin有三个好处。1. R和X对齐到同样的latent space了,学习到的映射同将能将R的latent code映射到干净无瑕疵的空间。2. 学习低维度的latent映射比学习高维的图像空间映射简单的多。3. 第一阶段的两个VAE是独立训练的,因此图像的重建过程不会受彼此的影响。这样,生成器Gy能永远得到一个干净的图像(与之对应的,如果我们直接使用像素级别的映射,原图中的瑕疵很可能仍然存在。
在这个阶段,作者会固定两个VAE的参数,只训练映射网络。映射网络的损失函数为:
Bringing Old Photos Back to Life - 图9
(实验中,Bringing Old Photos Back to Life - 图10)它由三部分组成,第一部分表示latent space loss,用预期的latent code和输出的latent code的L1距离表示。第二部分借LSGAN的形式引入判别器,利用adversarial loss引导图像的真实性。第三部分,引入feature matching loss让GAN训练地更稳定,通俗地讲,就是一对图像pair,x和y,x获得的修复照片和y获得的重建图像,在adversarial network Bringing Old Photos Back to Life - 图11和预训练网络VGG的多层次特征是一致的(本质上就是perceptual loss)。
Bringing Old Photos Back to Life - 图12

Multiple degradation restoration

Bringing Old Photos Back to Life - 图13image.png
上一节只讲了latent code间映射的整体逻辑,但没有具体讲解网络。之前我们提过,老照片的瑕疵有结构化的和非结构化的。结构化瑕疵的修复依赖于整体特征,非结构化瑕疵的修复则依赖于局部特征。为此,作者构造了global branch,其中包含partial nonlocal block用来考虑全局纹理。
假设F是中间的特征图,m是二值mask,会采样到与F同样的大小,1表示需要修复的受损区域。在F中,i位置的像素和j位置的像素相似度Bringing Old Photos Back to Life - 图15会根据掩摸后Fi和Fj的相关性(Bringing Old Photos Back to Life - 图16)来计算:
Bringing Old Photos Back to Life - 图17
Bringing Old Photos Back to Life - 图18通过embedded Gaussian计算得到。Bringing Old Photos Back to Life - 图19用来将F映射到高斯空间。最终,partial nonlocal block的输出为:
Bringing Old Photos Back to Life - 图20,是每个位置的加权平均相关性特征。前面提到的Bringing Old Photos Back to Life - 图21都是用1×1卷积实现的。

除了global branch,还有一个local branch,根据掩码将它们的结果结合起来:
Bringing Old Photos Back to Life - 图22
Bringing Old Photos Back to Life - 图23表示Hadamard product(其实就是矩阵对应元素相乘)

整体结构

image.png

Experiment

Training dataset

真实数据集来自Pascal VOC dataset
收集了一些老照片的纹理和刮痕,用随机透明度的layer addition, lighten-only and screen modes叠加到真实照片上。为了模拟大范围的照片损坏,作者还生成了带有羽毛和随机形状的孔。
5,718张真实老照片

scratch detection

前面也提到了,partial nonlocal block是需要一个binary mask来标注结构化瑕疵。这里作者是训练了一个Unet结构的网络(作者称其为检测网络)。这个检测网络一开始只用生成图像训练,利用focal loss平衡正负向本。接着从783张有刮痕的老照片中挑出了400张进行finetune。finetune之后的ROC挺高,到0.91
Bringing Old Photos Back to Life - 图25

Evaluation

1、 和SOTA方法的Quantitative comparison

评价标准:

  • PSNR、SSIM:low-level的区别,Operation-wise attention model最优
  • LPIPS:更符合人的感知
  • FID:生成模型的质量,主要计算生成图像和gt图像在特征分布的距离

Bringing Old Photos Back to Life - 图26
虽然这些指标没有都排第一,但作者有给一个合理的解释,证明总体效果仍然是有较高竞争力的。表中的PN表示partial nonlocal block,w/ 是with的意思,w/o是withoud,也证明有global branch效果会更好。

2、Qualitative comparison

image.png
此外,作者还做了user study

3、Ablation Study

(1)Pix2Pix
(2)用KL loss约束的两个VAE(这儿没能理解)
(3)两阶段的网络,即先训练两个VAE,再在不固定VAE的情况下训练映射网络
(4)上文叙述的完整网络(即在3的基础上需要固定VAE)
Bringing Old Photos Back to Life - 图28
Bringing Old Photos Back to Life - 图29

Bringing Old Photos Back to Life - 图30

Conclusion

  1. 效果很好
  2. 但仍然无法解决复杂的伪影

Code

Notes

好的英语写法:

Prior to the deep learning era

好的叙述方法

  1. 受损包括结构化受损和非结构化受损。结构化瑕疵:污点、刮痕,非结构化瑕疵:模糊、噪声、低分辨率、色彩淡化。
    结构化瑕疵需要全局的纹理信息,而非结构化瑕疵更多地依赖于局部的像素信息
  2. 真实照片中的瑕疵多种多样,难以用生成图片的方法去构造他们。
  3. 目前的图像修复技术难以涵盖这么多的瑕疵,因此,我们将其看作一个Image translation问题

Criticism

  1. 为了使R和X映射到的latent space尽可能紧凑,作者采用了VAE而非vanilla autoencoder,那别的有尝试吗?比如使用style gan中的mapping network是什么效果?
  2. 作者说nonlocal block利用mask input排除受损区域。哪里来的mask input
  3. 作者说monlocal block要mask input标识structured defect,说是训练一个检测网络。应该是训练了一个分割网络吧。

    Reference

    非结构化受损(噪声、模糊、色彩淡化、低分辨率)的图像复原技术:
  • non-local self-similarity
    • 15
    • 16
    • 17
  • sparsity
    • 18
    • 19
    • 20
    • 21
  • local smoothness
    • 22
    • 23
    • 24
  • image denoising
    • 5
    • 6
    • 25
    • 26
    • 27
    • 28
    • 29
  • super resolution
    • 7
    • 30
    • 31
    • 32
    • 33
  • deblur
    • 8
    • 34
    • 35
    • 36

结构化受损(孔缝、划痕、污点)的图像复原技术:

  • 37
  • 38
  • 39
  • 40