Eine sanfte Einführung in die Bildformate „Channels-First“ und „Channels-Last“.


Farbbilder haben Höhe, Breite und Farbkanalabmessungen.

Bei der Darstellung als dreidimensionale Arrays ist die Kanaldimension für die Bilddaten standardmäßig die letzte, kann jedoch häufig aus Gründen der Leistungsoptimierung auf die erste Dimension verschoben werden.

Die Verwendung dieser beiden „Kanalreihenfolgeformate“ und die Vorbereitung von Daten für eine bestimmte bevorzugte Kanalreihenfolge kann für Anfänger verwirrend sein.

In diesem Tutorial erfahren Sie, wie Sie Kanalreihenfolgeformate kennen, wie Sie Bilddaten entsprechend den Formaten vorbereiten und bearbeiten und wie Sie die Keras-Deep-Learning-Bibliothek für verschiedene Kanalreihenfolgen konfigurieren.

Nach Abschluss dieses Tutorials wissen Sie:

  • Die dreidimensionale Array-Struktur von Bildern und die Array-Formate „Kanäle zuerst“ und „Kanäle zuletzt“.
  • So fügen Sie eine Kanaldimension hinzu und wie konvertieren Sie Bilder zwischen den Kanalformaten.
  • Wie die Deep-Learning-Bibliothek von Keras die Reihenfolge bevorzugter Kanäle verwaltet und wie diese Präferenz geändert und abgefragt wird.

Starten Sie Ihr Projekt mit meinem neuen Buch „Deep Learning for Computer Vision“, einschließlich Schritt-für-Schritt-Anleitungen und den Python-Quellcode-Dateien für alle Beispiele.

Fangen wir an.

  • Aktualisiert im April 2019: Tippfehler im Codekommentar behoben (danke Antonio).
  • Aktualisiert im September 2019: Aktualisiert wegen geringfügiger Änderungen an der Keras 2.2.5-API. Die Verwendung von set_image_dim_ordering() wurde in set_image_data_format() geändert

Tutorial-Übersicht

Dieses Tutorial ist in drei Teile unterteilt; sie sind:

  1. Bilder als 3D-Arrays
  2. Bildkanäle manipulieren
  3. Bestellung von Keras-Kanälen

Bilder als 3D-Arrays

Ein Bild kann als dreidimensionales Array im Speicher gespeichert werden.

Typischerweise hat das Bildformat eine Dimension für Zeilen (Höhe), eine für Spalten (Breite) und eine für Kanäle.

Wenn das Bild schwarzweiß (Graustufen) ist, ist die Kanaldimension möglicherweise nicht explizit vorhanden, z. B. Für jede Koordinate (Zeile, Spalte) im Bild gibt es einen ganzzahligen Pixelwert ohne Vorzeichen.

Farbige Bilder haben normalerweise drei Kanäle für den Pixelwert an der Koordinate (Zeile, Spalte) für die roten, grünen und blauen Komponenten.

Deep-Learning-Neuronale Netze erfordern die Bereitstellung von Bilddaten als dreidimensionale Arrays.

Dies gilt auch dann, wenn es sich bei Ihrem Bild um ein Graustufenbild handelt. In diesem Fall muss die zusätzliche Dimension für den einzelnen Farbkanal hinzugefügt werden.

Es gibt zwei Möglichkeiten, die Bilddaten als dreidimensionales Array darzustellen. Die erste besteht darin, die Kanäle als letzte oder dritte Dimension im Array festzulegen. Dies wird als „Kanäle zuletzt“ bezeichnet. Die zweite besteht darin, die Kanäle als erste Dimension im Array festzulegen, die als „Kanäle zuerst“ bezeichnet wird.

  • Kanäle zuletzt. Bilddaten werden in einem dreidimensionalen Array dargestellt, wobei der letzte Kanal die Farbkanäle darstellt, z. B. [Zeilen][Spalten][Kanäle].
  • Kanäle zuerst. Bilddaten werden in einem dreidimensionalen Array dargestellt, wobei der erste Kanal die Farbkanäle darstellt, z. B. [Kanäle][Zeilen][Spalten].

Einige Bildverarbeitungs- und Deep-Learning-Bibliotheken bevorzugen die Reihenfolge der Kanäle zuerst, andere bevorzugen die Reihenfolge der Kanäle zuletzt. Daher ist es wichtig, mit den beiden Ansätzen zur Darstellung von Bildern vertraut zu sein.

Bildkanäle manipulieren

Möglicherweise müssen Sie die Bildkanäle oder die Kanalreihenfolge ändern oder manipulieren.

Dies kann einfach mit der NumPy-Python-Bibliothek erreicht werden.

Schauen wir uns einige Beispiele an.

In diesem Tutorial verwenden wir ein von Larry Koester (einige Rechte vorbehalten) aufgenommenes Foto der Phillip Island Penguin Parade.

Laden Sie das Bild herunter und legen Sie es in Ihrem aktuellen Arbeitsverzeichnis mit dem Dateinamen „penguin_parade.jpg“ ab.

  • Foto herunterladen (penguin_parade.jpg)

Bei den Codebeispielen in diesen Tutorials wird davon ausgegangen, dass die Pillow-Bibliothek installiert ist.

So fügen Sie einem Graustufenbild einen Kanal hinzu

Graustufenbilder werden als zweidimensionales Array geladen.

Bevor sie zur Modellierung verwendet werden können, müssen Sie dem Bild möglicherweise eine explizite Kanaldimension hinzufügen. Dadurch werden keine neuen Daten hinzugefügt. Stattdessen wird die Array-Datenstruktur dahingehend geändert, dass eine zusätzliche dritte Achse mit einer Dimension zur Aufnahme der Graustufenpixelwerte vorhanden ist.

Beispielsweise kann ein Graustufenbild mit den Abmessungen [Zeilen][Spalten] in [Zeilen][Spalten][Kanäle] oder [Kanäle][Zeilen][Spalten] geändert werden, wobei die neue [Kanäle]-Achse eine Dimension hat.

Dies kann mit der NumPy-Funktion expand_dims() erreicht werden. Mit dem Argument „axis“ können Sie angeben, wo die neue Dimension zur ersten hinzugefügt wird, z. B. „first“ für „Kanäle zuerst“ oder „last“ für „Kanäle zuletzt“.

Das folgende Beispiel lädt das Penguin Parade-Foto mithilfe der Pillow-Bibliothek als Graustufenbild und zeigt, wie eine Kanaldimension hinzugefügt wird.

# example of expanding dimensions
from numpy import expand_dims
from numpy import asarray
from PIL import Image
# load the image
img = Image.open('penguin_arade.jpg')
# convert the image to grayscale
img = img.convert(mode='L')
# convert to numpy array
data = asarray(img)
print(data.shape)
# add channels first
data_first = expand_dims(data, axis=0)
print(data_first.shape)
# add channels last
data_last = expand_dims(data, axis=2)
print(data_last.shape)

Wenn Sie das Beispiel ausführen, wird zunächst das Foto mithilfe der Pillow-Bibliothek geladen und dann in ein Graustufenbild konvertiert.

Das Bildobjekt wird in ein NumPy-Array konvertiert und wir bestätigen, dass die Form des Arrays zweidimensional ist, insbesondere (424, 640).

Mit der Funktion expand_dims() wird dann ein Kanal über axis=0 an der Vorderseite des Arrays hinzugefügt und die Änderung wird mit der Form (1, 424, 640) bestätigt ). Die gleiche Funktion wird dann verwendet, um einen Kanal am Ende oder in der dritten Dimension des Arrays mit axis=2 hinzuzufügen, und die Änderung wird mit der Form (424, 640, 1) bestätigt.

(424, 640)
(1, 424, 640)
(424, 640, 1)

Eine weitere beliebte Alternative zum Erweitern der Dimensionen eines Arrays besteht darin, die NumPy-Funktion reshape() zu verwenden und ein Tupel mit der neuen Form anzugeben; Zum Beispiel:

data = data.reshape((424, 640, 1))

So ändern Sie die Reihenfolge der Bildkanäle

Nachdem ein Farbbild als dreidimensionales Array geladen wurde, kann die Kanalreihenfolge geändert werden.

Dies kann mit der NumPy-Funktion moveaxis() erreicht werden. Hier können Sie den Index der Quellachse und der Zielachse angeben.

Diese Funktion kann verwendet werden, um ein Array im letzten Format des Kanals, z. B. [rows][cols][channels], in das Format des ersten Kanals, z. B. [channels][rows][cols], zu ändern ] oder umgekehrt.

Das folgende Beispiel lädt das Penguin Parade-Foto im Kanal-Letzt-Format und ändert es mit der Funktion moveaxis() in das Kanal-First-Format.

# change image from channels last to channels first format
from numpy import moveaxis
from numpy import asarray
from PIL import Image
# load the color image
img = Image.open('penguin_arade.jpg')
# convert to numpy array
data = asarray(img)
print(data.shape)
# change channels last to channels first format
data = moveaxis(data, 2, 0)
print(data.shape)
# change channels first to channels last format
data = moveaxis(data, 0, 2)
print(data.shape)

Wenn Sie das Beispiel zuerst ausführen, wird das Foto mithilfe der Pillow-Bibliothek geladen und in ein NumPy-Array konvertiert, um zu bestätigen, dass das Bild im letzten Kanalformat mit der Form (424, 640, 3) geladen wurde.

Anschließend wird die Funktion moveaxis() verwendet, um die Kanalachse von Position 2 auf Position 0 zu verschieben. Das Ergebnis wird bestätigt und zeigt das erste Kanalformat (3, 424, 640) an. Dies wird dann umgekehrt und die Kanäle von Position 0 werden wieder auf Position 2 verschoben.

(424, 640, 3)
(3, 424, 640)
(424, 640, 3)

Bestellung von Keras-Kanälen

Die Deep-Learning-Bibliothek von Keras ist unabhängig davon, wie Sie Bilder im Format „Channel First“ oder „Last Channel“ darstellen möchten, die Präferenz muss jedoch bei der Verwendung der Bibliothek angegeben und eingehalten werden.

Keras umfasst eine Reihe mathematischer Bibliotheken und jede hat eine bevorzugte Kanalreihenfolge. Die drei Hauptbibliotheken, die Keras umschließen kann, und ihre bevorzugte Kanalreihenfolge sind unten aufgeführt:

  • TensorFlow: Letzte Reihenfolge der Kanäle.
  • Theano: Kanäle erster Ordnung.
  • CNTK: Letzte Reihenfolge der Kanäle.

Standardmäßig ist Keras für die Verwendung von TensorFlow konfiguriert und die Kanalreihenfolge lautet ebenfalls standardmäßig „Kanäle zuletzt“. Sie können beide Kanalreihenfolgen mit jeder Bibliothek und der Keras-Bibliothek verwenden.

Einige Bibliotheken behaupten, dass die bevorzugte Kanalreihenfolge zu großen Leistungsunterschieden führen kann. Beispielsweise empfiehlt die Verwendung der MXNet-Mathematikbibliothek als Backend für Keras, die Kanäle in der ersten Reihenfolge zu verwenden, um eine bessere Leistung zu erzielen.

Wir empfehlen dringend, das image_data_format in „channels_first“ zu ändern. MXNet ist bei Channels_First-Daten deutlich schneller.

– Leistungsoptimierung von Keras mit MXNet-Backend, Apache MXNet

Standardkanalreihenfolge

Die Bibliothek und die Reihenfolge der bevorzugten Kanäle sind in der Keras-Konfigurationsdatei aufgeführt, die in Ihrem Home-Verzeichnis unter ~/.keras/keras.json gespeichert ist.

Die bevorzugte Kanalreihenfolge wird in der Konfigurationseinstellung „image_data_format“ gespeichert und kann entweder als „channels_last“ oder „channels_first“ festgelegt werden.

Nachfolgend sehen Sie beispielsweise den Inhalt einer keras.json-Konfigurationsdatei. Darin können Sie sehen, dass das System für die Verwendung von Tensorflow und der Reihenfolge channels_last konfiguriert ist.

{
    "image_data_format": "channels_last",
    "backend": "tensorflow",
    "epsilon": 1e-07,
    "floatx": "float32"
}

Basierend auf Ihrer bevorzugten Kanalreihenfolge müssen Sie Ihre Bilddaten so vorbereiten, dass sie der bevorzugten Reihenfolge entsprechen.

Konkret umfasst dies Aufgaben wie:

  • Ändern Sie die Größe oder Erweiterung der Dimensionen aller Trainings-, Validierungs- und Testdaten, um die Erwartungen zu erfüllen.
  • Angabe der erwarteten Eingabeform von Stichproben beim Definieren von Modellen (z. B. input_shape=(28, 28, 1)).

Modellspezifische Kanalreihenfolge

Darüber hinaus bieten die neuronalen Netzwerkschichten, die für die Arbeit mit Bildern konzipiert sind, wie z. B. Conv2D, auch ein Argument namens „data_format“, mit dem Sie die Kanalreihenfolge angeben können. Zum Beispiel:

...
model.add(Conv2D(..., data_format='channels_first'))

Standardmäßig wird dabei die bevorzugte Reihenfolge verwendet, die im Wert „image_data_format“ der Keras-Konfigurationsdatei angegeben ist. Dennoch können Sie die Kanalreihenfolge für ein bestimmtes Modell ändern, und im Gegenzug müssten auch die Datensätze und die Eingabeform geändert werden, um die neue Kanalreihenfolge für das Modell zu verwenden.

Dies kann nützlich sein, wenn Sie ein Modell laden, das für das Transferlernen verwendet wird und dessen Kanalreihenfolge von Ihrer bevorzugten Kanalreihenfolge abweicht.

Reihenfolge der Abfragekanäle

Sie können Ihre aktuell bevorzugte Kanalreihenfolge bestätigen, indem Sie das Ergebnis der Funktion image_data_format() ausdrucken. Das folgende Beispiel zeigt es.

# show preferred channel order
from keras import backend
print(backend.image_data_format())

Wenn Sie das Beispiel ausführen, wird Ihre bevorzugte Kanalreihenfolge wie in Ihrer Keras-Konfigurationsdatei konfiguriert gedruckt. In diesem Fall wird das letzte Format des Kanals verwendet.

channels_last

Der Zugriff auf diese Eigenschaft kann hilfreich sein, wenn Sie automatisch Modelle erstellen oder Daten je nach der vom System bevorzugten Kanalreihenfolge unterschiedlich vorbereiten möchten. Zum Beispiel:

if backend.image_data_format() == 'channels_last':
	...
else:
	...

Kanalreihenfolge erzwingen

Schließlich kann die Kanalreihenfolge für ein bestimmtes Programm erzwungen werden.

Dies kann erreicht werden, indem die Funktion set_image_data_format() im Keras-Backend entweder auf „channels_first“ (theano) für die Kanal-zuerst-Reihenfolge oder auf „channels_last“ aufgerufen wird' (Tensorflow) für die letzte Reihenfolge des Kanals.

Dies kann nützlich sein, wenn Sie möchten, dass ein Programm oder Modell unabhängig von der Standardkonfiguration der Keras-Kanalreihenfolge konsistent funktioniert.

# force a channel ordering
from keras import backend
# force channels-first ordering
backend.set_image_data_format('channels_first')
print(backend.image_data_format())
# force channels-last ordering
backend.set_image_data_format('channels_last')
print(backend.image_data_format())

Wenn Sie das Beispiel zuerst ausführen, wird die Reihenfolge der Kanäle zuerst erzwungen, dann die Reihenfolge der Kanäle zuletzt. Dabei wird jede Konfiguration bestätigt, indem der Kanalreihenfolgemodus nach der Änderung gedruckt wird.

channels_first
channels_last

Weiterführende Literatur

In diesem Abschnitt finden Sie weitere Ressourcen zum Thema, wenn Sie tiefer in die Materie einsteigen möchten.

  • Pillow-Python-Bibliothek
  • numpy.expand_dims-API
  • numpy.reshape-API
  • numpy.moveaxis-API
  • Keras-Backend-API
  • Keras Convolutional Layers API

Zusammenfassung

In diesem Tutorial haben Sie Kanalreihenfolgeformate kennengelernt, wie Sie Bilddaten vorbereiten und bearbeiten, um den Formaten zu entsprechen, und wie Sie die Keras-Deep-Learning-Bibliothek für verschiedene Kanalreihenfolgen konfigurieren.

Konkret haben Sie gelernt:

  • Die dreidimensionale Array-Struktur von Bildern und die Array-Formate „Kanäle zuerst“ und „Kanäle zuletzt“.
  • So fügen Sie eine Kanaldimension hinzu und wie konvertieren Sie Bilder zwischen den Kanalformaten.
  • Wie die Deep-Learning-Bibliothek von Keras die Reihenfolge bevorzugter Kanäle verwaltet und wie diese Präferenz geändert und abgefragt wird.

Haben Sie Fragen?
Stellen Sie Ihre Fragen in den Kommentaren unten und ich werde mein Bestes tun, um sie zu beantworten.

Verwandte Artikel