Panasonic Facial Recognition System "FacePRO:WV-ASF950"
leiphone 作者:涂图
本文根據對岸塗圖 CTO 在七牛雲架構師沙龍上的演講整理,本篇主要談談人臉辨識技術的原理,與具體實踐的一些問題。
在上篇文章的最後,我們提到了美顏 2.0 最關鍵的技術——人臉辨識。這是項複雜但又非常熱門的技術,我們將在這篇文章中聊一聊圖像辨識技術。
一、如何讓機器看懂世界?
這裡我們來簡單聊聊機器學習與深度學習。
近段時間,機器學習、深度學習的概念非常火,尤其是 Alpha Go 擊敗了韓國棋手這件事,引起了世界的轟動。機器學習和深度學習這兩個概念,比較容易混淆,以至於很多媒體在寫報導時,經常把這兩個詞混著用。由於這兩個概念,目前最主要應用在圖像領域上,所以我們僅就圖像辨識,尤其是人臉辨識方面,區分一下這兩個概念。
機器學習的概念提出的比較早,上世紀 90 年代初,人們開始意識到,一種可以更有效地建構模式,辨識算法的方法,那就是用數據(可以透過廉價勞動力採集獲得)去替換專家(具有很多圖像方面知識的人)。而深度學習可以算是機器學習的一個分支,只在近十年內,才得到廣泛的關注與發展。
下面說說具體的區別。
首先,機器學習辨識物體,是基於像素特徵的。我們會蒐集大量的圖像素材,再選擇一個算法,使用這個算法,來解析數據、從中學習,然後對真實世界中的事件,做出決策和預測。
而深度學習可以算是機器學習的一個分支,只在近十年內才得到廣泛的關注與發展。它與機器學習不同的是,它模擬我們人類,自己去辨識人臉的思路。
比如,神經學家發現了,我們人類在認識一個東西、觀察一個東西的時候,邊緣檢測類的神經元先反應比較大,也就是說我們看物體的時候,永遠都是先觀察到邊緣。
就這樣,經過科學家大量的觀察與實驗,總結出人眼辨識的核心模式,是基於特殊層級的抓取,從一個簡單的層級,到一個複雜的層級,這個層級的轉變,是有一個抽象更替的過程的。
深度學習就模擬了我們人類,去觀測物體這樣一種方式,首先拿到網路上海量的數據,拿到以後才有海量樣本,把海量樣本抓取過來做訓練,抓取到核心的特徵,建立一個網路,因為深度學習就是建立一個多層的神經網路,肯定有很多層。
有些簡單的算法,可能只有四五層,但是有些複雜的,像剛才講的谷歌的,裡面有一百多層。當然這其中有的層,會去做一些數學計算,有的層會做圖像預算,一般隨著層級往下,特徵會越來越抽象。
就這樣,經過科學家大量的觀察與實驗,總結出人眼辨識的核心模式,是基於特殊層級的抓取,從一個簡單的層級,到一個複雜的層級,這個層級的轉變,是有一個抽象更替的過程的。
深度學習就模擬了我們人類,去觀測物體這樣一種方式,首先拿到網路上海量的數據,拿到以後才有海量樣本,把海量樣本抓取過來做訓練,抓取到核心的特徵,建立一個網路,因為深度學習就是建立一個多層的神經網路,肯定有很多層。
有些簡單的算法,可能只有四五層,但是有些複雜的,像剛才講的谷歌的,裡面有一百多層。當然這其中有的層,會去做一些數學計算,有的層會做圖像預算,一般隨著層級往下,特徵會越來越抽象。
舉例來說,辨識一張人臉,如果是在具體環境中的人臉,如果遇到雲霧,或者被樹遮擋一部分,人臉就變得模糊,那基於像素的像素特徵的,機器學習就無法辨認了。它太僵化,太容易受環境條件的干擾。
而深度學習則將所有元素都打碎,然後用神經元,進行「檢查」:人臉的五官特徵、人臉的典型尺寸等等。最後,神經網路會根據各種因素,以及各種元素的加權,給出一個經過深思熟慮的猜測,即這個圖像有多大可能是張人臉。
而深度學習則將所有元素都打碎,然後用神經元,進行「檢查」:人臉的五官特徵、人臉的典型尺寸等等。最後,神經網路會根據各種因素,以及各種元素的加權,給出一個經過深思熟慮的猜測,即這個圖像有多大可能是張人臉。
所以,深度學習比機器學習,不管在人臉辨識,還是各種各樣的辨識表現都要好,甚至已經超過人類的辨識能力。
比如 2015 年谷歌發佈了一個 facenet 網路,做人臉檢測的,號稱用這個網路可以達到 98% 以上辨識率。而我們人類自己去看樣本所達到的正確率,一樣不是百分之百,甚至還沒有現在一些,採用最先進的深度學習,算法技術準確率高。
比如 2015 年谷歌發佈了一個 facenet 網路,做人臉檢測的,號稱用這個網路可以達到 98% 以上辨識率。而我們人類自己去看樣本所達到的正確率,一樣不是百分之百,甚至還沒有現在一些,採用最先進的深度學習,算法技術準確率高。
在機器學習方面,目前國際上比較主流的,基於人臉檢測的計算,一是 HOG 算法,還有其他像 LBF 特徵算法。 LBF 是 OpenCV 的,OpenCV 是個非常有名的開源庫,裡面有各種各樣的圖像處理相關功能,而且是開源的,但是它在移動平台上效果很差,沒有辦法達到我們要的效果。
這裡提到是因為它非常有名,裡面包含了各種各樣圖像處理相關的功能,比如說做特殊處理,做人臉辨識、物體辨識等等。OpenCV 裡面,就包含了 LBF 算法的實現。
這裡提到是因為它非常有名,裡面包含了各種各樣圖像處理相關的功能,比如說做特殊處理,做人臉辨識、物體辨識等等。OpenCV 裡面,就包含了 LBF 算法的實現。
深度學習有不少開源框架,比如 Caffe、TensorFlow。這些框架提供的,僅僅是建構深度學習網路的工具,但是深度神經網路,才是最關鍵的東西。網路怎麼建構?網路有多種建構方式,比如大家去關注這方面,會發現經常看到一些名詞,CNN、RNN。
CNN 可能是比較熱門的,在人臉辨識方面,是表現非常優越的一個網路,現在也是比較主流的一個網路。當然也有很多路,RNN 或者是更快的 CNN 網路等等,在解決某些具體問題的時候,有更加好的表現。
CNN 可能是比較熱門的,在人臉辨識方面,是表現非常優越的一個網路,現在也是比較主流的一個網路。當然也有很多路,RNN 或者是更快的 CNN 網路等等,在解決某些具體問題的時候,有更加好的表現。
二、圖像辨識的一些具體實現:比如,智慧鑒黃
當們我們具備了相關的深度學習技術後,就可以在服務端上,建構應用了。
比如做智慧鑒黃,一路影像流輸入,解碼以後拿到每一幀,辨識出有問題的部分,對它進行處理。比如打上馬賽克,或者把內容保存下來,然後發送通知給後台,告訴後台這裡有一張,疑似有不可描述的東西出現了等等,之後再編碼,輸出到其它地方,比如再分發到 CDN 等等。這些過程如果用人工辨識成本非常高,要發展肯定要透過技術手段去解決。
最後說下手機端上的經驗:塗圖的產品在人臉檢測,性能方面的測試指標。
比如 iOS 和安卓平台上面,我們做的測試,在 iPhone 6 上,40 特徵點抓取需要 40 毫秒,相當於一秒內可以處理 25 幀。當然實際上並不需要這麼多的次數,人眼觀察事物,因為有視覺暫留效應,一般來說 12 幀是個分界線,小於 12 幀就能感覺到畫面卡頓,但是只要大於 12 幀,看起來就是連續的。所以我們一般限制在十七八次的檢測,在 iOS 上夠用了。
安卓方面,相對於 iOS 平台的表現確實要差一些,不論是 API 的封裝,還是整個硬體的搭配,可能同樣一個 GPU 型號,用在安卓的設備上,就沒法達到跟 iOS 同樣的表現,iOS 平台確實在各方面上,要做得比安卓好一點。小米5 是比較新的設備了, 40 特徵點抓取需要大概 60 毫秒。
安卓方面,相對於 iOS 平台的表現確實要差一些,不論是 API 的封裝,還是整個硬體的搭配,可能同樣一個 GPU 型號,用在安卓的設備上,就沒法達到跟 iOS 同樣的表現,iOS 平台確實在各方面上,要做得比安卓好一點。小米5 是比較新的設備了, 40 特徵點抓取需要大概 60 毫秒。
雖然在手機端上,比如 iOS 9,已經推出了深度學習 API,iOS 10 又對其進行了升級,提供了更多的功能,但是一般來說我們是在 PC 上面開發、訓練的,直到把代碼都做好,再放在手機設備上運行。
因為就像剛才提到的,機器學習、深度學習的開發中非常關鍵的環節是訓練。
因為就像剛才提到的,機器學習、深度學習的開發中非常關鍵的環節是訓練。
訓練是什麼意思?
比如我取 1 萬張圖片,把人臉都標識出來,把 1 萬張樣本處理之後得到經驗,到底人臉有什麼特徵?比如涉及 150 個參數,得出一個函數,調整後得到一個函數模型,這樣的模型再去訓練、測試,最後得到一個比較好的模型。
接下來再找很多測試數據,比如 1 萬張測試數據,來檢測這個模型,如果表現很好,那這個數據模型網路是可靠的,最後用在實際中。
接下來再找很多測試數據,比如 1 萬張測試數據,來檢測這個模型,如果表現很好,那這個數據模型網路是可靠的,最後用在實際中。
但是這個訓練的過程,非常耗時間。我們運行一個訓練,CPU 可能需要二三十個小時。
這還是簡單的模型,一些複雜的模型,比如谷歌開放的 125 層神經網路,如果用 CPU 來跑可能要三四天,相當於這麼久以後才能得到一個模型,你才知道這個模型是好是壞。如果你發現不行,又改了一個小參數,結果還要繼續三四天時間。所以解決的辦法只有一條,就是升級硬體。比如 GPU 取代 CPU 完成運算。
科寶電子官網 www.cop-security.com
|
這裡列了一個細的指標,比如有些算法,需要在 RGB 空間裡做檢測,有沒有不可描述的內容在裡面。如果我們用 GTX 980 Ti 來運行,可以小於 20 毫秒一幀,用 i7 的 CPU 運行,檢測出來則是 800 秒,跟 GPU 跑完全不可比。
但問題是,專門做訓練的 GPU 設備非常貴,四五萬元的 GPU 在機器訓練裡面都不算好的,而且為了在複雜的場景中不耽誤時間,比如像 Alpha Go 做訓練一樣,只能用海量的設備來彌補,這個成本可想而知。所以才說只有有一定實力的公司,才能擔負的起做深度學習。
現在國際上一些主流的大公司,比如微軟,很多服務包括雲服務等等,用的是 FPGA 方案。百度也在做基於運算單元的晶片,中科院也在做相關的研究。
所以深度學習一路發展下來,實際上一直都卡在計算上,計算能力遠遠跟不上我們軟體的要求,最後就又變成了比拼硬體的時代。但其實這個問題,並不是近期才有的:早在人工智慧出現的早期,神經網路的概念就已經存在了,但神經網路對於「智慧」的貢獻微乎其微,主要問題就出在運算能力不足上。所以現在大家可以預見,量子計算一旦成為可能,人工智慧的時代才算真正要到來了。
台灣區電信工程工業同業公會 |
沒有留言:
張貼留言