Faltungs-Neuronale Netze mit Eingabebildern unterschiedlicher Dimensionen - Bildsegmentierung

12

Ich stehe vor dem Problem, Bilder mit unterschiedlichen Dimensionen als Eingaben in eine Segmentierungsaufgabe zu haben. Beachten Sie, dass die Bilder nicht einmal das gleiche Seitenverhältnis haben.

Ein allgemeiner Ansatz, den ich im Allgemeinen beim Deep Learning gefunden habe, ist das Zuschneiden der Bilder, wie dies auch hier vorgeschlagen wird . In meinem Fall kann ich das Bild jedoch nicht zuschneiden und seine Mitte oder ähnliches beibehalten, da ich bei der Segmentierung möchte, dass die Ausgabe die gleichen Abmessungen wie die Eingabe hat.

In diesem Dokument wird vorgeschlagen, dass bei einer Segmentierungsaufgabe dasselbe Bild mehrmals in einem anderen Maßstab in das Netzwerk eingespeist und dann die Ergebnisse aggregiert werden können. Wenn ich diesen Ansatz richtig verstehe, würde er nur funktionieren, wenn alle Eingabebilder das gleiche Seitenverhältnis haben. Bitte korrigieren Sie mich, wenn ich falsch liege.

Eine andere Alternative wäre, jedes Bild auf feste Abmessungen zu ändern. Ich denke, dies wurde auch durch die Antwort auf diese Frage vorgeschlagen. Es ist jedoch nicht festgelegt, auf welche Weise die Größe von Bildern geändert wird.

Ich habe überlegt, die maximale Breite und Höhe des Datensatzes zu verwenden und alle Bilder auf diese feste Größe zu ändern, um Informationsverlust zu vermeiden. Ich glaube jedoch, dass unser Netzwerk möglicherweise Probleme mit verzerrten Bildern hat, da die Kanten in einem Bild möglicherweise nicht klar sind. Was ist möglicherweise der beste Weg, um die Größe Ihrer Bilder zu ändern, bevor Sie sie dem Netzwerk zuführen?

Gibt es eine andere Option, die mir nicht bekannt ist, um das Problem zu lösen, Bilder mit unterschiedlichen Dimensionen zu haben?

Welcher dieser Ansätze ist Ihrer Meinung nach der beste, wenn man den Rechenaufwand, aber auch den möglichen Leistungsverlust des Netzwerks berücksichtigt?

Ich würde mich freuen, wenn die Antworten auf meine Fragen einen Link zu einer Quelle enthalten, falls es eine gibt. Vielen Dank.

MattSt
quelle

Antworten:

4

Ich werde eine gründlichere Antwort geben.

Es gibt zwei Probleme, mit denen Sie möglicherweise konfrontiert sind.

1) Ihr neuronales Netz (in diesem Fall das Faltungs-neuronale Netz) kann keine Bilder mit unterschiedlichen Auflösungen akzeptieren. Dies ist normalerweise der Fall, wenn eine Ebene vollständig verbunden ist. Wenn das Netzwerk jedoch vollständig faltungsorientiert ist, sollte es Bilder jeder Dimension akzeptieren können. Vollständig gefaltet bedeutet, dass es keine vollständig verbundenen Ebenen enthält, sondern nur Ebenen für Faltung, Max-Pooling und Batch-Normalisierung, die alle für die Größe des Bildes unveränderlich sind. Genau dieser Ansatz wurde in diesem bahnbrechenden Artikel Fully Convolutional Networks for Semantic Segmentation vorgeschlagen . Beachten Sie, dass ihre Architektur und Trainingsmethoden inzwischen möglicherweise etwas veraltet sind. Ein ähnlicher Ansatz wurde in weit verbreiteten verwendetU-Net: Faltungsnetzwerke für die biomedizinische Bildsegmentierung und viele andere Architekturen für die Objekterkennung, Posenschätzung und Segmentierung.

2) Faltungs-Neuronale Netze sind nicht skalierungsinvariant. Wenn man beispielsweise Katzen gleicher Größe in Pixel auf Bildern mit fester Auflösung trainiert, versagt das Netz bei Bildern kleinerer oder größerer Katzengrößen. Um dieses Problem zu lösen, kenne ich zwei Methoden (möglicherweise in der Literatur): 1) Mehrskalentraining von Bildern unterschiedlicher Größe in vollständig gefalteten Netzen, um das Modell gegenüber Skalenänderungen robuster zu machen; und 2) eine Architektur mit mehreren Maßstäben aufweisen. Ein Ausgangspunkt ist ein Blick auf diese beiden bemerkenswerten Artikel: Funktionspyramidennetzwerke zur Objekterkennung und hochauflösende Darstellungen zum Beschriften von Pixeln und Regionen .

Anuar Y.
quelle
2

Angenommen, Sie haben einen großen Datensatz, der pixelweise gekennzeichnet ist, besteht eine schwierige Möglichkeit, das Problem zu lösen, darin, die Bilder mit denselben Abmessungen vorzuverarbeiten, indem Sie horizontale und vertikale Ränder entsprechend den gewünschten Abmessungen einfügen. Bei Beschriftungen fügen Sie eine zusätzliche Dummy-Ausgabe hinzu Für die Randpixel können Sie also bei der Berechnung des Verlusts die Ränder maskieren.

Fadi Bakoura
quelle
Wie geht man dann in diesen Fällen mit Normalisierung um? Normalisieren Sie nur die Pixel in einem Bild, die nicht in seinem Rand enthalten sind?
MattSt
Ja, da Ihr Datengenerierungsprozess unterschiedliche Größen hat. Wenn Sie also die Ränder einbeziehen, ändern Sie die Datenverteilung. Ränder werden eingefügt, um die Trainingsmuster in Stapeln zu gruppieren, da Ihr Problem einen festen Ausgabevektor ausgeben muss.
Fadi Bakoura
0

Ich denke, dieses Papier wird nützliche Erkenntnisse für Sie haben.

Felix Goldberg
quelle
Sie sollten keine Nur-Link-Antworten geben.
JohnnyApplesauce
0

Wenn Sie eine Segmentierung durchführen möchten, können Sie U-Net verwenden. Es sind keine vollständig verbundenen Einheiten vorhanden. Daher spielt die Größe der Eingabe keine Rolle.

GanLover
quelle
3
Ich denke, Sie sollten Ihre Punkte etwas näher erläutern.
DuttaA
0

Ich denke, Sie können die Pixelgröße Ihres Bildes ändern und RGB für den nächsten Schritt in Binär oder Ganzzahl konvertieren

Danny Lukmana
quelle
1
Hallo und willkommen bei AI Stack Exchange. Könnten Sie bitte Ihre Antwort erweitern? Erwägen Sie, mehr Kontext hinzuzufügen, um Ihre Antwort zu sichern, und möglicherweise Referenzen hinzuzufügen.
Jaden Travnik
0

Versuchen Sie, die Größe des Bilds mithilfe der Interpolationstechnik für den nächsten Nachbarn auf die Eingabedimensionen Ihrer neuronalen Netzwerkarchitektur zu ändern (wobei es in einer Standard-2D-U-Netz-Architektur auf etwa 128 * 128 festgelegt bleibt) . Dies liegt daran, dass wenn Sie die Größe Ihres Bildes mithilfe einer anderen Interpolation ändern, dies zu Manipulationen an den Grundwahrheitsbezeichnungen führen kann. Dies ist insbesondere bei der Segmentierung ein Problem. Sie werden nicht mit einem solchen Problem konfrontiert sein, wenn es um die Klassifizierung geht.

Versuche Folgendes:

import cv2 
resized_image = cv2.resize(original_image, (new_width, new_height), 
                           interpolation=cv2.INTER_NEAREST)
Shalabh Gupta
quelle