Wie bereite ich Bilder für ein neuronales Netzwerk vor?

41

Ich möchte ein neuronales Netz zur Bildklassifizierung verwenden. Ich beginne mit vorab geschultem CaffeNet und trainiere es für meine Bewerbung.

Wie soll ich die Eingabebilder vorbereiten?

In diesem Fall handelt es sich bei allen Bildern um dasselbe Objekt, jedoch mit Abweichungen (siehe Qualitätskontrolle). Sie haben etwas andere Maßstäbe / Auflösungen / Entfernungen / Lichtverhältnisse (und in vielen Fällen kenne ich den Maßstab nicht). Außerdem gibt es in jedem Bild einen Bereich (bekannt) um das interessierende Objekt, der vom Netzwerk ignoriert werden sollte.

Ich könnte (zum Beispiel) die Mitte jedes Bildes zuschneiden, die garantiert einen Teil des interessierenden Objekts und keinen der ignorierten Bereiche enthält; aber das scheint, als würde es Informationen wegwerfen, und auch die Ergebnisse wären nicht wirklich gleich skaliert (vielleicht 1,5-fache Variation).

Dataset Augmentation

Ich habe von der Erstellung weiterer Trainingsdaten durch zufälliges Zuschneiden / Spiegeln / usw. gehört. Gibt es eine Standardmethode dafür? Gibt es Ergebnisse zur Verbesserung der Klassifikatorgenauigkeit?

Alex ich
quelle

Antworten:

35

Die Idee mit neuronalen Netzen ist, dass sie wenig Vorverarbeitung benötigen, da das schwere Heben durch den Algorithmus erfolgt, der für das Lernen der Merkmale verantwortlich ist.

Die Gewinner des Data Science Bowl 2015 haben einen tollen Überblick über ihren Ansatz. Der größte Teil des Inhalts dieser Antwort stammt aus der Klassifizierung von Plankton mit tiefen neuronalen Netzen . Ich schlage vor, Sie lesen es, insbesondere den Teil über Vorverarbeitung und Datenerweiterung .

- Ändern Sie die Größe der Bilder

Für verschiedene Größen, Auflösungen oder Abstände können Sie Folgendes tun. Sie können einfach die größte Seite jedes Bildes auf eine feste Länge skalieren.

Eine andere Möglichkeit ist die Verwendung von openCV oder scipy. und dies wird die Größe des Bildes ändern, um 100 Spalten (Breite) und 50 Zeilen (Höhe) zu haben:

resized_image = cv2.resize(image, (100, 50)) 

Eine weitere Option ist die Verwendung des scipy-Moduls unter Verwendung von:

small = scipy.misc.imresize(image, 0.5)

- Datenerweiterung

Die Datenerweiterung verbessert immer die Leistung, obwohl die Menge vom Dataset abhängt. Wenn Sie die Daten erweitern möchten, um die Größe des Datasets künstlich zu erhöhen, können Sie im Einzelfall die folgenden Schritte ausführen (dies wäre beispielsweise nicht der Fall, wenn Bilder von Häusern oder Personen vorhanden wären, bei denen beim Drehen um 180 Grad alle Informationen verloren gehen würden aber nicht, wenn Sie sie umdrehen wie ein Spiegel):

  • Drehung: zufällig mit einem Winkel zwischen 0 ° und 360 ° (gleichmäßig)
  • Übersetzung: zufällig mit Verschiebung zwischen -10 und 10 Pixel (einheitlich)
  • Neuskalierung: zufällig mit Skalierungsfaktor zwischen 1 / 1,6 und 1,6 (logarithmisch einheitlich)
  • Spiegeln: ja oder nein (Bernoulli)
  • Scheren: zufällig mit einem Winkel zwischen -20 ° und 20 ° (gleichmäßig)
  • Dehnung: zufällig mit Dehnungsfaktor zwischen 1 / 1,3 und 1,3 (logarithmisch einheitlich)

Sie können die Ergebnisse auf den Data Science-Schüsselbildern sehen.

Vorverarbeitete Bilder

Vorverarbeitete Bilder

erweiterte Versionen der gleichen Bilder

Bildbeschreibung hier eingeben

-Weitere Techniken

Diese befassen sich mit anderen Bildeigenschaften wie Beleuchtung und beziehen sich bereits auf den Hauptalgorithmus, eher auf einen einfachen Vorverarbeitungsschritt. Überprüfen Sie die vollständige Liste auf: UFLDL Tutorial

Wacax
quelle
1
Die Farbe ist auch für die Datenerweiterung einen Blick wert.
David C. Bishop
Können Sie auch den Code für die Drehung und Scherung usw. teilen? @wacax
Arsenal Fanatic
Ihr könnt ein Paket wie Keras zur Datenerweiterung verwenden.
Ricardo Cruz
2
Für alle, die Probleme mit dem Import des scipy.misc-Moduls haben. Du musst import scipy.misc. stackoverflow.com/questions/13581593/…
eleijonmarck
Welche Methode für die Größenänderung von Bildern wird normalerweise in Methoden nach dem Stand der Technik verwendet, z. B. in Methoden, die auf ImageNet verwendet werden?
HelloGoodbye
2

Obwohl die Antwort von wacax vollständig und wirklich erklärend ist, möchte ich ein paar Dinge hinzufügen, falls jemand über diese Antwort stolpert.

Zunächst einmal sind die meisten scipy.miscBild verwandte Funktionen ( imread, imsave, imresizeEFR) haben sich für entweder veraltet geworden ImageIO oder skimage .

Zweitens würde ich die Python-Bibliothek imgaug für jede Erweiterungsaufgabe empfehlen . Es ist sehr einfach zu bedienen und verfügt über praktisch alle Augmentationstechniken, die Sie verwenden möchten.

John Doe
quelle