点击上方“视学算法”,选择加"星标"或“置顶”

重磅干货,第一时间送达

本文转载自:机器之心  |  参与:Racoon张倩

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

从作者给出的 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_data/output/ -tb sample_data/background/0001.png

麻烦给我一个在看!

整个世界都是你的绿幕:这个视频抠图换背景的方法太惊艳了!相关推荐

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

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 绿幕是影视剧中抠图.换背景的利器,但如果不在绿幕前拍摄,我们还能完 ...

  2. AI视频抠图换背景,无需「绿幕」,也可达到影视级效果

    相信很多小伙伴在平时拍摄剪辑视频的时候,都会遇到视频背景杂乱的情况吧,这个时候都会想到像抠图一样,将视频中的人像抠出来换一个背景!那么具体应该怎么操作呢? 其实这个问题很简单,利用AI智能视频抠图,无 ...

  3. 虚拟直播、绿幕直播、绿幕抠图换背景虚拟直播介绍

    什么是虚拟直播: 是基于 绿幕抠图 技术(把所有绿色变成透明),实时换背景图片.背景视频(背景可以是产品特写.PPT宣传文案等),配合DY里的手机录屏功能,实现一个人的虚拟专业直播间(无须其他费用支出 ...

  4. 绿幕换背景、绿幕视频实时换背景

    PS:陆陆续续做绿幕抠图相关的工作也有2年之久了,一直研究普通摄像头下的绿幕抠图工作,这样的工作要比摄影棚下的难度要高很多,当然现在也出来很多的工具,抠图算法也越来越成熟,本人较懒,后面会一点点的把相 ...

  5. 绿幕特效视频的透明通道输出与拼合为图像矩阵

    既然之前的特效实现提升到了质的飞跃,那么就考虑敌机(本机)爆炸时的效果问题了. 首先download下某个绿幕爆炸特效视频: 本次使用aftereffects进行抠像: 首先视频导入到ae中,在效果- ...

  6. 大家都在用的抠图换背景软件,这些软件你知道几个?

      最近跟朋友们出去游玩,拍摄了一些具有纪念意义的照片.但是当我回来挑选照片,准备分享到社交平台的时候,发现有一些照片人像好看,但是背景有点模糊,有的拍不出当时天空的美.难道只能丢弃这些照片了吗?其实 ...

  7. 什么软件能抠图换背景?这些软件大家都在用

    现在拍照.P图已经成了许多小伙伴生活中不可或缺的一部分了,例如你想分享今天干了什么.出去吃大餐或是外出旅游,大家都会掏出手机用相机将这些记录下来,之后分享到社交平台上.但是拍照后,想将图片分享出来总需 ...

  8. 编程去除背景绿幕抠图,基于.NET+OpenCVSharp

    摘要:本文介绍了一种使用OpenCVSharp对摄像头中的绿幕视频进行实时"抠人像.替换背景"的方式,对于项目中的算法进行了分析.本文中给出了简化OpenCVSharp中Mat.M ...

  9. 【学习OpenCV4】教你替换绿幕背景

    绿幕图像的背景替换 一.色彩空间转换 二.提取绿幕区域 三.替换背景 绿幕图像的背景替换需要经历①色彩空间转换.②提取绿幕区域.③反转绿幕区域.④复制图像,其中遇到的各种函数和代码也都在本文有详细介绍 ...

最新文章

  1. 跟我一起做一个vue的小项目(十一)
  2. 应用新安全组 - 每天5分钟玩转 OpenStack(116)
  3. mvc html编辑器,MVC3 Html编辑器助手显示旧模型值
  4. HTTP状态码和编程
  5. 收藏:发展之道:简单与专注
  6. java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法...
  7. Dubbo仅仅是一个RPC框架?
  8. mysql怎么刷题_面试刷题mysql1:一条sql语句是如何经过mysql的体系结构的?
  9. git checkout 单个文件_IntelliJ IDEA下的使用 Git
  10. 性能测试之三——资源监控的方法
  11. 实现Trie(前缀树)
  12. rails与mysql之间中文数据显示不一致的问题
  13. 吴恩达机器学习作业(1)
  14. golang for循环时修改自身的值
  15. java调用海康人脸识别机5603的sdk的使用总结(三)
  16. 基于科大讯飞AIUI平台自定义语义库的开发
  17. 1425: PIPI的消消乐Ⅴ
  18. 【转载】我为什么鼓励工程师写blog
  19. mockjs java_GitHub - mikove3y/mockj: 生成mock数据的利器,mockjs的java实现。同时内置随机 random 一个对象的功能...
  20. css样式属性值无效问题

热门文章

  1. Eel+VUE python GUI编程
  2. R 和 Rstudio 在线更新
  3. 计算机视觉OpenCv学习系列:第十部分、实时人脸检测
  4. 最简单粗暴的蓝牙耳机选购技巧,盲选不踩雷五款品牌推荐
  5. gigaset812说明书_西门子GIASET825电话机说明书.pdf
  6. 实现国标GB/T28181流媒体服务解决方案安防4G摄像头互联网直播方案EasyGBS之水库管理无线视频监控解决方案
  7. 揭开人创造思维之谜:浴缸和床最易引发灵感
  8. 什么蓝牙耳机性价比高?四款高品质蓝牙耳机测评
  9. java_获得用户显示器大小
  10. 快捷截图、标注和取色的小工具snipaste