最近需要熟悉一下haar特徵,帶著一個師妹熟悉一下從特徵提取到訓練的整個過程。
第一次接觸,熟悉玩haar特徵和adaboost原理後。實驗開始了
實驗中採用了MIT CACL人臉的資料庫。
實驗中產生樣本資料的命令如下:
char order0[1024] = "opencv_createsamples.exe \-vec pos.vec \-info faces\\faces.txt \-w 20 \-h 20 \-num 2000";
這一步一般都沒有問題
之後就是資料訓練了,命令如下:
char order[1024] = "opencv_haartraining.exe \-data test \-vec pos.vec \-bg nonfaces\\nonfaces.txt \-minhitrate 0.995 \-maxfalsealarm 0.45 \-nstages 15\-npos 2000 \-nneg 3000 \-w 20 \-h 20 \-nonsym \-mem 1024 \-mode basic \-noeqw";
這裡預設的nstegas為14,因此minhitrate一般最好大於0.99
訓練中總是在運行到7或8層的時候停住,有時候等上一上午也不見進展
翻閱很多網友的報告後,總結如下:
1、正負樣本比例
2、反例樣本的品質
3、記憶體的大小
分析了半天,有看了看adaboost原理
如果負樣本品質不高,也就是說負樣本跟正樣本的相似性不大,那麼在訓練的過程中:
正檢測率為1,負檢測率為0,程式金輝進入死迴圈。
因為每一層的訓練,都會有新的負樣本補充進來,形成新的訓練樣本。
而越是進行到後面的迭代負樣本的品質要求越高
要是相似性太大或者負樣本少了,都有可能造成死迴圈。
因此我修改了負樣本,加入了很多差別比較大的突破,最終達到了8000+
訓練很快就完成了(用伺服器跑的)
最後實驗的效果也不錯,檢測速率和效果也說不錯的。
實驗的程式給大家貼出來,就不用老進dos了。
#include <windows.h>#include <cstring>#include <iostream>#include <stdio.h>#include <string.h>#include <ctype.h>using namespace std;char order[1024] = "opencv_haartraining.exe \-data test \-vec pos.vec \-bg nonfaces\\nonfaces.txt \-minhitrate 0.95 \-maxfalsealarm 0.45 \-nstages 15\-npos 2000 \-nneg 3000 \-w 20 \-h 20 \-nonsym \-mem 1024 \-mode basic \-noeqw";char order0[1024] = "opencv_createsamples.exe \-vec pos.vec \-info faces\\faces.txt \-w 20 \-h 20 \-num 100";int main(){//cout<<order<<endl;system(order0);system(order);return 0;}