酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

オブジェクト認識学習におけるポジティブ画像とネガティブ画像について

ポジティブ画像のことを 正解画像 、ネガティブ画像のことを 不正解画像 と呼んでいる方もいます。

OpenCVのオブジェクト認識について、あまり日本語で書かれている記事を見かけないので、いろんな場面で英語で検索することがあると思います。そのような時には、それぞれPositive Image、Negative Imageで検索してみてください。

  • ポジティブ画像
    • 検出させたいオブジェクトを含む画像
  • ネガティブ画像
    • 検出させたいオブジェクトを含まない画像

永田雅人さんが書かれた「実践OpenCV」によれば、実用的な精度の検出を実現するためには、ポジティブ画像が7,000枚、ネガティブ画像が3,000枚必要と言われています。

ネガティブ画像を用意する

Googleの画像検索からダウンロードしたりして画像を集めると良いらしいです。

ポジティブ画像を用意する

opencv_createsamplesを使用して、1枚のポジティブ画像からアフィン変換等で形状を変えて4,000枚といった画像を含む.vecファイルを作成することができます。opencv_createsamplesについては、こちらのページに詳細を書いておりますのでご覧ください。

また、1枚の画像に検出すべきオブジェクトが複数ある場合には、下記のようなフォーマットで指定することが可能です。

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

Windows向けであれば、OpenCVのパターン認識の素材集めのために作られた「SC」やオープンソースの画像認識の学習支援ツール「OM」を利用すると便利かもしれません。

学習精度を高めるためのポジティブ画像/ネガティブ画像の選び方

ポジティブ画像、ネガティブ画像に絡むものだけではありませんが、学習精度を高めるためにできることには以下のような画像を集める必要があります。ほとんど「実践OpenCV」からの引用です。

  • ポジティブ画像を増やす
  • ネガティブ画像を増やす
  • ステージ数を増やす(opencv_haartrainingの-nstagesオプションのこと。ただし学習時間が増えます)
  • ネガティブ画像の質を向上させる
    • 例えば、屋内で検出したい場合は、ネガティブ画像に屋内写真を多く用意すると効果がある
  • opencv_haartrainingの-modeオプションを、COREやALLに変更する
  • opencv_createsamplesで作成するポジティブ画像の縦横サイズを48x48といった大きめに変更する
  • 検出対象が左右対称でない場合は、opencv_haartrainingの-nonsymオプションを指定する
  • opencv_haartrainingの分類機の分割数を増やす(-nsplitsオプション)