1

Ich bin neu im maschinellen Lernen. Ich versuche eine Eingabematrix (X) aus einer Reihe von Bildern (Stanford-Hunde-Set von 120 Rassen) zu erstellen, um ein konvolutionelles neuronales Netzwerk zu trainieren. Mein Ziel ist es, die Größe von Bildern zu ändern und jedes Bild in eine Zeile zu verwandeln, indem jedes Pixel als separate Spalte dargestellt wird.Bildgrößenanpassung während der Vorverarbeitung für neuronales Netzwerk

Wenn ich Bilder direkt auf eine feste Größe skaliere, verlieren die Bilder ihre Originalität durch Quetschen oder Strecken, also ist das nicht gut (erste Lösung).

Ich kann die Größe ändern, indem Sie entweder Breite oder Höhe festlegen und dann zuschneiden (alle resultierenden Bilder haben die gleiche Größe wie 100x100), aber kritische Teile des Bildes können abgeschnitten werden (zweite Lösung).

Ich denke einen anderen Weg, es zu tun, aber ich bin mir sicher. Angenommen, ich möchte 10000 Spalten pro Bild haben. Anstatt die Größe der Bilder auf 100x100 zu ändern, werde ich das Bild so skalieren, dass die Gesamtzahl der Pixel etwa 10000 Pixel beträgt. Bilder der Größe 50x200, 100x100 und 250x40 werden alle in 10000 Spalten konvertiert. Für andere Größen wie 52x198 werden die ersten 10000 Pixel von 10296 berücksichtigt (dritte Lösung).

Die dritte Lösung, die ich oben erwähnt habe, scheint die ursprüngliche Form des Bildes zu bewahren, jedoch könnte es beim Konvertieren in eine Reihe all diese Originalität verlieren, da nicht alle Bilder dieselbe Größe haben. Ich wundere mich über Ihre Kommentare zu diesem Thema. Es wird auch großartig sein, wenn Sie mir Quellen nennen können, die ich über das Thema lernen kann.

Antwort

4

Lösung 1 (einfach die Größe des Eingabebildes ändern) ist ein gängiger Ansatz. Wenn Sie nicht ein sehr unterschiedliches Seitenverhältnis von der erwarteten Eingabeform haben (oder Ihre Zielklassen enge geometrische Einschränkungen haben), können Sie in der Regel immer noch eine gute Leistung erzielen.

Wie Sie bereits erwähnt haben, hat Lösung 2 (Bild beschneiden) den Nachteil, dass ein kritischer Teil Ihres Bildes möglicherweise ausgeschlossen wird. Sie können dies umgehen, indem Sie die Klassifizierung für mehrere Unterfenster des Originalbildes ausführen (d. H. Mehrere 100 × 100 Teilbilder klassifizieren, indem Sie das Eingabebild bei einem geeigneten Schritt horizontal und/oder vertikal durchlaufen). Dann müssen Sie entscheiden, wie Sie Ihre verschiedenen Klassifizierungsergebnisse kombinieren.

Lösung 3 wird nicht funktionieren, da das Faltungsnetzwerk die Bilddimensionen kennen muss (andernfalls würde es nicht wissen, welche Pixel horizontal und vertikal benachbart sind). Sie müssen also ein Bild mit expliziten Dimensionen (z. B. 100 x 100) übergeben, es sei denn, das Netzwerk erwartet ein Array, das von angenommenen Dimensionen abgeflacht wurde. Aber wenn Sie einfach ein Array von 10000 Pixelwerten übergeben und das Netzwerk nicht weiß (oder nicht annehmen kann), ob das Bild 100 x 100, 50 x 200 oder 250 x 40 ist, dann kann das Netzwerk das Netzwerk nicht anwenden Faltungsfilter richtig.

Lösung 1 ist eindeutig am einfachsten zu implementieren, aber Sie müssen den wahrscheinlichen Effekt der Änderung des Bildseitenverhältnisses mit dem Aufwand vergleichen, der zum Ausführen und Kombinieren mehrerer Klassifizierungen für jedes Bild erforderlich ist.

+0

Als vierte Lösung, wie sieht es mit der Größenänderung eines Bildes aus, so dass skaliertes Bild in eine Auflösung von 100x100 passt und Lücken mit gemittelter Farbe des Bildes füllt (oder mit Schwarz, das Null ist)? – Mehmed

+0

Ich nehme an, das ist eine Option, aber 100x100 ist schon ein kleines Bild zu klassifizieren. Wenn Sie Ihr Bild so skalieren, dass es nicht einmal 100x100 Pixel ausfüllt, scheint es wahrscheinlich, dass Informationen weggeworfen werden. – bogatron

+0

Ich stimme zu, ich benutze 100x100 nur um ein numerisches Beispiel zu geben. Ich denke, diese Option ist auch kein effizienter Weg, danke. – Mehmed