[捉蟲記錄]關於Cascade Training Error的bug
Jeremy
opencv_traincascade.exe -data data -vec diode\pos.vec -bg nodiode\neg.dat -numPos 600 -numNeg 600 -numStages 15 -w 22 -h 52 -minHitRate 0.995 -maxFalseAlarmRate 0.5
pause
Note:如果上面的引數名稱寫錯了,程式會自動忽略,並取預設數值.
在應用opencv_traincascade.exe對圖片進行訓練的過程中碰到很多問題,現一一記錄如下:
[bug1]: Train dataset for temp stage can not filled. Branch training terminated.
首先我們來看這個錯誤時從哪裡出來的,從原始碼[cascadeclassifier.cpp]中我們可以看到:
for( int i = startNumStages; i < numStages; i++ )
{
cout << endl << "===== TRAINING " << i << "-stage =====" << endl;
cout << "<BEGIN" << endl;
if ( !updateTrainingSet( requiredLeafFARate, tempLeafFARate ) )
{
cout << "Train dataset for temp stage can not be filled. "
"Branch training terminated." << endl;
break;
}
if( tempLeafFARate <= requiredLeafFARate )
{
cout << "Required leaf false alarm rate achieved. "
"Branch training terminated." << endl;
break;
}
CvCascadeBoost* tempStage = new CvCascadeBoost;
bool isStageTrained = tempStage->train( (CvFeatureEvaluator*)featureEvaluator,
curNumSamples, _precalcValBufSize, _precalcIdxBufSize,
*((CvCascadeBoostParams*)stageParams) );
cout << "END>" << endl;
可以知道,是在函式updateTrainingSet()中出了問題,我們接下來進去看看:
bool CvCascadeClassifier::updateTrainingSet( double minimumAcceptanceRatio, double& acceptanceRatio)
{
int64 posConsumed = 0, negConsumed = 0;
imgReader.restart();
int posCount = fillPassedSamples( 0, numPos, true, 0, posConsumed );
if( !posCount )
return false;
cout << "POS count : consumed " << posCount << " : " << (int)posConsumed << endl;
int proNumNeg = cvRound( ( ((double)numNeg) * ((double)posCount) ) / numPos ); // apply only a fraction of negative samples. double is required since overflow is possible
int negCount = fillPassedSamples( posCount, proNumNeg, false, minimumAcceptanceRatio, negConsumed );
if ( !negCount )
return false;
curNumSamples = posCount + negCount;
acceptanceRatio = negConsumed == 0 ? 0 : ( (double)negCount/(double)(int64)negConsumed );
cout << "NEG count : acceptanceRatio " << negCount << " : " << acceptanceRatio << endl;
return true;
}
我們的錯誤輸出是在"POS count……"之後,“NEG count”之前,這樣……問題就是negCount=false,也即fillPassedSamples()函式出錯了
後來我把numPos變大為1500,numNeg變大為1200。因為每次stage的迭代過程中會只更換“1%”左右的樣本。
相關文章
- [捉蟲記錄] access violation writing location _findnext
- Web伺服器捉蟲速記Web伺服器
- MySQL·捉蟲動態·DROPDATABASE外來鍵約束的GTIDBUGMySqlDatabaseTiDB
- W32DASM8.93捉蟲記 湖北 wuhuashangASM
- 給Chrome“捉蟲”16000個,Google開源bug自檢工具ChromeGo
- 關於delete cascade的小實驗delete
- java爬蟲第一天-bug記錄Java爬蟲
- 針對於debugger斷點的記錄斷點
- ChunJun 1.16 Release版本即將釋出,bug 捉蟲活動邀您參與!
- 關於javascript原型鏈的記錄JavaScript原型
- 捉蟲記之dozer對映父類屬性被重寫
- 關於記憶體的一些bug (轉)記憶體
- 關於webpack問答記錄...Web
- 子執行緒 UI 問題捉蟲執行緒UI
- 前端小bug記錄前端
- 關於SQL的重複記錄問題SQL
- 【Xtrabackup捉蟲】Waiting for master thread to be suspendedAIASTthread
- 關於action的error問題Error
- 一個關於recyclerView的bugView
- 關於UIInterfaceOrientation的一個bugUI
- 使用者該怎麼捉資料洩露的“BUG”
- [BUG反饋]關於設定選單的BUG
- BUG 解決記錄 一
- 記錄一個關於變數命名的事情變數
- 一個關於狗記錄的Java練習Java
- 關於分銷模組的一些記錄
- 關於倒資料的速度記錄問題
- MySQL·捉蟲動態·唯一鍵約束失效MySql
- oracle實驗記錄 關於記憶體的幾個viewOracle記憶體View
- Oracle關於nvl的一個BugOracle
- [BUG反饋]兩個關於釋出文章的BUG
- 關於contenteditable的IE下的bug
- 關於SpringBoot的外部化配置使用記錄Spring Boot
- 關於資料檔案autoextend on的一點記錄
- 關於move table和rebuild index批量操作的記錄RebuildIndex
- BUG管理系統運維記錄(bugfree)運維
- 關於Spring Aop和事務記錄Spring
- 關於Presentation Error的一點經驗Error