美颜=设计+算法?

LiveVideoStack 2017年7月7日

大家好,我是涂图CTO邱彦林,今天跟大家分享的内容相对来说还是更加的窄一点,主要集中在九项技术。我首先简单介绍一下涂图,涂图是一家做企业级图像处理的服务商,就是为企业提供图像处理相关的一些服务,我们目前提供的有图像SDK,短视频SDK,直播SDK等等。



我们还和像又拍云、声网这样的直播服务商做一体的直播云服务,还有我们图像识别相关的云服务,比如人脸云服务、在线滤镜服务等等。此外图像处理适用的行业也比较多,我这里也简单列了一下,像社区、电商、直播、教育、金融、O2O等等,这是我们现有的一些客户,大家也都简单过一下。



图像技术


OK,那到了我这个重点了,图像技术就是在直播中大家所见到的图像技术,有哪些我相信应该是很多了,这里我简单介绍一下,像美颜、智能美颜我们大家日常见得比较多,比如基于人脸识别技术的动态贴纸,还有像前面我们提到的美装等等,此外还有实时监黄,以及基于AR或者VR的技术,这些都是跟图像处理相关的一些技术。



美颜——OpenGL ES


接下来我简单介绍一下美颜,相信大家只要使用过直播应用,或者做过直播服务,我相信在产品里面或多或少都会有这个功能特点。


1.跨平台


目前据我所知,大部分产品里面,美颜都是在移动端,是基于OpenGL的ES这个技术,OpenGL本来是桌面端做图像处理的一个API接口,移动端的话,它也很早就开始,各大厂商都开始支持,它是一个比较通用的标准,在安卓和iOS端都可以支持,然后OpenGL ES是OpenGL的一个嵌入式的版本,当然除了OpenGL ES之外,安卓和iOS每个平台都还有一些其他的方案,但是这个方案呢,具备一个跨平台性,兼容性比较好。像苹果的话,大家都知道,苹果比较特立独行,一般来说它会有一些自己的技术——提供自己的图像处理的底层SDK,比如苹果在iOS 8推出的Metal,也是一个类似OpenGL ES的一个引擎,一个底层的API;像安卓,Google它本身也推出了一个类似于OpenGL ES——RenderScript,相信做开发的都或多或少接触过这些技术。


2.性能高,功耗小


OpenGL ES它有一些特点,我前面提到跨平台和性能比较高,因为它是在GPU里面运行的,大家都知道做直播有很多任务要完成,特别是在手机上,如果说你所有的东西都跑在CPU上,因为本身有编解码、推拉流,还有网络的交互传输等等,这些都是比较耗CPU,也就意味着耗电,对我们而言当然希望直播的时候功耗会比较低。


3.现成的开源库


另外就是说OpenGL ES还有比较现成的一些开源库,估计做开发的都会接触到,比如像GPUImage,还有Google grafika等等这些,包括网上有些现成的,所谓美颜的算法都可以找到一些现实的技术开源库,当然了,开源一个好处就是拿过来就能用,但是一个坏处,在使用过程中发现的bug需要自己去解决,比如我们WebRTC它是一个开源的,就像前面又拍云的黄总已经介绍过,关于WebRTC的很多开源问题,有很多坑需要自己去处理;而图像的,比如开源的GPUImage,各种各样的这些库也好,技术也好,算法也好,都会有一些局限性。


美颜——实时性处理


美颜的话,它其实是个实时处理的过程,比如说我们在直播的时候预览端,主播打开一个相机,开始直播了,这个时候,每一帧里面,我们看到的每帧画面都是经过美颜处理的,那要求每一帧从相机的采集、到处理、到预览、到编码、到推拉流的整个过程,全部要在一帧里面做很多事情,这是对实时适应要求非常高的一个处理,刚才前面黄总也提到就处理这个环节来说,首先你相机的采集,包括后面的编码和推流都是一个耗时的操作,如果说处理这个环节也比较耗时,也就意味着手机端的推流就已经有一个比较大的延时了,这就要求处理的时候,首先效果要好,同时你的算法性能足够高,就是耗时很小很小。



1.去噪


美颜的核心实现按照图像算法里的专业说法叫去噪,就是去噪点,噪点是图像处理里面的一个专业说法,一般来讲就是这种亮度差,也就是所谓的灰度,对于我们人眼来说,在看一个东西的时候,不管它是彩色图片,还是黑白图片,最敏感的就是亮度,为什么?我在这里举个例子,一般来说,我们在直播中传输的图像都是基于YUV的颜色空间的编码,YUV它其实一般不管我们是WebRTC,也不管是RTMP或者UDP传输,都是基于YUV颜色空间的这样一个图像画质,它是有损的,但是我们一般做直播时候感觉到这个画质还挺清晰的,颜色也还是在的,那是因为YUV只是把跟色彩相关的数据给压缩了,但是它把亮度相关的信息都全部保留,而我们人的眼睛不管是在看色彩也好,看东西也好,首先最敏感的是亮度,对于有些区域你把它给忽略掉,我们人的眼睛根本就感觉不到。



2.算法


而美颜的话,一般我们会采用一些算法,就是所谓的边界保持类平滑滤波算法,这个可能比较专业,这里我列了一些简单的算法名词——导向滤波、双边滤波、表滤波等等,一般来说,我们看到的不管是什么平台上面,只要直播应用里面带了美颜效果的,一般都是用上面提到的或者其中的某一个算法,有些算法相对来说会比较复杂,有的算法相对来说比较简单一点,当然了美颜里面并不光这一个渠道的算法,美颜真正要达到一个比较好的效果,是一个非常复杂的事情,大家会看到有的平台美颜效果好,有的平台美颜效果差,并不完全是由算法决定的,还有很多细节。


3.肤色检测


另外除了算法之外,还有包括对颜色的处理,对光效的处理等等,比如说我们讲到的对皮肤处理,有些时候看起来非常的红润,看起来很白,那这个其中会涉及到一些肤色检测的算法,肤色检测一般也有一些通用的算法,比如基于哪种颜色空间来做,一般来说,我们人的肤色——这里我提的主要是亚洲人,还没有提到比如说黑人,如果大家去尝试一些现有的带有美颜效果的直播应用,正常情况可以做到白皙、红润,但是如果找一个黑人朋友试一下就会发现不起作用,也就说明它的美颜算法并没有考虑到人种这样更多的情况。



4.光效


然后就是我刚才讲到的,要达到一个很好的美颜效果是非常复杂的事情,怎么讲呢?举个例子来说,我们今天这里用的灯光应该都是LED的,如果大家打开一个直播应用,预览的时候会发现在某些情况下,例如室内直播的预览画面会有一些条纹的滚动,就是那种波浪状的像光一样抖动,那可能就是说这个应用没有防闪烁的功能,什么意思呢?日光灯在我们国家用的一般是50赫兹的交流电,它体现在如果我们用前置摄象头打开一个手机应用的话,你会发现它没有做防抖动处理,就相当于光波会在相机采集的时候造成一个干扰,导致我们看到相机效果不是很好,有些闪烁,现在主流的手机厂商——安卓厂商都会对这个东西进行处理,默认的相机里面都会把这个东西自动开启,但是有些直播应用如果没考虑到这点,他一打开相机就发现只有在灯带的情况下——就是日光灯,你会发现有这个情况,这只是个简单例子。


还有一种情况就是各种光效,比如今天天气很好,室外光效很强,大中午的,另外还有就是有些主播他一般都在室内,后面会开一个很强的那种专业的取景灯,还会加那种反光的拍摄的一些设备,那有些时候灯部就会非常亮,美颜算法没有这个光效处理,导致的结果就是能看到的画面就是后面一片白,基本上看不清东西等等。因为光效的情况非常复杂,特别要考虑到环境光,还有就是比较暗的情况下,比较亮的情况下,室内室外,阴天晴天各种情况,这个时候就要求我们的算法,能够对光效做处理,比如像陌陌是支持自动开白平衡,白平衡解决不了这个问题,还需要我们利用一些算法来实现,比如说我通过一些直方图做一些直方图均衡化等等这些处理,保证你不管是什么光照情况下,都可以实现比较好的美颜效果,就是不管主播是什么环境光,我看到的画面感觉这个光效都非常的正常合理。


美颜——细节在算法之外


涂图在美颜算法做了很多这种细致的研究,因为这些东西都非常花时间,不光是算法的决定,并且还通过设计,比如说一款好的滤镜,一款好的美颜算法,它需要我们去设计美颜和程序开发一起结合起来去调试,像国内一些手机厂商会找我们来定制一些特殊的滤镜,包括像一些直播应用,我先针对具体应用怎么去执行,比如说我是做美食相关的,只要是那个场景里面出现美食相关的,我希望那个画面都看起来很好,假如我是母婴类的,或者我们可能经常是在户外的,不同的情况下这个算法,或者说这个滤镜都有相关的一些不同的处理。




美颜——性能


然后我这里再讲一下性能,一般来说做iOS的基本上都不会有什么问题,因为首先iOS的平台比较单一,设备从硬件软件各方面相对来说都是可控的,但是安卓就非常复杂了。


1.Android是个大坑


前面几位都提到了安卓里面有很多的坑,这是大概一年多前的图片,里面列举的都是安卓厂商,密密麻麻的,可能还没列完整,一般我们做安卓开发的时候,首先就会涉及到一个兼容性的问题。一般如果说我们要及时性,那美颜肯定是在GPU里面的,而GPU又比较复杂,现在主流的国内安卓厂商经过这几年的厮杀基本上已经比较少了,但还是很复杂,比如说有些手机厂商一年非常疯狂的推十几个牌子,像开演唱会一样,有很多品牌,像小米就有红米、红米PRO、红米Note,品牌很多,每个型号里面采用的GPU和CPU都是不一样的。



2. GPU性能分级


我们这边做了一个基于GPU性能的分级,然后根据这个GPU性能分级,我们来自动的调整算法复杂度。我们把市面上目前主流的GPU型号都做了一个分析,其实现在市面上主流GPU型号,特别是用在手机上的其实很少,一般就三大块,就前面列了三大——高通大头、其次是ARM、后面两个是 PowerVR和英伟达,从使用量上来讲ARM的Mali GPU是最多的,其次是高通,像PowerVR和英伟达相对来说少一点,可能大家都没有听说过。内置的手机厂商比如小米卖一款手机一般都不会注明,这个手机用的GPU是什么,它一般会说,我用的高通最新的835,但是高通835配的是什么GPU,一般都不会列出来,至少感觉大部分手机厂商都不会主动列出来,但实际上GPU对性能的影响又非常大,比如说你玩儿游戏,像王者荣耀或者其他的,如果你的GPU很差,那你的效果卡顿就会达不到要求,比如说帧率上不去,因为画面渲染大部分都是在GPU里面进行处理。 PowerVR可能了解的人会少一些,但实际上我估计在座的80%以上的手机,使用的都是这家厂商生产的GPU,包括iPhone使用的也是他们家提供,但是可能两年后iPhone就会放弃使用,因为苹果已经发出通告将于2018年之后终止与Power的合作,据我了解国内有些厂商也使用了他们的芯片,像魅族、华为的部分型号。


我们会针对GPU性能分级自动调整算法复杂度,保证我们的美颜算法在不同手机型号上完美适配:如果你的GPU很好,我的算法复杂度会很高、效果更好;如果你的GPU性能比较低,那我的算法复杂度会自动降低,甚至有些会关闭。



3.GPU加速


此外还可以提高的一点就是GPU加速,这里简单谈一下,在安卓上面,也就是所谓的硬编硬解的问题,涂图做了很多的研究,因为这个算法要完全跑在GPU上面,跟项值的采集跟硬编硬解都很有关系,而安卓对硬编硬解的支持一般都是要4.3版本以上,我们在这方面做了很多的尝试,保证只要你使用的系统是4.3版本以上,我们这个算法就可以配合硬件支持我们这个议题——从美颜到编码,对于目前热门安卓厂商像小米从红米一代到目前最新型号、三星从比较酷爆的机型到S8、华为从比较低端的机型到P9和P10等等,所有的机型上面我们都做过测试并且我们的硬编都可以比较好的支持。


我们公司也跟很多客户对接直播应用,首先我们会提出希望你手机硬编,而客户的第一反映就是安卓硬编不是很不稳定吗?精密性很差吗?一般客户都会这么讲,这里面也确实有很多坑,但都是可以解决的。据我们目前测试的结果来看,比如说硬编硬解,在这方面当然会提到什么?崩溃,合并。一般有些品牌会给出一些非常奇怪的崩溃,但经过研究都可以解决.一般来说不能仅仅是全部依靠安卓的SDK,比如MediaCodec编码出来的那个时间戳你直接用,可能在大部分手机上面都是没问题的,但是有些手机上时间戳是不靠谱的;比如说还有一些手机厂商,他会对某些参数做限制,比如说我这个手机支持的最大码率是多少,它是有个限制的,但是你查任何文档是查不到的,只能经过反复的尝试去探索,从而去避开这个坑,还有一些手机厂商跟其他厂商编码出来的音频数据格式会有一点细微的差别,但是就在那一点点细微的差别就会导致其他都可以正常播放,但是这个音频就是播不出来,而且它不会提示报错,等等。


这种非常诡异的问题,在使用硬编的时候都会遇到。包括,因为硬编会涉及到GPU的渲染,如果你独立使用OpenGL,它跟你的脚本——就是所谓的偏远脚本、文件脚本都会有关,有些细微的差别,有些GPU型号它会对你的代码产生限制,大家都知道有些GPU型号在你使用OpenGL的时候,它有些限制,比如说你使用的FBO会有限制,你使用传输数组的长度可能也有限制,比如说使用一个浮点,浮点的小数位达到多少位,可能大部分手机下面都可以跑这个脚本,但是有些机器上面一跑就崩溃,还包括我们在做硬编的时候,会涉及到GPU的线程同步问题,因为一般我们做硬编码会采用多线程,多线程就会涉及到一个OpenGL在多线程情况下的数据同步问题,这其实跟手机厂商对OpenGL的优化,对整个都很有关系,里面有很多的坑。我们也经历了很多,花了很多时间去解决这些问题,目前来看只要它的手机是4.3以上的,就可以保证硬编是可以工作的。


美颜——人脸识别技术


刚才提到的美颜都还是基于比较传统的图像算法,现在大家再去看美颜就会发现,大部分都已经升级到了第二代智能美颜——基于人脸识别技术的美颜,我们最常见的包括大眼瘦脸、动态贴纸、实时美妆等等,还有动态扣图,把人扣出来背景切换掉,相信大家看到过类似的应用。



1.技术点


这里面其实最关键的技术就是人脸识别,一般要解决两个问题,一个是人脸检测,一个就是抓取特征点。首先你检测这个当前画面的人脸,还要把关键点标出来,一般目前主流的话,不同公司有不同做法,有的标一百多个点,有的标六七十个点,基本上都能够满足大部分人的需求,这里面涉及到技术最早都是通过机器学习来做。



2.移动平台图像识别趋势


大家都知道深度学习非常火,特别是从Alpha GO之后,我相信现在不管是那家公司都会提出我们也在做深度学习相关的东西。即便是深度学习到现在为止,机器学习在手机上也还是非常有用,为什么呢?因为手机和PC端不一样,手机的性能还是很有限的,大家都知道,一般像国内比较大的公司,包括一些专业做深度学习研究的,他们都会用到,深度学习里面涉及到ARM计算,一般情况手机CPU是满足不了这些计算的,举个例子,比如说一个多层神经网络里面就算有40层,但是我们把这40层构建出来一个模型,看作一个函数的话,大家知道这个函数有多少个参数吗?可能有一千万个参数,就是说一个函数有一千万个参数,我们要对它进行一次运算,可想而知这个运算量有多大,通过CPU去算会有多慢,那只能是通过GPU去算,GPU现在在T阶段是有很多解决方案的,一般用的英伟达的那个GPU,相信玩儿游戏的都听过英伟达这家公司,英伟达最近非常意气风发,他们的股票基本上每天都在以百分之五六十的幅度在增长,这是因为像Google,Facebook,包括像亚马逊这些公司都在采购他们家的GPU卡——非常专业的图像卡来做深度学习的研究,游戏玩家听过他们,是因为用过他们的G卡——Geforce,有些比较高端的游戏玩家会用,但是相对来说深度学习研究使用的卡就更加昂贵了,一般来说像泰坦、1080就将近要一两万,更贵的像P40的,这样的非常专业、非常复杂的GPU卡估计就以百万计了。



3.移动平台深度学习趋势


因为深度学习涉及的计算量实在太大了,但是目前为止,手机上面还没法听说这样的事情,即便现在手机在硬件已经发展很好,当然现在有个趋势就是移动品牌逐渐转向深度学习,随着硬件,包括各方面的发展都让这个趋势变得有可能实现。大家都知道深度学习这个领域的技术、知识更新是非常快的,基本上隔几天去关注,就会发现有一篇论文发表了,我记得大概半个月前,国外的莱斯大学两个研究员发表的一篇论文,就说他们可以做到将现在的一些深度学习的、包括在去年的使用计算量降低,号称是可以降到95%以下,如果这个研究成果一旦投入使用的话,现在的一些深度学习的框架,包括像那些网络结构都可以在手机端实现。


我刚才前面提到苹果在iOS 8的时候发布了一个Metal的框架,它是个非常底层的图像处理引擎,和OpenGL非常相似,但是同时Metal还提供的一个功能,就是它开放了一个通用计算接口,也就是我们常说的GPGPU——专业术语叫通用计算能力,具有通用计算能力的GPU。一般而言我们的GPU是做什么?大家听的比较多的就是做图像处理、做图像渲染非常好,比如说现在玩的3D游戏,你要么在Widows上面就要改X,移动端可能大家有一些比较好的,比较主流的像那种开源的框架、免费的框架,或者叫做Unity3D、Unreal这种平台去开发3D游戏,他们一般会基于DrictX,或者是OpenGL这种接口来写,但是他们还是关注了图像的渲染这块,那GPU可以做一件什么事情呢?就是有个开放计算接口——通用的计算能力,像高通在深度学习里面提供的那些图像处理卡,他们就是提供了一个通用的计算能力,比如高通它提供了CUDA这样一个库,我们通过它提供了很多语言的版本接口,简单的调用就可以调用GPU指令去进行运算,GPU它设计的时候是一个并行计算的这样一个模式,它非常适合计算,特别是像那种所谓的矩阵运算、矢量运算等等,非常快,比CPU要快了一个数量级,那是非常大的。


现在移动端,像高通三星他们最新的GPU,他每年开放计算接口,比如高通最新跟835相匹配的GPU,他们都是提供了这个计算接口的,就是GPGPU这种它提供了这个指令,你可以通过这个指令去调用GPU去进行计算,而不仅仅是进行图像的渲染。



苹果也很早就开始布局,iOS 8的时候这个底层框架也开始开放了,但是一直到大概前些日子,苹果发布的iOS 11里面,它正式开放了一个框架叫Core ML,就是所谓的这个包,那其实就说它是一个逐渐从底层往上层、从硬件到软件一步一步来的这样一个布局,最早iOS 8的时候它开放的是一个非常底层的一个接口,就是类似于那种CPU指令、GPU指令这种,就是类似汇编的这种指令,对普通开发者来说没法使用的,然后它现在iOS 11开发的是一个什么包呢?就是基于一个非常高级的编程语言这样一个工具包,这样每个iOS开发人员都可以去调用它,我关注了一下这个包里面大概有两个内容,一个是通用机器学习的框架,就是说你可以用这个框架去构建自己的神经网络,去构建自己的决策数,构建自己的支持向量基本模型,构建自己的线性回归模型,等等。这些包括像刚才提到的,支持向量、线性回归、决策数、多层神经网络,这是机器学习和深度学习里面非常通用的一种技术,它可以让你根据自己的业务模型去构建你的网络也好,构建你的模型也好,同时它还提供了一些现成的模型——就是现成的接口,可以直接通过API去调用人脸识别就完成了人脸识别、语音识别。它就开放了这两部分,一个是利用它的框架创建自己的一个神经网络或者模型,同时它还提供一些现成的模型。大家都知道,iOS很早以前就已经有人脸识别技术了,但是它没有开放一些更加底层的API,现在就是到了iOS 11,它整个的从最底层逐渐往上、从硬件到软件这一套都打通了,到目前为止相对来说,安卓在这个方面应该是落后不少的。


因为安卓首先它的情况比较特殊,它是一个开源的操作系统,或者说Google它是不具备控制各个手机厂商的能力,是开放的,而各个手机厂商也都各自为政,比如说三星可能比较强势一点,三星大家都知道,它是非常强大的一家公司,它从硬件到软件,整体上各个环节都可以去参与,但是国内的手机厂商包括华为相对来说在这方面还是有差距,比如说华为可能只做CPU,它没有自己的GPU,还是用其他厂商的GPU,那他在这块即便是想做一些事情也还是有限制,那其他公司就更加不用说了,他们只能等着Google开发完一整套的才能够用上,所以说苹果在这方面在我看来是远远领先于安卓。


4.主流深度学习框架广泛支持移动平台


那现在其实主流的一些深度学习的框架已经开始支持移动平台了,比如大家都看到的像今年发布的Caffe2,还有包括Facebook内部搞了一个项目叫Caffe2Go,号称是可以做到视频里面,达到实时的效果,还有Google主推的TensorFlow,亚马逊比较支持的MxNet等等,这些框架其实都已经可以支持移动平台了,大家在网上也可以找到Demo,直接在iOS、安卓上跑这些东西,包括像苹果的iOS 11,大家如果去看官方的文章,就会发现它提供了一些现成的Demo,里面可以做什么事情?像那种数字识别,一般的这种Demo你可以现成用,就是整一套全是已经做好的,你直接按照那个调用,比如传一张带有数字的图片,他就告诉你数字结果,这个已经可以在官方网站上下载到了。


人脸检测API缺点及涂图解决方案



刚才我讲了很多关于人脸识别,可能有些开发者就会说,iOS、安卓现在不是已经在SDK里面提供了一些人脸检测的API吗?但是实际上这些东西在实际应用里面很多是没法去用的,这里面还是存在一些问题,比如说PPD速度慢、非常不灵活、缺乏一些功能等等,所以说目前大家看到直播里面的人脸识别技术,国内平台在手机端应用这种核心技术的并不多,据我所知很多直播应用一般都是采购第三方的,包括像映客、花椒,可能对应用的使用者来说并不关心这个东西,像我们TUSDK都是自己研发的,现在可以达到一个什么性能呢?比如说在iPhone6上面,动态加美颜可以达到30帧非常流畅,在安卓上面,像小米5也可以达到25帧。


图像识别技术在服务端应用



最后再简单介绍一下图像识别在服务端有哪些应用,现在大家都提到了鉴黄,这个也是基于图像识别的技术来做的,包括像人脸的抓取等等。我的介绍就到这里了,谢谢大家。

还可输入800
全部评论
作者介绍

邱彦林

涂图

CTO

文章

粉丝

视频

相关文章
阅读排行
  • 2周
  • 4周
  • 16周
热门视频

WebRTC视频数据流程分析

许建林/《WebRTC Native开发实战》书籍作者

移动音视频SDK工程实践之数据采集和处理

李明路/音视频SDK产品技术负责人