忍者ブログ

設備のマニアどっとこむ

IoT開発、設備・DIYのブログ!

OpenCV で分類器を作成する (ラズパイ、一部Win10)

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関連の記事を書いていこうと思います。









拍手[0回]

PR

コメント

翻訳(Translate)

プロフィール

HN:
佐々木 雅史
性別:
男性
自己紹介:
2021年 ラズパイ、M5stackを用いたIoT開発を専門で受注するアルティメンテを設立。代表を務める。
・2020年ラズパイコンテスト優良賞受賞
・設備系資格多数(電験3種、消防設備士甲4、2級ボイラー技士、危険物乙4、電工2種、技術士補(電気・電子)、エネ電、フォークリフトなど)

AD

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30