2019年6月28日 星期五

.整容式的美顏 2.0 技術如何實現?聊一聊背後的圖像辨識技術

Panasonic Facial Recognition System "FacePRO:WV-ASF950"



leiphone 作者:涂图


本文根據對岸塗圖 CTO 在七牛雲架構師沙龍上的演講整理,本篇主要談談人臉辨識技術的原理,與具體實踐的一些問題。

上篇文章的最後,我們提到了美顏 2.0 最關鍵的技術——人臉辨識。這是項複雜但又非常熱門的技術,我們將在這篇文章中聊一聊圖像辨識技術。

一、如何讓機器看懂世界?
這裡我們來簡單聊聊機器學習與深度學習。

近段時間,機器學習、深度學習的概念非常火,尤其是 Alpha Go 擊敗了韓國棋手這件事,引起了世界的轟動。機器學習深度學習這兩個概念,比較容易混淆,以至於很多媒體在寫報導時,經常把這兩個詞混著用。由於這兩個概念,目前最主要應用在圖像領域上,所以我們僅就圖像辨識,尤其是人臉辨識方面,區分一下這兩個概念。

機器學習的概念提出的比較早,上世紀 90 年代初,人們開始意識到,一種可以更有效地建構模式,辨識算法的方法,那就是用數據(可以透過廉價勞動力採集獲得)去替換專家(具有很多圖像方面知識的人)。而深度學習可以算是機器學習的一個分支,只在近十年內,才得到廣泛的關注與發展。

下面說說具體的區別。

首先,機器學習辨識物體,是基於像素特徵的。我們會蒐集大量的圖像素材,再選擇一個算法,使用這個算法,來解析數據、從中學習,然後對真實世界中的事件,做出決策和預測。

解析:整容式的美颜2.0技术如何实现?聊一聊背后的图像识别技术

而深度學習可以算是機器學習的一個分支,只在近十年內才得到廣泛的關注與發展。它與機器學習不同的是,它模擬我們人類,自己去辨識人臉的思路。

比如,神經學家發現了,我們人類在認識一個東西、觀察一個東西的時候,邊緣檢測類的神經元先反應比較大,也就是說我們看物體的時候,永遠都是先觀察到邊緣。

就這樣,經過科學家大量的觀察與實驗,總結出人眼辨識的核心模式,是基於特殊層級的抓取,從一個簡單的層級,到一個複雜的層級,這個層級的轉變,是有一個抽象更替的過程的。

深度學習就模擬了我們人類,去觀測物體這樣一種方式,首先拿到網路上海量的數據,拿到以後才有海量樣本,把海量樣本抓取過來做訓練,抓取到核心的特徵,建立一個網路,因為深度學習就是建立一個多層的神經網路,肯定有很多層。

有些簡單的算法,可能只有四五層,但是有些複雜的,像剛才講的谷歌的,裡面有一百多層。當然這其中有的層,會去做一些數學計算,有的層會做圖像預算,一般隨著層級往下,特徵會越來越抽象。

解析:整容式的美颜2.0技术如何实现?聊一聊背后的图像识别技术

舉例來說,辨識一張人臉,如果是在具體環境中的人臉,如果遇到雲霧,或者被樹遮擋一部分,人臉就變得模糊,那基於像素的像素特徵的,機器學習就無法辨認了。它太僵化,太容易受環境條件的干擾。

而深度學習則將所有元素都打碎,然後用神經元,進行「檢查」:人臉的五官特徵、人臉的典型尺寸等等。最後,神經網路會根據各種因素,以及各種元素的加權,給出一個經過深思熟慮的猜測,即這個圖像有多大可能是張人臉。

所以,深度學習比機器學習,不管在人臉辨識,還是各種各樣的辨識表現都要好,甚至已經超過人類的辨識能力。

比如 2015 年谷歌發佈了一個 facenet 網路,做人臉檢測的,號稱用這個網路可以達到 98% 以上辨識率。而我們人類自己去看樣本所達到的正確率,一樣不是百分之百,甚至還沒有現在一些,採用最先進的深度學習,算法技術準確率高。

在機器學習方面,目前國際上比較主流的,基於人臉檢測的計算,一是 HOG 算法,還有其他像 LBF 特徵算法。 LBF 是 OpenCV 的,OpenCV 是個非常有名的開源庫,裡面有各種各樣的圖像處理相關功能,而且是開源的,但是它在移動平台上效果很差,沒有辦法達到我們要的效果。

這裡提到是因為它非常有名,裡面包含了各種各樣圖像處理相關的功能,比如說做特殊處理,做人臉辨識、物體辨識等等。OpenCV 裡面,就包含了 LBF 算法的實現。

深度學習有不少開源框架,比如 Caffe、TensorFlow。這些框架提供的,僅僅是建構深度學習網路的工具,但是深度神經網路,才是最關鍵的東西。網路怎麼建構?網路有多種建構方式,比如大家去關注這方面,會發現經常看到一些名詞,CNN、RNN。

CNN 可能是比較熱門的,在人臉辨識方面,是表現非常優越的一個網路,現在也是比較主流的一個網路。當然也有很多路,RNN 或者是更快的 CNN 網路等等,在解決某些具體問題的時候,有更加好的表現。

二、圖像辨識的一些具體實現:比如,智慧鑒黃
當們我們具備了相關的深度學習技術後,就可以在服務端上,建構應用了。

比如做智慧鑒黃,一路影像流輸入,解碼以後拿到每一幀,辨識出有問題的部分,對它進行處理。比如打上馬賽克,或者把內容保存下來,然後發送通知給後台,告訴後台這裡有一張,疑似有不可描述的東西出現了等等,之後再編碼,輸出到其它地方,比如再分發到 CDN 等等。這些過程如果用人工辨識成本非常高,要發展肯定要透過技術手段去解決。

解析:整容式的美颜2.0技术如何实现?聊一聊背后的图像识别技术

最後說下手機端上的經驗:塗圖的產品在人臉檢測,性能方面的測試指標。

比如 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 完成運算。

科寶電子官網 www.cop-security.com

這裡列了一個細的指標,比如有些算法,需要在 RGB 空間裡做檢測,有沒有不可描述的內容在裡面。如果我們用 GTX 980 Ti 來運行,可以小於 20 毫秒一幀,用 i7 的 CPU 運行,檢測出來則是 800 秒,跟 GPU 跑完全不可比。

但問題是,專門做訓練的 GPU 設備非常貴,四五萬元的 GPU 在機器訓練裡面都不算好的,而且為了在複雜的場景中不耽誤時間,比如像 Alpha Go 做訓練一樣,只能用海量的設備來彌補,這個成本可想而知。所以才說只有有一定實力的公司,才能擔負的起做深度學習。

現在國際上一些主流的大公司,比如微軟,很多服務包括雲服務等等,用的是 FPGA 方案。百度也在做基於運算單元的晶片,中科院也在做相關的研究。

所以深度學習一路發展下來,實際上一直都卡在計算上,計算能力遠遠跟不上我們軟體的要求,最後就又變成了比拼硬的時代。但其實這個問題,並不是近期才有的:早在人工智慧出現的早期,神經網路的概念就已經存在了,但神經網路對於「智慧」的貢獻微乎其微,主要問題就出在運算能力不足上。所以現在大家可以預見,量子計算一旦成為可能,人工智慧的時代才算真正要到來了。
台灣區電信工程工業同業公會

沒有留言:

張貼留言