Immagine
Importante
Databricks consiglia di usare l'origine dati file binario per caricare i dati dell'immagine nel DataFrame Spark come byte non elaborati. Per il flusso di lavoro consigliato per gestire i dati delle immagini, vedere Soluzione di riferimento per le applicazioni di immagini.
L'origine dati dell'immagine crea un riepilogo dai dettagli delle rappresentazioni delle immagini e fornisce un'API standard per caricare i dati dell'immagine. Per leggere i file di immagine, specificare l'origine dati format
come image
.
df = spark.read.format("image").load("<path-to-image-data>")
Esistono API simili per Scala, Java e R.
È possibile importare una struttura di directory annidata (ad esempio, utilizzare un percorso come /path/to/dir/
) ed è possibile utilizzare l'individuazione partition specificando un percorso con una directory partition, ovvero un percorso come /path/to/dir/date=2018-01-02/category=automobile
.
Struttura dell'immagine
I file di immagine vengono caricati come dataframe contenenti un singolo column di tipo struct denominato image
con i campi seguenti:
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
where i campi sono:
nChannels
: numero di canali colore. Le values tipiche 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 (anche se non obbligatorio) per eseguire il mapping a uno dei tipi OpenCV visualizzati nella seguente table. I tipi OpenCV sono definiti per 1, 2, 3 o 4 canali e diversi tipi di dati per il pixel values. 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. È previsto che tre (quattro) tipi OpenCV del canale siano in ordine BGR(A).Mappa di abbinamento tra tipo e numeri in OpenCV (tipi di dati x numero di canali)
Tipo C1 S2 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 la matrice values di tipo t specificato dal campo modalità. La matrice è archiviata in ordine di riga più grande.
Visualizzare i dati delle immagini
La funzione Databricks display
supporta la visualizzazione dei dati dell'immagine. Vedere Immagini.
Esempio di notebook: Leggere e scrivere dati in file di immagine
Il notebook seguente illustra come leggere e scrivere dati in file di immagine.
Notebook dell'origine dati immagine
Limitazioni dell'origine dati dell'immagine
L'origine dati dell'immagine decodifica i file di immagine durante la creazione del DataFrame Spark, aumenta le dimensioni dei dati e introduce limitazioni nei seguenti scenari:
- Persistenza del DataFrame: se si desidera persistere il DataFrame in un Delta table per un accesso più semplice, è consigliabile rendere persistenti i Byte non elaborati anziché i dati decodificati per risparmiare spazio su disco.
- Ordine casuale delle partizioni: l'ordine casuale dei dati di immagine decodificati richiede più spazio su disco e larghezza di banda di rete, con un rallentamento della sequenza casuale. È consigliabile ritardare la decodifica dell'immagine il più possibile.
- Scelta di un altro metodo di decodifica: l'origine dati dell'immagine usa la libreria di I/O immagine di javax per decodificare l'immagine, impedendo così di scegliere altre librerie di decodifica delle immagini per ottenere prestazioni migliori o implementare una logica di decodifica personalizzata.
Queste limitazioni possono essere evitate usando l'origine dati del file binario per caricare i dati di immagine e decodificarli solo in base alle esigenze.