用DPM訓練自己的模型,並用於視訊檢測
DPM(Deformable PartModel)總結
剛參加完一個機器人比賽,其中要用到雙目進行目標定位,做法是從左右場景圖中找到目標區域,並用目標區域中的特徵點進行雙目匹配定位,定位效果非常好。考慮到實時性和簡單性,尋找目標區域我用的是DPM演算法,匹配效果非常好。DPM已經被實現了,不過源程式介面是基於matlab和C++的,不太符合工程需要,幸好有位大神,碩士畢設就是將DPM檢測部分實現了C++化,就用了他的程式,在此特別感謝。
比完賽,收穫很大,也想著把每一部分都進行總結,既方便他人,自己日後也能用得著。也歡迎朋友們提出問題進行交流哈!
1、原理
整體流程就是
1)訓練:基於HOG(Histogramsof Oriented Gradients,即梯度方向直方圖)構建目標輪廓模型,然後利用SVM訓練輪廓模型引數;考慮到目標會發生形變,比如行人腿和頭等經常發生相對位移,所以根據需要,設定子模型,通過訓練得到目標各部分輪廓模型;
2)檢測:將訓練好的模型與場景進行匹配。
2、程式
1)源程式(基於Matlab)
DPM由PedroFelzenszwalb提出,並用matlab實現了。
2)工程可用
部落格名叫yu_xianguo的大神,碩士畢業論文做的就是將DPM檢測部分用C++實現了,從而可以通過在Linux和Matlba訓練好模型後,直接被工程呼叫。不過要吐槽的是,檢測程式真的很慢,將640*320的圖片resize到320*240,處理一幀依然需要1s以上,直到resize到160*120才勉強達到實時要求。
3、實現
網上很多實現方法都是部分碎片化的,我這裡以滿足雙目攝像頭實時檢測為主線,"voc-release5+FastDPM"為主要程式,整合網上介紹的方法,系統講一下如何從資料採集、訓練、檢測等具體實現DPM檢測。這裡大多是借鑑別人的方法,少部分程式和方法是根據我的需要進行修改、新增的。
1)資料採集(用以訓練)
訓練資料格式:
正樣本影象+用於程式讀取資料的txt或xml檔案(包含影象名、影象中目標個數、目標區域所在位置:用矩形框左上角和右下角座標表示)
負樣本影象+用於程式讀取資料的txt或xml檔案(包含負樣本影象名)
通用資料集VOC(Visual Object Class):
Pascal VOC比賽使用的標準資料集,也是目前深度學習常用的資料集。至12年,資料集已擴充至包含20類目標,影象中包含哪個目標類、有多少目標、目標所在區域等按照統一格式寫入xml檔案中,如下圖。
製作自己的資料集:
因為我們要尋找的目標(是個玩偶)不在VOC資料集類,故我們需要重新制作影象;另外為了方便,我們不使用VOC中儲存影象目標區域等資訊的xml檔案的格式,直接用txt按“影象名目標個數 目標左上角和右下角座標”儲存影象中目標區域資訊,比如"1.jpg 1 30 40 40 200",用於程式讀取正樣本資料。
首先,將目標放在不同環境,不同角度拍攝影象若干,作為訓練的正樣本;
其次,框出正樣本影象中的目標,並將資訊儲存在positive.txt檔案中。為了方便,我用matlab寫了程式,每次顯示影象,再分別點目標矩形框左上角和右下角,自動將區域資訊儲存。感謝王詩琪同學對程式的修改,有需要的同學可直接下載http://download.csdn.net/detail/sysu_yuhaibao/9802154
然後,獲取負樣本。因為VOC中影象不包含我想訓練的目標模型,所以直接用這些影象。需要說明的是,影象名最好去掉“0”,便於格式統一,可以直接用matlab批量處理。
最後,直接生成negative.txt檔案,用於儲存負樣本影象名。
2)訓練
為了方便,直接在linux下跑voc-release程式,用於訓練模型:
首先,新建一個資料夾,將正樣本影象、positive.txt、negative.txt檔案放一起;下載VOC某個版本的程式碼,拷在同級目錄下;
其次,針對自己的資料集,修改程式,如下:
voc_config.m:Base_dir設定成當前路徑;line114的conf設定注意新增conf.project變數,總之需要將路徑理清楚
PosImageFile改成我們樣本影象、positive.txt和negative.txt路徑
pascal.m:因為只想訓練個模型,測試集製作及路徑設定比較麻煩,乾脆刪掉後面測試部分
然後,設定linux環境:
需要matlab和gcc編譯器,其中當前gcc編譯器版本不能超過matlab所能支援的最高版本,根據需要設定gcc編譯器當前優先支援的版本
最後訓練:
建立同級目錄資料夾"2007",用於儲存訓練結果;
psacal('bicycle',2):訓練,其中第一個變數不起作用;第二個根據目標可能分為幾大塊設定
訓練的結果儲存在2007\bicyle_final.mat中model,可通過visualizemodel(model)視覺化訓練結果
3)檢測
用的是某大神現成的C++程式碼,相關程式碼下載地址:
首先,搭建環境:OpenCV和pthread
以及<windows.h>中:將std::min改為min
其次,將model轉換成txt檔案:
最後,改成我們需要的視訊需求:
關鍵是FsatDPM.h中的FastDPM類,檢測到的目標數量、目標所在位置等資訊都儲存在變數detections中
FastDPM.cpp:去掉不必要的顯示和操作
注:檢測速度很慢,處理一幀640*480影象至少1s以上,所以如果可能的話,需要儘可能resize小一點進行處理。
至此,利用DPM實現檢測目標就告一段落了,由於當時做的時候比較倉促,難免有些細節忘記記錄,所以可能有一些小錯誤,歡迎批評指正!