整个世界都是你的绿幕:这个视频抠图换背景的方法着实真假难辨

1,788 阅读8分钟

绿幕是影视剧中抠图、换背景的利器,但如果不在绿幕前拍摄,我们还能完美地转换背景吗?华盛顿大学的研究者最近就上传了这样一份论文,不在绿幕前拍摄也能完美转换视频背景,让整个世界都变成你的绿幕。

机器之心报道,参与:Racoon张倩。

从作者给出的 demo 可以看到,他们的方法效果非常惊艳,即使视频中的人疯狂甩头发也没有影响合成效果:

做各种动作也没有「穿帮」:

即使人物和背景不好区分、手持镜头稍微晃动时抠图效果也不赖:

目前,这篇论文已被 CVPR 2020 大会接收。
  • 论文链接:https://arxiv.org/pdf/2004.00626.pdf

  • GitHub链接:https://github.com/senguptaumd/Background-Matting

在论文中,研究者提出了一种创建蒙版(matting)的新方法。多数现有的蒙版方法都需要以绿幕为背景,或者手工创建一个三元图(trimap)。当然,也有些自动方法不需要三元图,但效果会很差。本文提出的这个蒙版方法也不需要三元图,但抠图、换背景效果要更好。

当然,达到这么好的效果是有条件的。除了原始图像/视频之外,研究者还要求拍摄者多拍一张不带人物的背景图。这一过程要比创建三元图节省很多时间。研究者用对抗损失训练了一个深度网络,用来预测蒙版。他们首先利用带有 ground truth 的合成数据训练了一个具有监督损失的蒙版网络。为了在不加标记的情况下缩小合成图像与真实图像的差距,他们在第一个网络的指导下训练了另一个蒙版网络,并通过一个判别器来判断合成图像的质量。研究者在诸多图像和视频上测试了他们提出的新方法,发现这一方法显著优于之前的 SOTA。


在关于这一论文的讨论中,我们可以看到很多潜在的应用场景,比如 vlog(云旅游)、视频会议等。
对于广大「烟酒僧」来说,如果导师下次再让你发一段在实验室工(摸)作(鱼)的视频,或许也能用得上呢。

方法

系统的输入是一张图像或一个视频,图像/视频中的人站在静态的自然背景前,此外还需输入一张纯背景图。背景图的获取很简单,只需要让人物走出取景区域,然后操作曝光、焦距都已固定的相机进行拍摄(如智能手机相机)。对于手持相机,研究者假设相机的移动幅度很小,利用单应性(homography)将背景与给定的输入图像对齐。从输入中,研究者还提取了目标人物的软分割。对于视频输入,可以添加临近的帧来辅助生成蒙版。

图 2:方法概览。

在 Adobe 数据集上进行监督训练

研究者首先在 Adobe Matting 数据集(只用不透明物体的图像)上训练了一个深度蒙版网络。该网络将带有人物的图像 I、纯背景图像 B』、人物 S、相邻帧的时间堆栈 M(可选)的软分割作为输入,输出则是一个前景图 F 和一个前景蒙版α。为了生成 S,研究者应用了人物分割、腐蚀(erode)、膨胀(dilate)以及高斯模糊。在处理视频时,他们将 M 设为 I 前后相连的两帧。设两帧间隔为 T,则选取的相邻帧为 {I−2T , I−T , I+T , I+2T }。这些图像被转换为灰度图,以忽略颜色,更加专注于运动信息。如果输入中没有视频,研究者就将 M 设定为 {I, I, I, I},这些图像也转化为灰度图。将输入集合表示为 {I,B′,S,M},权重参数为θ的网络的运算可表示为:
研究者提出了一个语境转换块(Context Switching block,CS block)网络,以根据输入图像更有效地结合所有输入信息的特征(见上图 2)。举个例子,当人物的一部分背景相似时,网络应该更加关注该区域的分割线索。该网络有四个编码器,分别产生 256 个通道的特征图,然后通过应用 1x1 卷积、BatchNorm 和 ReLU 将来自 I 的图像特征分别与 B '、S 和 M 的结合起来,为这三对中的每一对生成 64 通道特征。最后,他们通过 1x1 卷积、BatchNorm 和 ReLU 将这三组 64 通道特征与最初的 256 通道特征相结合,得到编码后的特征并将其传给网络的其他部分,包括残差块和解码器。研究者观察到,上述 CS 块架构有助于网络从 Adobe 数据集泛化到实际数据。

研究者在 Adobe 数据集上用监督损失训练网络 G_Adobe ≡ G(·; θ_Adobe):


其中,(F, α) = G(X; θ_Adobe),梯度项α 可以鼓励模型生成更高锐度的图像。

在无标记真实数据上进行对抗训练

虽然研究者提出的 CS 块在结合了数据增广后,显著缩短了真实图像与使用 Adobe 数据集合成的图像之间的差距。然而,该方法在处理真实图像时仍然存在以下困难:
  • 在手指、手臂、头发附近的背景被复制到蒙版中;

  • 图像分割失败;

  • 前景重要部分的颜色与背景颜色相似;

  • 图像与背景之间没有对齐。


为解决以上问题,研究者提出用一种自监督学习方法从未标注的真实数据中训练模型。

该方法的主要思路是:蒙版估计中的主要误差会导致在新背景下合成的图片失真。例如,不好的蒙版可能会包含一些原图像背景,当在与新背景合成时会将之前背景的一部分内容复制到新背景下。于是,研究者训练了一个对抗判别器来区分合成图像与真实图像,以此提高蒙版网络的性能。

研究者使用 LS-GAN 框架来训练生成器 G_{Real} 与判别器 D,最小化以下目标函数来训练生成器:


其中,(F, α) = G(X; θ_{Real}),\bar{B} 为判别器用于生成合成图像的给定背景。研究者将λ设置为 0.05,并在训练过程中每两个 epoch 将其减少一半,以使判别器起到重要作用。研究者给 alpha 损失函数设置了较高的权重来鼓励模型生成更高锐度的图像。

研究者使用如下目标函数训练判别器:


其中,θ_{Disc} 代表判别器网络的权重,同时 (F, α) = G(X; θ_{Real})。

实验结果

研究者将该方法与其他方法进行了比较,包括几种在基准上表现良好的深度蒙版算法,比如 Bayesian Matting、Context-Aware Matting、Index Matting 和 Late Fusion Matting。

在 Adobe 数据集上的结果

研究者首先使用 2.69 万个样本来训练 GAdobe,在 100 个随机背景上合成 269 个目标,加上背景的扰动版本作为网络输入,使用 Adam 优化器进行训练,批处理大小为 4,学习率为 1e。

实验比较了 Adobe Dataset 中 220 种合成素材的结果,如下图所示:

表 1:Adobe Dataset 上的 Alpha 蒙版错误,数值越低代表性能越好。

真实数据上的结果

此外,研究者使用智能手机 iPhone 8 在室内和室外分别在手持和固定摄像机的情况下拍摄了视频。

图 3:(a-e)是自然背景下手持相机拍摄视频所呈现的 alpha 通道和前景,(e)是一个动态背景下的失败案例。

除此之外,研究者针对用户群体进行了调查,结果包括测试视频的评分总和。分数证明本论文所提出的方法优于其他方法,尤其是在摄像机拍摄的场景下,但手持拍摄的视频中,由于非平面背景导致的视差,还是会出现一些蒙版错误。

表 2:在 10 个真实世界视频中的用户研究结果(固定摄像机)。

表 3:在 10 个真实世界视频上的用户研究(手持相机)。

开源代码使用简介

环境配置

将项目克隆到本地:
git clone https://github.com/senguptaumd/Background-Matting.git

作者提供的代码需要在 Python 3 环境下运行,并在 Pytorch=1.1.0,Tensorflow=1.14,cuda10.0 版本下测试通过。接下来我们创建 conda 虚拟环境并安装依赖项:
conda create --name back-matting python=3.6
conda activate back-matting

确保 CUDA 10.0 为默认的 cuda。如果电脑上 CUDA 10.0 安装在/usr/local/cuda-10.0 目录下,运行如下命令:
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64
export PATH=$PATH:/usr/local/cuda-10.0/bin

安装 PyTorch 和 Tensorflow 以及相关依赖项:
conda install pytorch=1.1.0 torchvision cudatoolkit=10.0 -c pytorch
pip install tensorflow-gpu=1.14.0
pip install -r requirements.txt

在样本图像上运行推断程序

(1)准备数据

为实现对人物抠图的绿幕效果,我们需要以下数据:

  • 带有人物的图像(扩展名为_img.png)

  • 没有人物的背景图像(扩展名为_back.png)

  • 需要插入人物的目标背景图像(存放在 data/background 文件夹下)


我们也可使用 sample_data/文件夹进行测试,并参考它准备自己的测试数据。

(2)预训练模型

从作者提供的云盘中下载预训练模型,并将其放在 Models/目录下。

  • Pre-processing

  • Segmentation

  • Background Matting needs a segmentation mask for the subject. We use tensorflow version of Deeplabv3+.


(3)预处理

作者使用 TensorFlow 版的 Deeplabv3+来生成用于人物抠图的分割 mask:
cd Background-Matting/
git clone https://github.com/tensorflow/models.git
cd models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slimcd ../..
python test_segmentation_deeplab.py -i sample_data/input
当然,我们也可以使用其他任何一种图像分割网络来替代 Deeplabv3+。将分割后的结果保存成扩展名为_masksDL.png 的文件。

之后,我们需要对图像进行对齐预处理,即将背景与输入图像进行对齐。需要注意的是,在拍摄图像时我们需要关闭自动对焦与自动曝光功能。运行 python test_pre_process.py -i sample_data/input 即可对图像进行预处理。它会自动地对齐背景图片,并调节偏置与增益来匹配输入图像。

(4)人像抠图

运行如下代码即可实现背景替换。对于使用了三脚架来拍摄的图片,选择-m real-fixed-cam 可得到最好的效果。选择-m syn-comp-adobe 会让我们使用在 Adobe 合成数据集上训练的模型,而不是真实的数据(效果最差)。
python test_background-matting_image.py -m real-hand-held -i sample_data/input/ -o sample_data/output/ -tb sample_data/background/0001.png