圖像技術(shù)在直播中的應(yīng)用(下)——圖像識(shí)別
在《圖像技術(shù)在直播中的應(yīng)用(上)》中,我們簡(jiǎn)述了美顏技術(shù)1.0的原理與實(shí)踐問(wèn)題。在文章的***,我們提到了美顏2.0最關(guān)鍵的技術(shù)——人臉識(shí)別。這是項(xiàng)復(fù)雜但又非常熱門的技術(shù),我們將在這篇文章中聊一聊圖像識(shí)別,其原理與具體實(shí)踐的一些問(wèn)題。該分享系列整理自涂圖CTO在架構(gòu)師沙龍上的演講內(nèi)容。
一、淺析機(jī)器學(xué)習(xí)與深度學(xué)習(xí)——如何讓機(jī)器看懂世界?
近段時(shí)間,機(jī)器學(xué)習(xí)、深度學(xué)習(xí)的概念非常火,尤其是今年 AlphaGo 擊敗了韓國(guó)棋手這件事,引起了世界的轟動(dòng)。機(jī)器學(xué)習(xí)和深度學(xué)習(xí)這兩個(gè)概念,比較容易混淆,以至于很多媒體在寫(xiě)報(bào)道時(shí),經(jīng)常把這兩個(gè)詞混著用。由于這兩個(gè)概念目前最主要應(yīng)用在圖像領(lǐng)域上,所以我們僅就圖像識(shí)別,尤其是人臉識(shí)別方面,區(qū)分一下這兩個(gè)概念。
機(jī)器學(xué)習(xí)的概念提出的比較早,上世紀(jì) 90 年代初,人們開(kāi)始意識(shí)到一種可以更有效地構(gòu)建模式識(shí)別算法的方法,那就是用數(shù)據(jù)(可以通過(guò)廉價(jià)勞動(dòng)力采集獲得)去替換專家(具有很多圖像方面知識(shí)的人)。而深度學(xué)習(xí)可以算是機(jī)器學(xué)習(xí)的一個(gè)分支,只在近十年內(nèi)才得到廣泛的關(guān)注與發(fā)展。
下面說(shuō)說(shuō)具體的區(qū)別。
首先,機(jī)器學(xué)習(xí)識(shí)別物體是基于像素特征的。我們會(huì)搜集大量的圖像素材,再選擇一個(gè)算法,使用這個(gè)算法來(lái)解析數(shù)據(jù)、從中學(xué)習(xí),然后對(duì)真實(shí)世界中的事件做出決策和預(yù)測(cè)。
而深度學(xué)習(xí)可以算是機(jī)器學(xué)習(xí)的一個(gè)分支,只在近十年內(nèi)才得到廣泛的關(guān)注與發(fā)展。它與機(jī)器學(xué)習(xí)不同的,它模擬我們?nèi)祟愖约喝プR(shí)別人臉的思路。比如,神經(jīng)學(xué)家發(fā)現(xiàn)了我們?nèi)祟愒谡J(rèn)識(shí)一個(gè)東西、觀察一個(gè)東西的時(shí)候,邊緣檢測(cè)類的神經(jīng)元先反應(yīng)比較大,也就是說(shuō)我們看物體的時(shí)候永遠(yuǎn)都是先觀察到邊緣。就這樣,經(jīng)過(guò)科學(xué)家大量的觀察與實(shí)驗(yàn),總結(jié)出人眼識(shí)別的核心模式是基于特殊層級(jí)的抓取,從一個(gè)簡(jiǎn)單的層級(jí)到一個(gè)復(fù)雜的層級(jí),這個(gè)層級(jí)的轉(zhuǎn)變是有一個(gè)抽象迭代的過(guò)程的。深度學(xué)習(xí)就模擬了我們?nèi)祟惾ビ^測(cè)物體這樣一種方式,首先拿到互聯(lián)網(wǎng)上海量的數(shù)據(jù),拿到以后才有海量樣本,把海量樣本抓取過(guò)來(lái)做訓(xùn)練,抓取到核心的特征,建立一個(gè)網(wǎng)絡(luò),因?yàn)樯疃葘W(xué)習(xí)就是建立一個(gè)多層的神經(jīng)網(wǎng)絡(luò),肯定有很多層。有些簡(jiǎn)單的算法可能只有四五層,但是有些復(fù)雜的,像剛才講的谷歌的,里面有一百多層。當(dāng)然這其中有的層會(huì)去做一些數(shù)學(xué)計(jì)算,有的層會(huì)做圖像預(yù)算,一般隨著層級(jí)往下,特征會(huì)越來(lái)越抽象。
舉例來(lái)說(shuō),識(shí)別一張人臉。如果是在具體環(huán)境中的人臉,如果遇到云霧,或者被樹(shù)遮擋一部分,人臉就變得模糊,那基于像素的像素特征的機(jī)器學(xué)習(xí)就無(wú)法辨認(rèn)了。它太僵化,太容易受環(huán)境條件的干擾。而深度學(xué)習(xí)則將所有元素都打碎,然后用神經(jīng)元進(jìn)行“檢查”:人臉的五官特征、人臉的典型尺寸等等。***,神經(jīng)網(wǎng)絡(luò)會(huì)根據(jù)各種因素,以及各種元素的權(quán)重,給出一個(gè)經(jīng)過(guò)深思熟慮的猜測(cè),即這個(gè)圖像有多大可能是張人臉。
所以,深度學(xué)習(xí)比機(jī)器學(xué)習(xí)不管在人臉識(shí)別還是各種各樣的識(shí)別表現(xiàn)都要好,甚至已經(jīng)超過(guò)人類的識(shí)別能力。比如 2015 年谷歌發(fā)布了一個(gè) facenet 網(wǎng)絡(luò),做人臉檢測(cè)的,號(hào)稱用這個(gè)網(wǎng)絡(luò)可以達(dá)到 98% 以上識(shí)別率。而我們?nèi)祟愖约喝タ礃颖舅_(dá)到的正確率,一樣不是***,甚至還沒(méi)有現(xiàn)在一些***進(jìn)的采用深度學(xué)習(xí)算法的技術(shù)準(zhǔn)確率高。
在機(jī)器學(xué)習(xí)方面,目前國(guó)際上比較主流的基于人臉檢測(cè)的計(jì)算,一是 HOG 算法,還有其他像 LBF 特征算法。 LBF 是 OpenCV 的,OpenCV 是個(gè)非常有名的開(kāi)源庫(kù),里面有各種各樣的圖象處理相關(guān)功能,而且是開(kāi)源的,但是它在移動(dòng)平臺(tái)上效果很差,沒(méi)有辦法達(dá)到我們要的效果。這里提到是因?yàn)樗浅S忻?,里面包含了各種各樣圖象處理相關(guān)的功能,比如說(shuō)做特殊處理,做人臉識(shí)別、物體識(shí)別等等。OpenCV 里面就包含了 LBF 算法的實(shí)現(xiàn)。
深度學(xué)習(xí)有不少開(kāi)源框架,比如 Caffe、TensorFlow。這些框架提供的僅僅是構(gòu)建深度學(xué)習(xí)網(wǎng)絡(luò)的工具,但是深度神經(jīng)網(wǎng)絡(luò)才是最關(guān)鍵的東西。網(wǎng)絡(luò)怎么構(gòu)建?網(wǎng)絡(luò)有多種構(gòu)建方式,比如大家去關(guān)注這方面會(huì)發(fā)現(xiàn)經(jīng)常看到一些名詞,CNN、RNN,CNN 可能是比較火的,在人臉識(shí)別方面是表現(xiàn)非常優(yōu)越的一個(gè)網(wǎng)絡(luò),現(xiàn)在也是比較主流的一個(gè)網(wǎng)絡(luò)。當(dāng)然也有很多網(wǎng)絡(luò),RNN 或者是更快的 CNN 網(wǎng)絡(luò)等等,在解決某些具體問(wèn)題的時(shí)候,有更加好的表現(xiàn)。
二、圖像識(shí)別的一些具體實(shí)現(xiàn)——以智能鑒黃為例
當(dāng)們我們具備了相關(guān)的深度學(xué)習(xí)技術(shù)后,就可以在服務(wù)端上構(gòu)建應(yīng)用了。比如做智能鑒黃,一路視頻流輸入,解碼以后拿到每一幀,識(shí)別出有問(wèn)題的部分,對(duì)它進(jìn)行處理;比如打上馬賽克,或者把內(nèi)容保存下來(lái),然后發(fā)送通知給后臺(tái),告訴后臺(tái)這里有一張疑似有不可描述的東西出現(xiàn)了等等,之后再編碼,輸出到其它地方,比如再分發(fā)到 CDN 等等。這些過(guò)程如果用人工識(shí)別成本非常高,要發(fā)展肯定要通過(guò)技術(shù)手段去解決。
***說(shuō)下手機(jī)端上的經(jīng)驗(yàn):涂圖的產(chǎn)品在人臉檢測(cè)性能方面的測(cè)試指標(biāo)。比如 iOS 和安卓平臺(tái)上面我們做的測(cè)試,在 iPhone 6 上,40 特征點(diǎn)抓取需要 40 毫秒,相當(dāng)于一秒內(nèi)可以處理 25 幀。當(dāng)然實(shí)際上并不需要這么多的次數(shù),人眼觀察事物,因?yàn)橛幸曈X(jué)暫留效應(yīng),一般來(lái)說(shuō) 12 幀是個(gè)分界線,小于 12 幀就能感覺(jué)到畫(huà)面卡頓,但是只要大于 12 幀,看起來(lái)就是連續(xù)的。所以我們一般限制在十七八次的檢測(cè),在 iOS 上夠用了。安卓方面,相對(duì)于 iOS 平臺(tái)的表現(xiàn)確實(shí)要差一些,不論是 API 的封裝,還是整個(gè)硬件的搭配,可能同樣一個(gè) GPU 型號(hào),用在安卓的設(shè)備上就沒(méi)法達(dá)到跟 iOS 同樣的表現(xiàn),iOS 平臺(tái)確實(shí)在各方面上要做得比安卓好一點(diǎn)。小米5是比較新的設(shè)備了,40 特征點(diǎn)抓取需要大概 60毫秒。
三、技術(shù)的發(fā)展瓶頸——***還是拼硬件
雖然在手機(jī)端上,比如 iOS 9,已經(jīng)推出了深度學(xué)習(xí) API,iOS 10 又對(duì)其進(jìn)行了升級(jí),提供了更多的功能;但是一般來(lái)說(shuō)我們是在 PC 上面開(kāi)發(fā)、訓(xùn)練的,直到把代碼都做好,再放在手機(jī)設(shè)備上運(yùn)行。因?yàn)榫拖駝偛盘岬降?,機(jī)器學(xué)習(xí)、深度學(xué)習(xí)的開(kāi)發(fā)中非常關(guān)鍵的環(huán)節(jié)是訓(xùn)練。
訓(xùn)練是什么意思?
比如我取 1 萬(wàn)張圖片把人臉都標(biāo)識(shí)出來(lái),把 1 萬(wàn)張樣本處理之后得到經(jīng)驗(yàn),到底人臉有什么特征,比如涉及 150 個(gè)參數(shù),得出一個(gè)函數(shù),調(diào)整后得到一個(gè)函數(shù)模型,這樣的模型再去訓(xùn)練、測(cè)試,***得到一個(gè)比較好的模型。接下來(lái)再找很多測(cè)試數(shù)據(jù),比如 1 萬(wàn)張測(cè)試數(shù)據(jù),來(lái)檢測(cè)這個(gè)模型,如果表現(xiàn)很好,那這個(gè)數(shù)據(jù)模型網(wǎng)絡(luò)是可靠的,***用在實(shí)際中。
但是這個(gè)訓(xùn)練的過(guò)程非常耗時(shí)間。我們運(yùn)行一個(gè)訓(xùn)練,CPU 可能需要二三十個(gè)小時(shí)。這還是簡(jiǎn)單的模型,一些復(fù)雜的模型,比如谷歌開(kāi)放的 125 層神經(jīng)網(wǎng)絡(luò),如果用 CPU 來(lái)跑可能要三四天,相當(dāng)于這么久以后才能得到一個(gè)模型,你才知道這個(gè)模型是好是壞。如果你發(fā)現(xiàn)不行,又改了一個(gè)小參數(shù),結(jié)果還要繼續(xù)三四天時(shí)間。所以解決的辦法只有一條,就是升級(jí)硬件。比如 GPU 取代 CPU 完成運(yùn)算。
這里列了一個(gè)細(xì)的指標(biāo),比如有些算法需要在 RGB 空間里做檢測(cè),有沒(méi)有不可描述的內(nèi)容在里面。如果我們用 GTX 980 Ti 來(lái)運(yùn)行,可以小于 20 毫秒一幀,用 i7 的 CPU 運(yùn)行,檢測(cè)出來(lái)則是 800 秒,跟 GPU 跑完全不可比。但問(wèn)題是,專門做訓(xùn)練的 GPU 設(shè)備非常貴,七八千塊錢的 GPU 在機(jī)器訓(xùn)練里面都不算好的,而且為了在復(fù)雜的場(chǎng)景中不耽誤時(shí)間,比如像 AlphaGo 做訓(xùn)練一樣,只能用海量的設(shè)備來(lái)彌補(bǔ),這個(gè)成本可想而知。所以才說(shuō)只有有一定實(shí)力的公司才能擔(dān)負(fù)的起做深度學(xué)習(xí)。
現(xiàn)在國(guó)際上一些主流的大公司,比如微軟,很多服務(wù)包括云服務(wù)等等,用的是 FPGA 方案。百度也在做基于運(yùn)算單元的芯片,中科院也在做相關(guān)的研究。所以深度學(xué)習(xí)一路發(fā)展下來(lái),實(shí)際上一直都卡在計(jì)算上,計(jì)算能力遠(yuǎn)遠(yuǎn)跟不上我們軟件的要求,***就又變成了比拼硬件的時(shí)代。但其實(shí)這個(gè)問(wèn)題并不是近期才有的;早在人工智能出現(xiàn)的早期,神經(jīng)網(wǎng)絡(luò)的概念就已經(jīng)存在了,但神經(jīng)網(wǎng)絡(luò)對(duì)于“智能”的貢獻(xiàn)微乎其微,主要問(wèn)題就出在運(yùn)算能力不足上。所以現(xiàn)在大家可以預(yù)見(jiàn),量子計(jì)算一旦成為可能,人工智能的時(shí)代才算真正要到來(lái)了。