最近做了一个图像修复的project,感觉这两篇论文很好,就写点笔记嘿嘿
Context Encoder是根据AE(Auto-Encoder)修改得到。
AE在我的之前的blog里有讲解过哦,可自取~(https://blog.csdn.net/HustQbw/article/details/114670216)
我们知道,AE是一种编码器-解码器架构,用于对数据压缩、解压缩和图像去噪,但由于未在原有数据上引入约束(即新的信息),所以难以用于生成。
但这种编码器-解码器架构十分值得借鉴,先将图像用卷积层编码到一个低分辨率多通道的feature map,再进行反卷积上采样。
但有一个问题:卷积层只能联系像素点与其领域的特征,难以联系到全局的大部分乃至所有location。
这里就有点像分类问题了,分类问题总是先用卷积层、池化层进行特征提取,最后flatten到一维向量,利用全连接层得到分类结果。
这里全连接层所起到的作用就是整合全局所有位置的特征信息,或者说,全连接层屏蔽了特征在location上的差异(很容易理解,一维的向量就不存在空间位置的说法了),进行了全局的整合
但全连接层同样存在一个众所周知的问题:参数太太太太多了
所以作者使用了另一种全连接层————channel-wise fully-connected layer
Thus, the number of parameters in this channel-wise fully-connected layer is mn4 , compared to m2n4 parameters in a fully-connected layer (ignoring thebias term).
说白了,其实就是用1x1的conv来代替全连接层,用(batch_size,m,1,1)来代替(batchsize,m),不知道这样说会不会很抽象,但应该可以理解:)
得到channel-wise的fully-connected layer后就相当于得到了一个整合了图片除了缺失区域的其他部分的vector,再将这个vector上采样回到原图尺寸(原文里回到了64x64,因为作者修复的是中心部分的64x64的矩形部分)
所以总结可以得到:
Context Encoder = 下采样Encoder + channel-wise fully-connected layer +上采样Decoder
作者的两个网络结构如下:
一种适用于固定大小比例、固定形状的修复(128x128到64x64):
一种适用于不固定大小,不固定形状的修复(原图大小到原图大小):
判别器和GAN里的判别器类似,即判断真or假,来进行生成器与判别器的对抗
判别器的损失函数和常规GAN类似,就偷懒不赘述啦嘿嘿
Context Encoder运用的是一种无监督的学习,即你只需要提供你的task所需的data,然后随意得到mask,输入网络的既有完整图片也有得到的mask即可实现,而不需要认为的打标
重建Loss 是一个L2 距离,主要用来规范重建过程中的行为,让重建结果更具结构且与周围的信息一致。
作者尝试了L1和L2的loss,最后发现结果差不多。
我在跑代码的时候发现一个问题,就是L2 loss会让恢复的部分趋向于此位置整个训练集像素值的平均值,所以图片会比较模糊,难以捕捉到细节,和论文里所述一致
这里的原因是,要minimize L2 loss事实上就是在最大化一个高斯分布的log_likelihood
比如要拟合猫的分布,每一种猫都会带来一个峰值,L2 loss就是用一个高斯分布去拟合这个多峰的训练集分布,所以就会趋向于训练集的均值。
对于一副图像中的空白区域,可能有多种填充方式(修复任务的ground truth事实上是不唯一的,甚至可以认为没有ground truth)符合整体结构以及可以与周围信息很好地接洽,我们称之为不同的模式,而对抗Loss 就是用来进行模式选择。(学习缺失区域的数据分布)
通过结合重建Loss 及对抗Loss,可以让生成结果即具备相当的结构性,又符合整幅图像的语义。
这篇论文主要针对Context Encoder的两个点进行了修改
不使用channel-wise fully-connected layer,而改为使用dilated convoluton,这样就不会限制输入的尺寸了,可以适用于任意分辨率图像的修复
并且,原文的dilation选的很大,我认为这样也可以一定程度上实现channel-wise fully-connected layer整合全局信息的作用,因为dilation选的很大就可以连接距离较远的两个特征点
还有一点,空洞卷积和标准卷积,在相同参数量的情况下,空洞卷积可以提升更多的感受野。原文提到,若采用相同参数的标准卷积只能得到99的感受野,而使用空洞卷积可以获得307的感受野(这里我怎么算都算的是287,大家可以算一下,纠正一下我T T)
除了原有的Local Discriminator,这里还加入了全局的判别器,进行双重判别,这样可以在Context Encoder的基础上有更加好的视觉质量,并且对人的五官等复杂结构也可以有比较好的恢复
可以这样理解,比如要修复的地方是鼻子的右半边,但左半边结构还在,做个镜像就得到了右半边,这就是联合了全图判别的一个好处吧(根据论文标题,就是即提升了局部的一致性consistency,也提升了全局的一致性)
github和gitee都已经发啦
如果登不上github可以去码云gitee来一波git clone哦
记得来个star嘿嘿
https://gitee.com/HustQBW/context-encoder
https://github.com/HustQBW/Context-Encoder