抠图是图像处理中最常见的操作之一,指的是将图像中需要的部分从画面中精确的提取出来。
抠图的主要功能是为了后期的合成做准备。在 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 激活函数、1×1 的卷积层、batchnoraml 层构成并整体遵循mobilenetV3 的倒残差结构。
编码器采用通道可分离卷积用于降低计算量,随后进行特征图升维最后再使用 1×1 的卷积对特征图进行压缩降维。实验表明这种结构在轻量级网络中能够更加有效的提取数据特征。数据每经过一个编码器,大小减小一半,网络将在不同分辨率的数据上提取特征。
经过编码器提取特征后,最后一层特征会经过 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
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
经过上一篇章介绍,完成了实现 getters 的功能,那么接下来本篇将会实现 mutations 的功能。 在实现之前我们先来回顾一下 mutations 的使用。 将官方的 Vuex 导入进来,因为我们的还没有实现,现用一下官方的,来演示一下 mutatio…