天天看點

opencv 訓練分類器 train dataset for temp stage can not be filled 遇到的問題:參數了解:訓練模型需要的檔案一些其他知識:

目錄

遇到的問題:

解決方法:把maxFalseAlarmRate  降低

參數了解:

訓練模型需要的檔案

一些其他知識:

遇到的問題:

train dataset for temp stage can not be filled.

正樣本:

opencv 訓練分類器 train dataset for temp stage can not be filled 遇到的問題:參數了解:訓練模型需要的檔案一些其他知識:

負樣本:

opencv 訓練分類器 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

opencv 訓練分類器 train dataset for temp stage can not be filled 遇到的問題:參數了解:訓練模型需要的檔案一些其他知識:

我了解, 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坐标,圖檔寬度,圖檔高度。

如下圖:

opencv 訓練分類器 train dataset for temp stage can not be filled 遇到的問題:參數了解:訓練模型需要的檔案一些其他知識:

添加好,建立正樣本的圖檔的二進制儲存檔案,就是vec檔案。其中,num 正樣本圖檔檔案數量。 -w  -h  是希望縮放到的大小。所有切圖準備正樣本的時候,大小可以是任意的。但是建議還是用固定的。

opencv_createsamples.exe -vec pos.vec -info pos.txt -num 198 -w 20 -h 20

生成pos.vec。

opencv 訓練分類器 train dataset for temp stage can not be filled 遇到的問題:參數了解:訓練模型需要的檔案一些其他知識:

開始訓練:

建立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
           

訓練中:

opencv 訓練分類器 train dataset for temp stage can not be filled 遇到的問題:參數了解:訓練模型需要的檔案一些其他知識:

一些其他知識:

 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?      

opencv 訓練分類器 train dataset for temp stage can not be filled 遇到的問題:參數了解:訓練模型需要的檔案一些其他知識: