Načítání obrazových souborů

Důležité

Databricks doporučuje používat datový zdroj binární soubor k načtení obrazových dat do Spark DataFrame ve formě nezpracovaných bajtů. Viz Referenční řešení pro aplikace obrázků pro doporučené pracovní postupy pro zpracování dat obrázků.

Zdroj dat obrázku poskytuje standardní rozhraní API pro načítání souborů obrázků do datových rámců Sparku jako dekódované struktury a poskytuje přímý přístup k metadatům obrázků, jako je výška, šířka, počet kanálů a nezpracovaná pixelová data. Primárně se používá v kanálech předzpracování strojového učení, kde jsou pole strukturovaných obrázků povinná spolu s pixelovými daty. Azure Databricks podporuje zdroj obrazových dat pro dávkové načítání, včetně rozpoznávání oddílů pro uspořádané adresáře s obrázky. Chcete-li číst soubory obrázků, zadejte zdroj format dat jako image.

Předpoklady

Azure Databricks nevyžaduje další konfiguraci pro použití zdroje dat image.

Možnosti

Ke konfiguraci zdroje obrazových dat použijte metody .option() a .options() objektu DataFrameReader. Úplný seznam podporovaných možností najdete v referenčních informacích k možnostem rozhraní Spark API.

Usage

Následující příklady ukazují načítání souborů obrázků pomocí rozhraní API datového rámce Sparku, výběru polí metadat obrázků, zobrazení miniatur obrázků a uložení dekódovaných dat obrázků do tabulky Delta.

Načíst soubory obrázků

K načtení souborů obrázků do datového rámce použijte rozhraní API datového rámce Apache Spark. Vnořenou strukturu adresářů můžete importovat zadáním cesty k adresáři a rozpoznávání oddílů použít zadáním cesty s adresářem oddílu (například /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'
)

Výběr metadat obrázků

Pokud chcete pracovat s rozměry obrazu nebo informacemi o kanálu bez zpracování celých obrazových dat, vyberte ze sloupce struktury konkrétní pole image .

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'
)

Zobrazení dat obrázku

Funkce Databricks display vykresluje miniatury obrázků přímo ve sloupci image při práci se zdrojem dat image. Podporované možnosti zobrazení najdete v části Obrázky .

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'
)

Uložení dat obrázku do tabulky Delta

Pokud chcete zvýšit výkon čtení při načítání dat obrázků zpět, uložte datový rámec do tabulky Delta.

Note

Zdroj dat obrázku ukládá dekódovaná pixelová data, což zvyšuje využití disku v porovnání s nezpracovanými bajty. Pro úsporné trvalé ukládání dat použijte místo toho datový zdroj binární soubor.

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>")

Výstupní schéma

Soubory obrázků se načtou jako datový rámec obsahující jeden sloupec typu struktury, který se nazývá image s následujícími poli:

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)

Následující pole popisují soubor obrázku a jeho dekódovaná pixelová data.

  • origin: Cesta k souboru se zdrojovým obrázkem.
  • height: Výška obrázku v pixelech.
  • width: Šířka obrázku v pixelech.
  • nChannels: Počet barevných kanálů. Typické hodnoty jsou 1 pro obrázky ve stupních šedé, 3 pro barevné obrázky (například RGB) a 4 pro barevné obrázky s alfa kanálem.
  • mode: Celočíselná příznak označující, jak interpretovat datové pole. Určuje datový typ a pořadí kanálů, ve které jsou data uložená. Hodnota pole se očekává (ale nevynucuje) pro mapování na jeden z typů OpenCV zobrazených v následující tabulce. Typy OpenCV jsou definovány pro 1, 2, 3 nebo 4 kanály a několik datových typů pro hodnoty pixelů. Pořadí kanálů určuje pořadí, ve kterém jsou barvy uloženy. Pokud máte například typický obrázek se třemi kanály s červenými, modrými a zelenými komponentami, existuje šest možných objednávek. Většina knihoven používá RGB nebo BGR. Očekává se, že tříkanálové (čtyřkanálové) typy OpenCV mají kanály v pořadí BGR(A).

Mapování typu na čísla v OpenCV (datové typy x počet kanálů)

Typ 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: Obrazová data uložená v binárním formátu. Data obrázku jsou reprezentována jako trojrozměrné pole s rozměry (výška, šířka, nChannels) a hodnotami pole typu t, určené režimem. Pole je uloženo v pořadí hlavního řádku.

Limitations

Vzhledem k tomu, že zdroj dat obrázku dekóduje soubory obrázků během vytváření datového rámce, zvyšuje velikost dat a má následující omezení:

  • Využití disku při ukládání: Dekódovaná obrazová data jsou výrazně větší než surové bajty. Pokud datový rámec zachováte do tabulky Delta, uložte nezpracované bajty místo dekódovaných dat, abyste ušetřili místo na disku.
  • Výkon náhodného prohazování: Náhodné prohazování dekódovaných obrazových dat vyžaduje více místa na disku a větší šířku pásma sítě, což vede k pomalejším operacím náhodného prohazování. Odložte dekódování v rámci pipeline co nejdéle.
  • Oprava dekódovací knihovny: Zdroj dat obrázků používá knihovnu javax Image IO k dekódování obrázků, což vám brání v použití alternativních dekódovacích knihoven pro lepší výkon nebo vlastní dekódovací logiku.

Abyste se těmto omezením vyhnuli, použijte zdroj binárních dat ze souboru k načtení obrazových dat a dekódujte je jen podle potřeby.

Dodatečné zdroje

  • Čtení binárních souborů: Pokud vaše úloha vyžaduje nezpracované bajty obrazu namísto dekódované struktury, datový zdroj binárních souborů se vyhne režii dekódování a omezením datového zdroje obrázků.