目錄
遇到的問題:
解決方法:把maxFalseAlarmRate 降低
參數了解:
訓練模型需要的檔案
一些其他知識:
遇到的問題:
train dataset for temp stage can not be filled.
正樣本:
負樣本:
錯誤:
===== TRAINING 0-stage =====
<BEGIN
POS count : consumed 1000 : 1000
Train dataset for temp stage can not be filled. Branch training terminated.
最開始不了解樣本數量的要求,以為是樣本數量不夠,就複制了一些,是以圖上重複的很多。
最終,正樣本198個。負樣本588個。
解決方法:把maxFalseAlarmRate 降低
個人嘗試了無效的方法:
1、解讀源碼,認為是路徑有問題的,無效果。不過對源碼的解讀還是值得看。https://blog.csdn.net/tanmx219/article/details/81783803#commentBox
2、
參數了解:
官網解讀連接配接:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html#id9
中說明了各個參數,其中:
- -minHitRate <min_hit_rate>
分類器的每一級希望得到的最小檢測率。總的檢測率大約為 min_hit_rate^number_of_stages。
- -maxFalseAlarmRate <max_false_alarm_rate>
分類器的每一級希望得到的最大誤檢率。總的誤檢率大約為 max_false_alarm_rate^number_of_stages.
最大虛警率,影響弱分類器的門檻值,表示每個弱分類器(應該就是每一層)将負樣本誤分為正樣本的比例,一般預設值為0. 5
我了解, maxFalseAlarmRate 應該越小越好,那為什麼opencv預設設定為0.5呢,這麼高!是以我遇到了上面的報錯,從哪個圖看,是沒有獲得新的樣本了,是以我把maxFalseAlarmRate 降低到0.1一下,錯誤解決了。這樣是否合理呢?
關于這個參數的意思,連接配接:https://blog.csdn.net/beizhengren/article/details/77095969
中也有說明。
hitRate = tp / (tp + fn) = recall
falseAlarm = fp / (tn + fp)
這裡hitRate稱為“命中率”,度量檢測器對正樣本的通過能力,顯然越接近1越好;而falseAlarm稱為“虛警率”,度量檢測器對負樣本的通過能力,顯然越接近0越好。
預設minHitRate = 0.995,預設maxFalseAlarmRate = 0.5。假設stageNum = 20時,最終檢測器有:
hitRate ≈ minHitRate ^ stageNum = 0.995 ^ 20 = 0.904610....
falseAlarmRate ≈ maxFalseAlarmRate ^ stageNum = 0.5 ^ 20 = 0.00000095...
當然,如果我設定為0.1,訓練20層,最終的誤報率 0.1^20= 接近0 。
訓練模型需要的檔案
negdata檔案夾:負樣本圖檔
posdata檔案夾:正樣本圖檔
生産目錄檔案:(生成之前切記注意win系統檔案名中的空格要去掉。)
去掉空格可以用下面的批處理指令,儲存為bat拷貝到需要的目錄
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /s/b *.*') do (
set "foo=%%~nxi"
set foo=!foo: =!
set foo=!foo: =!
ren "%%~fi" "!foo!"
)
exit
生成目錄:
進入posdata目錄:執行 dir /b/s/p/w *.jpg > pos.txt
進入negdata目錄:執行 dir /b/s/p/w *.jpg > neg.txt
生成後,将2個TXT拷貝出來。到exe所在的目錄層級。
并修改pos.txt,在後面加上: 數量,x坐标,y坐标,圖檔寬度,圖檔高度。
如下圖:
添加好,建立正樣本的圖檔的二進制儲存檔案,就是vec檔案。其中,num 正樣本圖檔檔案數量。 -w -h 是希望縮放到的大小。所有切圖準備正樣本的時候,大小可以是任意的。但是建議還是用固定的。
opencv_createsamples.exe -vec pos.vec -info pos.txt -num 198 -w 20 -h 20
生成pos.vec。
開始訓練:
建立bat檔案
opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 110 -numNeg 600 -numStages 20 -w 20 -h 20 -maxFalseAlarmRate 0.3 -mode ALL
pause
訓練中:
一些其他知識:
1、正樣本數量:負樣本數量=1:3
2、剛開始生成的目錄TXT,要把裡面最後一行的 空行 删除。
3、檔案縮放到的大小,建議pos 20*20 ,neg 50*50
4、Oh wow I completely misread your training output. Getting the positive samples was no problem at all. The problem lies in your negative samples. I am guessing you have exactly 1500 samples with the model size and that it? Keep in mind that -numNeg is the amount of samples that need to get wrongly classified by the previous stages, in order to be valid for a new negative sample for the next stage. This means that for example, for creating 3 stages you need for example 2000 negative windows, but -numNeg will only be like 700. You get it?
意思是 opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 170 -numNeg 190 -numStages 20 -w 20 -h 20 -mode ALL 中的 numNeg應該設定為(neg樣本/numStages),是這樣嗎?
5、一般訓練到損失為0.0004就可以,繼續訓練可能過拟合。要合理選擇stage。
6、 訓練時候的 -numPos 170 -numNeg 190 ,這2個參數是每一層訓練時用的圖檔數量,
7、img/img_with_faces_1.jpg 1 140 100 45 45
img/img_with_faces_2.jpg 2 100 200 50 50 50 30 25 25
其中 1,2 表示這個圖中有幾個目标。後面的4位坐标,前2個是坐标起始點,後兩個是尺寸大小。用來從裡面扣正樣本。當然如果隻有1個樣本,而且在0,0 位置,就是1 0 0 width heigth
8、報錯 Train dataset for temp stage can not be filled. Branch training terminated.
9、負樣本的 neg.vec 是不需要建立的。隻需要由負樣本的目錄.txt 。注意:負樣本的圖檔大小可以不用進行歸一化成統一大小,因為其在訓練的時候可以進行指定大小,訓練時會進行圖像resize操作。
10、儲存xml的檔案夾需要手動建立,。
11、真正訓練的時候,正樣本不是用圖檔的形式輸入,是用pos.vec ,這裡面已經用二進制的方式保留了縮放後的所有圖檔。
12、opencv_createsamples 也可以用來檢視和檢查儲存于vec正樣本檔案中的正樣本。這時隻需指定 -vec , -w 和 -h 三個參數則可。 opencv_createsamples 将逐一顯示正樣本圖像。
13、N訓練層數,HR 命中率;FA 警告,隻有當每一層訓練的FA < maxfalsealarm數值才會進入下一層訓練
14、記得一定要numPos小于vec_file檔案裡面的數 一般numPos為0.9*num_in_vec或者為0.8*num_in_vec
15 -numNeg 可以選所有的負樣本數量,或者比負樣本數量大都可以。
15 【計算機視覺】如何使用opencv自帶工具訓練人臉檢測分類器
16\ Number of stages or maxFalseAlarmRate?