Lire des fichiers image
Databricks vous recommande d'utiliser la source de données de fichiers binaires pour charger les données d'image dans le Spark DataFrame sous forme d'octets bruts. Consultez la solution de référence pour les applications d'image pour le workflow recommandé pour gérer les données d'image.
La source de données d'image fournit une API standard pour charger des fichiers image dans des DataFrames Spark en tant que struct décodé, vous donnant un accès direct aux métadonnées d'image telles que la hauteur, la largeur, le nombre de canaux et les données de pixels brutes. Il est principalement utilisé dans les pipelines de prétraitement machine learning où des champs d'image structurés sont requis en même temps que les données de pixels. Databricks prend en charge la source de données d'image pour les lectures batch, y compris la découverte de partitions pour les répertoires d'images organisés. Pour lire les fichiers image, spécifiez la source de données format en tant que image.
Prérequis
Databricks ne nécessite pas de configuration supplémentaire pour utiliser la source de données d'image.
Options
Utilisez les méthodes .option() et .options() de DataFrameReader pour configurer l'origine de données de l'image. Pour une liste complète des options prises en charge, voir référence des options Spark API.
Utilisation
Les exemples suivants montrent comment charger des fichiers image à l'aide de l'API Spark DataFrame, sélectionner des champs de métadonnées d'image, afficher des miniatures d'image et enregistrer des données d'image décodées dans une table Delta.
Lire des fichiers image
Utilisez l'API Apache Spark DataFrame pour charger les fichiers image dans un DataFrame. Vous pouvez importer une structure de répertoires imbriqués en fournissant un chemin de répertoire, et utiliser la découverte de partition en spécifiant un chemin avec un répertoire de partition (par exemple, /path/to/dir/date=2018-01-02/category=automobile).
- Python
- Scala
- SQL
# Read all images from a directory
df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
display(df)
# Use partition discovery by specifying a partitioned path
df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/date=2024-01-01/category=dogs/")
display(df)
// Read all images from a directory
val df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.show()
// Use partition discovery by specifying a partitioned path
val partitioned = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/date=2024-01-01/category=dogs/")
partitioned.show()
-- Read all images from a directory
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'image'
)
Sélectionner les métadonnées de l'image
Pour travailler avec les dimensions d'image ou les informations de canal sans traiter l'intégralité des données de pixels, sélectionnez des champs spécifiques de la colonne de structure image.
- Python
- Scala
- SQL
df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
metadata = df.select("image.origin", "image.height", "image.width", "image.nChannels")
display(metadata)
val df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
val metadata = df.select("image.origin", "image.height", "image.width", "image.nChannels")
metadata.show()
SELECT image.origin, image.height, image.width, image.nChannels FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'image'
)
Afficher les données d'image
La fonction Databricks display affiche les miniatures d’images directement dans la colonne image lorsque vous travaillez avec la source de données d’image. Consultez Images pour les options d'affichage prises en charge.
- Python
- Scala
- SQL
df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
display(df)
val df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.show()
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'image'
)
Enregistrer les données d'image dans une table Delta
Pour améliorer les performances de lecture lors du rechargement des données d'image, enregistrez le DataFrame dans une table Delta.
La source de données d'image stocke les données de pixels décodées, ce qui augmente l'utilisation du disque par rapport aux octets bruts. Pour une persistance économe en stockage, utilisez plutôt la source de données de fichier binaire.
- Python
- Scala
df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
val df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
Schéma de sortie
Les fichiers image sont chargés en tant que DataFrame contenant une seule colonne de type struct appelée image avec les champs suivants :
root
|-- image: struct (nullable = true)
| |-- origin: string (nullable = true)
| |-- height: integer (nullable = false)
| |-- width: integer (nullable = false)
| |-- nChannels: integer (nullable = false)
| |-- mode: integer (nullable = false)
| |-- data: binary (nullable = false)
Les champs suivants décrivent le fichier image et ses données de pixels décodées.
origin: Chemin du fichier de l'image source.height: La hauteur de l'image en pixels.width: la largeur de l'image en pixels.nChannels: Le nombre de canaux de couleur. Les valeurs typiques sont 1 pour les images en niveaux de gris, 3 pour les images en couleur (par exemple, RVB) et 4 pour les images en couleur avec canal alpha.modeIndicateur entier qui indique comment interpréter le champ de données. Elle spécifie le type de données et l'ordre des canaux dans lesquels les données sont stockées. La valeur du champ est censée (mais sans obligation) correspondre à l'un des types OpenCV affichés dans le tableau suivant. Les types OpenCV sont définis pour 1, 2, 3 ou 4 canaux et plusieurs types de données pour les valeurs de pixels. L'ordre des canaux spécifie l'ordre dans lequel les couleurs sont stockées. Par exemple, si vous avez une image typique à trois canaux avec des composants rouges, bleus et verts, il existe six ordres possibles. La plupart des bibliothèques utilisent le format RVB ou BVR. Trois (quatre) types de canaux OpenCV sont attendus dans l'ordre BGR(A).
Mappage du type aux nombres dans OpenCV (types de données x nombre de canaux)
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: Données d'image stockées dans un format binaire. Les données d'image sont représentées comme un tableau tridimensionnel avec la forme de dimension (hauteur, largeur, nCanaux) et les valeurs de tableau de type t spécifiées par le champ de mode. Le tableau est stocké en ordre ligne par ligne.
Limitations
Étant donné que la source de données d’image décode les fichiers image lors de la création de DataFrame, cela augmente la taille des données et présente les limitations suivantes :
- Utilisation du disque lors de la persistance : les données d’image décodées sont nettement plus volumineuses que les octets bruts. Si vous persistez le DataFrame dans une table Delta, stockez les octets bruts au lieu des données décodées pour économiser de l’espace disque.
- Performances du shuffle : Le shuffle des données d'image décodées nécessite plus d'espace disque et de bande passante réseau, ce qui entraîne des Opérations de shuffle plus lentes. Reportez le décodage aussi longtemps que possible dans votre pipeline.
- Bibliothèque de décodage fixe : La source de données d'image utilise la bibliothèque javax Image IO pour décoder les images, ce qui vous empêche d'utiliser des bibliothèques de décodage alternatives pour une meilleure performance ou une logique de décodage personnalisée.
Pour éviter ces limitations, utilisez la source de données de fichier binaire pour charger les données d'image et ne les décodez qu'en cas de besoin.
Ressources supplémentaires
- Lire des fichiers binaires: Si votre charge de travail nécessite des octets d'image bruts plutôt qu'une structure décodée, la source de données de fichiers binaires évite le surcoût de décodage et les limitations de la source de données d'image.