圖像技術在直播中的應用(上)——美顏技術

2016年做爲視頻直播元年,不管從資本層面不斷高漲的估值,到平臺主播各類天文數字的報酬,再到像「局座」這樣的主流人士爭相上直播,直播的社會熱度可見一斑。而各大直播平臺在經歷了直播概念從無到有的階段後,如何作出差別化,如何解決在野蠻生長期產生的各類涉黃問題,成爲了幾乎全部平臺「成長的煩惱」。拋開政策、內容問題不說,單就技術層面,基於圖像技術的創新成爲解決這些難題最爲可行的辦法。做爲Tu料的首個分享,咱們首先就選擇了直播這個熱門話題,就圖像技術在直播中的應用作一個入門的介紹。該分享系列整理自塗圖CTO在架構師沙龍上的演講內容。算法

1、技術框架

愛漂亮之心,人皆有之。早期的圖片美顏教育了市場,到了直播時代,美顏一樣成爲直播平臺的標配。就目前來講,直播美顏用的主流技術是OpenGL ES。它的好處首先是直接在GPU上運行的,因此性能高、功耗小,用在直播上比較划算。第二,它是跨平臺的,iOS和安卓都支持,美顏效果可以直接在這兩個平臺上達到跨平臺的效果。另外OpenGL ES有一個優點,就是有大量現成的開源庫。好比像GPUImage,谷歌的grafika,還有基於安卓的一些具備實踐意義的庫,都是很經常使用的。網上也有一些比較熱心的開發者把本身的美顏的算法直接開源,包括一整套解決方案,從採集處處理到美顏處理,到最後輸出一個源編碼,都有相關的解決方案。架構

圖片描述

2、美顏原理——混合不能少

市面上大部分美顏產品的通常原理都是類似的。攝像頭採集畫面,經過必定的方式處理,最後輸出一張美顏後的圖片。框架

具體的說,原圖首先通過磨皮處理,也就是把痘、斑這些消除掉。而後把通過磨皮的圖片與原圖進行混合。混合這個步驟是不可缺乏的,由於若是隻用磨皮後的圖,很容易丟失細節。並且把兩張圖混合,還能夠經過調整兩個圖的混合權重,來控制磨皮的程度,達成不一樣級別的磨皮效果。固然最後一步也很關鍵,就是美膚,好比把皮膚膚色調得白一點、紅嫩一點,或者一些特殊的需求均可以實現。基本上大部分的美顏,都是這樣的流程。性能

圖片描述

3、磨皮算法——去痘就是降噪

本質上說,一張圖就是一個二維的數據。若是相臨的兩個區域灰度值相差比較大,這就意味着存在着噪點。好比臉上有個痘,這個痘天然產生一個灰度值的變化,從抽象意義上說就是一個噪點。因此美顏磨皮的算法,核心是去噪。去噪有不少的辦法,網上有各類各樣的算法,包括現成的論文。可是無論產用什麼算法,美顏的去噪算法都要保持一個特色,那就既要是邊界保持,同時還要作到平滑,也就是要濾波。測試

濾波算法中比較常見的是雙邊濾波,它的優勢在於很高效,所以很是適合移動平臺。還有一些其餘的算法比較複雜一點,也能夠達到那樣的效果,可是在移動應用上效率不高。雖然GPU是並行運算的,很適合這種運算,但GPU的能力是有必定範圍的,超過這個範圍也很耗電。包括雙邊濾波在內,一種濾波算法也有各類各樣實現,考慮在移動平臺上運行,能夠作一下特別的優化,好比在精度計算裏,適當下降精度,達到效果與效率的平衡。優化

圖片描述

4、膚色調整——檢測纔是難題

在作好磨皮後,最後一個流程就是膚色調整。調整膚色自己的手法已經很是成熟,因此更難的其實在於膚色檢測。爲何要作膚色檢測?有些早期的直播美顏是沒有這個功能的,因此他們就是以美化的膚色爲基礎,簡單粗暴的把整個圖像按這個色彩所有處理掉了,這就形成了總體偏色,效果還不如不作。所以,在處理圖像前,必須先進行膚色檢測,在圖像的全部像素點中找到對應膚色範圍的像素再進行處理。編碼

圖片描述

直播中的膚色檢測特殊的地方在於顏色空間的轉換。由於跟圖像處理相關的顏色空間主要有三種:RGB、YUV、HSV,而這三種色彩空間在直播中都要用到。spa

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、性能——不服跑個分?

說到性能,iOS平臺目前通常來講沒什麼問題,或者問題不多。好比 GPUImage是第三方的,算是iOS平臺上頗有歷史的一個庫。它實現了不少效果,好比剛纔提到的一些算法,在GPUImage裏面能夠看到簡單版的實現,包括怎麼寫腳本,怎麼跑起來,怎麼作雙邊濾波,裏面有簡單的實現,也能夠有很好的效果。包括在作直播的時候,GPUImage能夠做爲很好的客戶端擴展,惟一須要作的事情,就是加上一個推流;由於它包含的從客戶端的採集、處理到每一幀的數據,不管是YUV,仍是RGB,均可以輸出來。因此iOS平臺上相對來講問題少不少。

而安卓平臺問題就比較大了。由於安卓自己的特色,廠商不少、設備不少、系統版本不少,所以相互間比較難兼容。

第一個是設備問題。好比一個美顏算法在不一樣機器上跑起來,即便是同一款GPU,性能也可能會差異很大。因此,爲了保證一個腳本去適應不一樣的機器,有種辦法是這樣的:根據GPU的性能作了一個分級算法,若是評級比較高就採用最複雜的算法,若是性能評級比較低,就把美顏效果下降,保證在大部分環境下使用。

第二是版本的問題。好比,只有4.0以上版本纔可以經過相機,直接從相機採集裏面獲取到一個紋理,這個叫GLTEXTUREEXTERNAL_OES,相機直接把採集到的畫面轉給GPU,所有經過GPU加速。4.3之後能夠作什麼事情?從相機採集處處理到編碼,走的是全GPU,這是效果最好的也是最快的,固然這對系統的兼容要求是最高的。由於有些廠商在實現的時候沒有兼容這些東西,因此GPU加速很難作。

還有輸出YUV。不少直播平臺都要支持輸出YUV。這些YUV的數據就涉及到CPU和GPU的轉換過程。由於處理多是在GPU裏面完成的,GPU無法直接輸出來,就須要從GPU到CPU的轉換,這個目前來講尚未比較好的方案。安卓目前一些底層的GPU尚未開放,有的時候能夠經過Graphics Buffer來實現,可是安卓並無把這個開放出來。若是要有這個東西,惟一能作的是把安卓源代碼拿出來,包括把源代碼link到關鍵碼裏面去,這樣才能達到比較好的效果。CPU到GPU的轉換,是能夠毫秒級別的,若是直接從GPU轉換到CPU,可能好的設備也會花費20毫秒左右,這樣致使的數據,你預測的是24幀,可能就會有掉幀的狀況。在主流上可能影響不大,大部分狀況下都是能夠接受的,固然這最後也要看用戶只有的應用場景。

最後說說常被問到的一個問題: iOS平臺、安卓平臺都自帶有人臉檢測的API,爲何不用?

首先是系統頻率低、速度慢。蘋果可能有這樣一個考慮,不要影響到相機API的正常使用,因此頻率很低。檢測一次可能3秒鐘;不是檢測一次須要3秒鐘,而是3秒鐘纔給你一個數據,告訴你這張照片有沒有人臉。而做爲一個實用的產品,一秒鐘假設24幀,起碼要作十幾回檢測才能夠達到實時的要求,要否則的話跟不上對幀率的要求。在安卓問題更嚴重,由於還要看設備,有些設備甚至就沒有,廠商把這個設置就直接去掉了。另一個特徵點的問題。iOS上面有這些特徵點,好比眼睛、嘴巴、鼻子這些,安卓上面是直接沒有這些特徵點的。

7、美顏2.0——從化妝到整容

以上的內容都屬於美顏1.0的概念,而目前最新的美顏技術已經發展到了2.0概念。打個簡單的比方,若是美顏1.0只是化妝的話,美顏2.0基本就能達到整容的效果——把眼睛變大,把圓臉變成瓜子臉。而實現這一效果的基礎就是人臉識別。這很好理解,只有肯定了有沒有人臉,知道了五官在什麼位置,咱們才能把它們「整」的更漂亮。

關於人臉識別,就又是一個大問題了。限於篇幅,咱們會在下一期詳細展開這個問題說。

相關文章
相關標籤/搜索