OpenCVで学ぶ画像認識
第4回 オブジェクト検出器の作成方法
お久しぶりです。私事でなかなか執筆の時間がとれず,前回の掲載から長く時間が空いてしまい申し訳ありませんでした。皆さんから寄せられたコメントには非常に励まされました。
というわけで,今回はいよいよ最終回です。前回はオブジェクト検出器を使って顔を検出するところまで行いました。今回は,オリジナルオブジェクト検出器を作成してみます。
今回作成するプログラムのソースコードは,こちらから一括してダウンロードすることができます。
学習の流れと仕組み
学習の流れ
前回のおさらいになりますが,オブジェクト検出器は機械学習という方法を通して作成されます。つまり,コンピュータプログラムに検出したいオブジェクトの画像(正解画像)とそうでない画像(非正解画像)を与えることで,オブジェクトが含まれている画像の傾向というのをコンピュータに覚えさせていきます。
学習の流れを簡単にまとめると以下の通りです。
- 正解サンプル画像と非正解サンプル画像を用意する
- サンプル画像のリストファイルをそれぞれ作成する
- 正解サンプル画像を元に,学習用正解ファイルを生成する
- 学習用正解ファイルと非正解リストファイルを元に,学習を行う
ここで解説する学習方法の詳細については,インストールディレクトリ下の"apps/HaarTraining/doc/haartraining.htm"を参照して下さい。
今回は,画像の中から下図のような技術評論社のロゴを抽出するプログラムを作成します。
学習の仕組み
第3回で解説したとおり,OpenCVのオブジェクト検出はAdaBoostで学習させた強識別器を複数連結(カスケード)したものになっています。
検出器の学習は,この1番目の強識別器から順番に進めていきます。
各ステージ(強識別器の学習)には,目標とする認識率(正解画像を正解と判断した率)及び許容できる誤認識率(非正解画像を正解と誤って判断した率)があり,それを達成するまで繰り返し矩形特徴(弱識別器)を追加しながらAdaBoostによる学習を行っていきます。
全体が目標とする認識率,及び誤認識率を達成した時点で学習は終了です。
このように,学習は多くの繰り返し処理を必要とするため,非常に時間がかかります(早くて数時間,長いと数日から数週間)。
学習時間は,全学習ステージ数(標準で14),目標とする認識率,学習データの数などによって左右されますので,必要に応じて調整してください。
オブジェクト検出器の学習
画像の収集
まず,正解画像と非正解画像をそれぞれ収集します。
OpenCVのドキュメントによると,学習に用いる上で効率的なサンプル数は,正解画像7000枚,非正解画像3000枚とのことですが,ここでは正解画像4000枚,非正解画像1700枚程度で行います。
それだけ大量の画像をどこから集めるかですが,インターネット上には様々な画像素材提供サイトがあるので,そこから探すというのも一つの手です。またコンピュータ・ビジョンの研究分野では,実験用に顔画像やオブジェクト画像を提供している研究室がたくさんあるので,そういったデータを利用するのも良いかもしれません。
いくつか例としては,
- MITの顔画像データ
- カリフォルニア工科大学のオブジェクト画像データ
などがあります。
なお,正解画像を集める方法には2通りあります。一つは頑張って例えば自分でデジカメで撮影したり,インターネットから学習画像を集めること。もう一つは,1枚の画像に対して回転や変形などを加えることで,学習画像を増やす方法です。前者は顔や自動車など,個人差(車種)や表情などで形が変形するものに対して有効な方法で,後者はロゴなど形が一定のものを見つけたい時に適用します。
ここでは,後者の方法を用いて技術評論社のロゴを検出するプログラムを作成する予定ですが,前者についても解説します。
画像を収集したら,それを記述するリストファイルを作成します。


