Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Importante
Databricks consiglia di utilizzare l'origine dati file binario per caricare i dati delle immagini nel DataFrame di Spark come byte grezzi. Per il flusso di lavoro consigliato per gestire i dati delle immagini, vedere Soluzione di riferimento per le applicazioni di immagini.
L'origine dati delle immagini fornisce un'API standard per caricare file di immagine nei DataFrame di Spark come una struct decodificata, fornendo accesso diretto ai metadati dell'immagine, quali altezza, larghezza, numero di canali e dati grezzi dei pixel. Viene usato principalmente nelle pipeline di pre-elaborazione di Machine Learning in cui sono necessari campi immagine strutturati insieme ai dati pixel. Azure Databricks supporta l'origine dati per immagini per le letture in batch, incluso il rilevamento delle partizioni nelle directory di immagini organizzate. Per leggere i file di immagine, specificare l'origine dati format come image.
Prerequisiti
Azure Databricks non richiede una configurazione aggiuntiva per l'uso dell'origine dati dell'immagine.
Options
Usare i metodi .option() e .options() di DataFrameReader per configurare l'origine dei dati dell'immagine. Per un elenco completo delle opzioni supportate, vedere riferimento delle opzioni dell'API Spark.
Usage
Gli esempi seguenti illustrano il caricamento di file di immagine usando l'API DataFrame Spark, la selezione dei campi dei metadati dell'immagine, la visualizzazione delle anteprime delle immagini e il salvataggio di dati immagine decodificati in una tabella Delta.
Leggere i file di immagine
Usare l'API dataframe apache Spark per caricare i file di immagine in un dataframe. È possibile importare una struttura di directory annidata fornendo un percorso di directory e usare l'individuazione della partizione specificando un percorso con una directory di partizione , ad esempio /path/to/dir/date=2018-01-02/category=automobile.
Python
# 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)
Scala
// 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()
SQL
-- Read all images from a directory
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'image'
)
Selezionare i metadati dell'immagine
Per usare le dimensioni dell'immagine o le informazioni sul canale senza elaborare i dati in pixel completi, selezionare campi specifici dalla image colonna struct.
Python
df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
metadata = df.select("image.origin", "image.height", "image.width", "image.nChannels")
display(metadata)
Scala
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()
SQL
SELECT image.origin, image.height, image.width, image.nChannels FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'image'
)
Visualizzare i dati delle immagini
La funzione Databricks display visualizza le anteprime delle immagini direttamente nella colonna image quando si lavora con l'origine dati image. Vedere Immagini per le opzioni di visualizzazione supportate.
Python
df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
display(df)
Scala
val df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.show()
SQL
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'image'
)
Salvare i dati dell'immagine in una tabella Delta
Per migliorare le prestazioni di lettura durante il caricamento dei dati dell'immagine, salvare il dataframe in una tabella Delta.
Annotazioni
L'origine dati dell'immagine archivia i dati in pixel decodificati, aumentando così l'utilizzo del disco rispetto ai byte non elaborati. Per una persistenza efficiente in termini di spazio di archiviazione, usare invece l'origine dati file binario.
Python
df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
Scala
val df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
Schema di output.
I file di immagine vengono caricati come dataframe contenenti una singola colonna di tipo struct denominata image con i campi seguenti:
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)
I campi seguenti descrivono il file di immagine e i relativi dati pixel decodificati.
-
origin: percorso del file dell'immagine di origine. -
height: altezza dell'immagine in pixel. -
width: larghezza dell'immagine in pixel. -
nChannels: Il numero di canali di colore. I valori tipici sono 1 per le immagini in scala di grigio, 3 per le immagini colorate (ad esempio RGB) e 4 per le immagini colorate con canale alfa. -
mode: flag con numero intero che indica come interpretare il campo dati. Specifica il tipo di dati e l'ordine del canale in cui vengono archiviati i dati. Il valore del campo è previsto (ma non applicato) per eseguire il mapping a uno dei tipi OpenCV visualizzati nella tabella seguente. I tipi OpenCV sono definiti per 1, 2, 3 o 4 canali e diversi tipi di dati per i valori pixel. L'ordine del canale specifica l'ordine in cui vengono archiviati i colori. Ad esempio, se si dispone di un'immagine di tre canali tipica con componenti rosso, blu e verde, sono disponibili sei ordinamenti possibili. La maggior parte delle librerie usa RGB o BGR. I tipi OpenCV a tre (quattro) canali devono essere nell'ordine BGR(A).
Mappa di tipo a numeri in OpenCV (tipi di dati x numero di canali)
| Tipo | 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: dati di immagine archiviati in un formato binario. I dati dell'immagine sono rappresentati come matrice tridimensionale con la forma della dimensione (altezza, larghezza, nChannels) e i valori della matrice di tipo t specificati dal campo modalità. La matrice è archiviata in ordine di riga più grande.
Limitations
Poiché l'origine dati immagine decodifica i file di immagine durante la creazione del dataframe, aumenta le dimensioni dei dati e presenta le limitazioni seguenti:
- Utilizzo del disco durante la persistenza: i dati di immagine decodificati sono significativamente maggiori dei byte non elaborati. Se si salva il dataframe in una tabella Delta, archiviare i byte non elaborati anziché i dati decodificati per risparmiare spazio su disco.
- Prestazioni di shuffle: lo shuffle dei dati immagine decodificati richiede più spazio su disco e larghezza di banda di rete, con operazioni di shuffle più lente. Ritarda la decodifica il più a lungo possibile nel flusso di elaborazione.
- Libreria di decodifica predefinita: l'origine dei dati dell'immagine usa la libreria javax Image I/O per decodificare le immagini, il che impedisce di utilizzare librerie di decodifica alternative per ottenere prestazioni migliori o logiche di decodifica personalizzate.
Per evitare queste limitazioni, usare l'origine dati del file binario per caricare i dati dell'immagine e decodificarli solo in base alle esigenze.
Risorse aggiuntive
- Leggere i file binari: se il carico di lavoro richiede byte di immagini non elaborate anziché uno struct decodificato, l'origine dati del file binario evita il sovraccarico di decodifica e le limitazioni dell'origine dati dell'immagine.