最近項目上需要用到機器學習,特利用OpenCV自帶的可執行程序對圖像樣本進行分類處理。
利用OpenCV中opencv_createsample.exe和opencv_traincascade.exe對圖像進行分類的主要步驟可分爲以下幾個部分:
1.準備正樣本和負樣本
我準備的正樣本爲30*30的bmp圖(8位),特別注意的是正樣本大小要一致!
並將其放到pos文件夾下,利用windows自帶的批處理程序,生成pos.dat文件(pos路徑下),pos文件格式如下:
同樣地,將負樣本放在新建的neg文件夾下,並生成neg.dat文件(.dat格式可以更改的)
2.生成vec描述文件
將pos文件夾下的所有樣本生成.vec文件,該部分可以在pos和neg文件夾的同級目錄下新建createsamples.bat文件(批處理文件),文件中內容如下:
opencv_createsamples.exe -vec pos\pos.vec -info pos\pos.dat -num 130 -w 30 -h 30
其中pos.vec文件放在pos文件夾中,-num爲正樣本的數目,-w 寬度 -h 高度
可以在後面添加pause,以便批處理後暫停查看處理信息,具體如下:
生成後的效果圖如下:
若上述報錯,一定要仔細查找出錯原因,否則後續無法正常進行!
3.生成分類器
首先要在pos文件夾和neg文件夾同級目錄下新建data文件夾(以便存儲生成的分類器文件),同時新建calssify.bat批處理文件,其內容如下:
特別注意上述的路徑!後續生成過程出現問題,很大一部分原因是路徑出現問題!其參數說明如下:
-------------------------------------------
-data data 分類生成的文件放置的位置(在剛纔新建的data文件夾裏)
-vec pos\pos.vec 加載vec文件(pos.vec文件在pos文件夾裏)
-bg neg\neg.dat 加載負樣本文件
-numPos 130 正樣本的數量
-numNeg 50 負樣本的數量(neg文件夾下有50張負樣本)
-numStages 15 樣本訓練的層數(層數多,耗時長,建議15~20)
-w 30 -h 30 樣本大小
-minHitRate 0.9999 最小命中率(訓練目標的準確度)
-maxFalseAlarmRate 0.5 最大誤檢率(每一層的訓練值小於該值,即可進行下一層的訓練)
-mode ALL 特徵檢測的方式(ALL表示haar全方位檢測)
此外還有:
-mem 可用於設置電腦使用內存
-numStages 訓練分類器的級數,強分類器的個數
-precalcValBufSize 緩存大小,用於存儲預先計算的特徵值,單位MB
-precalcldxBufSize 緩存大小,用於存儲預先計算的特徵索引,單位MB
-featureType 特徵檢測類型(默認Haar特徵,還有LBP和HOG特徵)
-------------------------------------------
訓練後效果圖如下:
中間省略。。。
訓練的stage較多,一部分原因是參數設置,另外一部分原因是樣本大小。
-----------------------------------------------------------------
生成完畢後,可在data文件夾下看到生成的.xml文件(分類器數據),後續進行樣本預測可用cascade.xml文件。
整個處理過程,速度還是很快的(我的數據很少),期間容易出錯的地方包括:
1.各文件的路徑(相對路徑關係);
2.pos.dat文件中數據的排列格式(當然後綴不一定要取.dat,也可以.txt)
3.樣本過大,比如全是60*60的,且參數設置嚴格,訓練非常耗時,可能需要十幾個小時!,樣本最好爲20*20(我的爲30*30);
-----------------------------------------------------------------
注意事項:
1.正負樣本數量搭配最好滿足 1:(2.5~3.0);
2.負樣本的尺寸最好比正樣本尺寸大很多,例如正樣本爲20*20,負樣本爲1024*960;
3.負樣本之間需要有較大的差異性;
4.numPos最好要小於.vec文件中正樣本的數量,一般取0.9倍的正樣本數量;
5.正樣本中樣本圖案像素數量要大於背景圖像像素數量(即正樣本要集中體現樣本圖案!);
6.-numNeg 中負樣本的數量可以超過實際負樣本的數量(通常這樣的效果較好!);
7.訓練的速度 LBP>HOG>HARR(HARR的速度非常慢!);
-----------------------------------------------------------------
-----------------------------------------------------------------
下面展示利用級聯分類器進行特定目標檢測的效果。
1.正樣本總數774個,大小爲30*30;
2.負樣本總數2690個,大小爲120*120;
3.訓練採用的配置參數如下:特徵模式爲LBP;特徵集爲CORE;級聯層數20級;每一級正樣本數600個;每一級負樣本數5000個;最小檢出率爲0.9999;最大虛警率0.5。
4.訓練耗時半小時左右(i7處理器、8G內存);
5.訓練完成後,將.xml加載到檢測中,檢測函數對象.detectMultiScale中scaleFactor爲1.1,minNeighors爲1,flags爲4,minSize和maxSize分別爲21*21、30*30。參數具體含義可以參考opencv官方文檔。
6.被檢測對象如下:
7.不同對象被檢測的效果如下:
以上述檢測結果可看出,其檢測的效果並沒有想象中的那麼好!有的特徵沒有檢測出來,更有誤檢存在!(上中、下左、下右三幅圖全檢OK,其餘三幅存在問題!)。
在工業檢測中,上述的精度很難滿足實際的應用要求!直觀判斷,出現問題主要是因爲樣本的選取,其次是訓練參數的設置。
後續將進一步理解級聯分類器,致力於提高其檢測精度!