场景说明
为什么需要绿幕分割
绿幕的主要作用抠像,所以背景色和被摄物体的颜色要区分开来。绿幕是用来抠像的,也就是说在后期处理的时候要进行抠像合成。所以背景色和被摄物体的颜色要区分开来。选中一个颜色进行抠像,在产业领域往往被称为ChromaKey或者色度抠像。
纯色键可以使用任何颜色,因为绿色出现在人身上的概率较低,而且摄影机传感器对于绿色的敏感度最高能够节省不少的灯光费用,所以绿色使用的最为广泛。
这个人工智能视觉能力命名是个大乌龙
其实阿里云人工智能视觉生产中的绿幕分割能力是一个亮度键生成器。命名确实没有错,但是描述让人摸不着头脑。
基本概念
色键
色键(英语:Chroma key),又称色彩嵌空,是一种去背合成技术。Chroma为纯色之意,Key则是抽离颜色之意,把被拍摄的人物或物体放置于绿幕的前面,并进行去背后,将其替换成其他的背景。此技术在电影、电视剧及游戏制作中被大量使用,色键也是虚拟摄影棚(Virtual studio)与视觉效果(Visual effects)当中的一个重要环节。
亮度键
亮度键控(Luma key),简单来说就是根据亮度把部分视频图像抠出(即 抠像 的功能。亮度键控可设置为“亮部抠出”“暗部抠出”等。它的本质就是“抠”和“填”。 “抠”就是利用前景物体轮廓作为遮挡控制填平,将背景画面沿该轮廓线抠出,使背景变成黑色;“填”就是将所要叠加的视频信号填到被抠掉的无图像区域(也可以在两层中插入需合成的部分),最终生成前景物体与叠加背景相合成的图像。
亮度键控是利用键源视频信号中的亮度成分来产生键信号,由于键源视频信号的来源不同,它又可以分为内键和外键两种。它要求键源图像要有较高的亮度反差,即键源中作前景的图像部分要亮,其余部分要暗(黑),要形成明显的黑白反差。亮度键又称黑白键。
现代的键控器能够支持黑白之间的灰色,表现为透明度。
色键与亮度键对比
亮度键配合现代键控器能够较好实现透明效果,并且边缘清晰。但需要输入一路原始信号和亮度键信号才能实现抠像。
色键则只需要输入绿幕一路信号即可使用,但边缘容易收到影响,抠像时需要进行色彩溢出矫正否则人物会发绿。高切、低切、边缘融合需要调整合适的参数才能获得较好的边缘。
传统方式
后期制作软件打关键帧的方式手动跟踪被抠图对象获得亮度蒙版,或利用本地人工智能能力进行人物追踪抠像。
云服务优势
不改变现有工作流的前提下,快速生成亮度键文件,结合其他中间件可实现延时直播。或者批量处理来自媒体资产管理系统的绿幕文件。
准备工作
绿幕 -- 平直而远大
绿幕要平整,拍摄主体要远离绿幕,尽量保持2m以上的距离。为了获得较大的视场,需要较大的绿幕。
打光 -- 分别给光
打光之前,被拍摄主体先入镜,打好灯光之后。在开始给绿幕打光。人物尽量不要有暗面。背景需要均匀。使用示波器检查背景40%亮度,确保人物不进画面时绿幕的示波器器保持平直。
白平衡与色调 -- 抠像魔术
立方蜘蛛
右侧为灰卡
使用立方蜘蛛或灰卡进行手动白平衡调整,并且色调也需要正确设置,BMD的摄影机往往需要将int值设置成50。
光圈 -- 景深充分的大光圈
保证人物前后活动的景深超过30厘米,人物远离背景的情况下,尽量使用大光圈。可以让前后景有效分离,并且背景失焦后绿幕上的褶皱和不平整会被减弱。
快门 -- 非一般的动态模糊
通常快门设置为帧率的两倍分之一秒,在摄影机上设置快门角度为180度。为保证快速挥动的人物手臂或其他位置能干净地与绿幕分离,快门角度可设置为90度,或者帧率四倍分之一秒。
录制规格 -- 120MB限制
为保证画质,1080p60画面需要保证8Mbps以上的码率,也就是每段视频的长度不能超过2分钟。
如何搭建影视后期数字助理的中间件
函数计算
选择指定存储桶作为绿幕分割API的触发器,一旦出现新文件上传并完成哈希校验后立即出发该函数容器。
该函数容器调用阿里云人工智能->视觉生产->绿幕分割能力的API。以下引入阿里云API调试中心的Python实例代码。
# -*- coding: utf-8 -*-# This file is auto-generated, don't edit it. Thanks.importsysfromtypingimportListfromalibabacloud_videoseg20200320.clientimportClientasvideoseg20200320Clientfromalibabacloud_tea_openapiimportmodelsasopen_api_modelsfromalibabacloud_videoseg20200320importmodelsasvideoseg_20200320_modelsfromalibabacloud_tea_utilimportmodelsasutil_modelsfromalibabacloud_tea_util.clientimportClientasUtilClientclassSample: def__init__(self): passdefcreate_client( access_key_id: str, access_key_secret: str, ) ->videoseg20200320Client: """ 使用AK&SK初始化账号Client @param access_key_id: @param access_key_secret: @return: Client @throws Exception """config=open_api_models.Config( # 必填,您的 AccessKey ID,access_key_id=access_key_id, # 必填,您的 AccessKey Secret,access_key_secret=access_key_secret ) # 访问的域名config.endpoint=f'videoseg.cn-shanghai.aliyuncs.com'returnvideoseg20200320Client(config) defmain( args: List[str], ) ->None: # 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378659.htmlclient=Sample.create_client('accessKeyId', 'accessKeySecret') segment_green_screen_video_request=videoseg_20200320_models.SegmentGreenScreenVideoRequest() runtime=util_models.RuntimeOptions() try: # 复制代码运行请自行打印 API 的返回值client.segment_green_screen_video_with_options(segment_green_screen_video_request, runtime) exceptExceptionaserror: # 如有需要,请打印 errorUtilClient.assert_as_string(error.message) asyncdefmain_async( args: List[str], ) ->None: # 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378659.htmlclient=Sample.create_client('accessKeyId', 'accessKeySecret') segment_green_screen_video_request=videoseg_20200320_models.SegmentGreenScreenVideoRequest() runtime=util_models.RuntimeOptions() try: # 复制代码运行请自行打印 API 的返回值awaitclient.segment_green_screen_video_with_options_async(segment_green_screen_video_request, runtime) exceptExceptionaserror: # 如有需要,请打印 errorUtilClient.assert_as_string(error.message) if__name__=='__main__': Sample.main(sys.argv[1:])
根据该项目特点,可以考虑使用TS或Python较为适合。由于转换过程需要时间,也需要单独编写异步状态部分。
工作流
为实现流程整合,将该部分AI能力以函数计算形式封装为中间件,该函数可以被Serverless工作流掉用,当需要将该中间件加入到工作流时,应当取消OSS触发器。
在Serverless工作流的任务步骤中,异步调用函数计算可以更灵活地适应当前任务场景,避免限流等错误,同时可以简化流程中的错误处理和重试逻辑。
工作流中可以集成其他工作流,也可以整合消息服务,以便与现有的本地或云端的媒体资产管理系统结合。
返回的文件仅能保存30分钟,实现异步消息处理后应立即保存到OSS的结果桶当中,并触发其他函数计算容器或其他工作流。
OSS
在阿里云OSS上搭建媒体资产存储系统,与本地NAS进行同步。需要对待上传文件进行哈希校验,并使用断点续传能力。
应当选择华东2的OSS作为该项目存储桶,原因文末解释。
绿幕分割
该图为阿里云官方示例截图,可看到该结果为亮度键,并含有透明度的灰色过渡,并非黑白遮罩。
影视后期特效制作:绿幕分割算法能力可以提供一键替换特效的能力,将前期制作时用绿幕做背景,然后在后期将背景替换成特效。创意短视频制作:为制作更吸引人的、更有创意的短视频,在短视频制作前期也采用绿幕背景。后期编辑时,使用绿幕分割算法能力,替换成特效视频,帮助制作更有创意的视频作品。
精准分割:可对人体边缘进行精准分割。稳定边缘:每一帧的分割边缘持续稳定。快速低延迟:可快速实现分割,延迟低。
以上内容摘自阿里云的技术文档,一大堆语言,没说中要点。
“为绿幕拍摄的视频文件生成亮度键”才是这个能力的正确描述。
亮度抠像环境部署
原始画面输出
采用绿幕拍摄的原始文件输出给OBS或硬件色键器
分割后亮度键输出
亮度键文件需要与原始文件进行时间码和播放控制同步
亮度抠像硬件需求
测试可使用OBS软件,一般生产环境可采用ATEM Mini等设备进行两路信号的输入,在亮度键中配置即可。
写在最后
我会陆续针对在产业场景中的许多应用分享如何利用阿里云的AI能力结合函数计算进行中间件的开发心得与实战总结。不会公布源代码,但从基本原理到架构方式都会做较为细致的介绍。
适合有一定行业开发经验的开发者阅读,也非常欢迎具体行业的从业者与我交流,无论是否从事开发。