OpenCVも多少慣れてきたので、次のステップに移ろうと思って分類器作成に取り組んだものの、お盆休みにがっつりハマってしまった。
日本語、英語ともにググればかなり参考文献が出てくるから大丈夫と思っていたが、甘かった…
分類器は、画像処理をやるにあたり、判別するために使用するxmlファイルで、かなりサンプルがなければ難しいらしい。1000枚近く画像ファイルをもっているのは娘の写真くらいなので娘の顔を判別するファイルを作ることにした。
まずは画像にワクをつくるところから
objectmakerというフリーソフトで写真をワクで囲むと表をテキストで出力するというとても便利なソフトです。100枚くらいならいいのですが、1000枚やると病んできます笑
↓このサイトを参考にしました
http://d.hatena.ne.jp/takmin/20100930/1285848450↓解像度が大きい画像の場合は一気に縮小するソフトも使います。
https://www.vector.co.jp/download/file/win95/art/fh690609.html
これで学習させる正常画像とそのリストができました。
続いてまったく関係ないNG画像も集め、テキストでリストも作ります。
ここまでWin10で作成しUSBメモリーでラズパイに移しました。
ラズパイで動かす場合、画像の格納場所などフォルダ体系に注意が必要です。
自分はhomeのpiにOpenCVをインストールし保存していますが、/home/pi/Build/binのなかの
OpenCV~関係のファイルをコピーして新規に作成したフォルダにもっていきます。
新規フォルダーーー正常画像フォルダーー判別したい画像
|
|
--NG画像フォルダーー関係のない画像
|
|
--正常画像リスト.txtかdat(objectmakerで作成)
|
|
--NG画像リスト.txt
|
|
--分類器フォルダーーtraincascadeでxmlが作成される
|
|
--/home/pi/Build/bin/opencv関係ファイル
|
|
--vecファイル createsample実施時に作成される。
まずは正常画像リストを確認します。objectmakeで作成しても最初の何行目かは消した方がエラーが出にくいと思われます。正常画像フォルダ/ファイル名 ワクの数 座標というテキストになっているはずです。パスを確認して下さい。
取り急ぎ学習データであるvecファイルを作るには判別したい画像、正常画像リスト、/home/pi/Build/bin/opencv関係ファイルがあればOKです。
まずはコマンドプロンプトで移動
cd 新規フォルダ
続いてreatesampleのコマンドです。
opencv_createsample -info 正常画像リスト.txt -vec vecファイル名.vec -num 正常画像数
-bg NG画像リスト.txt -show -w24 -h24
-w24 -h24はvecファイルの大きさです。分類器ファイルを作成する際に合わせる必要があります。 -show をつけるとサンプル画像が表示されます。ワクで切り抜かれた画像が出てくれば成功です。ちなみに失敗するとvecファイルがえらい軽くなります。
学習結果で-imgがnullになっていますが -infoでリストと紐づいて実行しているので気にしなくてOKです。
続いてxmlファイルを作成していくのですがその前にNG画像リストのチェックです。
Windowsで改行するとエラーが出てきます。
Image reader can not be created.....
自分はとりあえずリストを1行だけにして確認しました。(改行が原因だとエラーが出ない)
テキストをラズパイで作り直したら復旧しました。
あとは勇気をだして下記コマンドを入力
opencv_traincascade -data 分類器フォルダ名 -vec vecファイル名.vec -bg NG画像リスト.txt
-numPos 正常画像数×0.9ぐらい -numNeg NG画像数 -mode all -w24 -h24
NG画像数はそのまま数を入力すればいいのですが、正常画像はそのまま入れると
Bad argument (Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.)
こんなエラーが出てきます。正常の画像に0.9くらいかけた数にしておけば解消する(はず)です。
成功すると下記の様な表示がしばらく繰り返されたら成功です。
ーーーーーーーーーーーーーーーーーーーーーー
| | | |
| FA | HR | N |
| | | |
| | | |
| | | |
完了すると分類器フォルダにcascade.xmlという分類器が作成されるので
この記事にあるコードの分類器パスを変更すればOKです。(赤字の部分)
cascade_path = "haarcascade_frontalface_alt.xml"
分類器が作成されても精度?が悪すぎるとカメラ画像が呼び出せなかったり、フリーズしたりするのでその場合はcreatesampleからやり直したり、NGファイルを増やしたりといろいろ試してください。
とりあえず相当苦労しましたが、娘を判別することができたので感無量でした。
いろいろな文献ありますが、微妙に古い記事だとOpenCVのバージョンが違ったりして参考にならなかったりします。今回はver3.1.0にて動作させています。あまり内容は理解していませんが(オイ)、参考になればまたOpenCV関連の記事を書いていこうと思います。