OpenCV

カスケードトレーニングについて私が知っていることをメモしておこう

opencv_traincascadeでカスケードファイルを作っています。あと20時間くらいかかりそうで手持無沙汰なのでメモ。

まず、 opencv_traincascade.exeは自分でコンパイルしたものを使ったほうがよさそうです。
コンパイルオプションをちゃんと吟味して、早く動くものでやるとはかどります。しかしながら段数が増えてくると早いやつを使ってもだんだんスピードが遅くなります。それでも自前でコンパイルしたほうが良い理由は、配布されているopencv_traincascadeバイナリだとできない段数でも自前で作ったバイナリならできたからです。理由は調べてないのでわかりません。

メモリーは多いにこしたことはないです。-precalcValBufSize -precalcIdxBufSize は内蔵の物理メモリが許す限り大きくとったほうが初速が稼げます。これも段数が上がるとあんまり効果がなくなるみたいです。

正解画像も不正解画像もあらかじめすべてJPEGならJPEG、BMPならBMPに変換しておいたほうが良いです。ディスクスペースに余裕があるならBMPにすれば画像展開の時間が稼げると思います。OpenCVのLIBPNGは古いしなんがおかしいのでPNGは使わないほうが良いでしょう。ZLIBも古いし。不正解画像はグレースケールにしたほうが良いみたいですが、理由は知りません。もしかしたら正解もグレースケールにしたほうが良いのかもしれませんがわかりません。

JPEG画像をどうしても使う場合はOPENCVをビルドするときに、JPEGライブラリをLIBJPEG-TURBOに差し替えたほうがちょっと早いですが、これも段数が上がると効果が薄れます。

TBBは有効にしたほうが良いと以前書きましたが、最新のやつ(3.3.1 Gitで持ってきたソース参照)はTBB有効にしなくてパラレル処理するようになっているみたいです。CPUの占有率とかスピードを見るとTBBを有効にしたほうが早いみたいです。なぜかはわかりません。マルチコアのCPUでなかったら段数上がっていくと時間がめちゃくちゃかかるので悲しくなると思います。

アノテーションは、有名なツール、https://github.com/takmin/ObjectMarker 
を利用されるとよいでしょう。OpenCVの付属ツールより使いやすいです。
ObjectMakerを自力でコンパイルするときには注意点として、IFDEF でWindowsを判断しているところがあるのですが、WIN とかなっているところを _WIN とアンダーバーを付けないとマウスをちゃんと持ってこれないので気を付けて下さい。矢印キーを使いたい人、残念ですがOPENCVのキー処理のソースをいじらないとできないので、あきらめて10キーつきのキーボードを使うかを10キーを買ったほうが早いと思います。
ビルドするのにBoostライブラリが必要ですが、自分でビルドして使えるようにするのはとても面倒なので、Nugetで持ってくるとよいと思います。

アノテーションが終わったものは、そのまま使うのではなく、囲ったところを切り出した画像にしたほうが良いみたいです。ObjectMakerをビルドして使えば作成したアノテーションファイルでできます。

しかしながら切り出してしまうとopencv_createsample.exeで必要な入力画像の位置指定TXTファイルを作るのに往生することになります。
リサイズするユーティリティーはフリーで落ちているので、それらを使って全部同じサイズにリサイズすればファイル名をdirなどで吐き出して、そのあとはコピペで行けます。
もしくは、プログラムがとくいな人はPythonなどで、画像一杯を領域としたOK用の位置指定ファイルを生成するプログラムを作ってしまえばよいと思います。PILとか使ってディレクトリ内の切り取り済みのイメージファイルのサイズを読み取ってファイル名とサイズを吐き出すプログラムを作ればよいです。image.sizeとかでとれます。

あと、不正解画像ですが、ありえないシチュエーションの画像は入れないほうが良いでしょう。段数上がるごとに
時間がかかるので時間の無駄遣いになります。

メモは以上です。