23

这项开源视频抠图技术火了!换背景的方法着实真假难辨

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzIwMTE1NjQxMQ%3D%3D&%3Bmid=2247502020&%3Bidx=2&%3Bsn=4da48408178fbeb670f5a7fe47b6b1d5
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

a2Ejmye.gif

参与:Racoon、张倩

转自:机器之心

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

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

fIj6BfU.gif

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

iUvMFfY.gif

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

iaMB3uQ.gif

目前,这篇论文已被 CVPR 2020 大会接收。

MRf6neM.png!web

  • 论文链接: https://arxiv.org/pdf/2004.00626.pdf

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

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

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

6b2ueej.png!web

在关于这一论文的讨论中,我们可以看到很多潜在的应用场景,比如 vlog(云旅游)、视频会议等。

UBzENv3.png!web

vemAJru.png!web

对于广大「烟酒僧」来说,如果导师下次再让你发一段在实验室工(摸)作(鱼)的视频,或许也能用得上呢。

方法

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

qARnmqA.png!web

图 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},权重参数为θ的网络的运算可表示为:

Y3qIN3v.png!web

研究者提出了一个语境转换块(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):

IbABzyJ.png!web

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

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

虽然研究者提出的 CS 块在结合了数据增广后,显著缩短了真实图像与使用 Adobe 数据集合成的图像之间的差距。然而,该方法在处理真实图像时仍然存在以下困难:

  • 在手指、手臂、头发附近的背景被复制到蒙版中;

  • 图像分割失败;

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

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

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

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

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

jiIFjaa.png!web

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

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

FvEfyaM.png!web

其中,θ_{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 种合成素材的结果,如下图所示:

mMVfyu2.png!web

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

真实数据上的结果

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

V7jqemi.png!web

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

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

nAr2quY.png!web

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

M3aYneA.png!web

表 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

END

jMnymmm.png!web

备注:分割

YfUNvaJ.jpg!web

图像分割交流群

语义分割、实例分割、全景分割、抠图等技术, 若已为CV君其他账号好友请直接私信。

我爱计算机视觉

微信号 : aicvml

QQ群:805388940

微博/知乎:@我爱计算机视觉

投稿:[email protected]

网站:www.52cv.net

byA7ju3.jpg!web

在看,让更多人看到   fUJvIbe.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK