当前位置: 首页 > 科技观察

图像技术在直播中的应用(下)——美化技术

时间:2023-03-14 17:21:33 科技观察

2016年是视频直播元年,无论是资本层面的估值上涨,还是平台主播的天价薪酬,再到““局座”等主流人士争相直播,直播的社会火爆程度可见一斑。各大直播平台在经历了从无到有的直播概念阶段后,如何做差异化,如何解决野蛮生长时期出现的各种涉黄问题,成为几乎所有平台的“成长烦恼”。抛开政策和内容问题不谈,单就技术层面而言,基于影像技术的创新成为解决这些问题最可行的途径。作为最新的图片分享,我们首先选择了直播的热点话题,对图像技术在直播中的应用进行了介绍。本次分享系列整理自画CTO在架构师沙龙的演讲内容。1.技术框架每个人都有爱美之心。早期的画面美化教育了市场,到了直播时代,美化也成为了直播平台的标配。目前,直播美颜的主流技术是OpenGLES。它的优点是直接在GPU上运行,因此具有高性能和低功耗,在直播中使用更划算。二是跨平台,iOS和Android都支持,美颜效果可以直接在这两个平台实现跨平台效果。OpenGLES的另一个优势是有大量现成的开源库。比如GPUImage,Google的grafika,以及一些基于Android的实用类库,都是非常常用的。网上也有一些热心的开发者直接开源了他们的美化算法,包括一整套的解决方案,从采集到处理再到美化处理,再到最后输出一个源码,都有相关的解决方案。2.美化原理——混合是必不可少的市场上大多数美化产品的大体原理都是相似的。相机采集图像,按照一定的方式进行处理,最后输出美化后的图像。具体来说,首先对原始图像进行磨皮处理,即去除粉刺和斑点。然后将蒙皮图像与原始图像混合。混合步骤是必不可少的,因为如果只使用平滑图像很容易丢失细节。而且,通过混合两张图片,还可以调整两张图片的混合权重,控制平滑皮肤的程度,实现不同程度的平滑皮肤效果。当然,最后一步也很关键,就是美肤,比如让肤色更白、更红、更嫩,或者一些特殊的需求都可以达到。基本上大部分的美女,都是这样的过程。3.磨皮算法——去痘就是降噪从本质上讲,一张图片就是一个二维数据。如果相邻两个区域的灰度值相差比较大,说明有噪声。比如脸上有痘痘,痘痘自然会产生灰度值的变化,这是抽象意义上的噪声点。因此,美颜磨皮算法的核心是去噪。去噪的方法有很多种,网上也有各种算法,包括现成的论文。但是不管用什么算法,美颜去噪算法都必须保持一个特性,就是必须同时保持边界和平滑,也就是过滤。比较常见的过滤算法是双边过滤。它的优点是效率很高,所以非常适合移动平台。还有其他更复杂的算法也能达到那种效果,但在移动应用中效率不高。GPU虽然是并行计算,非常适合这种计算,但是GPU的能力是有一定范围的,超出这个范围就会消耗很多电量。包括双边过滤在内,过滤算法有多种实现方式。考虑在移动平台上运行,可以做专门的优化。比如在精度计算上,适当降低精度,达到效果和效率的平衡。4.肤色调整——检测是个难题。皮肤平滑完成后,最后一个过程是肤色调整。调整肤色的方法本身就很成熟,所以比较难的其实是肤色检测。为什么要做肤色检测?一些早期的直播美颜没有这个功能,所以都是以美化后的肤色为基础,根据这个颜色简单粗暴地对整个画面进行处理,造成了整体偏色。效果比不做还差。因此,在对图像进行处理之前,必须先进行肤色检测,在处理前的图像中的所有像素中找到肤色范围对应的像素。直播中肤色检测的特殊之处在于颜色空间的转换。因为与图像处理相关的主要有三种颜色空间:RGB、YUV、HSV,而这三种颜色空间在直播中都会用到。RGB是最常见的颜色空间。我们日常使用的显示设备都是基于RGB空间的。这里不多做解释。YUV是一种比较传统的色彩空间,最早应用在电视信号的传输中,目前多用于直播数据的采样和传输过程中。这是因为人眼对亮度(Y)的敏感度远高于对色度(U,V)的敏感度,所以YUV比RGB更容易压缩,更容易节省传输带宽。HSV颜色空间用于肤色检测。因为如果用RGB做肤色检测,需要检查R、G、B三个值是否同时满足肤色的颜色范围,YUV也是一样。HSV的三个值:色相(H)、饱和度(S)、明度(V)中,只有H与肤色有关,所以只需要考虑H(H值可以判断在25之间-50肤色),所需的计算量自然比RGB少很多。因此,在直播的不同阶段,必须分别使用这三种颜色空间,并且这三种颜色空间必须不断相互转换。5.细节——美化算法在算法之外很重要,但是美化是一个很主观的事情。非常漂亮和高效的算法并不能保证完美的美化效果,所以在用标准算法处理后,设计师需要根据自己的经验进行调整。比如很多平台的算法都差不多,但是为什么最后美化出来的效果感觉还是不一样,其实里面有很多细节,需要花时间去优化,尤其是用户的需求是什么,怎么让它更美。再举个例子。在众多平台上,在白天、夜间、室内、室外、自然光、人造光等不同光照条件下,直播的美颜效果千差万别。造成这种情况的原因可能是算法没有考虑光照因素,结果一个很小的因素就影响了效果。因此,这需要大量的测试,采用技术手段结合人工优化,以保证最佳的美容效果。再说一次:细节是魔鬼。6.Performance——你想给多少分?性能方面,iOS平台目前普遍没有或很少有问题。比如GPUImage就是一个在iOS平台上有着悠久历史的第三方库。它实现了很多效果,比如刚才提到的一些算法,在GPUImage中可以看到一个简单版的实现,包括如何写脚本,如何运行,如何做双边滤波,里面有简单的实现,以及也有好的。影响。包括做直播的时候,GPUImage可以作为一个很好的客户端扩展。唯一需要做的就是添加推流;因为它包含了客户端采集和处理到每一帧的数据,不管是YUV,还是RGB,都可以输出。所以在iOS平台上出现的问题相对较少。Android平台有一个更大的问题。由于Android本身的特点,厂商多,设备多,系统版本多,相互之间很难兼容。首先是设备问题。比如一个美颜算法如果在不同的机器上运行,即使是同一个GPU,性能也可能相差很大。所以,为了保证一个脚本能够适配不同的机器,有一个办法:根据GPU的性能做一个分级算法,如果分级比较高,就用最复杂的算法,如果性能等级比较低,使用美观效果降低,保证在大部分环境下使用。二是版本问题。比如只有4.0以上的版本才能通过camera直接从camera获取一个texture。这称为GLTEXTUREEXTERNAL_OES。相机直接将拍摄的图像传输到GPU,所有这些都由GPU加速。4.3之后可以做什么?从摄像头采集到处理到编码,它使用全GPU,最好最快。当然,这是对系统最兼容的要求。因为有的厂商在实现的时候不兼容这些东西,所以GPU加速就很难做。还有输出YUV。很多直播平台都必须支持YUV的输出。这些YUV数据涉及到CPU和GPU的转换过程。因为处理可能在GPU中进行,GPU不能直接输出,所以需要从GPU转换到CPU。目前对此没有更好的解决方案。目前Android的一些底层GPU还没有开放,有的时候可以通过GraphicsBuffer来实现,但是Android并没有开放这个。如果你想要这个东西,唯一能做的就是把Android源码拿出来,包括把源码和关键代码联系起来,这样才能达到更好的效果。从CPU到GPU的转换可以在毫秒级完成。如果直接从GPU切换到CPU,好的设备可能需要20毫秒左右。得到的数据,如果你预测24帧,可能会出现掉帧的情况。对主流可能影响不大,大多数情况下是可以接受的。当然,这也取决于用户仅有的应用场景。***先说一个经常被问到的问题:iOS平台和Android平台都内置了人脸检测API,为什么不用呢?首先,系统频率低,速度慢。苹果可能有这样的考虑,不影响cameraAPI的正常使用,所以频率很低。检测一次可能需要3秒;检测一次不需要3秒,但是给你一个数据需要3秒,告诉你这张照片里有没有人脸。作为一个实用的产品,假设每秒24帧,至少需要检测十几次才能满足实时性要求,否则就跟不上帧率要求。Android上这个问题就更严重了,因为要看设备,有的设备甚至没有,厂商直接去掉这个设置。另一个特征点问题。iOS上有这些特征点,比如眼睛、嘴巴、鼻子,而Android上没有这些特征点。7、美容2.0——从化妆到整形,一切都属于美容1.0的概念,目前最先进的美容技术已经发展到2.0的概念。打个简单的比方,如果Beauty1.0只是化妆,Beauty2.0基本可以达到整容的效果——把眼睛放大,把圆脸变成鹅蛋脸。这种效果的基础是人脸识别。这很容易理解。只有确认是否有人脸,知道五官在哪里,才能“整”得更美。关于人脸识别,又是一个大问题。限于篇幅,我们将在下一期详细讨论这个问题。