Image
Important
Databricks recommande d’utiliser la source de données de fichier binaire pour charger des données d’image dans le DataFrame Spark sous forme d’octets bruts. Pour plus d’informations sur le flux de travail recommandé pour traiter les données d’image, consultez Solution de référence pour les applications image.
La source de données d’image extrait les détails des représentations d’image et fournit une API standard pour charger les données d’image. Pour lire les fichiers image, spécifiez image
pour le format
de la source de données.
df = spark.read.format("image").load("<path-to-image-data>")
Des API similaires existent pour Scala, Java et R.
Vous pouvez importer une structure de répertoire imbriquée (par exemple, utiliser un chemin comme /path/to/dir/
) et vous pouvez utiliser la détection de partition en spécifiant un chemin d’accès avec un répertoire de partition (c’est-à-dire un chemin d’accès tel que /path/to/dir/date=2018-01-02/category=automobile
).
Structure des images
Les fichiers image sont chargés sous forme de DataFrame contenant une seule colonne de type struct appelée image
avec les champs suivants :
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
où se trouvent les champs :
nChannels
: Nombre de canaux de couleur. Les valeurs typiques sont 1 pour les images en nuances de gris, 3 pour les images colorées (par exemple, RVB) et 4 pour les images colorées avec canal alpha.mode
: Indicateur d’entier qui indique comment interpréter le champ de données. Il spécifie le type de données et l’ordre des canaux dans lesquels les données sont stockées. Il est attendu (mais pas obligatoire) que la valeur du champ corresponde à l’un des types OpenCV affichés dans le tableau suivant. Les types OpenCV sont définis pour un, deux, trois ou quatre canaux et plusieurs types de données pour les valeurs des 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 composantes rouge, bleue et verte, il y a six ordres possibles. La plupart des bibliothèques utilisent soit RVB, soit BGR. Les types OpenCV à trois (quatre) canaux sont censés être dans l’ordre BGR(A).Correspondance entre les types et les 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 sous la forme d’un tableau tridimensionnel avec une forme de dimension (hauteur, largeur, nombre de canaux) et des valeurs de tableau de type t spécifiées par le champ mode. Le tableau est stocké dans l’ordre row-major.
Affichage des données d’image
La fonction Databricks display
prend en charge l’affichage des données d’image. Voir Images.
Exemple de Notebook : Lire et écrire des données dans des fichiers images
Le notebook suivant montre comment lire et écrire des données dans des fichiers d’image.
Notebook de la source de données d’image
Limitations de la source de données image
La source de données d’image décode les fichiers d’image pendant la création du DataFrame Spark, augmente la taille des données et introduit des limitations dans les scénarios suivants :
- Persistance du DataFrame : Si vous voulez conserver le DataFrame dans une table Delta pour un accès plus facile, vous devez conserver les octets bruts au lieu des données décodées pour économiser de l’espace disque.
- Lecture aléatoire des partitions : La lecture aléatoire des données d’image décodées nécessite plus d’espace disque et de bande passante réseau, ce qui entraîne une lecture aléatoire plus lente. Vous devez retarder le décodage de l’image autant que possible.
- Choix d’une autre méthode de décodage : La source de données d’image utilise la bibliothèque Image IO de javax pour décoder l’image, ce qui vous empêche de choisir d’autres bibliothèques de décodage d’image pour améliorer les performances ou implémenter une logique de décodage personnalisée.
Ces limitations peuvent être évitées en utilisant la source de données de fichier binaire pour charger des données d’image et les décoder uniquement si nécessaire.