お久しぶりです。私事でなかなか執筆の時間がとれず、
というわけで、
今回作成するプログラムのソースコードは、
学習の流れと仕組み
学習の流れ
前回のおさらいになりますが、
学習の流れを簡単にまとめると以下の通りです。
- 正解サンプル画像と非正解サンプル画像を用意する
- サンプル画像のリストファイルをそれぞれ作成する
- 正解サンプル画像を元に、
学習用正解ファイルを生成する - 学習用正解ファイルと非正解リストファイルを元に、
学習を行う
ここで解説する学習方法の詳細については、
今回は、

学習の仕組み
第3回で解説したとおり、

検出器の学習は、
各ステージ
全体が目標とする認識率、
このように、
学習時間は、
オブジェクト検出器の学習
画像の収集
まず、
OpenCVのドキュメントによると、
それだけ大量の画像をどこから集めるかですが、
いくつか例としては、
- MITの顔画像データ
- カリフォルニア工科大学のオブジェクト画像データ
などがあります。
なお、
ここでは、
画像を収集したら、
例として、

NG\image_0001.jpg
NG\image_0002.jpg
NG\image_0003.jpg
NG\image_0004.jpg
NG\image_0005.jpg
一行一行に、
同様の要領で、
OK\image_0001.jpg 1 120 100 45 45
OK\image_0002.jpg 2 100 200 50 50 50 30 25 25
OK\image_0003.jpg 1 40 55 60 60
OK\image_0004.jpg 1 104 98 40 40
OK\image_0005.jpg 2 62 70 50 50 120 162 30 30
非正解画像のリストと違うのは、
これは、
ファイル名の後ろにある数字は、

では、
学習用正解ファイルの作成
1枚の画像から大量の正解画像を作成するために、
まず、
- createsamples.
exe - haartraining.
exe - cv100.
dll - cxcore100.
dll - libguide40.
dll - highgui100.
dll
次に、
> > createsamples.exe -img gihyo_logo.png -vec pos_gihyo.vec -num 4000 -bgcolor 255 -w 44 -h 18 -show
createsamples.
- -img
学習の元画像を示します。
1枚の画像からではなく、
集めたたくさんの学習画像から学習用正解ファイルを生成する場合、 -imgの引数を-infoに変えて正解画像リストファイルを指定します。 - -vec
出力ファイル名です。学習用画像データは全てこの1つのファイルにまとめられます。
- -num
作成する学習サンプル画像の数です。ここでは4000を指定しました。
- -bgcolor
背景色を示します。ただし単純にグレースケール画像の0から255までの濃度であらわします。この例ですと背景色は白なので255を指定します。
- -bg
この例ではロゴの背景は一様である場合がほとんどなので使用していませんが、
もし検出したいオブジェクトが、 複雑な背景の中にある場合が予想されるなら、 このオプションで前節で作成した非オブジェクト画像リストを記したテキストファイルを指定します。 - -w
学習サンプル画像の横幅
(ピクセル) を指定します。ここでは元画像の1/ 4のピクセルサイズを指定しました。 - -h
学習サンプル画像の縦幅
(ピクセル) を指定します。学習サンプル画像では、 元の画像を回転させたものが生成されるため、 その遊びを持たせるために元画像の1/ 2のサイズを指定しました。 - -show
このオプションを指定すると、
実際にどのようなサンプル画像が生成されたかを見ることができます。Windowが開いたらスペースキーを押すことで、 次のサンプル画像を見ることができます。画像の閲覧をやめる場合はESCキーを押すか、 ウィンドウを閉じてください。
事前にどのような画像が生成されるかを見ることで、その他のオプションのパラメータを最適化することをお勧めします。
他にも様々なオプションが用意されてますが、
これで、
オブジェクトの学習
オブジェクトの学習には、
学習を行うにはコマンドプロンプトから、
> > haartraining.exe -data gihyo_logo -vec pos_gihyo.vec -bg NG.txt -npos 4000 -nneg 1685 -w 44 -h 18 -mode ALL
- -data
出力したい学習結果xmlファイル名です。同名の作業用フォルダが自動的に作成されます。
- -vec
学習サンプルデータを指定します。
- -bg
非オブジェクト画像リストを記したテキストファイルを指定します。
- -npos, -nneg
それぞれ学習させる正解画像、
非正解画像の枚数を指定します。 - -w, -h
createsamplesで指定したものをそのまま使用して下さい。
- -mode
使用するオブジェクト検出特徴の種類を指定します
(第3回参照)。ここでは全ての種類の特徴を用いています。
これにより学習がスタートします。このコマンドを実行すると、
学習の進捗は以下のように、
Parent node: 1
Chosen number of splits: 0
Total number of splits: 0
Tree Classifier
Stage
+---+---+---+
| 0| 1| 2|
+---+---+---+
0---1---2
Parent node: 2
*** 1 cluster ***
POS: 2990 3000 0.996667
NEG: 1292 0.00242816
BACKGROUND PROCESSING TIME: 13.95
Precalculation time: 20.47
+----+----+-+---------+---------+---------+---------+
| N |%SMP|F| ST.THR | HR | FA | EXP. ERR|
+----+----+-+---------+---------+---------+---------+
| 1|100%|-|-0.912555| 1.000000| 1.000000| 0.146894|
+----+----+-+---------+---------+---------+---------+
| 2|100%|+|-0.836548| 1.000000| 0.861455| 0.130546|
+----+----+-+---------+---------+---------+---------+
| 3| 95%|-|-0.397814| 1.000000| 0.487616| 0.074731|
+----+----+-+---------+---------+---------+---------+
Stage training time: 399.80
Number of used features: 3
上記の表の"node"または"stage"が一つの強識別器にあたります。この画面の例では2つの強識別器まで学習が終わっており、
もし計算時間がかかりすぎて途中で止めたいときは、
表のNというのは、
オブジェクト検出プログラムの実行
では、


このように、
連載の終りに
これで4回にわたって行われた連載は終了です。この連載ではOpenCVのオブジェクト検出アルゴリズムを通して、
そして一方で、
この分野はまだまだ発展途上の分野です。世界中の優れた研究者がしのぎを削って研究を行っており、
今、
それと比べると、
そして僕は、
この連載を通して、
最後までお読みいただき、