1. 简介
图像修复是对图像中缺失的区域进行填补。相比较传统的修复算法,深度学习借助大量的数据和强大的模型,赋予图像修复更多的想象力,尤其在缺失区域比较大的情形,深度学习往往能够获得比较满意的结果。本文对Deep Video Inpainting这篇论文的要点和代码进行解析。
论文对视频的缺失区域进行填补,需要解决的问题有2个:1)对单帧图片进行修复;2)保证修复视频的连续性。同一视频的相邻帧提供了一个场景的不同角度的信息,这些信息可以辅助单帧的修复。因此本文从单帧修复、相邻帧信息借鉴以及结果视频连续性三个角度对论文进行解析。
2. 论文解析
2.1 单帧修复
论文采用的修复模型主体是U-Net,输入是待修复的图片帧与指示需要修复区域的mask。为了能够更好的处理这种输入,U-Net中每层不再是普通的卷积,而是替换为了Gated Convolution,这是一种在深度学习修复问题中常用的卷积,在非修复问题中也可以当作注意力模型用。这一部分的损失包括2个:L1损失和SSIM损失。
2.2 帧间信息借鉴
单帧图像修复除了去猜修复区域的内容以外,还可以从正常的区域去借鉴来使得整张图的修复结果更合理。相比较单帧的修复,视频中相邻的帧也可以提供修复所需要的参考信息。论文中使用当前帧之前的第6帧、第3帧以及之后的第3帧、第6帧作为参考,对这些帧们首先计算与当前帧的光流,然后利用光流对这些帧们做仿射变换,最后从变换后的帧中提取可以借鉴的信息。
由2.1可知,单帧(当前帧)修复采用U-net结构,即一个encoder和一个decoder。参考帧们和当前帧共用一个decoder,参考帧们的encoder和当前帧的encoder结构一样,但不共用。参考帧们和当前帧使用encoder每次降低分辨率后的特征计算光流并做仿射变换,在不同的分辨率下做信息借鉴,提升整体修复的效果。这部分的损失包含2个:光流损失和仿射变换损失。论文中作者使用的光流真值(ground truth)是用FlowNet2计算出来的。
2.3 结果一致性
视频修复除了要保证单帧修复结果好外,还要保证修复视频的一致性。这里论文采用2个方法:一是把上一帧的输出作为当前帧的一个参考帧,这帧和2.2中的参考帧们共用一个encoder,这个是用来保持短时的连续性;二是使用LSTM来记录从第一帧到当前帧的信息,这个用来保证长时的连续性。这两个机制可以作为一个基本的框架用于视频处理相关的任务中。
3. 代码解析
论文作者使用Pytorch对模型进行了开源,目前只有测试代码和训练好的模型,我改写了一个Tensorflow版本的测试代码。除了上面提到的encoder、decoder、LSTM之外,还有光流计算、仿射变换等模块。这里简单说一个模块:Aggregator和MaskEstimator。之前介绍了输入除了当前帧外,还有5个参考帧们,到底从这些参考帧们里面借鉴多少东西,借鉴哪里的内容,论文作者首先用Aggregator将5个参考帧们结合到一起,然后利用MaskEstimator学习一个mask,最后利用这个mask将参考帧们的特征和当前帧的特征结合到一起。这让我觉得深度学习是黑盒还是工具取决于我们对问题的分解和系统的设计。