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