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