質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Q&A

解決済

2回答

2367閲覧

opencv_createsamplesとopencv_traincascadeについて

qwertyui

総合スコア21

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

0グッド

0クリップ

投稿2017/09/15 23:10

opencv_createsamples、opencv_traincascadeをコマンドプロンプトで実行する際に-w,-hを設定できますが、幅と高さの設定なのはわかりますが、どの幅、高さなのでしょうか。何も設定しないと初期値の24で実行されるようですがそれだと用意した正解画像、不正解画像のサイズではないと思います。
認識させたいモノの幅、高さなのかと思いましたが画像によって大きく写れば数値は大きくなりますし、小さければ小さくなりますので認識するモノの幅、高さでもない気がします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

回答依頼の件(2017/09/29夜 追記)


Q.1

一枚の画像から7000枚の正解画像を制作し、不正解を3500枚にして制作したわけですが、もっと枚数を増やせば精度は上がりますか。

一般的な話として、枚数を上げればある程度は上がると思います。が、ここでそれよりも、もっと大事にしたいのは「データの質(規模・性質)」と「パラメータ(どう処理するか)」です。

*データの質の話
先日stackoverflow(リンクは忘れました…)を読んでいたところ「100枚のデータ増強写真よりも、本物の写真1枚の方がずっと価値が高い。しっかりした選別機を作りたいなら、(めんどくさいかもしれないけれども)ちゃんとデータをそろえるべきだ」というようなことが書いてありました。

増強データよりも本物のデータの方が、上手くばらついているとでも呼ぶのでしょうか。対象の背景が都度ばらついていることが物体検出では必要になってきますので、その辺が実際のデータの方がうまくいっているのかもしれませんね。

なので、データの質的な切り口では、

1.まずはデータ増強によって得られた検出器を使い、デジカメか何かで撮影した動画をしゃーっと流して処理

2.正解フレームや誤検出したフレームを保存(OpenCVの動画再生でqボタンで割り込む要領で、sで保存など適当にやればよいと思います)
※先の事例では、「動画を使えば写真を数千枚用意するくらいのことはたやすいけれども、動画を枚フレームや毎秒キャプチャしたところで、一般的にはそんなにバラついた写真は得られないよね。だから、適当に時間を置きながらデータを採るとよいよ」的なtipsが書かれていました。

3.新しく得られたデータを元にさらに改良されたカスケードファイルを生成
※誤検出画像を背景にしていしたり、対象物が含まれていない画像を適当なサイズに大小ばらつかせて背景に指定するのがよい、ということを割と見かけます、

が精度を上げるためのデータの準備になります。

*パラメータの話
上手く検出するためには、パラメータ(アルゴリズム側)の設定も重要になります。デフォルトではHaar-likeになっていると思いますが、LBPやHOGも試してはいかがでしょうか?それぞれの特徴量に特異不得意があるようで、詳しい方でも「モデル毎にやってみないと分からない」というような記事をよく見ます。
あたりをつけるために、まずは少ないステージ数で走らせて試すのがよいと思います。


Q.2

あとtraincascadeが16ステージで終わり、Required leaf false alarm rate achieved. Branch training terminated.というメッセージが表示されました。16ステージで終わってもxmlファイルは作成されうまく認識できていたのであまり気にしなくてもいいのでしょうか。

その通りだと思います。確かtraincascadeをする際に、目標値(この精度で誤検出しなくなるまでやる)を引数で設定するか、なければデフォルト値がロードされるようになっていたと思います。その値に達したのでもうこれ以上訓練する必要はないね、ということで打ち切られていますね。

投稿2017/09/29 12:48

編集2017/09/29 12:52
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qwertyui

2017/09/29 14:39

回答ありがとうございます。 不正解画像に関しては似たようなものを多く集めても意味が無いと思い、できるだけ異なるものを集めました。パラメータの話は-featureTypeでLBPやHOGが選択できるようですね。特徴量以外にも自分で数値を設定できるのでそれらを自分で設定することも影響しそうです。
guest

0

ベストアンサー

うろ覚えですが、検出させたいターゲットの最小サイズと言い換えてよいと思います。24なら24px(以上)100なら100px(以上)とかそんな感じでしょうか。(「サイズではない!ベクトルだ!」のような細かい理解のズレはあるかもしれません)

検出したい生画像が200px四方で、そこにライオンが80px四方で写っているとした場合、24で仕込んだ場合は検出できても、100で仕込んだ場合には検出できない(ターゲットが80px四方では検出するには小さすぎる)とかそういうことが起きたはずです。あとは、数値を大きくすると仕込みにかかる時間がグーンと伸びた気がします。


Cascade Classifier Training(公式)
OpenCVで物体検出器を作成する
今回は画像解析とかそういうアレ
この辺が参考になると思います。

投稿2017/09/16 02:05

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qwertyui

2017/09/16 04:17

回答ありがとうございます。検出させたいダーゲットが縦長ならその比率に合わせて-w,-hをそれぞれ異なる数値で設定した方が認識しやすくなりますか。 現状ではopencv_createsamplesはうまくいって、.vecを生成し、opencv_traincascadeで実行するとエラー?メッセージが表示されることもあり、試行錯誤し、とりあえず制作したxmlファイルを試してみましたが、うまく認識していないようでした。ウェブサイトによって必要な正解画像、不正解の数が異なり、単純に枚数が少ないのかもしれません。 またopencv_traincascadeでステージ数を自分で決めることができますが、多い方が精度が良くなるみたいなことでしょうか。
退会済みユーザー

退会済みユーザー

2017/09/16 08:39

そのような理解でよいと思います。 正解枚数、不正解枚数のうち、正解枚数が特にキモだったと思います。何ステージか回っていく中で、はじめは100の正解枚数だったものが、80になり60になり…となっていきます。この時に、はじめに指定した数より使うことのできる正解枚数が下回ると「データが足りなくて学習できないよ」という旨のエラーがでます。そのために、train時の注意書きに「実際の枚数より1割くらい少なめに指定してください」という旨がよく書かれています。
qwertyui

2017/09/16 08:56

そうですね。正解数の指定を実際の0.8から0.9にした方が良いようです。 あと正解画像、不正解画像について気になった点として、ネットで不正解画像のサンプルを集めると解像度が低い、小さい画像ばかりなのですが、オブジェクト認識ファイル(.xmlファイル)の制作において適切な解像度、縦横のピクセル数はあるのでしょうか。
退会済みユーザー

退会済みユーザー

2017/09/16 11:34 編集

>正解数の指定を実際の0.8から0.9 経験上、ステップ数が進むにつれシビアになっていくので、0.8か0.7くらいがよいと思います。 >適切な解像度、縦横のピクセル数はあるのでしょうか。 解像度が高いと正確になり処理が重くなります。低い場合は逆ですね。解像度の低い側から様子を見ながら、不具合があれば上げてはいかがでしょうか? アスペクト比はターゲット次第で、適当に合わせればよいと思います。
qwertyui

2017/09/29 05:58 編集

新しい質問で回答依頼するつもりでしたが、この質問で回答依頼をクリックしてしまったようなのでここで聞きます。 おかげさまで認識ファイルが作成でき、パソコンのカメラで確認したところ認識できていました。 createsamplesで-imgで一枚の画像から7000枚の正解画像を制作し、不正解を3500枚にして制作したわけですが、もっと枚数を増やせば精度は上がりますか。それとも一定の枚数から精度は変わらないものですか。 あとtraincascadeが16ステージで終わり、Required leaf false alarm rate achieved. Branch training terminated.というメッセージが表示されました。16ステージで終わってもxmlファイルは作成されうまく認識できていたのであまり気にしなくてもいいのでしょうか。
退会済みユーザー

退会済みユーザー

2017/09/29 12:08

長くなるので回答欄に書きますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問