Image

Wichtig

Databricks empfiehlt, die Binärdatei-Datenquelle zu verwenden, um Bilddaten als Rohbytes in den Spark DataFrame zu laden. Siehe Referenzlösung für Bildanwendungen für den empfohlenen Workflow zum Umgang mit Image-Daten.

Die Image-Datenquelle abstrahiert die Details der Bilddarstellungen und stellt eine Standard-API zum Laden von Image-Daten bereit. Um Image-Dateien zu lesen, geben Sie die Datenquelle format als image an.

df = spark.read.format("image").load("<path-to-image-data>")

Ähnliche APIs sind für Scala, Java und R vorhanden.

Sie können eine geschachtelte Verzeichnisstruktur importieren (z. B. einen Pfad wie /path/to/dir/ verwenden) und Sie können die Partitionsermittlung verwenden, indem Sie einen Pfad mit einem Partitionsverzeichnis (d. h. einem Pfad wie /path/to/dir/date=2018-01-02/category=automobile) angeben.

Image-Struktur

Image-Dateien werden als Datenrahmen geladen, der eine einzelne Strukturtyp-Spalte namens image mit den folgenden Feldern enthält:

image: struct containing all the image data
  |-- origin: string representing the source URI
  |-- height: integer, image height in pixels
  |-- width: integer, image width in pixels
  |-- nChannels
  |-- mode
  |-- data

dabei sind die Felder:

  • nChannels: Die Anzahl der Farbkanäle. Typische Werte sind 1 für Graustufenbilder, 3 für farbige Bilder (z. B. RGB) und 4 für farbige Bilder mit Alphakanal.

  • mode: Integer-Flag, das angibt, wie das Datenfeld zu interpretieren ist. Es gibt den Datentyp und die Kanalreihenfolge an, in der die Daten gespeichert werden. Der Wert des Felds wird erwartet (aber nicht erzwungen), um einem der in der folgenden Tabelle angezeigten OpenCV-Typen zu zuordnen. OpenCV-Typen werden für 1, 2, 3 oder 4 Kanäle und mehrere Datentypen für die Pixelwerte definiert. Kanalreihenfolge gibt die Reihenfolge an, in der die Farben gespeichert werden. Wenn Sie beispielsweise über ein typisches Bild mit drei Kanälen mit roten, blauen und grünen Komponenten verfügen, gibt es sechs mögliche Reihenfolgen. Die meisten Bibliotheken verwenden entweder RGB oder BGR. Es wird erwartet, dass drei (vier) OpenCV-Kanaltypen in BGR(A)-Reihenfolge sind.

    Zuordnen des Typs zu Zahlen in OpenCV (Datentypen x Anzahl von Kanälen)

    Type C1 C2 C3 C4
    CV_8U 0 8 16 24
    CV_8S 1 9 17 25
    CV_16U 2 10 18 26
    CV_16S 3 11 19 27
    CV_32U 4 12 20 28
    CV_32S 5 13 21 29
    CV_64F 6 14 22 30
  • data: Image-Daten, die in einem Binärformat gespeichert sind. Bilddaten werden als ein dreidimensionales Array mit der Dimensionsform (Höhe, Breite, nChannels) und Arraywerten vom Typ t dargestellt, die vom Modusfeld angegeben werden. Das Array wird in zeilenweiser Reihenfolge gespeichert.

Anzeigen von Image-Daten

Die Databricks display-Funktion unterstützt das Anzeigen von Image-Daten. Weitere Informationen finden Sie unter Images.

Notebookbeispiel: Lesen und Schreiben von Daten in Image-Dateien

Im folgenden Notebook wird gezeigt, wie Sie Daten in Image-Dateien lesen und schreiben können.

Notebook für Image-Datenquellen

Notebook abrufen

Einschränkungen der Image-Datenquelle

Die Image-Datenquelle decodiert die Image-Dateien während der Erstellung des Spark-Datenrahmens, erhöht die Datengröße und führt in den folgenden Szenarien zu Einschränkungen:

  1. Beibehalten des Datenrahmens: Wenn Sie den Datenrahmen für einen einfacheren Zugriff in einer Delta-Tabelle beibehalten möchten, sollten Sie die unformatierten Bytes anstelle der decodierten Daten beibehalten, um Speicherplatz zu sparen.
  2. Shuffling der Partitionen: Das Shuffling der decodierten Image-Daten erfordert mehr Speicherplatz und Netzwerkbandbreite, was zu einem langsameren Shuffling führt. Sie sollten die Decodierung des Images so weit wie möglich verzögern.
  3. Auswählen einer anderen Decodierungsmethode: Die Image-Datenquelle verwendet die Image-E/A-Bibliothek von javax, um das Image zu decodieren. Dadurch können Sie keine anderen Image-Decodierungsbibliotheken auswählen, um eine bessere Leistung zu erzielen oder eine angepasste Decodierungslogik zu implementieren.

Diese Einschränkungen können vermieden werden, indem die Binärdatei-Datenquelle verwendet wird, um Bilddaten zu laden und nur bei Bedarf zu decodieren.