學習深度學習已有一段時間了,總想著拿它做點什么,今天終于完成了一個基于caffe的人臉檢測,這篇博文將告訴你怎樣通過caffe一步步實現人臉檢測。本文主要參考唐宇迪老師的教程,在這里感謝老師的辛勤付出。

傳統(tǒng)機器學習方法實現人臉檢測:

  人臉檢測在opencv中已經幫我們實現了,我們要把它玩起來很簡單,只需要簡簡單單的幾行代碼其實就可以搞定。(haarcascade_frontalface_alt.xml這個文件在opencv的安裝目錄下能找到,筆者的路徑是:E:\opencv2.4.10\opencv\sources\data\haarcascades,大家可根據自己的安裝路徑找到)

大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓 face_detect.cpp

 運行結果:

  大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓

caffe實現人臉檢測:

  我是在ubuntu16.04環(huán)境下完成的實驗,渣渣筆記本有不起GPU跑訓練,所有實驗也是基于CPU的。要想把人臉檢測玩起來,首先你得保證你的ubuntu已經安裝了opencv和caffe,初次配這兩個環(huán)境初學者往往會弄到吐血,而且還是吐老血,我自己已經記不清到底花了多久才把它們搞定(估計是我太慫,也許你很快就能弄好喲,加油)。這里給兩個參考鏈接,opencv在ubuntu下的配置和測試:http://blog.csdn.net/a1429331875/article/details/31539129;ubuntu16.04上caffe的配置與安裝(CPU ONLY):http://blog.csdn.net/u010402483/article/details/51506616;以上兩個鏈接僅供參考,配置過程出了問題大家就多去網上搜解決方案吧,總會有人也遇到過和你一樣的問題。配置好以后大家可以先跑跑MNIST手寫字體識別這個案例吧,這個案例算是給自己的一個安慰。  到這里就已經默認大家環(huán)境已經配置好了。

  第一步:(這樣寫感覺很蠢,但還是寫得盡量詳細吧)在桌面或者你喜歡的路徑下建一個文件夾,這個文件夾將用來存放我們實驗中用到的所有東西。我自己是在桌面建了一個文件夾,取名:faceDetect

  第二步:獲取人臉和非人臉圖片當作訓練集和驗證集。首先我們一定要有樣本,在本實驗中我們的樣本是一個二分類的樣本,大家可以自行去網上找數據集,當然也可以給我發(fā)郵件(likai_uestc@163.com),我這里有數據集。數據集我們分訓練集(trainData20000_20000)和驗證集(testData1600_1600),trainData20000_20000文件夾和testData1600_1600文件夾我們把它們兩個都放在faceDetect文件夾下,trainData20000_20000文件夾和testData1600_1600文件夾下又都放兩個文件夾face和noface,人臉圖片我們放在face文件夾下,非人臉圖片我們放在noface文件夾下。此時的目錄結構如下:

  大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓

  第三步:給樣本打標簽。本實驗中是人臉我們給的標簽是1,不是人臉給標簽0.訓練樣本的標簽我們寫入train.txt,驗證樣本的標簽我們寫入test.txt.  train.txt和test.txt文件我們放在faceDetect目錄下。 txt文件中的內容如下:

  大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓

  生成txt文件的內容的參考代碼如下:(僅供參考)

大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓 getTxt.cpp

   第四步:制作LMDB數據源。通過shell腳本制作,腳本文件名 face-lmdb.sh,face-lmdb.sh也放在faceDetect路徑下。腳本的內容:

  重點關注第5,6,7,9,10,14,16,17,44,45,54,55行。第5第6行就是你faceDetect的路徑,第7行是你caffe中tools的路徑,第9第10行是訓練樣本和驗證樣本的路徑,第14行為true表示對圖片進行resize操作,第16,17行填寫resize的大小,第44行和54行就是填標簽文件,第45和55行是生成的lmdb文件存放的文件夾名,這兩個文件夾不能自己手動提前建立。

大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓 face-lmdb.sh

 

  現在在終端執(zhí)行 ./face-lmdb.sh 命令即可,執(zhí)行截圖如下:

  大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓

  第五步:準備網絡模型文件(train.prototxt)及超參數文件(solver.prototxt)。train.prototxt和solver.prototxt文件也放在faceDetect路徑下。網絡模型各層參數詳解及超參數文件詳解可參考:https://wenku.baidu.com/view/f77c73d02f60ddccdb38a025.html。

  網絡模型文件:

大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓 train.prototxt

  超參數文件:

  第1行網絡模型文件的路徑,第15行訓練得到的模型的保存路徑,在本實驗中自己在faceDetect文件夾下建一個model文件夾用于保存得到的模型文件。net: "/home/kobe/Desktop/faceDetect/train.prototxt"

大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓

test_iter: 50
test_interval: 500
# lr for fine-tuning should be lower than when starting from scratch
base_lr: 0.001
lr_policy: "step"
gamma: 0.1
# stepsize should also be lower, as we're closer to being done
stepsize: 20000
display: 100
max_iter: 100000
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "
/home/kobe/Desktop/faceDetect/model/"

# uncomment the following to default to CPU mode solving

solver_mode: CPU

大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓

 

   第六步:開始訓練。運行train.sh腳本進行訓練,train.sh也放在faceDetect路徑下。腳本的內容:(根據自己的實際路徑進行修改)

1 #!/usr/bin/env sh2 3 /home/kobe/caffe/build/tools/caffe train --solver=/home/kobe/Desktop/faceDetect/solver.prototxt #\4 #--weights=models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel \5 #--gpu 0

 

   在終端中運行 ./train.sh 就可以開始訓練了,訓練很花時間的,根據機器配置不同所花時間也不同。訓練截圖如下:

  大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓

  訓練結束后,我們得到以下的文件(model下的文件),caffemodel結尾的文件就是我們最終需要的文件了:

  大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓

 

  第七步:實現多尺度人臉檢測。基于滑動窗口的人臉檢測,在訓練的時候樣本已經resize成227*227,所以對于輸入圖片,我們在輸入圖片中截取227*227大小的窗口放入模型進行分類,依次這樣進行窗口滑動,最終找出其中的人臉區(qū)域。但是圖片中人臉并不一定就是227*227大小的,所以我們需要進行多尺度變換,所謂多尺度變換就是指對于輸入圖片我們進行放大和縮小變換,這樣輸入一張圖片,就可以得到很多經過放大或縮小的圖片了,把所有圖片當作一組輸入進行人臉檢測。那么現在問題又來了,我們輸入的是不同大小的圖片,網絡中有一個全連接層,全連接層的存在導致輸入的圖片大小必須一樣大小,要解決這個問題我們的解決方法是把全連接層轉換成全卷積層(可參考caffe官網進行操作)。

  轉換過程中需要用到的兩個deploy文件。

  全連接時使用(deploy.prototxt):

大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓 deploy.prototxt

   全卷積時使用(deploy_full_conv.prototxt):

大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓 deploy_full_conv.prototxt

  全連接轉全卷積參考代碼:

大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓 innerToConv.py

  轉換后得到另一個模型(alexnet_iter_50000_full_conv.caffemodel).

  實現多尺度人臉檢測代碼:

大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓 face_detect.py

 

運行結果:

 大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓


http://www.cnblogs.com/418ks/p/7221185.html