ドローン開発日記~第8回勉強会開催~
ブログから記事を見つけたい場合はこちら
こんにちは、開発メンバーのYです。
私は最近、個人的なお勉強として、リコイル制御や被弾しない立ち回りに関する動画を見るようにしています。しかし、FPS自体が初心者なので、打ち合いが始まると慌てて判断ができなくなってしまうので、繰り返しプレイして慣れていかなきゃいけませんね。(勉強しろ)
さて、前回学習の結果がうまくいかないという残念な結果で終わってしまいました…。
↑うまくいかない原因は、おそらく用意した画像がすくなかったこと、positiveの数が少なかったことなどが考えられます。
と、思いきや実は顔画像の学習自体に失敗していたことがわかりました。。。🥺
どうやらファイル共有の過程で、人の顔検知用に作っていたデータセットではなく、
第6回勉強会にて用意した犬検知用のデータセットのパスを指定して学習が行われていたみたいです。
評価用の顔画像に検知枠がつかなかったのは誤検知が起こらなかったという解釈をすればある意味成功しているといえますね。。。
過ちに気づいた我々は、すぐさま顔検知用のパスを指定し学習を試みました。
が、エラーが起き学習が始まってくれません。
multiprocess_iterator.py にうまいことデータが渡せてないみたいです。
コードは問題なさそうなのでデータセットが原因?
というわけで、思いつく限りの要因をみんなで考え、トライ&エラーを繰り返しました。
1 拡張子の問題?
犬画像の学習時はすべて.jpg
顔画像のアノテーションに使用した画像の拡張子は.JPG
↑大文字と小文字の違いとかいい感じに対策してくれてそうな気もするが、、、
と思いつつも試した結果、エラー内容は変わりませんでした。
後ほど分かったのですが、やはりいい感じに対策してくれてるみたいでこの辺は特に気にしなくていいらしいです。
2 画像サイズが大きすぎる?
犬画像の解像度はせいぜい 1024 x 512 程度に対して、
顔画像の解像度は 4032 x 3024 もありました。
iPhone11はすごいんですね。
犬のデータセットをつくったM氏曰く、Twitterからとってきた画像らしいので
ネットの海に私の自撮りを投げ込み(もちろん鍵のついたアカウントです)
Twitterさんにリサイズしてもらいました。
試してみたところ、エラー内容は変わりませんでしたが
これも一要因だったみたいです。(解像度の詳細については後で調べておきます)
3 画像に添付する情報のせい?
顔画像のプロパティを確認したところ、
位置情報などの無駄な情報も入っていました。
Kさんの経験上、もしかしたら…ということでこのあたりの無駄な情報も消してみました。
結果、エラーは消えませんでした。
これも特に関係なかったみたいです。
4 犬のデータセット作り直してみる
同じ手順で、前回識別に成功した犬のデータセットを作り直してみました。
これで失敗すれば、学習画像以外の問題も考える必要がありますね。
結果うまくいきました。
犬は許されて人が許されないのはなぜなのか。
5 犬のデータセットに人間を混ぜてみる
犬画像onlyの学習は成功するので、試しにリサイズ後の顔画像をnegativeとして犬データセットに混ぜてみました。
学習が動きました。
意味が分からないですね。
今度は犬にdog, 人に自分の名前のラベルをつけ、2クラス識別できるか試してみました。
学習が動きませんでした。
2クラスでダメなので、1クラス識別も試してみました。
顔画像のみ、人の名前ラベルをつけて切り抜いた結果、同様のエラーで学習が動きませんでした。
これで何となくラベルに原因がありそうな気がしてきました。
6 真相
次に顔画像だけにしてdogラベルをつけてみました。
学習が動きました。
以下、評価結果です。
成功して、無事犬として識別されました。
dogのラベルを使用すれば、学習できるみたいですね。
もしかして、ライブラリ側で使えるラベル名が決められてるんじゃないか?
というわけで「human」、 「man」、「woman」、「person」など、ありそうなのをいっぱい試してみましたが、あのエラーがでて学習失敗しました。
もういっそのことdogに改名し、次回から開発メンバーのdogとして更新を行う覚悟を決めたときでした。
Kさんがある存在に気づきました。
ラベル名を決めてる以外の何物でもなさそうなやつがいますね。
この配列にラベル名を追加してみたところ問題なく学習が動きました。。。
私のPCでは試せませんでしたが、評価画像に対して識別も成功したみたいです。(画像用意できなくてすみません)
というわけで、エラーの原因は
・my_bbox_label_name.pyでラベル設定をしていなかった
ということでした。
アノテーションで使用するラベル名は、コード上でも設定する必要があるんですね。
アノテーションツール上で設定すればいいものだと思っていました。
Mさんもそういえば犬の時にやった気がするとのことです。
仕様書にはしっかり目を通さないとですね。
反省します。
後日談
Mが2クラス識別に成功したみたいです。
画像20枚くらいでもいけたらしい。
2クラス識別については次回!