Reading Video-to-Video Synthesis

论文地址:https://tcwang0509.github.io/vid2vid/paper_vid2vid.pdf

作者:Ting-Chun Wang, Ming-Yu Liu, Jun-Yan Zhu, Guilin Liu, Andrew Tao, Jan Kautz, Bryan Catanzaro

发表: NeurIPS 2018

Project:https://tcwang0509.github.io/vid2vid/

Github:https://github.com/NVIDIA/vid2vid


如果你去做这个任务,会怎么做?作者做的方法和你想的有什么差异?

这篇论文的背景是当时已经有比较好的pic2pic生成模型了。要让vid2vid也work的话,最重要的应该就是帧与帧之间consistency的问题。所以我会想在将pic2pic生成模型应用在video的基础上,对帧之间加上consistency loss。但直接这样肯定效率很低,因为一个视频中帧与帧之间肯定会包含大量冗余信息嘛,应该还需要想办法让帧之间信息共享,这样模型只需要预测后一帧与前一帧不同的地方,减少运算。例如,用一个小网络预测图像中静态与动态的部分,不知道可不可行。

看完文章后:我感觉我在大体思路上把握准了,主要矛盾确实如此。但

  1. 作者没有用consistency loss,而是用gan的思路,设计了一个条件视频鉴别器 \(D_V\),鉴别视频在时序上的动态是否真实自然。
  2. 我没有optical flow,光流,这方面的知识储备;作者利用一个网络预测optical flow,就可以直接根据前一帧图像得到后一帧图像中对应的像素点了,而且这样的结果能够很consistent。对于前一帧图像中没有对应的像素,再用一个补洞网络补洞。这样就解决了效率问题。
  3. 作者还利用了特征嵌入方法,实现了多模态视频的生成,这是我第一次了解到的方法,感觉很有趣。

Why:

  1. 图像水平上的生成被研究得很好,但是视频上的此前却比较少;图像生成的成果如果直接放在视频上的话,效果不太妙,因为帧与帧之间缺乏连贯性。所以是需要一些temporal上的改进的

What:

  1. 利用GAN和一些时间-空间对抗目标(spatio-temporal adverbial objective),来实现video to video的生成。
  2. 用不同类型的输入来生成新的照片写实风格的视频,效果很好。
  3. 是一个全新定义的vid2vid任务,主要新点在于:输入的vid并不是完整的视频帧,而是一些可以操控的语义信息,例如segmentation masks, sketches, and poses

读前疑问:

  1. 在此之前没有比较好的vid2vid,这篇论文是在什么条件下实现了很好的vid2vid效果呢,比如其他方面的技术革新?我觉得主要是利用了gan,一个图像鉴别器+一个视频鉴别器相配合,取得很好的生成效果。除此之外我觉得optical flow用在这里也很好,效率高而且生成效果连贯(但是不知道新不新);另外特征嵌入方法用在这里也很好,实现了根据语义信息来生成新视频,而且可以是多模态的视频
  2. 摘要里强调的时间-空间对抗目标(spatio-temporal adverbial objective)到底是什么?我感觉正文里好像没有再特别强调时间-空间这一对目标了……根据我自己的理解的话,主要就是那一对鉴别器:时间上--视频鉴别器鉴别在时序上的动态是否真实自然,空间上--图像鉴别器鉴别一张图像在空间上是否真实自然。

How:

定义vid2vid任务

  1. 定义输入的语义信息序列为\(s\),对应的真实视频序列为\(x\),模型生成的视频序列为\(\tilde x\),则模型的目标是在给定\(s\)的条件下,让\(\tilde x\)的条件分布拟合\(x\)的条件分布

  2. image-20220524143313609
    image-20220524143313609

    D是discriminator,G是generator。整个任务就变成了一个最大最小优化问题,论文主要通过设计网络和时空优化目标来解决这个问题。

  3. 为了简化问题,做了一个Markov假设:当前第t帧生成的视频\(\tilde x_t\),由且仅由第t帧输入\(s_t\) + 前L帧输入\(s_{t-L}^{t-1}\) + 前L帧生成的视频\(\tilde x_{t-L}^{t-1}\)这三个因素决定。image-20220524144030781

    实验里,L取了个不大不小的2.建立了一个神经网络F,递归地逐帧生成视频。

网络架构

  1. 网络F定义如下:

    image-20220524144722968
    image-20220524144722968

    给定\((\tilde x_{t-L}^{t-1}, s_{t}^{t-1})\)作为输入。对于与上一帧图像有关联的像素点,网络会利用optical flow来warp(扭曲?)上一帧像素点,得到这一帧新的像素点。对应等式的前半部分。还有一些像素是上一帧图像里没有的,这时候就需要生成来填充。对应等式的后半部分。具体来说:

    • 用一个optical flow预测网络W来估计从上一帧到这一帧的optical flow \(\tilde w_{t-1}\).
    • 用一个生成器H来生成需要填充的像素\(\tilde h_t\).
    • 用一个mask预测网络M来生成mask \(\tilde m_t\). 这个mask不是非0即1的,而是包含了0-1之间的连续值。这样做是为了更好地融合W和H生成的结果。比如说,在 zoom in 的情况下,一个物体逐渐靠近,那么它会逐帧放大。如果仅仅利用optical flow的扭曲结果,那么这个物体就会变得模糊。因此,还需要生成器来填充一些细节。有了soft mask,warp的像素和生成的像素就可以融合。
  2. 用了coarse-to-fine的方法来生成高分辨率的视频

  3. 用了2个不同的discriminator来减轻gan训练中的mode collapse问题(模式倒塌,即生成的结果是很逼真,但是多样性不足)。

    1. 条件图像鉴别器 \(D_I\),顾名思义,鉴别每一帧图像是否真实的
    2. 条件视频鉴别器 \(D_V\),鉴别视频在时序上的动态是否真实自然。给定optical flow,鉴别K个连续的帧

losses

\[ \mathop{min}\limits_{F} ( \mathop{max}\limits_{D_I}\mathcal{L}_I (F, D_I ) + \mathop{max}\limits_{D_V} \mathcal{L}_V (F, D_V )) + λ_W L_W (F ), \]

  1. \(\mathcal{L}_I\) 是条件图像鉴别器 \(D_I\)的gan loss:image-20220530194307049,其中,\(\phi_I\) 就是从第1~T帧中随机取1帧的操作
  2. \(\mathcal{L}_V\)是条件视频鉴别器 \(D_V\)的 gan loss:image-20220530194419594,和图像的如出一辙,\(\phi_V\) 就是从第1~T帧中随机取连续K帧的操作
  3. \(L_W\) 是flow estimation loss:image-20220530194534485,包括两部分,1. 真实flow和估计flow的端点误差 2. 把前一帧扭曲到后一帧的warp loss

前景-背景先验

通过语义分割,给模型提供了一个前景、背景的先验信息,同时把补洞网络拆分成了两个:

  1. 背景补洞网络:这个很容易,因为整个大背景其实可以由optical flow很准确地预测出来,补洞网络只需要补一点点从画面外面刚进来的部分
  2. 前景补洞网络:这个比较难,因为前景物品往往占比不大,但是又动作幅度很大,前景补洞网络需要从零开始生成很多东西

通过用户实验,证明大部分人觉得有这个前景-背景先验之后,效果更好。

多模态生成

网络F是一个单模态映射函数,这意味着输入一个视频,它也只能生成一个视频。那怎样让它根据同一个输入视频,输出多个不同的视频呢?这里采用了特征嵌入方法(feature embedding scheme)。

  1. 输入源视频的同时,也输入instance级别的语义分割mask \(s_t\)
  2. 训练一个图像编码器E,它把每一帧真实图像\(x_t\)编码成d维的特征map(论文中d取3)。然后用一个instance-wise的平均池化,来让同一个物体的所有像素分享共同的特征向量。得到的这个instance-wise平均池化后的图像特征map称为\(z_t\)
  3. 这个\(z_t\),加上mask \(s_t\),再被输入到网络F
  4. 以上是训练的过程。训练结束后,对每个类型的对象的特征向量的高斯分布拟合一个混合高斯分布。
  5. 测试的时候,利用每个物体所对应的类型的分布,可以sample特征向量,进而生成新视频了。给出不同的特征向量,F就能生成不同的视频了
img
img

实现的细节

  1. coarse-to-fine的训练:512 × 256, 1024 × 512, and 2048 × 1024 resolutions,这三种分辨率,先从低的开始训练起,逐渐增加到高的。
  2. mask预测网络M和flow预测网络W共享权重,只有输出层不一样。
  3. 图像鉴别器是一个多尺度PatchGAN
  4. 除了空间上的多尺度,视频鉴别器还会考虑多个帧率,即时间上的多尺度,确保短期和长期都能consistent
  5. 2k分辨率,8个v100 gpus,训练10天……
  6. datasets:
    1. Cityscapes:训练DeepLabV3网络来获得所有的语义分割mask,用FlowNet2的结果作为optical flow的ground truth,用Mask R- CNN的结果作为instance- level 语义mask的gt
    2. Apolloscape
    3. Face video dataset:FaceForensics dataset里的真实视频
    4. Dance video dataset:从YouTube下载的跳舞视频💃

结果

图像生成模型pix2pixHD和视频风格迁移模型COVST作为baseline。FID(论文定义的视频变种)跟baseline比略好,但human preference score(论文定义的由人来打分,评估哪个视频更真实)高很多。

通过更改语义mask,可以控制生成视频中的物体种类;通过更改特征向量,可以控制生成视频中的物体外观;在未来视频预测上也有很好的性能。

局限性

  1. 缺少一个物体内部的具体信息,生成转弯的车的时候效果比较差。论文提出或许可以通过增加3D信息作为输入来解决
  2. 在整个视频中,一个物体的外观有时候还是前后不一致
  3. 偶然情况下,一辆车的颜色可能会逐渐发生变化
  4. 当通过更改语义信息来操纵视频生成的时候,例如把树改成房子,偶然会出现一部分变成房子,另一部分树变了形的情况(?是这个意思吗)。这或许可以通过采用更粗糙的语义标签的方式解决,因为这样模型就不会对标签形状过于敏感