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

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

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

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

1646閲覧

YOLOv5で再現率・適合率が収束してしまい、正しく学習できない

Ichi

総合スコア0

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/05/19 06:13

実現したいこと

YOLOv5で自前の学習画像を用いて2クラス分類を行いたいです。
※ここではクラス名は 'A' , 'B' とします。

発生した問題点

YOLOv5で自前の画像で学習させ、別のテスト画像でテストした結果、すべてのテスト画像がクラス ’A’ に分類されていまい正しく分類してくれないことに困っています。
また、学習後に自動で出力される画像を確認してみたところ、以下のような画像が出力されました。見てみると、train とval は減少して収束しているように見えます。しかし、適合率(precision)と再現率(recall)は、様々なパラメータなどで何度も試しましたが 、適合率が 0.5、再現率が 1.0 とある値にいきなり収束してしまっているように思います。

これらの問題を解決できる良い方法は何かございませんでしょうか?

イメージ説明

試したこと

前提としてデータセットは以下のもので試しました。

学習画像:クラス 'A' :約1200枚、クラス 'B' :約1200枚
検証画像:今回は学習画像と同じに設定
テスト画像:約1000枚

エポック数に関しては、上の画像では200ですが、増やしても再現率・適合率はずっと変わりませんでした。

再現率が1.0とコンスタントに異常に高いのは学習がうまくいっておらず、すべてクラス 'A' に分類されてしまっているからなのでは?と考え様々なハイパーパラメータを試してみましたが、結局、適合率・再現率は変わらずすべてのテストデータがクラス'A'に分類されていしまいました。

試したハイパーパラメータは、デフォルトのハイパーパラメータ設定ファイルの hyp.scratch-low.yaml の
lr1 や lr0 を 0.001 から 0.01 に下げてみたり、ほかにも閾値?と思われる、anchor_t (anchor-multiple threshold) や iou_t (IOU traning threshold)などを様々な値で試したりしましたがうまくいきませんでした。

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

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

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

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

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

jbpb0

2022/05/19 07:25 編集

> 自前の画像で学習させ、別のテスト画像でテストした結果、すべてのテスト画像がクラス ’A’ に分類されていまい正しく分類してくれない 学習に使った画像でテストしたら、もっと正しく分類されるのでしょうか? 学習画像でテストして分類がうまくいくのなら、過学習が起きてるのだと思います 学習画像でテストしてもダメなら、学習時にlossが小さいのと矛盾するので、学習時とテスト時のプログラムコードに相違点がある可能性があります
jbpb0

2022/05/19 07:25 編集

> 学習画像:クラス 'A' :約1200枚、クラス 'B' :約1200枚 検証画像:今回は学習画像と同じに設定 テスト画像:約1000枚 検証画像を、学習画像と同じものではなく、 > すべてのテスト画像がクラス ’A’ に分類され のテスト画像を用いたら、学習時のvalの結果がメチャ悪化するのでしょうか? 分類がうまくいかないテスト画像を検証画像に使ったら学習時のval結果がメチャ悪化するのなら、過学習が起きてるのだと思います 分類がうまくいかないテスト画像を検証画像に使っても学習時のval結果が悪化しないなら、テストで分類がうまくいかないのと矛盾するので、学習時とテスト時のプログラムコードに相違点がある可能性があります
Ichi

2022/05/19 08:26 編集

ご回答ありがとうございます。 あまり影響はないと考えますが、以下のように修正になります。申し訳ございません。 誤「学習画像:クラス 'A' :約1200枚、クラス 'B' :約1200枚」 正しくは「学習画像:クラス 'A' :約1600枚、クラス 'B' :約1400枚」 一つ目のご指摘のとおり以下のようにテスト画像を学習画像に置き換えて、過学習されていないか確認してみました。 学習画像:クラス 'A' :約1600枚、クラス 'B' :約1400枚 検証画像:学習画像と同じに設定 テスト画像:学習画像と同じに設定 結果は、再現率・適合率の改善は見られませんでした。また学習時のvalは悪化はせず最初の画像と同じように減少するだけでした。また、テストを行っても変わらずすべて 'A' と分類されてしまいました。 やはり学習時とテスト時でなにかしら矛盾があるのでしょうか。 また、2つ目のご指摘については実験が終わり次第追記させていただきます。
jbpb0

2022/05/19 08:39

同じ画像なのに、学習と検証はうまくいって、テストはダメって、同じ処理をしてたら有り得ませんよね テスト時には何か相違点があると思いますよ たとえば、色の順番がRGBとBGRと違ってないか、とか、正規化が違ってないか(255で割ってるか)、とか、そういうところに違いはありませんか?
Ichi

2022/05/19 09:16 編集

ありがとうございます、その点について確認いたします。 また、新たに気付いたこととして、検証とテスト結果において奇妙な点を発見しました。 学習した後に出力される、あるミニバッチにおける検証結果の画像が 'A' 0.6 , 'B' 0.4 のように、一つの物体でなぜか2つのクラスおよびBboxが重なって検出されていました。これは明らかに異常ですよね? またもう一つありまして、テスト画像の検出結果の数字が ”すべてのテスト画像で” ほぼ同じ値('A' :0.54)を示していることです。ほぼ、といったのは0.01とかそのような単位でそれぞれ違うという意味です。 これを踏まえると、検証時に問題が発生しているためテスト段階ではなく、学習と検証の段階に何か間違いがあるのではないかと考えました。
Ichi

2022/05/19 09:29

二つ目のご指摘について以下のように実験しました。 学習画像:クラス 'A' :約1600枚、クラス 'B' :約1400枚 検証画像:テスト画像と同じ テスト画像:約1000枚 この結果に関しましてもこれまでの結果と同じようにvalの悪化はみられませんでした。
jbpb0

2022/05/19 09:31

> 一つの物体でなぜか2つのクラスおよびBboxが重なって検出されていました。 yolov5のコードを読んでないので詳細分かりませんが、 https://kikaben.com/non-max-suppression/ に「YOLOv5などの実装ではクラスごとにBounding Boxのxy座標をずらして異なるクラスのBounding Boxで絶対に重なりがないようにしておいてから、1つの画像に対して1回のNMSの処理を呼びだすといった工夫がなされています。」と書いてあるので、実際その通りなら、おかしいですね
jbpb0

2022/05/19 09:37 編集

> 学習した後に出力される、あるミニバッチにおける検証結果の画像が 'A' 0.6 , 'B' 0.4 のように、一つの物体でなぜか2つのクラスおよびBboxが重なって検出されていました。 その画像をテストに使った場合でも、結果は「A」だけなのですよね? 下記より >  ”すべてのテスト画像で” ほぼ同じ値('A' :0.54)を示している
Ichi

2022/05/19 09:44 編集

はい、すべて 'A' となりました。 これまでのすべての実験を通して、テストではすべての画像で 'A' を示して、ほぼ同じ値となってしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問