14

OpenCVで物体検出器を作成する⑥ ~traincascade~

こんにちは!ザキヤマです。

前回の準備編に引き続き、今回はついにトレーニング!!traincascadeで分類器を作成していきます。

OpenCVで物体検出器を作成するシリーズ、記事一覧はこちら

img_seo_bnr02

構成の確認

前回、正解画像と不正解画像を準備し、以下のようなフォルダ構成になりましたよね。

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で物体検出器を作成する⑦ ~分類器完成~

img_seo_bnr02

CONTACT US

株式会社プロフェッサはWEB制作会社です。
ウェブサイト制作やシステム開発など、ウェブに関するご相談は下記よりお気軽にどうぞ


Previous Post

Next Post