HOG+ADABOOST訓練方式網上資料很多,這篇文章是在小編訓練過程中遇到的一些問題加以總結。
首先,在準備文件之前先讓大家對訓練文件有個直觀的感受。
建立一個新文件夾,可以取名為Pedestrian,在Pedestrian文件夾下再建立pos和neg文件夾,用于存放正負樣本,xml文件夾用于訓練后生成的模型的存放位置,從opencv安裝位置(“D:\Environment\opencv\build\x64\vc12\bin”)中拷貝opencv_createsamples.exe 和 opencv_traincascade.exe兩個執行文件到Pedestrian文件夾下,pos.txt和neg.txt是正負樣本存放位置,以及正樣本的標簽和位置。以上就是訓練時所需要的所有文件,簡單吧!但是,在小編訓練途中還是碰到很多坑,可能小編太弱了... (羞愧臉)
1. 準備正負樣本集pos和neg
這個是最耗時的一項任務啦(悄悄告訴你,小編也是偷了點懶)。
首先是在有行人的視頻中抽幀,隔3幀抽一次。當然,做正樣本的時候,正常的操作就是手動截圖,或者用一些小工具簡化這一過程。但是,這里小編用了一個別人訓練好的模型,直接把所有從抽到的幀中檢測到的頭肩保存下來,這樣真的省掉很多時間,但是由于這種方式準確率并非百分之百,還是要手動剔除掉不是頭肩的部分。小編大概找到頭肩樣本3000張,然后用opencv或者其他方式將所有樣本resize到36x36。所有正樣本存放到Pedestrian/pos下,正樣本集就完成了。
正負樣本的比例一般是1:4~1:5,所以,3000的正樣本需要截12000~15000張負樣本。
負樣本就是不包括頭肩的,但是尺寸要大于36x36的圖片。負樣本最好是可能有行人的背景,這樣讓模型效果更好。
小編這里也偷個懶,用opencv寫了個代碼,就是找一張同樣場景但是沒有行人的圖片,然后取寬高100x200,100x100,300x200等多種尺寸,步長為20,30,40,50,遍歷并保存圖片,這樣,多找幾張背景圖片,很快負樣本就完成了,當然,頭肩模型,小編在負樣本中也加入了一些手臂,腿等非頭肩部分作為負樣本。
最后,將所有負樣本放到Pedestrian/neg文件夾下,負樣本集就完成了。這里小編要說一下,正負樣本最好命名時分別以pos/neg為開頭,這樣可以簡化后面的操作。
2. 正負樣本描述文件pos.txt和neg.txt
打開cmd,輸入代碼如下:
這樣,在pos和neg文件夾下就分別生成了pos.txt和neg.txt兩個文件,把這兩個文件都剪切到Pedestrian文件下,并修改內容如下:
i. 去掉pos.txt文件里的pos.txt那一行,并且刪除最后一個空白行,然后,按編輯->替換,編輯如下,然后按全部替換。
再替換如下:
這個是正樣本存放路徑。pos.txt至此完成。
ii. 去掉neg.txt文件里的neg.txt那一行,并且刪除最后一個空白行,然后,按編輯->替換,編輯如下,然后按全部替換。
這個是負樣本存放路徑。neg.txt至此完成。
3. 生成pos.vec文件
生成pos.vec文件是利用Pedestrian下的opencv_createsamples.exe執行。打開cmd,進入到Pedestrian文件夾下,輸入: opencv_createsamples.exe -info pos.txt -vec pos.vec -bg neg.txt -num 3000 -w 36 -h 36
各個參數的意義,網上都有很多資料對其解釋,這里我不做過多介紹。
4. 訓練分類器
完成以上工作,就可以開始訓練了。
在cmd中,進入Pedestrian目錄下,輸入:opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 1500 -numNeg 5000 -featureType HOG -w 36 -h 36 mode -ALL
訓練開始,如下圖:
有幾點要注意:
1. numPos的值要低于pos的值;
2. 樣本的路徑一定要寫對;