基於深度學習框架caffe的人臉檢測
GIF/1K
1
什麼是深度學習
深度學習的概念源於人工神經網路的研究。含多隱層的多層感知器就是一種深度學習結構。深度學習通過組合低層特徵形成更加抽象的高層表示屬性類別或特徵,以發現數據的分散式特徵表示。
深度學習的概念由Hinton等人於2006年提出。基於深度置信網路(DBN)提出非監督貪心逐層訓練演算法,為解決深層結構相關的優化難題帶來希望,隨後提出多層自動編碼器深層結構。此外Lecun等人提出的卷積神經網路是第一個真正多層結構學習演算法,它利用空間相對關係減少參數數目以提高訓練性能。
深度學習是機器學習中一種基於對數據進行表徵學習的方法。觀測值(例如一幅圖像)可以使用多種方式來表示,如每個像素強度值的向量,或者更抽象地表示成一系列邊、特定形狀的區域等。而使用某些特定的表示方法更容易從實例中學習任務(例如,人臉識別或面部表情識別)。深度學習的好處是用非監督式或半監督式的特徵學習和分層特徵提取高效演算法來替代手工獲取特徵。
深度學習是機器學習研究中的一個新的領域,其動機在於建立、模擬人腦進行分析學習的神經網路,它模仿人腦的機制來解釋數據,例如圖像,聲音和文本。同機器學習方法一樣,深度機器學習方法也有監督學習與無監督學習之分.不同的學習框架下建立的學習模型很是不同.例如,卷積神經網路(Convolutional neural networks,簡稱CNNs)就是一種深度的監督學習下的機器學習模型,而深度置信網(Deep Belief Nets,簡稱DBNs)就是一種無監督學習下的機器學習模型。
2
Caffe是什麼樣的框架
Caffe的設計:基本上,Caffe follow了神經網路的一個簡單假設----所有的計算都是以layer的形式表示的,layer做的事情就是take一些數據,然後輸出一些計算以後的結果,比如說卷積,就是輸入一個圖像,然後和這一層的參數(filter)做卷積,然後輸出卷積的結果。每一個layer需要做兩個計算:forward是從輸入計算輸出,然後backward是從上面給的gradient來計算相對於輸入的gradient,只要這兩個函數實現了以後,我們就可以把很多層連接成一個網路,這個網路做的事情就是輸入我們的數據(圖像或者語音或者whatever),然後來計算我們需要的輸出(比如說識別的label),在training的時候,我們可以根據已有的label來計算loss和gradient(梯度),然後用gradient來update網路的參數。通俗點說卷積就是把二維圖像矩陣通過某種操作變成另外一堆二維矩陣,這個過程就是一個小積木,然後所有的積木都是通過矩陣運算拼到一起去,變成一個大的構建,這個大構建上面有很多未知的參數,然後弄一個演算法比如梯度下降把這些參數確定出來。
好了,對卷積神經網路有所了解,就可以看看caffe的代碼了,要讀懂caffe,首先要熟悉Blob,Layer,Net,Solver這幾個大類。這四個大類自下而上,環環相扣,貫穿了整個caffe的結構,下面先分別簡單地介紹一下這四個類的主要作用。
Blob作為數據傳輸的媒介,無論是網路權重參數,還是輸入數據,都是轉化為Blob數據結構來存儲
Layer作為網路的基礎單元,神經網路中層與層間的數據節點、前後傳遞都在該數據結構中被實現,層類種類豐富,比如常用的卷積層、全連接層、pooling層等等,大大地增加了網路的多樣性
Net作為網路的整體骨架,決定了網路中的層次數目以及各個層的類別等信息
Solver作為網路的求解策略,涉及到求解優化問題的策略選擇以及參數確定方面,修改這個模塊的話一般都會是研究DL的優化求解的方向。
3
基於卷積神經網路(CNN)的人臉檢測
我是根據A Convolutional Neural Network Cascade for Face Detection這篇paper來實現的,作者是Haoxiang Liy, Zhe Linz, Xiaohui Shenz, Jonathan Brandtz, Gang Hua。
基於卷積神經網路的人臉檢測方法,包括訓練階段和測試階段;在訓練階段,將訓練樣本輸入卷積神經網路,獲得卷積神經網路的連接權值和偏置值;在測試階段,讀入視頻圖像,當檢測到有運動物體時,提取出感興趣區域,用n*n像素大小的塊每次移動I個像素,對感興趣區域進行分塊處理,得到若干圖片,將分塊後的圖片縮放至與訓練樣本的大小相同,並將這些圖片輸入已訓練完成的卷積神經網路進行分類,其中50 < η < 70。其中,上述卷積神經網路的結構為8層,包括依次連接的輸入層、Cl層、S2層、C3層、S4層、C5層、S6層和輸出層,Cl層、C3層、C5層為卷積層,S2層、S4層、S6層為下採樣層,Cl層有8個56*56像素大小的特徵map,S2層有8個28*28像素大小的特徵map,C3層有24個24*24像素大小的特徵map,S4層有24個12*12像素大小的特徵map,C5層有50個8*8像素大小的特徵map,S6層有50個4*4像素大小的特徵map,輸出層包括I和O兩個單元,分別表示人臉和非人臉。
4
後記
當時做這個項目時face++小組的人臉檢測準確率已經超過Google了,他們的網站https://www.faceplusplus.com.cn/,最近我發現百度雲也可以在網頁上進行人臉檢測了,https://cloud.baidu.com/product/face/detect。當然這些都不會開源的,但由於可見基於深度學習的人臉檢測這一課題的火熱程度,因為圖像處理是最適用於深度學習場景的,而人臉識別和檢測是最具有發展前景的項目之一。本來隨著實現A Convolutional Neural Network Cascade for Face Detection這篇論文,我已經將這個課題放在了一邊,但因為各方面的機緣巧合,又重拾起來,寫下了這篇算是科普意義的文章。之後如果有新的成果,會及時和大家分享。
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
TAG:VTime |