圖像技術(shù)在直播中的應(yīng)用(上)——美顏技術(shù)
2016年作為視頻直播元年,無(wú)論從資本層面不斷高漲的估值,到平臺(tái)主播各種天文數(shù)字的報(bào)酬,再到像“局座”這樣的主流人士爭(zhēng)相上直播,直播的社會(huì)熱度可見(jiàn)一斑。而各大直播平臺(tái)在經(jīng)歷了直播概念從無(wú)到有的階段后,如何做出差異化,如何解決在野蠻生長(zhǎng)期產(chǎn)生的各種涉黃問(wèn)題,成為了幾乎所有平臺(tái)“成長(zhǎng)的煩惱”。拋開(kāi)政策、內(nèi)容問(wèn)題不說(shuō),單就技術(shù)層面,基于圖像技術(shù)的創(chuàng)新成為解決這些難題最為可行的辦法。作為T(mén)u料的***分享,我們首先就選擇了直播這個(gè)熱門(mén)話(huà)題,就圖像技術(shù)在直播中的應(yīng)用做一個(gè)入門(mén)的介紹。該分享系列整理自涂圖CTO在架構(gòu)師沙龍上的演講內(nèi)容。
一、技術(shù)框架
愛(ài)美之心,人皆有之。早期的圖片美顏教育了市場(chǎng),到了直播時(shí)代,美顏同樣成為直播平臺(tái)的標(biāo)配。就目前來(lái)說(shuō),直播美顏用的主流技術(shù)是OpenGL ES。它的好處首先是直接在GPU上運(yùn)行的,所以性能高、功耗小,用在直播上比較劃算。第二,它是跨平臺(tái)的,iOS和安卓都支持,美顏效果能夠直接在這兩個(gè)平臺(tái)上達(dá)到跨平臺(tái)的效果。另外OpenGL ES有一個(gè)優(yōu)勢(shì),就是有大量現(xiàn)成的開(kāi)源庫(kù)。比如像GPUImage,谷歌的grafika,還有基于安卓的一些具有實(shí)踐意義的庫(kù),都是很常用的。網(wǎng)上也有一些比較熱心的開(kāi)發(fā)者把自己的美顏的算法直接開(kāi)源,包括一整套解決方案,從采集到處理到美顏處理,到***輸出一個(gè)源編碼,都有相關(guān)的解決方案。
二、美顏原理——混合不能少
市面上大部分美顏產(chǎn)品的一般原理都是相似的。攝像頭采集畫(huà)面,通過(guò)一定的方式處理,***輸出一張美顏后的圖片。
具體的說(shuō),原圖首先經(jīng)過(guò)磨皮處理,也就是把痘、斑這些消除掉。然后把經(jīng)過(guò)磨皮的圖片與原圖進(jìn)行混合?;旌线@個(gè)步驟是不可缺少的,因?yàn)槿绻挥媚テず蟮膱D,很容易丟失細(xì)節(jié)。而且把兩張圖混合,還可以通過(guò)調(diào)整兩個(gè)圖的混合權(quán)重,來(lái)控制磨皮的程度,達(dá)成不同級(jí)別的磨皮效果。當(dāng)然***一步也很關(guān)鍵,就是美膚,比如把皮膚膚色調(diào)得白一點(diǎn)、紅嫩一點(diǎn),或者一些特殊的需求都可以實(shí)現(xiàn)?;旧洗蟛糠值拿李?,都是這樣的流程。
三、磨皮算法——去痘就是降噪
本質(zhì)上說(shuō),一張圖就是一個(gè)二維的數(shù)據(jù)。如果相臨的兩個(gè)區(qū)域灰度值相差比較大,這就意味著存在著噪點(diǎn)。比如臉上有個(gè)痘,這個(gè)痘自然產(chǎn)生一個(gè)灰度值的變化,從抽象意義上說(shuō)就是一個(gè)噪點(diǎn)。所以美顏磨皮的算法,核心是去噪。去噪有很多的辦法,網(wǎng)上有各種各樣的算法,包括現(xiàn)成的論文。但是不管產(chǎn)用什么算法,美顏的去噪算法都要保持一個(gè)特點(diǎn),那就既要是邊界保持,同時(shí)還要做到平滑,也就是要濾波。
濾波算法中比較常見(jiàn)的是雙邊濾波,它的優(yōu)點(diǎn)在于很高效,因此非常適合移動(dòng)平臺(tái)。還有一些其他的算法比較復(fù)雜一點(diǎn),也可以達(dá)到那樣的效果,但是在移動(dòng)應(yīng)用上效率不高。雖然GPU是并行運(yùn)算的,很適合這種運(yùn)算,但GPU的能力是有一定范圍的,超過(guò)這個(gè)范圍也很耗電。包括雙邊濾波在內(nèi),一種濾波算法也有各種各樣實(shí)現(xiàn),考慮在移動(dòng)平臺(tái)上運(yùn)行,可以做一下特別的優(yōu)化,比如在精度計(jì)算里,適當(dāng)降低精度,達(dá)到效果與效率的平衡。
四、膚色調(diào)整——檢測(cè)才是難題
在做好磨皮后,***一個(gè)流程就是膚色調(diào)整。調(diào)整膚色本身的手法已經(jīng)非常成熟,所以更難的其實(shí)在于膚色檢測(cè)。為什么要做膚色檢測(cè)?有些早期的直播美顏是沒(méi)有這個(gè)功能的,所以他們就是以美化的膚色為基礎(chǔ),簡(jiǎn)單粗暴的把整個(gè)圖像按這個(gè)色彩全部處理掉了,這就造成了整體偏色,效果還不如不做。因此,在處理圖像前,必須先進(jìn)行膚色檢測(cè),在圖像的所有像素點(diǎn)中找到對(duì)應(yīng)膚色范圍的像素再進(jìn)行處理。
直播中的膚色檢測(cè)特殊的地方在于顏色空間的轉(zhuǎn)換。因?yàn)楦鷪D像處理相關(guān)的顏色空間主要有三種:RGB、YUV、HSV,而這三種色彩空間在直播中都要用到。
RGB是最常見(jiàn)的色彩空間,我們?nèi)粘S玫娘@示設(shè)備就是基于RGB空間,這里不多解釋。
YUV是一種比較傳統(tǒng)的顏色空間,最早是應(yīng)用在電視信號(hào)的傳播里面的,目前多用在直播的數(shù)據(jù)采樣、傳輸?shù)倪^(guò)程。這是因?yàn)槿搜蹖?duì)亮度(Y)遠(yuǎn)比色度(U、V)更敏感,所以YUV比起RGB更容易被壓縮,這樣就更容易節(jié)省帶寬進(jìn)行傳輸。
而基于HSV顏色空間才是用來(lái)做膚色檢測(cè)的。因?yàn)槿绻肦GB來(lái)做膚色檢測(cè),需要檢測(cè)R、G、B三個(gè)值是否同時(shí)滿(mǎn)足膚色的顏色范圍,YUV同理。而HSV三個(gè)值:色調(diào)(H)、飽和度(S),明度(V)中,只有H是關(guān)乎膚色的,因此只需要對(duì)H進(jìn)行考慮(H值在25-50之間即可判斷為膚色),所需要的運(yùn)算量自然比RGB少很多。
所以,在直播的不同階段,要分別使用這三種色彩空間,要不停的把這三種色彩空間進(jìn)行相互轉(zhuǎn)換。
五、細(xì)節(jié)——在算法之外
美顏算法固然重要,但美更是一件很主觀的事。算法寫(xiě)得非常優(yōu)美和高效并不能保證美顏效果是***的,所以用標(biāo)準(zhǔn)的算法處理后,還需要設(shè)計(jì)師依據(jù)自己的經(jīng)驗(yàn)去進(jìn)行調(diào)整。比如很多平臺(tái)算法都大同小異,但是為什么最終出來(lái)的美顏效果讓人感覺(jué)還是有差異,其實(shí)就是說(shuō)里面有很多細(xì)節(jié)在,需要花時(shí)間優(yōu)化,特別是用戶(hù)的需求是什么,怎樣更漂亮。
再舉一個(gè)例子。很多平臺(tái)在不同的光照條件下,比如白天、晚上,室內(nèi)、室外,自然光、人工光,直播出來(lái)的美顏效果差異很大。這其中的原因可能就是算法中沒(méi)有考慮光照因素,結(jié)果使很小的因素影響了效果。
所以,這就要求進(jìn)行大量的測(cè)試,用技術(shù)手段結(jié)合人工去優(yōu)化,才能保證***的美顏效果。還是那句話(huà):細(xì)節(jié)是魔鬼。
六、性能——不服跑個(gè)分?
說(shuō)到性能,iOS平臺(tái)目前一般來(lái)說(shuō)沒(méi)什么問(wèn)題,或者問(wèn)題很少。比如 GPUImage是第三方的,算是iOS平臺(tái)上很有歷史的一個(gè)庫(kù)。它實(shí)現(xiàn)了很多效果,比如剛才提到的一些算法,在GPUImage里面可以看到簡(jiǎn)單版的實(shí)現(xiàn),包括怎么寫(xiě)腳本,怎么跑起來(lái),怎么做雙邊濾波,里面有簡(jiǎn)單的實(shí)現(xiàn),也可以有很好的效果。包括在做直播的時(shí)候,GPUImage可以作為很好的客戶(hù)端擴(kuò)展,唯一需要做的事情,就是加上一個(gè)推流;因?yàn)樗膹目蛻?hù)端的采集、處理到每一幀的數(shù)據(jù),無(wú)論是YUV,還是RGB,都可以輸出來(lái)。所以iOS平臺(tái)上相對(duì)來(lái)說(shuō)問(wèn)題少很多。
而安卓平臺(tái)問(wèn)題就比較大了。因?yàn)榘沧勘旧淼奶攸c(diǎn),廠(chǎng)商很多、設(shè)備很多、系統(tǒng)版本很多,因此相互間比較難兼容。
***個(gè)是設(shè)備問(wèn)題。比如一個(gè)美顏算法在不同機(jī)器上跑起來(lái),即使是同一款GPU,性能也可能會(huì)差別很大。所以,為了保證一個(gè)腳本去適應(yīng)不同的機(jī)器,有種辦法是這樣的:根據(jù)GPU的性能做了一個(gè)分級(jí)算法,如果評(píng)級(jí)比較高就采用最復(fù)雜的算法,如果性能評(píng)級(jí)比較低,就把美顏效果降低,保證在大部分環(huán)境下使用。
第二是版本的問(wèn)題。比如,只有4.0以上版本才能夠通過(guò)相機(jī),直接從相機(jī)采集里面獲取到一個(gè)紋理,這個(gè)叫GLTEXTUREEXTERNAL_OES,相機(jī)直接把采集到的畫(huà)面轉(zhuǎn)給GPU,全部通過(guò)GPU加速。4.3以后可以做什么事情?從相機(jī)采集到處理到編碼,走的是全GPU,這是效果***的也是最快的,當(dāng)然這對(duì)系統(tǒng)的兼容要求是***的。因?yàn)橛行S(chǎng)商在實(shí)現(xiàn)的時(shí)候沒(méi)有兼容這些東西,所以GPU加速很難做。
還有輸出YUV。很多直播平臺(tái)都要支持輸出YUV。這些YUV的數(shù)據(jù)就涉及到CPU和GPU的轉(zhuǎn)換過(guò)程。因?yàn)樘幚砜赡苁窃贕PU里面完成的,GPU沒(méi)法直接輸出來(lái),就需要從GPU到CPU的轉(zhuǎn)換,這個(gè)目前來(lái)說(shuō)還沒(méi)有比較好的方案。安卓目前一些底層的GPU還沒(méi)有開(kāi)放,有的時(shí)候可以通過(guò)Graphics Buffer來(lái)實(shí)現(xiàn),但是安卓并沒(méi)有把這個(gè)開(kāi)放出來(lái)。如果要有這個(gè)東西,唯一能做的是把安卓源代碼拿出來(lái),包括把源代碼link到關(guān)鍵碼里面去,這樣才能達(dá)到比較好的效果。CPU到GPU的轉(zhuǎn)換,是可以毫秒級(jí)別的,如果直接從GPU轉(zhuǎn)換到CPU,可能好的設(shè)備也會(huì)花費(fèi)20毫秒左右,這樣導(dǎo)致的數(shù)據(jù),你預(yù)測(cè)的是24幀,可能就會(huì)有掉幀的情況。在主流上可能影響不大,大部分情況下都是可以接受的,當(dāng)然這***也要看用戶(hù)只有的應(yīng)用場(chǎng)景。
***說(shuō)說(shuō)常被問(wèn)到的一個(gè)問(wèn)題: iOS平臺(tái)、安卓平臺(tái)都自帶有人臉檢測(cè)的API,為什么不用?
首先是系統(tǒng)頻率低、速度慢。蘋(píng)果可能有這樣一個(gè)考慮,不要影響到相機(jī)API的正常使用,所以頻率很低。檢測(cè)一次可能3秒鐘;不是檢測(cè)一次需要3秒鐘,而是3秒鐘才給你一個(gè)數(shù)據(jù),告訴你這張照片有沒(méi)有人臉。而作為一個(gè)實(shí)用的產(chǎn)品,一秒鐘假設(shè)24幀,起碼要做十幾次檢測(cè)才可以達(dá)到實(shí)時(shí)的要求,要不然的話(huà)跟不上對(duì)幀率的要求。在安卓問(wèn)題更嚴(yán)重,因?yàn)檫€要看設(shè)備,有些設(shè)備甚至就沒(méi)有,廠(chǎng)商把這個(gè)設(shè)置就直接去掉了。另外一個(gè)特征點(diǎn)的問(wèn)題。iOS上面有這些特征點(diǎn),比如眼睛、嘴巴、鼻子這些,安卓上面是直接沒(méi)有這些特征點(diǎn)的。
七、美顏2.0——從化妝到整容
以上的內(nèi)容都屬于美顏1.0的概念,而目前***的美顏技術(shù)已經(jīng)發(fā)展到了2.0概念。打個(gè)簡(jiǎn)單的比方,如果美顏1.0只是化妝的話(huà),美顏2.0基本就能達(dá)到整容的效果——把眼睛變大,把圓臉變成瓜子臉。而實(shí)現(xiàn)這一效果的基礎(chǔ)就是人臉識(shí)別。這很好理解,只有確定了有沒(méi)有人臉,知道了五官在什么位置,我們才能把它們“整”的更漂亮。
關(guān)于人臉識(shí)別,就又是一個(gè)大問(wèn)題了。限于篇幅,我們會(huì)在下一期詳細(xì)展開(kāi)這個(gè)問(wèn)題說(shuō)。