はじめに
Pythonをはじめよう 第7回 ファイルを選択して動画再生で自動車の識別を行うことを予定しておりました。ただ、OpenCVの自動車のカスケードファイルが用意されておりませんでしたので、自分で準備したいと思います。
方法としては、ドライブレコーダの動画ファイルからJPGを抜き出し、これを使ってポジティブサンプルとネガティブサンプルを準備し分類器を作成していきます。
- 動画ファイルからJPG抽出
- ポジティブサンプルの準備
- OpenCVのツールで分類器の作成
1.動画ファイルからJPG抽出
ドライブレコーダーの動画から静止画を抽出するために「Free Video to JPG Converter」というソフトを利用しました。
複数の動画をまとめて処理してくれるので処理を開始したら待つだけです。
これで6918枚のJPG画像を用意できました。
ただ、使えない画像(停車中のものは、ほぼ同じ画像が続いたり)もたくさん有るので、まだまだ画像は必要だと思います。
2.ポジティブサンプルの準備
準備した画像ファイルは動画ファイル毎にフォルダ分けされるので、一カ所のフォルダにまとめます。
ねこと画像処理 part 2 – 猫検出 (モデル配布) と OpenCV 2.4.2で分類器を作る の記事を読んでポジティブとネガティブに分類する作業を行おうと思ったのですが、紹介されているツールでは無く「ObjectMarker ver1.5」を使ってみたら今ひとつ使い方に慣れなかったので自作したツールを使って作業をすることにしました。
上段のエクスプローラー部分でフォルダを選択して最初のJPG画像を選択します。
次に対象物の自動車を四角形で囲み下段にある「セットして次へ」ボタンをクリックすると、右側のOK.txtに画像ファイルが登録されます。対象物が無い場合はそのまま「セットして次へ」ボタンをクリックすると、右側のNG.txtに画像ファイルが登録されます。
OK.txt [画像ファイル名] [対象物体数] [X座標] [Y座標] [幅] [高さ]
NG.txt [画像ファイル名]
画像をスキップしたい場合は「スキップ」ボタンをクリックすると次の画像へすすみます。
右下の「保存」ボタンをクリックすると、選択中のフォルダに OK.txtとNG.txtファイルが保存(上書き保存)されます。
地道な作業ですが、こつこつ続けていきますが、まだまだ終わりません(汗)
とりあえず作業はすすめられますが、バグが有ったりするのでこのツールを公開できる状況ではありません。
アンドゥ・リドゥ・四角形のサイズ変更や移動など欲しい機能も実装したいところです。また、セットした画像を再度表示したときに四角形で囲んだ状態で表示させたり、OK.txtを更新したりも必要だと感じます。(現在、追加のみなので画像が重複してしまう)
3.OpenCVのツールで分類器の作成
2の準備作業がまだまだかかりそうなので分類器の完成は別のブログで公開することになりますが、OpenCVのツールを準備しておく必要があります。
opencv_createsamples と opencv_traincascade が必要となるのでダウンロードして使えるようにしておきます。
OpenCV download サイトを開き「Files」をクリックします。
「opencv-win」をクリックします。
「3.4.3」をクリックします。
「opencv-3.4.3-vc14_vc15.exe」をクリックしてダウンロードします。
ダウンロードしたファイルは自己解凍ファイルなので実行するとopencvフォルダにツール類が展開されます。
opencv\build\x64\vc15\bin にパスを通しておくと便利だと思います。
途中のOK.txtを使ってopencv_createsamplesを実行してみます。「opencv\build\x64\vc15\bin」にOK.txtをコピーして
opencv\build\x64\vc15\bin> opencv_createsamples -info OK.txt -vec OK.vec -num 273
とここで問題発覚しました。
動画からJPG抽出した際にファイル名に半角スペースが使われているために「opencv_createsamples.exe」がファイルをオープンできません。( ̄ω ̄;)
用意した全JPGファイルのリネームが必要です。。。
> ren "???????? ??.jpg" "????????_??.jpg"
一括で置換できました(⌒ω⌒)
OK.txtも修正して再度実行してみたところ上手く実行できました。
さらに試してみましょう。「opencv\build\x64\vc15\bin」にNG.txtをコピーして carフォルダを作成し次のコマンド実行
opencv\build\x64\vc15\bin> opencv_traincascade -data car/ -vec ok.vec -bg ng.txt -numPos 245 -numNeg 783 -featureType HAAR -mode ALL
しばらく時間がかかりそうです。
最後に
Pythonをはじめよう 第7回 ファイルを選択して動画再生 のソースに出来上がったカスケードファイルをにセットして上手く自動車を認識できるかは、現在処理中のため次回のブログになります。
ポジティブサンプルもまだまだ用意しないといけないのでなかなか大変ではありますが、がんばっていきたいと思います。