bsYUKI86_syukudaiganbaru15150305

OpenCVで物体検出器を作成する⑤ ~createsamples~

こんにちは!ザキヤマです。
残暑を待ち構えていましたが、涼しいままあっという間に10月ですね~。

3つの特徴量の違いに引き続き、今回はtraincascadeの準備編、createsamplesについて説明していきます。

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

img_seo_bnr02

作業フォルダの構成

まず作業フォルダを作りましょう。
opencvの中のbinフォルダから下記ファイルをコピーします。

  • 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

これからファイルが増えていくので、わかりやすくするため下記の4つのフォルダも作成しておきます。

  • pos(正解画像を保存するフォルダ)
  • vec(正解画像ベクトルファイル用フォルダ)
  • neg(不正解画像を保存するフォルダ)
  • cascade(分類器用フォルダ)

さらに、cascadeの中に、どの分類器か分けるフォルダを作っておきましょう。

そうすると、下記のような構成になります。

pos/
vec/
neg/
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

用意するもの

  • 正解画像(ポジティブ画像)
    └検出させたい物体が映っている画像
  • 不正解画像(ネガティブ画像、背景画像)
    └検出させたい物体が映っていない画像

精度を考えると、正解画像は7000枚以上不正解画像は3000枚以上あると良いようです。

今回は簡単な分類器を作成して流れをつかむため、
正解画像50枚と、不正解画像30枚を集めて分類器を作成してみましょう。

正解画像

集めた正解画像は、1つのベクトルファイルにする必要があります。
createsamplesを使うと、正解画像をベクトルファイルに出力できます。

正解画像の収集は、地道に正解画像を集めいていく方法もありますが、
createsamplesというユーティリティを利用すると、1枚の正解画像から画像を変形させて、正解画像 数十枚~数百枚以上分のベクトルファイルを作成することができます。

便利ですね。使ってみましょう。ということで、今回は1枚の画像から作成します。

cleatesamples

コマンドラインを開いて、
createsamplesの実行ファイルを実行すると、パラメータの説明が出てきます。

opencv_createsamples.exe

↓実行!

Usage: opencv_createsamples.exe
  [-info  <collection_file_name>]...正解画像のリストファイル(自力で集めた場合)
  [-img  <image_file_name>]...1枚の画像(変形させてベクトルファイルを作成する場合)
  [-vec  <vec_file_name>]...出力されるベクトルファイルの名前(~.vec)
  [-bg  <background_file_name>]...-imgの背景になる画像のリストファイル
  [-num  <number_of_samples = 1000>]...作成する正解画像の枚数
  [-bgcolor  <background_color = 0>]...正解画像の背景になっている色を指定
  [-inv] [-randinv]...色の反転をする場合に指定
  [-bgthresh  <background_color_threshold = 80>]...背景とみなす範囲
  [-maxidev  <max_intensity_deviation = 40>]...最大明度差
  [-maxxangle  <max_x_rotation_angle = 1.100000>]...最大回転角度rad
  [-maxyangle  <max_y_rotation_angle = 1.100000>]
  [-maxzangle  <max_z_rotation_angle = 0.500000>]
  [-show [ <scale = 4.000000>]]...指定すると変形させた正解画像を確認できるウィンドウが表示される。
  [-w  <sample_width = 24>]...ベクトルの横幅
  [-h  <sample_height = 24>]...ベクトルの高さ

パラメータを指定しない場合、初期値が適用されます。
たとえば、ooo.jpgをposフォルダに保存したとして、下記のように実行します。

opencv_createsamples.exe -img ./pos/ooo.jpg -vec ./vec/ooo.vec -num 50 -bgcolor 255 -maxidev 40 -maxxangle 0.8 -maxyangle 0.8 -maxzangle 0.5 -show

-showを指定した場合、enterキーで次の画像を見ることができます。
見るのを終了する場合はescキーで表示を終了できます。

パラメータの数値については、実際に数値を変更してどんな画像が出力されるか見て調節してみてください。
実行完了すると、ベクトルファイルが生成されています。

不正解画像

不正解画像については、検出させたい物体が映っていない画像であれば、なんでも良いようです。
正解画像と区別させたい画像を用意するとよいでしょう。

不正解画像をnegフォルダへ保存していき、不正解画像のリストファイルを作成します。

リストファイルの作り方

たとえば集めた画像ファイルの拡張子がjpgだった場合、
コマンドプロンプトでnegフォルダまで移動し、
下記コマンドで簡単にリストファイルが生成できます。

dir *.jpg /b > nglist.txt

ターミナルでリストファイルを作りたいときはこっち。

ls -v | grep jpg > nglist.txt

リストファイル「bglist.txt」の内容はこんな感じになります。

xxx.jpg
xxxx.jpg
・
・
・
xxxxx.jpg

準備完了!

正解画像と不正解画像がそろいましたね。これで準備は完了です。
ここまででフォルダの構成は以下のようになっています。

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の前準備、createsamplesについてでした。

次回はtraincascadeでカスケードファイルを生成します。

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

img_seo_bnr02

CONTACT US

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


Previous Post

Next Post