🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

YOLO

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1876閲覧

YOLO3 性能評価 学習結果についてご意見をお聞かせください

songyong

総合スコア21

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

YOLO

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/13 17:47

編集2021/02/13 18:57

お世話になっております。
YOLO3の学習結果について、これがどれくらい学習できているのかが、
よくわからず、有識者の皆さまのご意見をいただければと思います。

食品の検品プログラム作成のため、
写真はまず20程度で、かつ1枚の中に複数の検品対象が含まれる状態で、
アノテーションを行い、学習した結果になります。

反省点としては、
画像サイズを揃えずに学習したため、ワーニングが出ている状態で学習させて見ました。
下記の結果がどれほど学習できていて、
追加でどれほど写真数が必要そうであるのか、
有識者様のご意見を頂けますと幸甚です。

また最後のエラーについても、コメントいただけると嬉しいです。

宜しくお願いします。

※追記
実際の分類結果、散々でした。全く使い物になりません。
アノテーションを個体ごとではなく、複数の個体が写っている写真に付与していたため、
学習が進まなかったのかもしれません。
個体ごとに綺麗な写真を集めて、データ水増しして、、、、と地道に頑張るしかないですよね。。。
最終目標は動画を取りながらの検品なので、この技術はマストです。

YOLO3

11/1 [==============================] - 118s 118s/step - loss: 154.9013 - val_loss: 293.3253 2Epoch 53/100 31/1 [==============================] - 107s 107s/step - loss: 123.8679 - val_loss: 332.8865 4Epoch 54/100 51/1 [==============================] - 116s 116s/step - loss: 118.6423 - val_loss: 283.1588 6 7Epoch 00054: ReduceLROnPlateau reducing learning rate to 9.999999747378752e-06. 8Epoch 55/100 91/1 [==============================] - 113s 113s/step - loss: 104.8749 - val_loss: 273.0976 10Epoch 56/100 111/1 [==============================] - 106s 106s/step - loss: 113.4638 - val_loss: 344.6003 12Epoch 57/100 131/1 [==============================] - 106s 106s/step - loss: 107.3745 - val_loss: 291.9477 14 15Epoch 00057: ReduceLROnPlateau reducing learning rate to 9.999999747378752e-07. 16Epoch 58/100 171/1 [==============================] - 98s 98s/step - loss: 108.4160 - val_loss: 345.5313 18Epoch 59/100 191/1 [==============================] - 103s 103s/step - loss: 106.3354 - val_loss: 291.8364 20Epoch 60/100 211/1 [==============================] - 99s 99s/step - loss: 111.9667 - val_loss: 349.2791 22 23Epoch 00060: ReduceLROnPlateau reducing learning rate to 9.999999974752428e-08. 24Epoch 61/100 251/1 [==============================] - 97s 97s/step - loss: 104.7155 - val_loss: 324.1514 26Epoch 00061: early stopping 272021-02-14 02:41:28.689791: W tensorflow/core/kernels/data/generator_dataset_op.cc:107] Error occurred when finalizing GeneratorDataset iterator: Failed precondition: Python interpreter state is not initialized. The process may be terminated. 28 [[{{node PyFunc}}]] 29

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

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

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

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

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

tiitoi

2021/02/14 01:44 編集

数十枚は少なすぎだと思います。 上手く行きそうが判断するためにお試しでやるにも数百枚は必要です。 物体検出を使用する業務用のシステムを作ったことがありますが、実用レベルの精度を出すには1ラベルあたり千枚以上は用意しました
meg_

2021/02/14 02:03

> 画像サイズを揃えずに学習したため、 揃えてやってみましょう。またサイズは決められたサイズにしていますか? > アノテーションを個体ごとではなく、複数の個体が写っている写真に付与していたため どういう意味でしょうか?「複数の個体が写っている写真」でも検出対象毎にアノテーション付与すれば良いのでは?
songyong

2021/02/14 02:12

tiitoi 様 コメント頂き、ありがとうございます。実際に業務用システムを作った経験がある方から、 貴重なコメントを頂けて、大変嬉しいです! 学習させる仕組みは理解できましたので、後はテスト対象数を増やしていきます。 また教師画像の用意方法についても2点追加質問させて下さい。 1点目、 今回教師画像は1画像に複数物体が含まれるものを使用しておりますが、 基本1画像には1物体が好ましいのでしょうか? それとも1000枚以上という学習数が十分であれば、複数個体が写っている画像を利用しても、 上手く学習してくれるようになりますでしょうか。 2点目、 1ラベルあたり1000枚というのは元データの数になりますでしょうか。 200-300枚のデータを水増しして、1000枚に到達させようと考えておりましたが、 元データ1000枚用意した上で、加えて水増しといったイメージでしょうか。 以上、お手すきの際にコメント頂けますと嬉しいです。 宜しくお願いします。
tiitoi

2021/02/14 02:26

ちなみにアノテーションはどのように行いましたか? meg_さんもご指摘されてますが、そもそもアノテーションが正しくされていないと学習は上手くいきません。
songyong

2021/02/14 02:28

meg様 サイズ変更が必要なことをデータ用意した後に気づいてしまったので、今回は無視して流して見ました。 決められたサイズというのは、yolo.pyなどに指定されているサイズのことですよね?そちらに合わせて、 リサイズしてやってみます。 教師データとして、1画像1物体の方が感覚的に学習が進みやすい気がしています。 1画像の中に複数物体が含まれていると、物体の個数とか余計な情報が増えてしまう気がしています。 アノテーション付けているから、関係ないんですかね。。。
tiitoi

2021/02/14 02:30

画像サイズはプログラム側でやるので、データを作成する段階でする必要はないです。 むしろ、リサイズしたらアスペクト比が崩れて精度に悪影響がでます。
songyong

2021/02/14 02:35

ありがとうございます! すみません、リサイズについて、意見が別れており、混乱しております、、、 再度下記参考を記載しますので、ご意見をお願いできますでしょうか。 下記記事を参考にしております。 https://short4010.hatenablog.com/entry/2019/11/12/182527 【該当箇所】 >注意として、学習させる画像のサイズはすべて同一である必要があります。 >train.pyの25行目に以下のようなコードがあることからもわかります。 >input_shape = (416,416) # multiple of 32, hw >デフォルトでは416*416のサイズの画像が渡されるという前提の下で処理が行われます。そのため、アノテ>ーション前に416*416のサイズにすべての画像を変換しておく必要があります。
songyong

2021/02/14 02:39

>ちなみにアノテーションはどのように行いましたか? >meg_さんもご指摘されてますが、そもそもアノテーションが正しくされていないと学習は上手くいきません。 すみません。回答が前後してしまいました。 labelImg を使用しています。 1画像内に複数の個体を含みますので、それぞれの個体領域を設定・名称付けを行っております。 こちらについては、問題ない認識です。
tiitoi

2021/02/14 02:44 編集

↓でリサイズされるのでその必要はないですね、 https://github.com/qqwweee/keras-yolo3/blob/e6598d13c703029b2686bc2eb8d5c09badf42992/yolo3/utils.py#L36 その記事に書いてある「アノテーション前に416*416のサイズにすべての画像を変換しておく必要があります」という文言は間違っています。 もしリサイズされていないのでしたら、モデルに入力できないのでエラーになるはずです。 > 1画像内に複数の個体を含みますので、それぞれの個体領域を設定・名称付けを行っております。 であれば、そちらは大丈夫だと思います。 回答にも記載しましたが、1画像に1物体がよいという縛りもとくにないです。
songyong

2021/02/14 02:50

本当に色々とご教示いただき、ありがとうございます。 ソース確認させて頂きました。確かにリサイズ処理が含まれていますね。 リサイズについて、最後一点だけ確認させてください。 学習開始時に下記のワーニングが出ております。これが、リサイズしてないことによる影響なのかな と解釈しておりました。 WARNING:tensorflow:Skipping loading of weights for layer conv2d_58 due to mismatch in shape ((1, 1, 1024, 24) vs (255, 1024, 1, 1)). WARNING:tensorflow:Skipping loading of weights for layer conv2d_58 due to mismatch in shape ((24,) vs (255,)). WARNING:tensorflow:Skipping loading of weights for layer conv2d_66 due to mismatch in shape ((1, 1, 512, 24) vs (255, 512, 1, 1)). WARNING:tensorflow:Skipping loading of weights for layer conv2d_66 due to mismatch in shape ((24,) vs (255,)). WARNING:tensorflow:Skipping loading of weights for layer conv2d_74 due to mismatch in shape ((1, 1, 256, 24) vs (255, 256, 1, 1)). WARNING:tensorflow:Skipping loading of weights for layer conv2d_74 due to mismatch in shape ((24,) vs (255,)).
tiitoi

2021/02/14 03:06 編集

データセットは3クラスでしょうか? 学習済みモデルを指定して学習を開始すると思いますが、学習済みモデルはMSCOCOの80クラスで、クラス数変わると出力層手前の畳み込み層の形状が変わるので、train 開始時に上記の警告が出ますが、正常な動作です。
songyong

2021/02/14 03:11

ご回答頂き、ありがとうございます。 仰る通り3クラスです。 本当に何から何まで教えて頂いてありがとうございます。 疑問点全て解消し、理解することができました、
guest

回答1

0

ベストアンサー

1点目、
今回教師画像は1画像に複数物体が含まれるものを使用しておりますが、
基本1画像には1物体が好ましいのでしょうか?
それとも1000枚以上という学習数が十分であれば、複数個体が写っている画像を利用しても、
上手く学習してくれるようになりますでしょうか。

物体検出のデータとしてはむしろ1画像に複数の物体が写っているのが普通です。
実際の運用で検出する際は、複数の物体が写っている画像に対して検出するのであれば、むしろ、同じ状況の画像でデータを作成し、学習したほうがよいです。

2点目、
1ラベルあたり1000枚というのは元データの数になりますでしょうか。
200-300枚のデータを水増しして、1000枚に到達させようと考えておりましたが、
元データ1000枚用意した上で、加えて水増しといったイメージでしょうか。

必要な枚数というのは問題の難易度によります。
簡単に見分けがつくものであれば数百枚でもそれなりの精度が出る可能性はありますが、「対象物体のバリエーションが様々 (例: 犬であれば、犬種によって見た目が結構違う」「見分けがつきにくい、異なるクラスでもほぼ同じ見た目で、微妙な差異を見分ける必要がある」場合はたくさんのデータが必要になります。
まずは数百枚で学習して検出がある程度上手くいきそうというのがわかれば、そこからはデータをどんどん追加していけば、それだけ精度が上がっていきます。

ちなみに1000枚というのは元のデータ数です。
質問の出力を見るに、keras-yolov3 を使ったのかと思いますが、その場合は内部ですでに「色合い、彩度、明るさの変更」「左右反転」「ランダムクロップ」などのオーグメンテーションが行われています (該当箇所)。なので、入力する段階でこちらで予めデータを水増しする必要はないです。

投稿2021/02/14 02:25

編集2021/02/14 02:27
tiitoi

総合スコア21956

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

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

songyong

2021/02/14 03:13

tiitoi様 本当に勉強になりました。 的確 かつ 詳細 な回答を迅速に頂き、本当に助かりました。 図々しいお願いになってしまいますが、今後のプロダクト開発の過程で疑問点が発生するかと思いますので、 今後も質問させて頂ければと思います。 引き続き、宜しくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問