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