在提這個問題之前,我已經百度了很久。我現在正在使用opencv庫里自帶的opencv_traincascade利用LBP特徵訓練分類器,可是經常會卡在某一個stage動不了。有很多資料,大家眾說紛紜,但是我試用他們的方法,依然卡住不動。比如我有3000個正樣本,4000個負樣本,我用opencv_createsamples創建了3000個samples在vec文件里,然後使用opencv_traincascade時,正樣本-numPos和負樣本-numNeg用了很多種比例都訓練到一半卡住了,請問opencv_createsamples里的-num和opencv_traincascade里的-numPos,-numNeg到底該如何設置呢?萬分感謝!PS:我使用的是LBP特徵。


關於數量如何設置,也可以理解為正負樣本比例如何控制。首先明確一點,訓練過程是增強分類器的功力,這就要求整個訓練期間負樣本不能動,不管總數還是內部的單個圖片。以此為基礎逐個stage去篩選過濾正樣本。理論上是每個stage中,能區分60%以上的正樣本即為合格。這被分對的60%正樣本被丟棄,認錯的40%連同新補充的正樣本一起進入下一個stage。(反之篩選負樣本同理)

打個比方,有個電影叫《初戀50次》,但50次是同一個人。訓練的50個stage(實際上不需要這麼多stage)的正樣本都不完全相同,上一任的經驗幾乎帶不到下一任,所以有點像《搭訕50次》。

參與訓練的樣本數量,提個建議僅供題主參考——正負樣本數量相當。這也是我的經驗,沒有絕對的道理,但是想想會覺得很自然。

具體多少數量沒有的定論,不一定要達到數十萬。兩個問題也請題主思認真考下,這會決定樣本的收集和取捨

1:分類器需要適用於多大的場景?

2:如何考慮樣本之間冗餘問題?

上圖中Stage-6中FA(FalseAlarm,虛警率)為0,說明負樣本已全部被正確分類了,也就不會有負樣本繼續參與下一輪的訓練了,所以就卡住了,而我用的OpenCV-2.4.10版本,出現這種狀況的時候會提示,Train dataset for temp stage can not be filled. Branch training terminated。詳見,OpenCV樣本訓練經驗 - PeakJin的博客 - CSDN博客處的tip5tip6。

收集的原始負樣本可以在和正樣本相關的情況下盡量的多,但多的同時要盡量保證這些原始負樣本的尺寸足夠大(是正樣本尺寸的許多倍,因為正樣本的尺寸大小就是滑動窗口的尺寸大小),這樣才會保證在訓練的過程中一直有可用的能參與訓練的負樣本,也就不會出現FA為0的情況。記住numNeg和你收集到的原始負樣本的數量間並沒有多大聯繫,numNeg個訓練用負樣本會從尺寸足夠大的原始負樣本集上滑動和scale得到,但一定要盡量保持numPos:numNeg = 1:3,這樣才能得到最優的訓練效果。


謝邀

首先我沒用過opencv的traincascade,不過寫過boosting

訓練卡住的話我覺得應該是負樣本的數量不夠,你3000正樣本,4000負樣本太少了,如果你觀察訓練過程就會發現,越到後面的stage對負樣本的篩選就越難,可能需要數十萬個負樣本才能滿足要求。

上一階N=2時FA就到0了,HR還是1,用的正負樣本是不是區分度太大了?正樣本要有固定規則,負樣本要豐富多樣性,這應該不是設置的問題了,多找幾個數據集扒負樣本進去吧。


請問這個問題怎麼解決的啊
你好,我也遇到了相同的問題,不過我用的是HAAR特特徵。我發現問題是出在樣本的數量和質量上,。不知道你發現沒有,在出現卡住的上一個stage中,FA最終都為0了,也就是說對負樣本的虛警率(每個弱分類器將負樣本誤分為正樣本的比例)已經達到了0,可能是程序不再繼續往下分類了。提高正樣本和負樣本的數量可以訓練出更多的stage,但是具體的關係本人也沒搞清楚,忘相互學習。


推薦閱讀:
相关文章