文章目录
1.本文的出发点(motivation)
1.图像修复现存在的问题
研究人员认为,现有的基于深度学习的图像修复方法不够好,是因为丢失像素的输出必然取决于输入的值,而这些输入的值(通常是数据集的均值)必须要提供给神经网络,以修复出丢失的像素。这就导致图像中出现的诸如颜色差异或者模糊之类的artifacts.
最近图像修复的局线性都是关注矩形孔洞缺失,这种限制可能会导致模型过度的适应矩形孔洞缺失的修复,这样会限制模型在实际中的应用效果。
2.本文的动机
针对目前存在这个问题,本文的作者提出了部分卷积的方法和思想,确保丢失的像素的修复输出结果不依赖为这些像素提供的输入的值。这种方法使用一个“部分卷积”层,根据其对应的接受域(感受野)的有效性,对每个输出进行重新归一化,这种重新归一化可以确保输出值与每个接受域中缺失像素的值无关。本文的工作旨在实现与空洞初始化值无关并且没有任何额外的后处理的良好合并孔预测。
2.本文的实现方法
2.1 部分卷积层
其中W表示卷积核的权重,b是相应的bias,X是当前滑动窗口中的特征值,M是相应的二进制掩码。⊙表示逐个元素之间的操作,可以看出,输出值仅取决于非屏蔽输入。 比例因子1/sum(M)应用适当的缩放比例来调整有效(未屏蔽)输入的变化量。
部分卷积层内部的实现:它是通过把滑动窗口的image和对应mask做一个⊙(逐元素乘法)运算,放入到搭建好的CNN中去更新,最后它希望mask能够更新为一个全为1的值,也就是新的image所有像素都有效。
如何更新掩模呢?
在每次进行部分卷积操作后,这样更新mask:如果卷积能够在至少一个有效输入值上调整其输出,则这个掩码区域是有效的。
为简洁起见,我们将部分卷积运算和掩膜更新函数联合称为部分卷积层
在部分卷积层有足够的连续应用的情况下,如果输入包含任何有效像素,则任何掩膜将最终全部为1。
部分卷积层可以通过扩展现有的标准卷积层进行实现:
直接的实现是定义大小为C×H×W的二进制掩膜,与相关的图像/特征具有相同的大小,然后使用固定卷积层实现掩膜更新,其具有与部分卷积操作相同的内核大小,但权重相同地设置为1并且偏置设置为0.
2.2本文采用的网络架构
网络架构采用与U-net网络类似的结构,用部分卷积替换所有的卷积层,在解码器阶段使用最近邻上采样法。
跳跃连接将连接对应的编码器和解码器中的特征图和掩码,作为下一个部分卷积层的feature和mask输入。最后的部分卷积图层的输入将包含原始输入图像与孔和原始蒙版的拼接。这使模型可以简单地复制无孔像素。
网络架构是基于UNet的改进,左边包括8个部分卷积层PCONV1-PCONV8,负责图像的编码,右边包括8个部分卷积层PCONV9-PCONV16负责解码,解码层的输入是上一层图upscale(为了保证和编码层原图大小一致)后和对应编码层(可以理解为“原图”)在channels维度上的一个concatenate(拼接)。直观上理解的话,编码层卷积的目的是提取图像的特征值和信息,解码层卷积的目的是从channels维度上让编码层图片(原图)与上一个解码层(绘制图片)做一个风格上的融合和逼近。
3.本文的损失函数
数学符合描述:
I i n I_{in} Iin表示初始的带洞的原图,M为二进制掩码(0代表为holes),网络修复的 结果为 I o u t I_{out} Iout,真实的图片表示为 I g t I_{gt} Igt
3.1逐像素重建损失
ζ h o l e = 1 N I g t ∣ ∣ ( 1 − M ) ⊙ ( I o u t − I g t ) ∣ ∣ 1 \zeta_{hole}=\frac{1}{N_{I_{gt}}}||(1-M)⊙(I_{out}-I_{gt})||_1 ζhole=NIgt1∣∣(1−M)⊙(Iout−Igt)∣∣1
ζ v a i l d = 1 N I g t ∣ ∣ M ⊙ ( I o u t − I g t ) ∣ ∣ 1 \zeta_{vaild}=\frac{1}{N_{I_{gt}}}||M⊙(I_{out}-I_{gt})||_1 ζvaild=NIgt1∣∣M⊙(Iout−Igt)∣∣1
N
I
g
t
N_{I_{gt}}
NIgt表示
I
g
t
I_{gt}
Igt元素的个数(H x W x C)
Lvalid是有效区域的代价损失;Lhole是遮挡区域的代价损失;
3.2感知损失(perceptual loss)
这里 I c o m p 为 原 始 的 输 出 图 I o u t I_{comp}为原始的输出图I_{out} Icomp为原始的输出图Iout,但是非孔洞区域被替换为原始的真实图.
N ψ p I g t N_{\psi_{p}^{I_{gt}}} NψpIgt表示在 ψ p I g t \psi_{p}^{I_{gt}} ψpIgt中的元素数目,感知损失是计算 I o u t 、 I c o m p 和 I g t 之 间 的 感 知 特 征 的 L 1 距 离 I_{out}、I_{comp}和I_{gt}之间的感知特征的L1距离 Iout、Icomp和Igt之间的感知特征的L1距离
感知特征的提取是用在Image-net上预训练的 VGG 模型对其图片提取高层次的特征。 ψ p I ∗ \psi_p^{I_*} ψpI∗表示提取输入 I ∗ I_* I∗在VGG上第p层的特征。文中使用的 pool1 , pool2, pool 3。
3.3风格损失(style loss)
与感知损失类似,但是还是有很大区别。
在计算 L1 距离前,引入了一个自相关矩阵(Gram matrix),在每个特征图上执行自相关。
矩阵运算假设高层特征的shape是(H x W x C),计算得到的自相关Gram matrix矩阵是(C x C), K p K_p Kp是第p个选择的归一化
因子 1 / C p H p W p 1/C_pH_pW_p 1/CpHpWp
3.4 TV loss(total variation loss)
这是R上的平滑惩罚[28],其中R是孔区域的1像素扩张区域。它计算的是把孔扩张1像素后和原comp图像的损失值(即平滑罚分),那TV损失其实就是用来保证孔边界区域的平滑自然。
3.5总损失
通过对100个验证图像执行超参数搜索来确定损失项权重。
综上,总的损失函数就是把这些复杂的损失函数揉在一起,但其实用一种更直观的方式去理解,我觉得会更能说明白一些。如果把问题看成生成问题,那就是代价损失;如果把问题看成变换问题,那就是感知损失和风格损失;如果把问题看成边界过渡问题,那就是总变差(TV)损失。而本模型把问题看成了上述问题的总和,于是就把这一堆损失函数给揉在了一起。至于它们的权重是如何分配的,文中只写了一个通过实验得出。
4参考文献
- Image Inpainting for Irregular Holes Using Partial Convolutions