
OpenCVで物体検出器を作成する⑥ ~traincascade~
こんにちは!ザキヤマです。
前回の準備編に引き続き、今回はついにトレーニング!!traincascadeで分類器を作成していきます。
OpenCVで物体検出器を作成するシリーズ、記事一覧はこちら!
構成の確認
前回、正解画像と不正解画像を準備し、以下のようなフォルダ構成になりましたよね。
pos/ ooo.jpg vec/ ooo.vec neg/ xxx.jpg xxxx.jpg ・ ・ ・ xxxxx.jpg nglist.txt cascade/ ooo/ opencv_calib3d2411.dll opencv_core2411.dll opencv_createsamples.exe opencv_features2d2411.dll opencv_flann2411.dll opencv_highgui2411.dll opencv_imgproc2411.dll opencv_ml2411.dll opencv_objdetect2411.dll opencv_traincascade.exe
traincascadeのパラメータ
それでは、traincascadeのパラメータを確認していきましょう。
createsamplesと同じように、コマンドラインを開き、
traincascadeの実行ファイルを実行すると、パラメータの説明が出てきます。
opencv_traincascade.exe
↓実行!
Usage: opencv_traincascade.exe -data <cascade_dir_name>...分類器を保存するフォルダ(分類器ごとに分ける) 自動生成されないため、先にフォルダを作成しておいてください。 -vec <vec_file_name>...作成したベクトルファイル(~.vec) -bg <background_file_name>...不正解画像のリストファイル [-numPos <number_of_positive_samples = 2000>]...(※)作成した正解画像の枚数より少なくする [-numNeg <number_of_negative_samples = 1000>]...用意した不正解画像の枚数 [-numStages <number_of_stages = 20>] [-precalcValBufSize <precalculated_vals_buffer_size_in_Mb = 256>]...特徴量用のメモリサイズ [-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb = 256>]...特徴量用のバッファメモリー 多いと計算速度が速くなる [-baseFormatSave] --cascadeParams-- [-stageType <BOOST(default)>] [-featureType <{HAAR(default), LBP, HOG}>]...特徴量の見つけ方を決める [-w <sampleWidth = 24>]...正解画像を作成したときと同じものを指定 [-h <sampleHeight = 24>]...正解画像を作成したときと同じものを指定 --boostParams-- [-bt <{DAB, RAB, LB, GAB(default)}>]...boost分類器のタイプ DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost. [-minHitRate <min_hit_rate> = 0.995>]...各ステージでの最小ヒット率 [-maxFalseAlarmRate <max_false_alarm_rate = 0.5>]...半分を超えない識別器は意味が無い [-weightTrimRate <weight_trim_rate = 0.95>] [-maxDepth <max_depth_of_weak_tree = 1>]...弱検出器の最大の深さ [-maxWeakCount <max_weak_tree_count = 100>] --haarFeatureParams-- [-mode <BASIC(default) | CORE | ALL>] --lbpFeatureParams-- --HOGFeatureParams--
※作成した正解画像の枚数より少なくする?
正解画像の枚数を指定する「-numPos」について注意点があります。
今回はcreatesamplesを使って正解画像を50枚作成しましたが、ここで-numPosを50として実行するとエラーが出ることがあります。
学習中に正解画像として適切でないと判断された正解画像は、以降正解画像として扱われなくなります。
そこで、この分を補完するために次の画像を呼び出しますが、
用意した分の枚数を指定している場合は画像が足りないので、次の画像がない!!とエラーが出てしまうのです。
そのため、「正解画像とみなされなくなる枚数」を想定した数値を設定する必要があります。
ステージ数や、正解率の設定などによって数値は変わりますが、
とりあえず、今回は用意した枚数の9割~8割ほどで設定してみてください。
これで大抵は画像枚数が足りなくなることはないと思います。が、もしエラーがでたら画像を変えるか、数値を変更してみてください。
実行!
パラメータを指定しない場合は初期値が適用されます。
一番シンプルに必須のみ指定し、実行すると以下のようになります。
opencv_traincascade.exe -data ./cascade/ooo/ -vec ./vec/ooo.vec -bg ./neg/nglist.txt -numPos 40 -numNeg 20
画像の枚数が少ないので、実行してから数分で分類器が出来上がると思います。
実行環境にもよるかもしれませんが、10分たっても動きがみられないようであれば、
学習のループに陥っている可能性大です。
正解画像が良くなかったのか、不正解画像が良くなかったのか、、、要因は様々ですが、
おそらくそのまま待っていても終了しません。Ctrl+Cで終了しましょう。
精度を高めるために画像の枚数を増やしたり、正解率を上げたりした場合には数時間かかります。
設定や機械の性能によって、数日かかる場合もあるようです。
学習途中で終了したとしても、ステージごとにxmlファイルが生成されるため、
同じコマンドを実行することで中断したステージから再開することが可能です。
実行すると、以下のようにずらずらっと学習が始ります。
PARAMETERS: cascadeDirName: ./cascade/ooo/ vecFileName: ./vec/ooo.vec bgFileName: ./neg/nglist.txt numPos: 40 numNeg: 20 numStages: 20 precalcValBufSize[Mb] : 256 precalcIdxBufSize[Mb] : 256 stageType: BOOST featureType: HAAR sampleWidth: 38 sampleHeight: 24 boostType: GAB minHitRate: 0.995 maxFalseAlarmRate: 0.5 weightTrimRate: 0.95 maxDepth: 1 maxWeakCount: 100 mode: BASIC ===== TRAINING 0-stage ===== <BEGIN POS count : consumed 40 : 40 NEG count : acceptanceRatio 20 : 1 Precalculation time: 0.81 +----+---------+---------+ | N | HR | FA | +----+---------+---------+ | 1| 1| 0| +----+---------+---------+ END> Training until now has taken 0 days 0 hours 0 minutes 1 seconds. ===== TRAINING 1-stage ===== <BEGIN POS count : consumed 40 : 40 NEG count : acceptanceRatio 20 : 0.144928 Precalculation time: 0.797 +----+---------+---------+ | N | HR | FA | +----+---------+---------+ | 1| 1| 0| +----+---------+---------+ END> Training until now has taken 0 days 0 hours 0 minutes 2 seconds. ===== TRAINING 2-stage ===== <BEGIN POS count : consumed 40 : 40 NEG count : acceptanceRatio 20 : 0.0917431 Precalculation time: 0.806 +----+---------+---------+ | N | HR | FA | +----+---------+---------+ | 1| 1| 0|
うまくいくと…
フォルダ構成はこんな感じになっています。
cascade_dir_nameで指定したディレクトリ、cascade/ooo/の中にいくつかxmlファイルが生成されています。
途中結果も勉強の段階ごとに出力されるため、勉強の度合いによってファイル数が変わります。
最終的に出力される、「cascade.xml」が完成した分類器です。
pos/ ooo.jpg vec/ ooo.vec neg/ xxx.jpg xxxx.jpg ・ ・ ・ xxxxx.jpg nglist.txt cascade/ ooo/ cascade.xml ← params.xml stage0.xml stage1.xml stage2.xml stage3.xml opencv_calib3d2411.dll opencv_core2411.dll opencv_createsamples.exe opencv_features2d2411.dll opencv_flann2411.dll opencv_highgui2411.dll opencv_imgproc2411.dll opencv_ml2411.dll opencv_objdetect2411.dll opencv_traincascade.exe
無事、カスケード分類器が作成できました。
今回は画像枚数が少ないので、検出ができなかったり誤認識が多かったりするかもしれません。
でも、作成の流れはつかめていただけましたでしょうか?
後はcreatesmamplesの設定値を変えてみたり、画像枚数を増やしたり、ほかの特徴量で作成してみたり、traincascadeの設定値をいじったりしてみて、納得いく精度の分類器を作成してみてください!
つづきます
次回、今回作成した分類器で使った画像と、検出結果を発表いたします!
無事、検出ができるのでしょうか。
そもそも、ザキヤマは何の検出器を作ったのでしょうか。お楽しみに〜。
OpenCVで物体検出器を作成するシリーズ
OpenCVで物体検出器を作成する① ~基礎知識~
OpenCVで物体検出器を作成する② ~Haar-Like特徴~
OpenCVで物体検出器を作成する③ ~LBP特徴~
OpenCVで物体検出器を作成する④ ~HOG特徴~
OpenCVで物体検出器を作成する⑤ ~createsamples~
OpenCVで物体検出器を作成する⑥ ~traincascade~
OpenCVで物体検出器を作成する⑦ ~分類器完成~
OpenCVで物体検出器を作成する⑧ ~エラー対処~