坂本研のゼミ室

opencv_traincascadeで分類器作る時に苦しんだ事

はじめに

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を実行する事で、分類器を作成する事ができました。