はじめに
Opencvのtraincascadeでカスケード分類器を作ろうとやってみた時に、以下のようなエラーがでてきたのでその対応をメモします。
PARAMETERS: cascadeDirName: ./cascade/bunrui/ vecFileName: ./vec/t_RGB.vec bgFileName: ./neg/nglist.txt numPos: 40 numNeg: 15 numStages: 20 precalcValBufSize[Mb] : 1024 precalcIdxBufSize[Mb] : 1024 acceptanceRatioBreakValue : -1 stageType: BOOST featureType: HOG sampleWidth: 24 sampleHeight: 24 boostType: GAB minHitRate: 0.995 maxFalseAlarmRate: 0.5 weightTrimRate: 0.95 maxDepth: 1 maxWeakCount: 100 Number of unique features given windowSize [24,24] : 9 ===== TRAINING 0-stage ===== <BEGIN POS count : consumed 40 : 40 Train dataset for temp stage can not be filled. Branch training terminated. Cascade classifier can't be trained. Check the used training parameters.
調べると情報が少なく
- 不正解画像の数が足りない
- 改行コードが違う
- WindowSizeの指定が違う
などあり試してみましたがダメでした。
解決策
ファイル構成は以下のようになっています。
. ├── opencv_traincascade ├── pos //正解画像ファイル │ ├── pos.png ├── vec //正解画像のベクトルファイル │ ├── pos.vec ├── neg //不正解画像ファイル │ ├── ng.png //不正解画像を複数枚用意 │ ├── nglist.txt ├── cascade //分類器用のファイル │ ├── ◯◯◯ //任意のファイル名 ├── 略
解決策としては、nglist.txtにある不正解画像のリストにopencv_traincascadeからのパスを通す事で解決しました。
変更前
ng1.png ng2.png ng3.png ng4.png ng5.png
変更後
./neg/ng1.png ./neg/ng2.png ./neg/ng3.png ./neg/ng4.png ./neg/ng5.png
リストが多すぎて一つ一つパス通すの大変だ、という方はこちらを使ってみてください。
各行の文字列の先頭に./neg/という文字列を追加して出力します。
<?php $file = fopen("nglist.txt", "r"); if($file){ while ($line = fgets($file)) { echo "./neg/".$line; } } fclose($file); ?>
これでopencv_traincascadeを実行する事で、分類器を作成する事ができました。