TensorFlowのまったく新しい Object Detection API で遊んでいたので、他の公開データセットでトレーニングすることにしました。
私はたまたま this スーパーマーケットの棚にあるさまざまなブランドのタバコ箱の画像と、各画像の各タバコ箱の境界ボックスをリストしたテキストファイルで構成される食料品データセットに出くわしました。 10個の主要ブランドがデータセットでラベル付けされており、他のすべてのブランドは11番目の「その他」カテゴリに分類されます。
私は彼らの tutorial に従い、このデータセットでモデルを訓練することに成功しました。処理能力の制限のため、データセットの3分の1のみを使用し、データのトレーニングとテストのために70:30の分割を実行しました。私はfaster_rcnn_resnet101モデルを使用しました。構成ファイル内のすべてのパラメーターは、TFが提供するデフォルトのパラメーターと同じです。
16491のグローバルなステップの後、いくつかの画像でモデルをテストしましたが、結果にあまり満足していません-
他の画像で製品を検出するのに対して、本棚でラクダを検出できませんでした
私が抱えていたもう1つの問題は、モデルがラベル1以外のラベルを検出しなかったことです。
トレーニングデータから製品の作物インスタンスを検出しませんでした
ネガティブイメージでも99%の信頼度でタバコの箱を検出します!
誰かが私が間違っていることを手伝ってくれる?精度を向上させるにはどうすればよいですか?そして、合計で11のクラスがあると述べたのに、なぜカテゴリ1に属するすべての製品を検出するのですか?
Editラベルマップを追加しました:
item {
id: 1
name: '1'
}
item {
id: 2
name: '2'
}
item {
id: 3
name: '3'
}
item {
id: 4
name: '4'
}
item {
id: 5
name: '5'
}
item {
id: 6
name: '6'
}
item {
id: 7
name: '7'
}
item {
id: 8
name: '8'
}
item {
id: 9
name: '9'
}
item {
id: 10
name: '10'
}
item {
id: 11
name: '11'
}
だから私は何が起こっているのかを理解したと思う。データセットを分析したところ、カテゴリ1のオブジェクトに偏っていることがわかりました。
これは、1から11までの各カテゴリの頻度分布です(0ベースのインデックス付けで)
0 10440
1 304
2 998
3 67
4 412
5 114
6 190
7 311
8 195
9 78
10 75
モデルは、すべてをカテゴリ1としてラベル付けするだけで十分なローカルミニマムに達していると思います。
一部のボックスが検出されない問題について:もう一度トレーニングを試みましたが、今回はブランドを区別しませんでした。その代わりに、私はモデルにタバコの箱が何であるかを教えようとしました。まだすべてのボックスが検出されていませんでした。
次に、入力画像を切り取り、それを入力として提供することにしました。結果が改善され、改善されたかどうかを確認するだけです!
入力画像の寸法は、モデルで受け入れられている600 x 1024よりもはるかに大きかったことがわかります。そのため、これらの画像を600 x 1024に縮小していました。つまり、タバコの箱の詳細が失われていました。
だから、私はトリミングされた画像のすべてのクラスで訓練された元のモデルをテストすることにしました、それは魅力のように機能します:)
これは、元の画像のモデルの出力でした
これは、左上の4分の1を切り取り、入力として提供したときのモデルの出力です。
助けてくれたみんなありがとう! APIの素晴らしい仕事をしてくれたTensorFlowチームにおめでとう:)これで、誰もがオブジェクト検出モデルをトレーニングできるようになりました!
データセットにはいくつの画像がありますか?トレーニングデータが多いほど、APIのパフォーマンスは向上します。クラスごとに約20枚の画像でトレーニングを試みましたが、精度はかなり悪かったです。私はあなたが上で言及したすべての問題にほとんど直面しました。より多くのデータを生成すると、精度が大幅に向上しました。
PS:評判が悪いのでコメントできませんでした
データセットのサイズはかなり小さいようです。 Resnetは大規模なネットワークであり、適切にトレーニングするにはさらに多くのデータが必要です。
何をすべきか: