wake-up-neo.com

Eigenes Verhalten der TensorFlow-Objekterkennungs-API

Ich habe mit TensorFlows brandneuer Object Detection API gespielt und habe mich dazu entschlossen, es mit anderen öffentlich verfügbaren Datensätzen zu trainieren.

Ich stolperte über this Lebensmitteldatensatz, der aus Bildern verschiedener Zigarettenschachtelmarken im Supermarktregal sowie einer Textdatei besteht, die die Begrenzungsboxen jeder Zigarettenschachtel in jedem Bild auflistet. In dem Datensatz wurden 10 große Marken gekennzeichnet, und alle anderen Marken fallen in die 11. Kategorie "Sonstiges".

Ich folgte ihrem Tutorial und konnte das Modell mit diesem Datensatz trainieren. Aufgrund der eingeschränkten Rechenleistung habe ich nur ein Drittel des Datensatzes verwendet und einen 70:30 Split für Trainings- und Testdaten durchgeführt. Ich habe das Modell schneller_rcnn_resnet101 verwendet. Alle Parameter in meiner Konfigurationsdatei stimmen mit den von TF bereitgestellten Standardparametern überein.

Nach 16491 globalen Schritten habe ich das Modell an einigen Bildern getestet, aber ich bin mit den Ergebnissen nicht sehr zufrieden -

  Die Kamele konnten nicht in der obersten Ebene erkannt werden, während das Produkt in anderen Bildern erkannt wurde

  Warum erkennt es die Marlboros nicht in der obersten Reihe?

  Ein anderes Problem, das ich hatte, ist, dass das Modell außer Label 1 niemals ein anderes Label erkannt hat

 

Erkennt keine Ernte-Instanz des Produkts aus den Trainingsdaten

 

Es erkennt Zigarettenschachteln selbst bei negativen Bildern zu 99%!

Kann mir jemand bei dem helfen, was schief läuft? Was kann ich tun, um die Genauigkeit zu verbessern? Und warum erkennt es, dass alle Produkte zur Kategorie 1 gehören, obwohl ich erwähnt habe, dass es insgesamt 11 Klassen gibt?

Bearbeiten Meine Label-Map hinzugefügt:

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'
}
17
Banach Tarski

Ich glaube, ich habe herausgefunden, was los ist. Ich habe eine Analyse des Datensatzes durchgeführt und festgestellt, dass er auf Objekte der Kategorie 1 verzerrt ist.

Dies ist die Häufigkeitsverteilung der einzelnen Kategorien von 1 bis 11 (bei 0-basierter Indizierung).

0 10440
1 304
2 998
3 67
4 412
5 114
6 190
7 311
8 195
9 78
10 75

Ich denke, das Modell hat ein lokales Minimum, bei dem es einfach gut ist, alles als Kategorie 1 zu bezeichnen.

Über das Problem, einige Boxen nicht zu erkennen: Ich habe das Training erneut versucht, aber diesmal habe ich nicht zwischen Marken unterschieden. Stattdessen versuchte ich, dem Modell beizubringen, was eine Zigarettenschachtel ist. Es wurden immer noch nicht alle Boxen erkannt.

Dann entschied ich mich, das Eingabebild zuzuschneiden und als Eingabe bereitzustellen. Nur um zu sehen, ob sich die Ergebnisse verbessern und es hat getan!

Es stellt sich heraus, dass die Abmessungen des Eingabebildes viel größer waren als die vom Modell akzeptierten 600 x 1024. Die Bilder wurden also auf 600 x 1024 verkleinert, was bedeutete, dass die Zigarettenschachteln ihre Details verloren hatten :)

Also habe ich mich entschlossen, das Originalmodell zu testen, das in allen Klassen auf zugeschnittenen Bildern trainiert wurde und es wie ein Zauber wirkt :)

 Original image

Dies war die Ausgabe des Modells auf dem Originalbild

 Top left corner cropped from original image

Dies ist die Ausgabe des Modells, wenn ich das obere linke Viertel herausschneide und als Eingabe bereitstelle. 

Vielen Dank an alle, die geholfen haben! Herzlichen Glückwunsch an das TensorFlow-Team für einen fantastischen Job für die API :) Jetzt kann jeder Objekterkennungsmodelle trainieren!

13
Banach Tarski

Wie viele Bilder enthält der Datensatz? Je mehr Trainingsdaten verfügbar sind, desto besser ist die API. Ich habe es mit ca. 20 Bildern pro Klasse versucht, die Genauigkeit war ziemlich schlecht. Ich habe fast alle Probleme, die Sie oben angesprochen haben. Wenn ich mehr Daten erzeugte, verbesserte sich die Genauigkeit erheblich.

PS: Sorry, ich konnte nicht kommentieren, da ich nicht genug Ruf habe

4

Es scheint, dass die Größe des Datensatzes eher klein ist. Resnet ist ein großes Netzwerk, für das noch mehr Daten erforderlich sind, um richtig trainieren zu können.

Was ist zu tun:

  1. Erhöhen Sie die Dateigröße
  2. Verwenden Sie vorab trainierte Netzwerke und optimieren Sie Ihren Datensatz (Sie tun dies wahrscheinlich bereits).
  3. Verwenden Sie die Datenerweiterung (Größenänderung, Unschärfe, ...; das Spiegeln ist für diesen Datensatz möglicherweise nicht geeignet).
0
Blackberry