抠图是图像处理中最常见的操作之一,指的是将图像中需要的部分从画面中精确的提取出来。

抠图的主要功能是为了后期的合成做准备。在 Photoshop 中,抠图的方法有很多种,最常见的有通道抠图、蒙版抠图、钢笔工具抠图和快速选择工具等。针对视频的抠图方法主要是基于keylight 插件对纯色背景进行抠图(多用于绿幕)。

抠图主要解决的是图像中前景和背景区域的准确预测问题,对于图像编辑和影视制作有着极其重要的实际意义。因此一个准确有效的抠图算法可以极大改善内容生产的工作流程。从而节省大量的人力物力并提高工作效率。

图1 trimap 抠图

常用视频抠图方式

业内常用视频抠图主要有通用抠图绿幕抠图两种方式。

通用抠图通常基于 trimap 对前景、背景和 alpha 图进行估计,然而当图像中的前景和背景颜色相似或有着比较复杂的纹理时,基于 trimap 的传统算法很难取得比较好的效果。绿幕抠图也可以基于 trimap,但是由于 trimap 方法需要额外增加一个三值图输入,在视频绿幕抠图很难实际应用起来。

绿幕抠图通常采用色度键或亮度键算法。亮度键指将一幅彩色图像转为单通道的黑白图像,这幅黑白图像就代表着该图像的亮部和暗部区域。通过设置最低亮度和最高亮度两个阈值,将符合该条件的区域保留,不符合的去除,由此就生成了一张 alpha 图,然而这种方法直接生成的 alpha 图通常有比较多的瑕疵,还需要进行二次处理。

色度键算法则是在 HSV 彩色空间中进行,其中 H 表示色调、即是什么颜色,S 表示饱和度即该颜色有多浓,V 表示亮度即该颜色有多亮。色度键算法需要提前手动选择背景颜色,通过计算整幅图像和背景颜色的距离或称相似度来判断哪些颜色属于背景,哪些颜色属于前景,由此得到最终的 alpha 图。

图2 AE 软件中的色度键抠图

在绿幕抠图中,无论是亮度键还是色度键都需要和用户进行交互,需要用户繁琐的调节各种复杂的参数来达到较好的抠图效果。同时,由于黄色(255,255,0)和绿色(0,255,0)相近,色度键算法很难对该颜色进行有效处理。如图 2 所示,在 AE 软件中使用色度键算法对绿幕视频进行抠图,可以看到背景基本能去除干净,但是黄色的皮卡丘玩具出现了异常。

图3 HSV 颜色空间模型

近年来随着计算机硬件设备和人工智能基础理论的发展,使得人工智能算法能够真正在各行各业落地。CNN 具备强大的高级特征提取能力,弥补了传统算法要基于手工特征进行设计的弊端。同时 CNN 还具备强大的拟合能力,与传统算法相比,基于 CNN 的人工智能算法通常具备更强的鲁棒性。

ZEGO 绿幕抠图技术方案

2.1 数据制作

图4 绿幕抠像过程

绿幕数据是比较专业的数据,一般只有影视公司才会去拍摄,而由于肖像、版权等一系列问题,互联网上几乎找不到任何可以公开使用的绿幕数据。所以,ZEGO 搭建了专业的绿幕拍摄场地,用于制作专业的绿幕数据集。

绿幕数据的制作包括绿幕背景和前景拍摄。为了兼容市面上大部分绿幕以及增加绿幕背景的多样性,ZEGO 使用专业的摄影灯用于调节绿幕的明亮和色温,同时考虑到用户使用的绿幕不一定像专业的那么平整和柔和,我们也制作了一批效果较差的绿幕背景数据。

图5 通过补光灯和色温灯控制绿幕背景的颜色

绿色溢出是绿幕抠图的经典问题。由于光线的反射、物体距离绿幕的远近和物体本身色彩的深浅等原因会造成物体表面被染上绿色,而人眼对绿色非常敏感,因此绿色溢出会使得绿幕抠图的效果大打折扣。ZEGO 专门制作了一批带有绿色溢出的数据集,并使用 AE 软件中的 keylight 插件进行绿幕抠图和颜色溢出抑制,由此得到带绿色溢出的前景图像、绿色溢出抑制后的前景图像以及对应的 alpha 图。

图6 带绿色溢出的前景以及对应的绿色抑制前景和 alpha 图

图7 人体、纸张被绿幕反射上绿色

2.2 模型设计

ZEGO 设计了超轻量级的 CNN 模型用于实时绿幕抠图。该模型采用编码器加解码器结构,其中编码器由 3X3 的卷积层、relu 激活函数、1x1 的卷积层、batchnoraml 层构成并整体遵循mobilenetV3 的倒残差结构。

编码器采用通道可分离卷积用于降低计算量,随后进行特征图升维最后再使用 1x1 的卷积对特征图进行压缩降维。实验表明这种结构在轻量级网络中能够更加有效的提取数据特征。数据每经过一个编码器,大小减小一半,网络将在不同分辨率的数据上提取特征。

经过编码器提取特征后,最后一层特征会经过 LRASSP(轻量级空洞空间金字塔池化)层,该层是轻量级的空间金字塔池化。该层会将输入按照宽和高均匀的分成 1 份、4 份、16 份,并分别对其进行全局均值池化,最后再把得到的池化特征拼接起来。该层能获取特征图不同空间的尺度信息,从而增强网络的鲁棒性。

图8 ASPP 示例

在解码器阶段,会逐一对特征图进行两倍上采样并结合时序信息来加强视频抠图的连续性和稳定性。时序信息通过 GRU(Gate Recurrent Uint)模块来提取并嵌入对应的解码器中。GRU 是循环神经网络的一种,和 LSTM(Long-Short Term Memory)一样,也是为了解决长期记忆和方向传播中的梯度等问题。

GRU 包括两个门控接口,其公式如下:

GRU 首先通过上一个传输下来的状态  和当前节点的输入  来获取两个门控的状态,其中制重置的门控,Z为控制更新的门控,为 sigmoid 函数。

得到门控信号之后,首先使用重置门控来得到重置后数据:

再将与输入进行拼接,随后通过 tanh 激活函数来讲数据缩放到 -1 到 1 的范围内。

这里的  主要包含了当前输入的数据,有针对性的对添加到当前的隐藏状态,相当于记忆了当前时刻的状态。

GRU 的关键步骤是记忆更新阶段,在这个阶段中,GRU 同时进行了遗忘和记忆两个步骤,并使用先前得到的更新门控Z进行更新:

门控信号的范围为 0 到 1。门控信息越接近 1,代表记忆下来的数据越多,反之则代表遗忘的越多。

当添加了 GRU 后,整个网络会随着时间对错误的预测进行修正并能有效抑制视频抠像的闪烁。

图 9 GRU 对错误预测的修正

绿幕抠图除了要精细的抠出前景边界外还需有对绿色溢出进行有效抑制。人眼对绿色非常敏感,如果抠像边界还残留绿色或前景被光线反射上绿色会对绿幕抠图的结果大打折扣。

整个绿幕抠图的原理可解释为如下公式:

其中  为合成后图像,为抠图模型得到的透明通道图,表示前景,表示新的背景。

图10 绿幕抠图模型

2.3 绿色抑制

为了解决绿幕抠图中的颜色溢出问题,ZEGO 额外在网络后端增加了一个绿色抑制模块。ZEGO 在该方案中制作了一批带有绿色溢出的数据,并通过 AE 软件提取其前景、alpha 图随后对前景进行绿色抑制得到抑制后的前景图。因此,一个数据组包含了四个数据,分别是原始绿幕图像、alpha 图、带绿色溢出的前景、绿色抑制后的前景。

图11 绿色抑制流程

在网络的训练过程中,会先预测出不进行绿色抑制的前景图像,随后进入绿色抑制器并对绿色溢出进行抑制。

最终的前景图会和数据中的手动绿色抑制前景计算 L1 损失,并将梯度回传更新网络参数。

其中  为预测的前景,为真实的绿色抑制后的前景。

图13 绿色抑制效果

ZEGO 绿幕分割,极致效果体验

ZEGO 通过在算法中嵌入多级绿色值,有效的改善了传统绿幕在打光不均、绿幕不规范时出现的绿色残留。同时 ZEGO 利用 GRU 模块,增加了帧间信息,有效的提升了 alpha 图之间的连续性,弱化了原始噪声对抠图的影响。并且 ZEGO 提出了自适应的颜色溢出机制,在解决颜色溢出的同时尽量不对其他颜色产生大的影响。ZEGO 绿幕抠图在获得好的抠图效果同时,性能同样优秀。实测在 RK3588 上对四路 1080P 视频进行处理,每帧耗时仅 8 毫秒。

绿幕分割效果对比

除了绿幕分割能力之外,ZEGO 还支持任意背景分割能力,开发者可以利用这两种能力实现背景虚化、虚拟背景、演讲模式、多人实时同台互动等业务场景,打造更多样的互动体验。

更多 ZEGO 绿幕分割信息可点击链接或下方阅读原文查看:https://doc-zh.zego.im/article/16333

瞬间抠图!揭秘 ZEGO 绿幕抠图算法背后的技术的更多相关文章

  1. 【沙龙报名中】与微信&云开发官方团队零距离互动,揭秘爆款微信小游戏背后的技术!

    有人说 微信小程序游戏的百花齐放 活像十几年前的4399小游戏称霸互联网的景象 " 歪,斗地主吗,三缺二, 不用下app,小程序就能玩,我保证不抢地主让你抢!" ...... &q ...

  2. AI目标分割能力,无需绿幕即可实现快速视频抠图

    绿幕抠图是影视制作过程中常见的技术手段,常用于视频中抠除并替换背景,通过后期加工实现视频剪辑制作的更多可能性.然而,绿幕抠图技术制作成本费时费力,无法应用于日常生活. 华为视频编辑服务近期上线目标分割 ...

  3. Camtasia绿幕素材的视频合成

    随着科技和互联网的快速发展,让越来越多的人喜欢上了视频的各项制作,那么怎么让两个视频进行合成并一起播放呢?操作很简单,下面来讲解具体的操作步骤.小编选用的是Camtasia2019版本的视频编辑软件进 ...

  4. 在Android用vulkan完成蓝绿幕扣像

    效果图(1080P处理) 因为摄像头开启自动曝光,画面变动时,亮度变化导致扣像在转动时如上. 源码地址vulkan_extratest 这个demo主要测试二点,一是测试ndk camera集成效果, ...

  5. 推荐系统[八]算法实践总结V2:排序学习框架(特征提取标签获取方式)以及京东推荐算法精排技术实战

    0.前言 「排序学习(Learning to Rank,LTR)」,也称「机器排序学习(Machine-learned Ranking,MLR)」 ,就是使用机器学习的技术解决排序问题.自从机器学习的 ...

  6. 揭秘|一探腾讯基于Kubeflow建立的多租户训练平台背后的技术架构

    腾讯业务及组织架构现状 先简单和大家介绍一下腾讯内部的业务及相关组织架构的现状,有助于帮助大家理解为什么我们会基于后面的架构来设计整套方案. 下图的应用大多数人经常会用到,比如微信.腾讯视频.游戏等等 ...

  7. 机器学习算法-PCA降维技术

    机器学习算法-PCA降维 一.引言 在实际的数据分析问题中我们遇到的问题通常有较高维数的特征,在进行实际的数据分析的时候,我们并不会将所有的特征都用于算法的训练,而是挑选出我们认为可能对目标有影响的特 ...

  8. c++实现加密和解密算法以及JNI技术的应用实例

    #include "jiami.h" #include "jni.h" #include "com_test_start_CommonClassLoa ...

  9. 算法习题---4-7RAID技术(UV509)

    一:题目 (一)基础知识补充(RAID和奇偶校验) 磁盘管理—磁盘阵列(RAID)实例详解(本题目常用RAID 5技术实现) 奇偶校验(同行数据中同位上的1的个数,偶校验时:1的个数为偶数则校验结果为 ...

  10. AR介绍

    AR介绍 AR全名扩增实境,是一种实时融合现实与虚拟的图像技术. AR技术的三板斧:感知(寻找目标定位位置-与环境交互),渲染(实现产品交互-与客户交互),追踪(捕捉目标运动轨迹-客户环境上下文). ...

随机推荐

  1. ray-分布式计算框架-集群与异步Job管理

    0. ray 简介 ray是开源分布式计算框架,为并行处理提供计算层,用于扩展AI与Python应用程序,是ML工作负载统一工具包 Ray AI Runtime ML应用程序库集 Ray Core 通 ...

  2. Win Node.js安装教程

    前言: 一.下载 下载地址:https://registry.npmmirror.com/binary.html?path=node/ 二.安装(以下为傻瓜式安装操作)  三.验证安装 to be c ...

  3. 【解决方法】windows连接域时报错:An Active Directory Domain Controller(AD DC) for the domain“chinaskills.com“....

    目录-快速跳转 问题描述 原因分析: 解决方案: 附言: 问题描述 操作环境与场景: 在 VM 内 windos 2019 在连接到域时,提示报错: An Active Directory Domai ...

  4. 【笔记】跟吴恩达和IsaFulford学提示词工程(初级开发者入门课程)

    标签: #Prompt #LLM 创建时间:2023-04-28 17:05:45 链接:课程(含JupyterNotebook) ,中文版 讲师:Andrew Ng,Isa Fulford 发表在: ...

  5. 关于python中的OSError报错问题

    Traceback (most recent call last):  File "main.py", line 1, in <module>    from trai ...

  6. 2020-10-01:谈谈golang的空结构体。

    福哥答案2020-10-01:#福大大架构师每日一题# 1.map.value是空结构体,构造集合. 2.通道.只传递信号,不传递数据. 3.切片.不管切片多长,都不会占用空间. 4.仅包含方法的结构 ...

  7. 数据分析缺失值处理(Missing Values)——删除法、填充法、插值法

    缺失值指数据集中某些变量的值有缺少的情况,缺失值也被称为NA(not available)值.在pandas里使用浮点值NaN(Not a Number)表示浮点数和非浮点数中的缺失值,用NaT表示时 ...

  8. 深入浅出 OkHttp 源码解析及应用实践

    作者:vivo 互联网服务器团队- Tie Qinrui OkHttp 在 Java 和 Android 世界中被广泛使用,深入学习源代码有助于掌握软件特性和提高编程水平. 本文首先从源代码入手简要分 ...

  9. c++函数参数和返回值

    c++函数参数和返回值 函数存储位置 函数参数入栈顺序 初始化列表 函数的返回值 用参数引用来返回 返回一个参数指针 返回一个对象 总结 函数的几种变体 inline 函数 函数对象 lambda 函 ...

  10. phpstudy-sqlilabs-less-13

    题目:POST - Double Injection - Single quotes- String - with twist 单引号与括号的双注入 先试试 uname=1' or 1=1#& ...