
OpenCVで物体検出器を作成する⑤ ~createsamples~
こんにちは!ザキヤマです。
残暑を待ち構えていましたが、涼しいままあっという間に10月ですね~。
3つの特徴量の違いに引き続き、今回はtraincascadeの準備編、createsamplesについて説明していきます。
OpenCVで物体検出器を作成するシリーズ、記事一覧はこちら!
作業フォルダの構成
まず作業フォルダを作りましょう。
今回使用したのはWindowsで動かせるOpenCV、バージョンは2.4.11です。
以下からダウンロードできます。
→ OpenCV – Browse /opencv-win/2.4.11 at SourceForge.net
opencvの中のbinフォルダから、作業フォルダに必要なファイルをコピーしていきましょう。DLしたexeをインストールしたディレクトリの、
\opencv\build\x64\vc12\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~
OpenCVで物体検出器を作成するシリーズ
OpenCVで物体検出器を作成する① ~基礎知識~
OpenCVで物体検出器を作成する② ~Haar-Like特徴~
OpenCVで物体検出器を作成する③ ~LBP特徴~
OpenCVで物体検出器を作成する④ ~HOG特徴~
OpenCVで物体検出器を作成する⑤ ~createsamples~
OpenCVで物体検出器を作成する⑥ ~traincascade~
OpenCVで物体検出器を作成する⑦ ~分類器完成~
OpenCVで物体検出器を作成する⑧ ~エラー対処~