【Caffe实践】基于Caffe的人脸检测实现
from:?http://blog.csdn.net/chenriwei2/article/details/50321085
0. 引言
深度學習可以說是在人臉分析相關領域遍地開花,近年來在人臉識別,深度學習在人臉檢測,人臉關鍵點檢測中有很廣泛的應用,這篇文章中,初步實現了基于深度學習CNN的人臉檢測。
1. 方法討論
深度學習一般沒有進行直接的檢測,現有的檢測大多都是基于分類的檢測,主要的方法有兩種:
1.1. 基于滑動窗口的分類
最典型的方法就是OverFeat那一套,其主要的方法是:對于每一個尺度、每一個可能的滑動窗口,進行分類。其主要的缺點是:對于稍微大一點的圖像,滑動窗口往往有好幾百萬個之多,所以直接利用這個方法往往速度比較的慢。
如果只是對每一個滑動窗口進行分類的話,那速度的確會變得非常的慢,但是,卷積有一個顯著的優點就是權值共享,它可以很好的進行計算結果的重復利用。所以最后基于CNN的全卷積網絡速度也不會特別的慢。
1.2. 基于目標顯著性方法
最典型的方法是R-CNN那一套,其主要的方法是:先快速的檢測可能的目標區域塊,然后用訓練好的深度網絡模型進行特征提取,之后再進行分類。它主要解決的問題就是基于滑動窗口的目標檢測方法窗口過多的問題。
然而這種方法可能不適合于人臉檢測,因為人臉是屬于局部目標,而顯著目標檢測通常用來檢測通用的完整目標區域。
在這里,我實現的是基于滑動窗口的檢測方法,利用caffe的機制,直接將訓練好了的網絡模型轉換為全卷積網絡,從而實現直接輸入任意圖像的大小。
2. 實驗步驟
2.1. 數據生成
首先是樣本的采樣,需要的是兩類數據,人臉圖像和非人臉圖像。可以用自己喜歡的方法進行人臉框和非人臉框的選取,并把截取的人臉圖像塊分別放在face-images 和no-face-images 文件夾中。
在這里需要注意的一點是:如果隨機采樣,很有可能正負數據及其的不平衡,從而導致網絡無法訓練,需要特別注意。
緊接著是將數據轉換為LMDB,這一點其實挺重要的,直接的文件列表雖然方便,但是訓練速度會比LMDB格式的低5倍左右,而且LMDB或者LevelDB支持更多的數據預處理方法。
利用如下腳本:{convert_data_lmdb.sh},可以將數據轉化為LMDB。
<code class="hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">略</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>2.2. 網絡配置
由于我們是用來做人臉二分類,所以沒有必要訓練一個非常大的網絡,小一點的就可以,我這邊是改進DeepID的網絡,采用人臉圖像大小是48*48 彩色圖像。當然你也可以直接那別人訓練好了的網絡進行微調處理。
網絡結構圖如下所示:?
完整的訓練參數及其文件在最后面的鏈接文件給出。。
2.3. 訓練網絡
訓練網絡也跟普通的所有的分類網絡訓練一樣。?
配置好相對應的路徑和超參數,在當前路徑下,運行
由于是二分類,網絡收斂的很快,差不多幾萬個迭代就可以達到99%以上的二分類精度。
3. 測試
3.1. 網絡轉換
訓練好了的人臉二分類器,不能直接應用于人臉檢測,需要進行轉換為全卷積網絡的格式,具體的方法在Caffe官網上有詳細的說明,這里不再贅述。
關鍵代碼如下:
<code class="hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">略</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>3.2. 非極大值閾值
直接使用了這個代碼,已經實現了非極大值閾值。
3.3. 人臉檢測
主要代碼如下:
<code class="hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">略</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>4. 實驗結果
4.1. 響應圖
其中,顏色越紅的地方出現就是檢測器判斷人臉出現的地方。
?
?
?
4.2 檢測結果圖
?
?
?
這里面已經設置了比較高的閾值,不然誤檢率會很高。
5. 討論
1,閾值的設定,是在準確率和召回率之前的權衡。?
2,基于以上方法,定位還不夠準確。
所有代碼
地址:Github代碼
PS: 如果對你有幫助,還請點個star吧
總結
以上是生活随笔為你收集整理的【Caffe实践】基于Caffe的人脸检测实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Caffe实践】基于Caffe的人脸识
- 下一篇: 人脸验证 DeepID 算法实践