Windows
OpenCV
機械学習
python3
顔認識

OpenCVでSplatoonのイカ分類器を作ってみた

More than 1 year has passed since last update.

前回までのOpenCV

さて、前回はサンプル10枚でイカ検出器を作成してみたところ見事に検出に失敗しました。
というわけで、今回はサンプルを数を増やしたり、パラメータを変更しながらいろいろ試してみたいと思います。

opencv_createsamplesによるサンプルの生成

createsamplesコマンドを使用することで、1枚の画像から角度やサイズを変更した大量のサンプルを自動生成することが出来ます。

opencv_createsamples.exe -img face.jpg -num 1000 -vec test.vec

-img :元になる画像を指定します。
-num :生成する画像の数を指定します。
-vec :生成した画像から作られるvectorファイルの名前

その他のオプションは何もオプションを付けないでコマンドを実行して確認してください。
デフォルトでは生成する画像のサイズは24x24のものになります。
サイズを変更するには、 -h -w で高さと幅を指定します。
24だと少し小さすぎな気がしています。

traincascadeによる学習

次にtraincascadeコマンドを使用して学習を行います。

opencv_traincascade.exe -data 50 -vec test.vec -bg list.txt -numPos 50 -numNeg 10

-data:生成した分類器を出力するフォルダ。事前に作成しておく必要があります。
-vec :ソースとなるvectorファイル。createsamplesで生成したもの
-bg :ネガティブ画像のリストが記述されたテキストファイル
-numPos:使用するポジティブ画像の数。生成した数を同じ数を指定するとエラーになる場合があります。
-numNeg:使用するネガティブ画像の数

結果

いろいろ試行錯誤して、出来上がった分類器の認識結果がこちら。顔以外にも判定がでる場合がありますが、それなりに上手く認識します。ちなみに、本当は動画でやりたいのですがキャプチャ環境が無いので、スクリーンショットをTwitterで送信してからPCに保存しています。

image.png
image.png
参考までに各コマンドのパラメータです。

opencv_createsamples.exe -bgcolor 250 -img posi.jpg -vec 4000.vec -num 4000 -bg nega.txt -h 40 -w 40
opencv_traincascade.exe -data 4000 -v
ec 4000.vec -numPos 3500 -numNeg 1200 -bg list.txt -featureType LBP -h 40 -w 40

分類器作成のコツ

さて、実際にやってみると分かるのですが、精度の高い分類機を作成するのはなかなか難しいです。というかそもそも認識するようにするだけでも試行錯誤が必要です。上手く作成するコツをまとめておきたいと思います。

LBPを使用する

試行錯誤が必要なので、分類器の学習速度が重要です。デフォルトのHaarに比べてLBPは大幅に学習速度が速いため、数多く試行が可能です。traincascade実行時に-featureType LBP を指定すればOKです。

createsamplesの生成結果を確認する

createsamples実行時には-bgcolorと-bgを指定して実行しないと上手く認識しませんでした。-showを指定することで生成された画像を確認することができますので、学習に適した画像が生成されていることを確認しましょう。今回のケースですと、最初はキャラクターの髪の毛が入った状態でデフォルトのパラメータで画像を生成していたところ、ほとんど認識することが出来ませんでした。そこで、目の周りの部分だけを切り取り、様々な背景に目の部分が浮き出るような画像が生成される様に-bgcolorを調整し、-bg パラメータを指定したところ認識率が上がりました。画像を確認する際には、-h -w でサイズを少し大きめにすると確認しやすいです。ただし、大きくすると学習時間が長くなりますので、最終的には小さなサイズでvecファイルを生成します。

まず過剰に認識する状態にしてからネガティブ画像を増やす

まず、対象を正しく認識できるようにしてから、ネガティブ画像を徐々に追加し、誤認識を減らしていきましょう。今回はポジティブ画像を1000枚、ネガティブ画像100枚程度から開始しました。この程度ですと、学習は数分で終わります。その後、ネガティブ画像を追加していったところ認識精度が悪くなったので、ポジティブ画像を3500枚に変更しました。最終的にはネガティブ画像を1200枚まで増やしています。ネガティブ画像を集めるには、Google等からキーワードで画像を一括ダウンロードするツールが沢山ありますのでそれを利用しましょう。ちなみに、最終的なパラメータでの学習時間はThinkpadT530で35分でした。

以下の写真は調整途中の結果です。こんな感じで誤認識が沢山ある状態にしてからチューニングしましょう。
image.png

まとめ

今回は、createsamplesコマンドを使用して大量の画像を生成し、イカを正しく認識できるうに分類器を作成しました。createsamplesコマンドを使用して分類器を作成するにはコツが必要ですので、まずは時間がかからない枚数で試行錯誤して方向性を定めてからサンプル数を増やすことをオススメします。