Wie formatiere ich die Bilddaten für das Training / die Vorhersage, wenn die Bilder unterschiedlich groß sind?

87

Ich versuche mein Modell zu trainieren, das Bilder klassifiziert. Das Problem, das ich habe, ist, dass sie unterschiedliche Größen haben. Wie soll ich meine Bilder / oder Modellarchitektur formatieren?

Asif Mohammed
quelle
2
Bitte zeigen Sie, was Sie bisher versucht haben und was bei Ihnen anscheinend nicht funktioniert.
Keith John Hutchison
16
Und bam da geht der Code von Inception v4. Ich bin mit diesem Standardkommentar nicht einverstanden. Ein bisschen mehr Input wäre nett - wie zum Beispiel, um welche Art von Netz es sich handelt - aber die Abstimmungen sind überhaupt nicht gerechtfertigt. Das ist dort ein echtes Problem.
Sunside
4
Die Frage ist, wie ImageNet seine Bilddaten so formatiert, dass sie für das Training nützlich sind.
mskw

Antworten:

146

Sie haben nicht gesagt, von welcher Architektur Sie sprechen. Da Sie sagten, Sie möchten Bilder klassifizieren, gehe ich davon aus, dass es sich um ein teilweise faltungsorientiertes, teilweise vollständig verbundenes Netzwerk wie AlexNet, GoogLeNet usw. handelt. Im Allgemeinen hängt die Antwort auf Ihre Frage vom Netzwerktyp ab, mit dem Sie arbeiten.

Wenn Ihr Netzwerk beispielsweise nur Faltungseinheiten enthält, dh keine vollständig verbundenen Schichten enthält, kann dies für die Größe des Eingabebilds unveränderlich sein. Ein solches Netzwerk könnte die Eingabebilder verarbeiten und wiederum ein anderes Bild zurückgeben ("Faltung den ganzen Weg"); Sie müssten sicherstellen, dass die Ausgabe Ihren Erwartungen entspricht, da Sie den Verlust natürlich auf irgendeine Weise bestimmen müssen.

Wenn Sie jedoch vollständig angeschlossene Einheiten verwenden, treten Probleme auf: Hier haben Sie eine feste Anzahl von gelernten Gewichten, mit denen Ihr Netzwerk arbeiten muss, sodass unterschiedliche Eingaben eine unterschiedliche Anzahl von Gewichten erfordern würden - und das ist nicht möglich.

Wenn dies Ihr Problem ist, können Sie Folgendes tun:

  • Es ist mir egal, ob du die Bilder zerquetschst. Ein Netzwerk kann ohnehin lernen, den Inhalt zu verstehen. Bedeuten Skalierung und Perspektive überhaupt etwas für den Inhalt?
  • Schneiden Sie die Bilder in der Mitte auf eine bestimmte Größe. Wenn Sie befürchten, Daten zu verlieren, führen Sie mehrere Zuschnitte durch und erweitern Sie damit Ihre Eingabedaten, sodass das Originalbild in Nverschiedene Bilder mit der richtigen Größe aufgeteilt wird.
  • Füllen Sie die Bilder mit einer Volltonfarbe auf eine quadratische Größe auf und ändern Sie dann die Größe.
  • Mach eine Kombination davon.

Die Auffülloption führt möglicherweise eine zusätzliche Fehlerquelle in die Netzwerkvorhersage ein, da das Netzwerk möglicherweise (gelesen: wahrscheinlich) auf Bilder ausgerichtet ist, die einen solchen aufgefüllten Rand enthalten. Wenn Sie einige Ideen benötigen, schauen Sie sich den Abschnitt Bilder in der TensorFlow-Dokumentation an. Es gibt solche Teile resize_image_with_crop_or_pad, die die größere Arbeit wegnehmen.

Was tut der Pflege einfach nicht über Quetschen, hier ist ein Stück der Vorverarbeitung Pipeline des berühmten Inception - Netzwerkes:

# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.

# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
    distorted_image,
    lambda x, method: tf.image.resize_images(x, [height, width], method=method),
    num_cases=num_resize_cases)

Sie sind sich dessen total bewusst und tun es trotzdem.

Je nachdem , wie weit wollen Sie oder Notwendigkeit zu gehen, gibt es eigentlich ein Papier hier genannt Spatial Pyramide Pooling in Deep Convolution Networks für Visual Recognition , dass Griffe Eingänge von beliebiger Größe , indem sie auf eine ganz besondere Art und Weise zu verarbeiten.

Sonnenseite
quelle
11
Dieses Thema scheint weitaus komplizierter zu sein, wenn Sie sich mit Objekterkennung und Instanzsegmentierung befassen, da Ankerboxgrößen, die auch Hyperparameter sind, angepasst werden müssen, wenn Sie einen Datensatz mit hoher Varianz in den Bildgrößen haben.
CMCDragonkai
Seitenverhältnisse spielen eine ziemlich wichtige Rolle für ein Netzwerk, das zwischen Kreisen und Ellipsen unterscheiden soll.
HelloGoodbye
1
Eine andere allgemeine Beobachtung ist, dass Chargen nicht unbedingt die gleichen Abmessungen haben müssen; Der erste Stapel kann 4: 3-Bilder verarbeiten, der zweite 16: 9 usw., solange für die dichten Schichten gesorgt ist.
Sunside
1
@Tobitor, machen Sie die Eingaben des Netzwerks immer so nah wie möglich an den tatsächlichen Daten (Test- oder Inferenzzeitdaten). Wenn alle Ihre Bilder viel breiter als hoch sind, sollten Sie auch Ihr Netzwerk modellieren, um Ihre Bilder so zu verarbeiten. Das heißt, wenn Sie unmöglich sagen können, wie Ihre "Nutzungsdaten" aussehen werden, müssen Sie während des Trainings einige Opfer bringen. In diesem Fall ist die Größenänderung eines Bilds von 1000 x 200 auf 256 x 256 im Allgemeinen in Ordnung (stellen Sie sich vor, Sie betrachten das Nummernschild in einem Winkel von 60 Grad - es ist jetzt ungefähr quadratisch).
Sunside
2
@Tobitor Es ist überhaupt nicht erforderlich, dass Bilder quadratisch sind. Es ist nur der am wenigsten schlechte Kompromiss, wenn Sie die tatsächlichen Bildgrößen während der Inferenz nicht kennen. : ^) Was die Größe betrifft, desto kleiner, desto besser, aber die Bilder müssen groß genug sein, um immer noch die feinsten erforderlichen Details zu erfassen. Denken Sie im Allgemeinen daran, dass Sie als menschlicher Experte unmöglich feststellen können, was in der Datei enthalten ist Bild, das Netzwerk wird auch nicht in der Lage sein.
Sunside
11

Versuchen Sie, eine räumliche Pyramiden-Pooling-Ebene zu erstellen. Setzen Sie es dann nach Ihrer letzten Faltungsschicht, so dass die FC-Schichten immer konstante Dimensionsvektoren als Eingabe erhalten. Trainieren Sie während des Trainings die Bilder aus dem gesamten Datensatz mit einer bestimmten Bildgröße für eine Epoche. Wechseln Sie dann für die nächste Epoche zu einer anderen Bildgröße und setzen Sie das Training fort.

Pranay Mukherjee
quelle
Könnten Sie etwas näher darauf eingehen, was "räumliches Pyramiden-Pooling" im Vergleich zu regulärem Pooling ist?
Matthieu
Bitte lesen Sie Spatial Pyramid Pooling in tiefen Faltungsnetzwerken zur visuellen Erkennung in blog.acolyer.org/2017/03/21/convolution-neural-nets-part-2 @Matthieu
Asif Mohammed