Image Inpainting for Irregular Holes Using Partial Convolutions

/ by GuoWY / 论文来源: https://arxiv.org/pdf/1804.07723.pdf

总 结

  • 模型很复杂,但效果特别好

      这篇文章的模型挺复杂,我们先依据原文的网络架构表格(如下)

      画出一张对应的网络架构图:

      依据这张图,我们就能比较好的理解原模型的网络架构了。大的架构是基于UNet的改进,左边包括8个部分卷积层PCONV1-PCONV8,负责图像的编码,右边包括8个部分卷积层PCONV9-PCONV16负责解码,解码层的输入是上一层图upscale(为了保证和编码层原图大小一致)后和对应编码层(可以理解为“原图”)在channels维度上的一个concatenate(拼接)。直观上理解的话,编码层卷积的目的是提取图像的特征值和信息,解码层卷积的目的是从channels维度上让编码层图片(原图)与上一个解码层(绘制图片)做一个风格上的融合和逼近。关于部分卷积层内部的实现,它是通过把滑动窗口的image和对应mask做一个⊙(逐元素乘法)运算,放入到搭建好的CNN中去更新,最后它希望mask能够更新为一个全为1的值,也就是新的image所有像素都有效。

      损失函数部分,我觉得它是把能考虑到的损失都考虑进去了。不妨看一下具体定义式:Ltotal = Lvalid + 6Lhole + 0.05Lperceptual + 120( Lstyleout + Lstylecomp ) + 0.1Ltv。其中,Lvalid是有效区域的代价损失;Lhole是遮挡区域的代价损失;Lperceptual是感知损失,它计算的是输出图像、合成输出图像(保留原图真实区域)与真实原图的L1距离;Lstyleout与Lstylecomp都是风格损失,其实风格损失与感知损失很像,但是在计算上风格损失是采用Gram矩阵去计算的距离;最后一个是Ltv,它计算的是把孔扩张1像素后和原comp图像的损失值(即平滑罚分),那TV损失其实就是用来保证孔边界区域的平滑自然。综上,总的损失函数就是把这些复杂的损失函数揉在一起,但其实用一种更直观的方式去理解,我觉得会更能说明白一些。如果把问题看成生成问题,那就是代价损失;如果把问题看成变换问题,那就是感知损失和风格损失;如果把问题看成边界过渡问题,那就是总变差(TV)损失。而本模型把问题看成了上述问题的总和,于是就把这一堆损失函数给揉在了一起。至于它们的权重是如何分配的,文中只写了一个通过实验得出,这个我就无从考证了。

      费了这么多口舌,终于把模型架构和损失介绍完了,下面说一些我的感悟吧。模型确实复杂,但也仅仅只是模块数量上的繁多,它并没有涉及到精巧的算法或大胆的想象。有意思的在于,它完全没有考虑掩模像素的空间位置信息,这意味着掩模形状可以是任意的,大小也可以是任意的,这甚至不影响模型最终的修复效果。我觉得这正是这个模型出众的地方,从实验中与其他模型的比较也可以看出,当掩模不规则或很大时,传统的修复算法都会出问题,但这篇模型依然能够画出极其逼真的修复图像,让人觉得有些不可思议。当然,关于这篇模型我也有些自己疑惑的地方。通常损失函数不应该弄得太复杂,因为复杂的损失函数与模型之间存在不同的相关关系,彼此也容易相互影响,这很容易让模型变得极其不稳定,但这篇文章不仅糅合了足足6个损失函数,还能让模型取得极其稳定和出色的效果,这实在是让人觉得,有点不可思议。不过,或许以后会有更多的论文做出相关方面的论证,给出什么样的损失函数是最优、最合理的。

      

评 论