Tensorflow Object Detection APIを使用して、自分のデータのオブジェクト検出器をトレーニングしています。私はDatTranによる(素晴らしい)チュートリアルに従っています https://towardsdatascience.com/how-to-train-your-own-object-detector-with-tensorflows-object-detector-api-bec72ecfe1d9 =。提供されているssd_mobilenet_v1_coco-modelの事前トレーニング済みモデルチェックポイントをトレーニングの開始点として使用しています。オブジェクトクラスは1つだけです。
トレーニング済みモデルをエクスポートし、評価データで実行して、結果のバウンディングボックスを確認しました。訓練されたモデルはうまく機能しました。 20個のオブジェクトがある場合、通常、予測された境界ボックス(「真陽性」)にスポットがある13個のオブジェクトがあったと言えます。 7オブジェクトが検出されなかった場所(「偽陰性」)。 2つ以上のオブジェクトが互いに近接している場合に問題が発生する2つのケース:これらのケースの一部では、オブジェクト間に境界ボックスが描画されます(「誤検知」<-もちろん、これらを「誤検知」と呼ぶなどは不正確です。しかし、これは私がここで精度の概念を理解するためだけのものです)。他の「誤検知」はほとんどありません。これは私が期待していた結果よりもはるかに良い結果のようです。この種の目視検査では実際のmAP(予測されタグ付けされた境界ボックスの重なりに基づいて計算されますか?)は得られませんが、mAPは大まかに次のように推定されます。 13 /(13 + 2)> 80%のようなもの。
ただし、(2つの異なる評価セットで)評価(eval.py
)を実行すると、次のmAPグラフ(0.7平滑化)が得られます。 トレーニング中のmAP
これは、mAPに大きな変動があり、トレーニング終了時のレベルが約0.3であることを示しています。これは、エクスポートされたoutput_inference_graph.pb
を使用したときに境界ボックスがどれだけうまく描画されるかに基づいて想定するよりもはるかに悪いです。評価セット。
トレーニングの総損失グラフは次のとおりです。 トレーニング中の総損失
私のトレーニングデータは、それぞれ約20個のラベル付きオブジェクトを含む200枚の画像で構成されています(labelImgアプリを使用してラベルを付けました)。画像はビデオから抽出され、オブジェクトは小さく、ぼやけています。元の画像サイズは1200x900なので、トレーニングデータ用に600x450に縮小しました。評価データ(eval.py
の評価データセットとして、また予測がどのように見えるかを視覚的に確認するために使用しました)は類似しており、それぞれ20個のオブジェクトを持つ50個の画像で構成されていますが、まだ元のサイズです(トレーニングデータはビデオの最初の30分から抽出され、評価データは最後の30分から抽出されます)。
質問1:モデルが非常にうまく機能しているように見えるのに、なぜmAPの評価が非常に低いのですか? mAPグラフが大きく変動するのは正常ですか?テンソルボードがグラフを描画するために使用する画像の数のデフォルト値には触れませんでした(この質問を読みました: Tensorflowオブジェクト検出API検証データサイズ そしていくつかのデフォルト値があるという漠然とした考えがあります変更可能?)
質問2:これはトレーニングデータと評価データの異なるサイズ(1200x700と600x450)に関連している可能性がありますか?もしそうなら、私も評価データのサイズを変更する必要がありますか? (アプリケーションが元の画像サイズを使用しているため、これを実行したくありませんでした。モデルがそのデータに対してどの程度適切に機能するかを評価したいと思います)。
質問3:画像ごとに複数のタグ付きオブジェクトがある画像からトレーニングおよび評価データを形成することは問題ですか(つまり、評価ルーチンは、1つの画像内のすべての予測境界ボックスを1つの画像内のすべてのタグ付き境界ボックスと比較します。 not1つの画像内のすべての予測ボックスを1つのタグ付きボックスにすると、多くの「誤検知」が発生しますか?)
(質問4:mAPの種類が平準化されていた場合、モデルのトレーニングは約10000タイムステップ後に停止された可能性がありますが、現在はオーバートレーニングされていますか?それが大きく変動する時期を判断するのは難しいです。)
私はオブジェクト検出の初心者なので、誰もが提供できる洞察に感謝します! :)
質問1:これは難しいです...まず、大まかな計算が間違っているので、mAPが何であるかを正しく理解していないと思います。簡単に説明すると、計算方法は次のとおりです。
オブジェクトのクラスごとに、実際のオブジェクトと検出されたオブジェクトのオーバーラップを使用して、検出に「真陽性」または「偽陽性」のタグが付けられます。 「真陽性」が関連付けられていないすべての実オブジェクトには、「偽陰性」というラベルが付けられます。
次に、信頼度の高い順に(データセットのすべての画像で)すべての検出を繰り返します。精度を計算し(TP/(TP+FP)
)、リコール(TP/(TP+FN)
)、すでに見た検出のみをカウントします(現在よりも大きな信頼度で) 1)TPおよびFPの場合。これにより、適合率-再現率グラフに配置できるポイント(acc、recc)が得られます。
グラフに可能なすべてのポイントを追加したら、曲線の下の面積を計算します。これは、このカテゴリの平均精度です。
複数のカテゴリがある場合、mAPはすべてのAPの標準平均です。
それをあなたのケースに適用する:最良の場合、あなたの真のポジティブは最高の自信を持った検出です。その場合、acc/rec曲線は長方形のようになります。(13/20)リコールまでは100%の精度で、その後13/20リコールで100%未満の精度でポイントします。これにより、mAP=AP(category 1)=13/20=0.65
が得られます。そして、これが最良のケースです。誤検知により信頼性が高くなるため、実際には期待が少なくなります。
あなたが低くなる可能性がある他の理由:
おそらく、良好と思われる境界ボックスの中には、検出と実際のオブジェクトとのオーバーラップが十分に大きくないため、計算で拒否されるものもあります。基準は、2つの境界ボックス(実際のボックスと検出)のUnion(IoU)の交差が0.5
を超えている必要があることです。穏やかなしきい値のように見えますが、実際にはそうではありません。おそらく、検出された境界ボックスを、受け入れられるかどうかに応じて異なる色で表示するスクリプトを作成する必要があります(受け入れられない場合は、FPとFNの両方が表示されます) )。
評価の最初の10枚の画像だけを視覚化しているのかもしれません。もしそうなら、2つの理由でそれを変更してください:1。たぶんあなたはこれらの画像で非常に幸運であり、運だけで、それらは続くものを代表していません。 2.実際、運が良ければ、これらの画像が評価セットの最初の画像である場合、ビデオのトレーニングセットの終了直後に表示されるため、トレーニングセットの一部の画像と非常によく似ているため、次のようになります。予測が容易なため、評価セットを代表するものではありません。
質問2:構成ファイルmobilenet_v1_coco-model
のその部分を変更していない場合、すべての画像(トレーニングとテストの両方)はネットワークの開始時に300x300ピクセルに再スケーリングされます。前処理は重要ではありません。
質問3:いいえ、まったく問題ありません。これらのアルゴリズムはすべて、画像内の複数のオブジェクトを検出するように設計されています。
質問4:変動を考慮して、改善または明らかなオーバートレーニングが見られるまで、実際にトレーニングを続けます。 10kステップは実際には非常に小さいです。タスクが比較的簡単なので十分かもしれません。十分ではないかもしれません。大幅に改善するには、その10倍待つ必要があります...