さて、前回までで事前に提供される分類器を使って顔認識し、顔にモザイクをかけるところまでやりました。次のステップとして分類器を自分で作成してみたいと思います。
#題材を決める
まず何の分類器を作るかなのですが、Splatoonのキャラクター(正式にはインクリングと言う生き物らしい)を検出するものを作ってみたいと思います。たまたま最初にこのキャラの静止画で顔認識を試した時に、顔を認識せず、あぁ普通の顔認識じゃ駄目なんだと思ったのが理由です。
#分類器の作成手順
分類器の作成方法としては、haartrainingとtraincascadeの2種類の方法があるようです。traincascadeの方が新しい方法のようなのでそちらを使ってみたいと思います。
traincascadeのチュートリアルがあるのでそちらを参照しながら作業を進めようと思いますが以下の手順が必要です。
- ネガティブ画像の準備
- ポジティブ画像の準備
- vectorファイルの生成
- 機械学習(traincascade)の実行
対象の含まれた画像と、その座標を記述したファイル、対象が含まれない画像などが必要になります。精度の高い分類機を作るには数千枚の写真があったほうが良いようなのですが、手順を理解するという意味でまずは10枚程度でやってみようと思います。
対象の座標を記述するのが面倒なのでツールでも作ろうかと思ったのですが、みんな同じことを考えるようですでに作成されている人がいたのでそれを利用させてもらおうと思います。Pythonの勉強も兼ねて、今後こういったツールも作ってみたいと思います。
物体検出/追跡研究者のための画像アノテーションツール ObjectMarker
##ポジティブ画像の収集とアノテーションの作成
Googleで検索をして適当な画像を10枚ほどダウンロードしました。ダウンロードした画像はObjectMakerのrawdataフォルダに配置します。
ObjectMakerを実行し、読み込んだ画像の顔の部分を囲っていきます。
これで準備完了です。
##ネガティブ画像の収集
次に対象が写っていないネガティブ画像を準備します。ネガティブ画像は対象が写っていなければどんなものでも良いようです。こちらもファイルのリストが必要なので以下のようなコマンドでリストを作成します。
dir /B > nega.txt
#Vectorファイルの生成
以下のコマンドでvectorファイルを生成しました。
opencv_createsamples.exe -info annotation.txt -vec inkling.vec -num 10
以下の2点でひっかかりました。
-
VBのランタイムが必要
msvcp140.dllが無いと言われた場合には、VBのランタイムが必要です。以下からダウンロードして導入したところ解決しました。https://www.microsoft.com/ja-JP/download/details.aspx?id=52685 -
/を¥変更する必要がある
ObjectMakerが作成するアノテーション・ファイルはパスの区切りが/なのですが、これだと上手くファイルが認識されませんでした。/を¥に変更したところ正しく動作しました。
#traincascadeの実行
以下のコマンドでtraincascadeを実行しました。ステージはデフォルト20なのですが、14個目で止まってしまうので、13を指定しました。
opencv_traincascade -data inkling -vec inkling.vec -numStages 13 -bg nega\nega.txt -numPos 9 -numNeg 9
こちらもいくつか引っかかりました。
-
ネガティブ・サンプルの配置に気をつける必要がある
vectorファイルを生成する際に使用するポジティブ・サンプルのリスト・ファイルに記載するファイル・パスは相対パスで良いようなのですが、トレーニング時のネガティブ・サンプルのリストではコマンドに対する相対パスになるようです。
また、その際に表示されるのが、以下のようなエラーメッセージのためハマると大変そうです。
"Required leaf false alarm rate achieved. Branch training terminated." -
ディレクトリは作成してくれない。
-data プロパティで指定するのはファイル名ではなくてディレクトリ名です。ここで指定するディレクトリは自動的に作ってくれないので事前に作成しておく必要があります。
##結果
さて、tranincascadeコマンドで作成されたcascade.xmlを使って早速試してみました。
すると、、、、全くと言っていいほど認識しません、、、
やはりサンプル10枚では少なかったのでしょう。というわけで、次回はcreatesampleコマンドを使用して正解画像を増やしてトレーニングを実行してみたいと思います。