OpneCV人臉識別:訓練篇

閒來想完善一下之前做的汽車運動檢測的工程,打算認認真真的將整輛車給識別出來,可是唯一的問題是,我手上沒有足夠的用來做訓練的素材,於是從很流行的人臉識別開始,探求一下機器識別的流程如何。花了一些時間,在此作一下筆記。


一、使用TBB編譯opencv_traincascade.exe


會跳到我這篇博文裏來的童鞋,多是已經參考網上其他的文章,大概的流程估計已經知曉,文檔式的內容我儘量少提。簡單的提一下,視覺識別的過程主要是訓練跟檢測兩項內容,此篇只講訓練。對基本素材的訓練需要運用到opencv的兩個自帶的程序:opencv_createsamples.exe跟opencv_traincascade.exe(opencv_haartraining.exe據說是已經落後的東西就略過)。前者是用來用來準備訓練用的正樣本數據和測試數據,後者則是用來作訓練用的,其具體介紹請自行google,我之所以要重新編譯opencv_traincascade.exe,是因爲opencv自帶的程序不支持多核心運算,在跑了一個晚上後我堅決用TBB來重新編譯,好讓它支持cpu的多核性能。


使用TBB來編譯opencv請參考這裏,這篇文章的內容其實說得挺清楚的,但會有漏講一些東西,像最後使用visual studio重新編譯的時候會提示少了一些TBB的lib跟opencv的lib,少TBB的lib只需要在工程屬性裏添加庫包含目錄,少opencv的lib,則需要將提示缺少的lib全部拷貝一下就行(你實際操作的時候會清楚我說什麼的啦)。然後你就可以在新編譯出來的工程bin目錄下看到支持TBB的opencv_traincascade.exe,我個人用的是VS2013編譯的x64版本,我將其打包放到這裏,可以提供給朋友們作訓練測試。


其實效果挺明顯,自帶的opencv_traincascade作訓練,程序的cpu佔用率就25%,用我新編譯的程序用訓練cpu就暴到85%左右,今天用了一個半小時就訓練完跑了之前要大半天的程序。(只是現在卡在stage 9那裏,cpu佔用率回到25%,程序到底有沒有正常運行我很懷疑,但我用了7000張的圖片,訓練需要一定的耗時,也可能執行到不支持多核運算的步驟,跑到明天再見分曉吧。)


二、準備訓練素材


(1)準備正負樣本的圖片素材


這是一個最重要的步驟,也是最痛苦的步驟,原來這世上是有這類東西的數據庫的,經過幾層跳轉,我down到某個人臉識別的數據庫(其原始鏈接我找不回來),正負樣本共約7000的圖片,因爲ACDSee無法識別其格式,我又折騰地用PS批量轉成了bmp格式,我放到這裏供大家下載(見過這麼用心的博主沒?看過此文的人請多手點個贊吧。)什麼叫正負樣本?請自己google吧。


(2)編寫正負樣本描述文件


爲方便管理,在C盤根目錄下建一個文件夾(希望SSD會有點用),名爲CvFile,將有正負樣本的圖片文件夾(分別叫face_bmp_2429、nonface_bmp_4548)放到裏邊去。在CvFile目錄下新建個txt文件,起名叫face_2429_info.txt,如下面這麼填內容:

//圖片路徑 數量 有效內容矩形信息
face_bmp_2429\face00001.bmp 1 0 0 19 19
face_bmp_2429\face00002.bmp 1 0 0 19 19
face_bmp_2429\face00003.bmp 1 0 0 19 19
face_bmp_2429\face00004.bmp 1 0 0 19 19
face_bmp_2429\face00005.bmp 1 0 0 19 19
...


內容可以用絕對路徑的,爲方便起見,要統一正樣本的尺寸,“19 19”是圖片的尺寸信息,這個很重要,這兩個數據整個訓練過程都要一致的。如果有人用自定義的素材,生成這個文本描述文件可以用命令行,也可以自己編代碼來生成,請各自便(我是自己寫了個程序,有需要的朋友問我要)。


負樣本的描述文件就簡單多了,同樣新建一個叫non_face_4548_info.txt的文本文檔,像以下這樣編寫就行,只需要寫清楚路徑就可以了。

//圖片路徑
nonface_bmp_4548\nonface0001.bmp
nonface_bmp_4548\nonface0002.bmp
nonface_bmp_4548\nonface0003.bmp
nonface_bmp_4548\nonface0004.bmp
nonface_bmp_4548\nonface0005.bmp
nonface_bmp_4548\nonface0006.bmp
...


一開始,我沒找到樣例,結果負樣本的描述文件跟正樣本弄成一樣的,給果在訓練時程序會提示“無效的背景描述文檔(本是en文,忘了拼寫)”,所以理論上負樣本是不管圖片大小的,只要滿足“不包括目標物體的內容”這唯一條件即可。


(3)創建樣本VEC文件


vec文件主要用於作訓練用的,這是很關鍵的一個步驟,首先我們要找到opencv_createsample.exe這個程序,爲省去麻煩,我是將opencv\build\x64\vc12\bin裏的全部內容拷貝到CvFile文件夾裏的,裏面有opencv_createsample.exe這個文件。


使用命令行工具,定位到CvFile,啓動opencv_createsample.exe,如下圖輸入命令:

opencv_createsamples.exe -vec pos.vec -info face_2429_info.txt -bg non_face_4548_info.txt -num 2429 -w 19 -h 19


成功運行會有如下圖的提示:

wKiom1NaYXGBbh5GAAFEpWZ8MrE428.jpg


命令的參數意義還是自己去查吧,關鍵的地方是-w -h兩個參數須與正樣本圖片一致,CvFile文件下會生成一個pos.vec的文件,這就是接下來訓練用的vec文件,那素材的準備就大功告成了。至於爲什麼我不用bat文件來啓動程序,那是因爲我沒法爲你們截圖啊。


三、訓練


好了,最讓人關心的訓練開始啦。先在CvFile新建一個文件夾mydata,這個是用來放cascade結果跟中間文件用的,網上很多教程沒提這個事,否則會造成訓練失敗的。


同樣使用cmd寫下啓動opencv_traincascade.exe程序的命令如下:

opencv_traincascade.exe -data mydata -vec pos.vec -bg non_face_4548_info.txt -numPos 2000 -numNeg 4000 -numStages 20 -featureType HAAR -w 19 -h 19 -mode ALL


需要注意幾個參數,mydata就是上面新建的結果文件夾;-numPos及-numNeg的數值要比實際的樣本數略小;-featureType有HAAR及LBP兩種(HAAR - 類Haar特徵; LBP - 局部紋理模式特徵),前者是默認的,其區別請google,如果你想盡快看到訓練結果可以將其設爲LBP,其運行是相當快速的;-w -h參數則如我一直強調的,要通篇一致。正常運行如下圖所示:

wKioL1NaZQmyKy5pAAK6nDL8K5M523.jpg


然後,就沒有然後了,你就慢慢等訓練結果出來吧,你可以查看mydata文件夾下的裏的內容,等訓練結束會存在cascade.xml的文件——這纔是我們最終需要在檢測用到的東西。個人太貪心,樣本太多,stage數太多,現在一直卡在9-stage下,等出了結果我再寫檢測篇吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章