从作者给出的demo可以看到,他们的方法效果非常惊艳,即使视频中的人疯狂甩头发也没有影响合成效果:
做各种动作也没有「穿帮」:
即使人物和背景不好区分、手持镜头稍微晃动时抠图效果也不赖:
目前,这篇论文已被CVPR2020大会接收。
在论文中,研究者提出了一种创建蒙版(matting)的新方法。多数现有的蒙版方法都需要以绿幕为背景,或者手工创建一个三元图(trimap)。当然,也有些自动方法不需要三元图,但效果会很差。本文提出的这个蒙版方法也不需要三元图,但抠图、换背景效果要更好。
在关于这一论文的讨论中,我们可以看到很多潜在的应用场景,比如vlog(云旅游)、视频会议等。
对于广大「烟酒僧」来说,如果导师下次再让你发一段在实验室工(摸)作(鱼)的视频,或许也能用得上呢。
方法
系统的输入是一张图像或一个视频,图像/视频中的人站在静态的自然背景前,此外还需输入一张纯背景图。背景图的获取很简单,只需要让人物走出取景区域,然后操作曝光、焦距都已固定的相机进行拍摄(如智能手机相机)。对于手持相机,研究者假设相机的移动幅度很小,利用单应性(homography)将背景与给定的输入图像对齐。从输入中,研究者还提取了目标人物的软分割。对于视频输入,可以添加临近的帧来辅助生成蒙版。
图2:方法概览。
在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})。
实验结果
研究者将该方法与其他方法进行了比较,包括几种在基准上表现良好的深度蒙版算法,比如BayesianMatting、Context-AwareMatting、IndexMatting和LateFusionMatting。
在Adobe数据集上的结果
研究者首先使用2.69万个样本来训练GAdobe,在100个随机背景上合成269个目标,加上背景的扰动版本作为网络输入,使用Adam优化器进行训练,批处理大小为4,学习率为1e。
实验比较了AdobeDataset中220种合成素材的结果,如下图所示:
表1:AdobeDataset上的Alpha蒙版错误,数值越低代表性能越好。
真实数据上的结果
此外,研究者使用智能手机iPhone8在室内和室外分别在手持和固定摄像机的情况下拍摄了视频。
图3:(a-e)是自然背景下手持相机拍摄视频所呈现的alpha通道和前景,(e)是一个动态背景下的失败案例。
除此之外,研究者针对用户群体进行了调查,结果包括测试视频的评分总和。分数证明本论文所提出的方法优于其他方法,尤其是在摄像机拍摄的场景下,但手持拍摄的视频中,由于非平面背景导致的视差,还是会出现一些蒙版错误。
表2:在10个真实世界视频中的用户研究结果(固定摄像机)。
表3:在10个真实世界视频上的用户研究(手持相机)。
开源代码使用简介
环境配置
将项目克隆到本地:
condacreate--nameback-mattingpython=3.6condaactivateback-matting确保CUDA10.0为默认的cuda。如果电脑上CUDA10.0安装在/usr/local/cuda-10.0目录下,运行如下命令:
condainstallpytorch=1.1.0torchvisioncudatoolkit=10.0-cpytorchpipinstalltensorflow-gpu=1.14.0pipinstall-rrequirements.txt在样本图像上运行推断程序
(1)准备数据
为实现对人物抠图的绿幕效果,我们需要以下数据:
我们也可使用sample_data/文件夹进行测试,并参考它准备自己的测试数据。
(2)预训练模型
从作者提供的云盘中下载预训练模型,并将其放在Models/目录下。
(3)预处理
作者使用TensorFlow版的Deeplabv3+来生成用于人物抠图的分割mask:
之后,我们需要对图像进行对齐预处理,即将背景与输入图像进行对齐。需要注意的是,在拍摄图像时我们需要关闭自动对焦与自动曝光功能。运行pythontest_pre_process.py-isample_data/input即可对图像进行预处理。它会自动地对齐背景图片,并调节偏置与增益来匹配输入图像。
(4)人像抠图
运行如下代码即可实现背景替换。对于使用了三脚架来拍摄的图片,选择-mreal-fixed-cam可得到最好的效果。选择-msyn-comp-adobe会让我们使用在Adobe合成数据集上训练的模型,而不是真实的数据(效果最差)。