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

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达51aa947cb145dc2a6a4b2776f8ac8eb0.png

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

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

2382a8254254154c384bb4a535580871.gif


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

d73bd991c831e4a5db5a54431ee6ff70.gif

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

2ed0c23d8d2db812c9d1d9d82787c6e3.gif

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

c74d61ecb76f1facc982d2d9de46f4cf.png

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

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

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

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

b33435701ab0db1a0700a63dbbbd00ff.png

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

b427b26e049ba31572ca95546625634b.png

e2e96624e67a9c826899b87b9eceb3c3.png

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

方法

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

60b5062831445b27e04f1bc2a372775e.png

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

abeb0d84b704f38c6624e2ff58bbaaca.png

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

5fe14cebb62f136d1c4376139e2eecb9.png

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

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

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

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

  • 图像分割失败;

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

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

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

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

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

bde47ada50a4325516b2918d5cdcbb5e.png

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

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

3c0bc5877550db4a149c3cf53ffc27bd.png

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

315eef38d6913530a232b65fbb878327.png

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

真实数据上的结果

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

d4d5c609f97707122472cf95c48dd4a0.png

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

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

c003f0f1347d436ac382d03e658da718.png

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

a7ee74dbd2f52139e7b14fb785ae00fc.png

表 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

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

d1a7887a2f74df74cce159fb337cef1e.png

4aa77334374a3061c8cac4ad3c648933.png

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 抠图和更背景是图像处理中的两个常见任务。Python中有许多图像处理库,可以帮助我们完成这些任务,其中最常用的是OpenCV和PIL。 抠图可以分为基于颜色和基于形状的方法。基于颜色的方法是通过选择颜色范围来分离前景和背景。基于形状的方法是通过选择前景和背景的边界来分离它们。 以下是使用OpenCV和PIL进行抠图和更背景的简单示例: ```python import cv2 from PIL import Image # 抠图 def remove_background(img_path): img = cv2.imread(img_path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY) contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnt = max(contours, key=cv2.contourArea) x, y, w, h = cv2.boundingRect(cnt) foreground = img[y:y+h, x:x+w] return foreground # 更背景 def change_background(foreground_path, background_path, output_path): foreground = Image.open(foreground_path) background = Image.open(background_path).resize(foreground.size) background.paste(foreground, (0, 0), foreground) background.save(output_path) # 使用示例 foreground_path = 'path/to/foreground.png' background_path = 'path/to/background.png' output_path = 'path/to/output.png' foreground = remove_background(foreground_path) foreground.save('path/to/foreground.png') change_background('path/to/foreground.png', background_path, output_path) ``` 在此示例中,我们使用OpenCV提取前景,并使用PIL将前景粘贴到背景上。要使用此代码,您需要安装OpenCV和Pillow(PIL)库。 ### 回答2: Python视频抠图背景是指使用Python编程语言对视频中的对象进行抠图,并将其替为不同的背景。 首先,我们需要使用Python中的图像处理库(如OpenCV)来从视频中提取每一帧图像。然后,我们将使用图像分割算法(如GrabCut算法)来识别和分离图像中的前景和背景。 一旦我们成功地将图像中的前景与背景分开,我们可以使用图像处理技术(如图像融合)将对象从原始背景中移除,并将其贴在新的背景上。 为了实现这个过程,我们可以按照以下步骤进行操作: 1. 导入所需的库,如OpenCV。 2. 从视频中获取每一帧图像。 3. 对每一帧图像进行图像分割,将前景和背景分离出来。 4. 使用图像处理技术将前景与新的背景进行融合。 5. 将处理后的图像保存为视频文件。 值得注意的是,在实际处理视频时,由于视频具有多个帧图像,我们需要对每一帧都进行处理,并将其合并为一个新的视频文件。 总结起来,Python视频抠图背景可以通过使用图像处理库和技术,将视频中的对象与背景进行分割和替,从而实现。这为我们提供了广阔的应用领域,例如影视后期制作、虚拟现实等。 ### 回答3: Python视频抠图背景是使用图像处理技术来实现的。具体步骤如下: 1. 首先,我们需要使用Python的图像处理库(如OpenCV)来读取视频,并提取视频中的每一帧图像。 2. 接着,将每一帧的图像进行背景抠图。可以使用图像分割算法(如GrabCut算法)来实现。该算法能够根据用户给定的初始前景和背景区域,自动分割出前景和背景。 3. 抠图后,将前景图像保存,并继续处理下一帧图像。 4. 接下来,我们需要准备一个新的背景图像。可以选择一张静态图片作为新的背景,或者使用视频中的某一帧图像作为新的背景。 5. 将前景图像与新的背景图像进行融合。可以使用图像合成技术(如透明度混合)来实现。这样就可以将前景图像放置在新的背景之上。 6. 最后,将融合后的图像保存,并继续处理下一帧图像,重复以上步骤,直到处理完所有帧。 使用Python进行视频抠图背景可以实现很多有趣的效果,如去除原视频背景,替为自定义的背景,或者将特定物体提取出来,放置到不同的环境中。这样可以为视频增加视觉吸引力,增强用户的观赏体验。同时,Python作为一种简洁易用的编程语言,具有丰富的图像处理库和算法,使得视频抠图背景变得更加简单和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值