机器之心报道
绿幕是影视剧中抠图、换背景的利器,但如果不在绿幕前拍摄,我们还能完美地转换背景吗?华盛顿大学的研究者最近就上传了这样一份论文,不在绿幕前拍摄也能完美转换视频背景,让整个世界都变成你的绿幕。
从作者给出的 demo 可以看到,他们的方法效果非常惊艳,即使视频中的人疯狂甩头发也没有影响合成效果:
?做各种动作也没有「穿帮」:
即使人物和背景不好区分、手持镜头稍微晃动时抠图效果也不赖:
目前,这篇论文已被 CVPR 2020 大会接收。
在论文中,研究者提出了一种创建蒙版的新方法。多数现有的蒙版方法都需要以绿幕为背景,或者手工创建一个三元图。当然,也有些自动方法不需要三元图,但效果会很差。本文提出的这个蒙版方法也不需要三元图,但抠图、换背景效果要更好。当然,达到这么好的效果是有条件的。除了原始图像/视频之外,研究者还要求拍摄者多拍一张不带人物的背景图。这一过程要比创建三元图节省很多时间。研究者用对抗损失训练了一个深度网络,用来预测蒙版。他们首先利用带有 ground truth 的合成数据训练了一个具有监督损失的蒙版网络。为了在不加标记的情况下缩小合成图像与真实图像的差距,他们在第一个网络的指导下训练了另一个蒙版网络,并通过一个判别器来判断合成图像的质量。研究者在诸多图像和视频上测试了他们提出的新方法,发现这一方法显著优于之前的 SOTA。
在关于这一论文的讨论中,我们可以看到很多潜在的应用场景,比如 vlog、视频会议等。
对于广大「烟酒僧」来说,如果导师下次再让你发一段在实验室工作的视频,或许也能用得上呢。
图 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),梯度项α 可以鼓励模型生成更高锐度的图像。
为解决以上问题,研究者提出用一种自监督学习方法从未标注的真实数据中训练模型。该方法的主要思路是:蒙版估计中的主要误差会导致在新背景下合成的图片失真。例如,不好的蒙版可能会包含一些原图像背景,当在与新背景合成时会将之前背景的一部分内容复制到新背景下。于是,研究者训练了一个对抗判别器来区分合成图像与真实图像,以此提高蒙版网络的性能。研究者使用 LS-GAN 框架来训练生成器 G_{Real} 与判别器 D,最小化以下目标函数来训练生成器:
其中,(F, α) = G(X; θ_{Real}),bar{B} 为判别器用于生成合成图像的给定背景。研究者将λ设置为 0.05,并在训练过程中每两个 epoch 将其减少一半,以使判别器起到重要作用。研究者给 alpha 损失函数设置了较高的权重来鼓励模型生成更高锐度的图像。研究者使用如下目标函数训练判别器:
其中,θ_{Disc} 代表判别器网络的权重,同时 (F, α) = G(X; θ_{Real})。
表 1:Adobe Dataset 上的 Alpha 蒙版错误,数值越低代表性能越好。
图 3:是自然背景下手持相机拍摄视频所呈现的 alpha 通道和前景,是一个动态背景下的失败案例。除此之外,研究者针对用户群体进行了调查,结果包括测试视频的评分总和。分数证明本论文所提出的方法优于其他方法,尤其是在摄像机拍摄的场景下,但手持拍摄的视频中,由于非平面背景导致的视差,还是会出现一些蒙版错误。
表 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.6conda activate back-matting
确保 CUDA 10.0 为默认的 cuda。如果电脑上 CUDA 10.0 安装在/usr/local/cuda-10.0 目录下,运行如下命令:
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64export PATH=$PATH:/usr/local/cuda-10.0/bin
安装 PyTorch 和 Tensorflow 以及相关依赖项:
conda install pytorch=1.1.0 torchvision cudatoolkit=10.0 -c pytorchpip install tensorflow-gpu=1.14.0pip install -r requirements.txt
我们也可使用 sample_data/文件夹进行测试,并参考它准备自己的测试数据。预训练模型从作者提供的云盘中下载预训练模型,并将其放在 Models/目录下。
预处理作者使用 TensorFlow 版的 Deeplabv3+来生成用于人物抠图的分割 mask:
cd Background-Matting/git clone https://github.com/tensorflow/models.gitcd 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 即可对图像进行预处理。它会自动地对齐背景图片,并调节偏置与增益来匹配输入图像。人像抠图运行如下代码即可实现背景替换。对于使用了三脚架来拍摄的图片,选择-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
免责声明:本站内容和图片由网友提供或来自网络。
如有违反到您的权益,请通知我们删除处理。文章仅代表作者本人的观点,与本站立场无关!
© 2023 nvsheng.cc 女生-个人图集收集 蜀ICP备2021006193号-3|川公网安备 51130202000403号
发表评论