ぷらおり

適当にプログラムとかCTFとか

課題メモ(カスケード型分類器)

opencvでカスケード型分類器を作成する課題で色々ごちゃごちゃしたので覚え書きとして。 深夜に書いたので読みづらい文章なのは勘弁してください((。

仮想環境としてminicondaを使ってます。windowsファイルは配布してくれてるみたいなんだけどwindowspython入れてないしめんどいからubuntuでやりました。

インストール

まずopencvの3.x.x台を入れる必要があるんですがpythonのバージョンが2.7~3.6辺りじゃないと入らないらしい(エラーメッセージちゃんと読んでないからわからんけど。僕はpython2.7でやったら入りました)。

$ conda create -n "test" python=2.7
$ conda activate test
$ conda install -c conda-forge opencv=3.4.4

opencvのバージョンは適当な3系を選びました。conda-forgeのラベル使った方が良いのかもしれないけどよくわからなかったしインストールできたのでとりあえずヨシ(良くない)。

今回必要になるopencv_traincascade.exeとopencv_createsamples.exeはminiconda/pkgs/opencv-(バージョン)/bin/にあると思います。world3412.dllもあるって書いてたんだけど僕の環境ではなかったしなくても動きました(謎)。

あと必要なdll(linuxでは.so)がpkgs/opencv-(バージョン)/lib/にlibopencv-(名前).soであるはずなのでこれをコピーします。

試しにopencv_createsamplesを実行しようとするとシェアードライブラリ関連のエラーが出るのでldd通して足りないものをインストールしてldconfigとか。

$ ldd opencv_createsamples | grep not
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:(ファイルのあるディレクトリ)

1つ目のコマンドで足りないシェアードライブラリが出てきます。僕の環境で足りなかったもののインストール手順は下に書いてますが大体ライブラリ名で検索すれば解決方法出てくるので頑張ってわからなかったら聞いてください。2つ目のはパス通すときに使うコマンドです。

$ sudo apt install libjpeg9-dev libopenblas-base python3-pyqt5 

libjasper-devとlibwebp-devがデフォルトだとインストールに失敗するのでここを参考に/etc/apt/sources.listに追記。

$ sudo add-apt-repository 'deb http://security.ubuntu.com/ubuntu xenial-security main
$ sudo apt install libjasper-dev

これでjasperは大丈夫だったんですが,webpは上手くいかなかったのでここを参考に手動でインストールして解決。libwebp.so.7のシンボリックリンク作成してパス通せば大丈夫だと思います。

$ wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz
$ tar xvfz libwebp-1.0.2.tar.gz
$ cd libwebp-1.0.2
$ ./configure --prefix=/usr/local/libwebp/1_0_2
$ make
$ make install
$ ln -s /usr/local/libwebp/1_0_2/lib/libwebp.so.7 /usr/local/lib/
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

権限の都合でsudoがいるとこがあるので適宜読み替えてください。

ベクトルファイル作成

ここまでくればopencv_createsamplesが動くのでオプションとか付けて実行。僕の環境では正解画像をchuni.jpgとしています。

$ ./opencv_createsamples -img ./pos/chuni.jpg -vec ./vec/chuni.vec 
2/14修正 - オプションそんなにいらないっぽい

-showはお好み。

学習させてみる

次にopencv_traincascadeを実行する。

$ ./opencv_traincascade -data cascade/chuni/ -vec vec/chuni.vec -bg neglist.txt -numPos 30 -numNeg 8

”Train dataset for temp stage can not be filled. Branch training terminated.Cascade classifier can't be trained. Check the used training parameters."というエラーが出る場合neglist.txtのすべてのファイルに./neg/(ファイル名)とすれば治るらしいです。ここ参照。

"required leaf false alarm rate achieved"はエラーじゃなくて学習終了?のようなのでこれが出たらOK。

学習は成功したんですけど検出が上手くできないので残りは後日追記します。