Чтение файлов изображений

Внимание

Databricks рекомендует использовать источник данных двоичный файл для загрузки данных изображений в DataFrame Spark в виде необработанных байтов. Рекомендуемый рабочий процесс для обработки данных изображения см. в разделе Эталонное решение для приложений, работающих с изображениями.

Источник данных изображения предоставляет стандартный API для загрузки файлов изображений в Кадры данных Spark в виде декодированной структуры, предоставляя прямой доступ к метаданным изображения, таким как высота, ширина, количество каналов и необработанные данные пикселей. Он в основном используется в конвейерах предварительной обработки машинного обучения, где требуются структурированные поля изображений вместе с данными пикселей. Azure Databricks поддерживает источник данных изображений для пакетного чтения, включая обнаружение разделов для структурированных каталогов изображений. Для чтения файлов изображений укажите источник данных format как image.

Предварительные требования

Azure Databricks не требует дополнительной настройки для использования источника данных изображений.

Options

Используйте методы .option() и .options() класса DataFrameReader для настройки источника данных изображения. Полный список поддерживаемых параметров см. в справочнике по параметрам API Spark.

Usage

В следующих примерах демонстрируется загрузка файлов изображений с помощью API Кадра данных Spark, выбор полей метаданных изображения, отображение эскизов изображений и сохранение декодированных данных изображения в разностную таблицу.

Чтение файлов изображений

Используйте API DataFrame Apache Spark для загрузки файлов изображений во фрейм данных. Можно импортировать вложенную структуру каталогов, указав путь к каталогу и используя обнаружение секций, указав путь с каталогом секции (например, /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'
)

Выбор метаданных изображения

Чтобы работать с измерениями изображения или данными канала без обработки данных полного пикселя, выберите определенные поля из столбца 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'
)

Отображение данных изображения

Функция Databricks display отображает эскизы изображений непосредственно в столбце image при работе с источником данных изображения. Сведения о поддерживаемых параметрах отображения см. в разделе "Изображения ".

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

Сохранение данных изображения в таблице Delta

Чтобы повысить производительность чтения при последующей загрузке данных изображений, сохраните DataFrame в таблицу Delta.

Note

Источник данных изображения хранит декодированные данные пикселей, что увеличивает использование диска по сравнению с необработанными байтами. Для эффективного хранения используйте вместо этого источник данных двоичного файла .

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

Выходная схема

Файлы изображений загружаются в виде DataFrame, содержащего один столбец типа структуры, который называется image со следующими полями:

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)

В следующих полях описан файл изображения и декодированные данные пикселей.

  • origin: путь к файлу исходного образа.
  • height: высота изображения в пикселях.
  • width: ширина изображения в пикселях.
  • nChannels: количество цветовых каналов. Типичными значениями являются 1 для изображений серого уровня, 3 для цветных изображений (например, RGB) и 4 для цветных изображений с альфа-каналом.
  • mode: целочисленный флаг, указывающий способ интерпретации поля данных. Он указывает тип данных и порядок каналов, в которых хранятся данные. Ожидается, что значение поля должно соответствовать одному из типов OpenCV, отображаемых в следующей таблице, но это не обязательно. Типы OpenCV определяются для 1, 2, 3 или 4 каналов и нескольких типов данных для значений пикселей. Порядок каналов задает порядок, в котором хранятся цвета. Например, если у вас есть типичное трехканальное изображение с красными, синими и зелеными компонентами, существует шесть возможных порядков. Большинство библиотек используют либо RGB, либо BGR. Ожидается, что три (четыре) канала типа OpenCV будут представлены в порядке BGR (A).

Сопоставление типов с числами в OpenCV (типы данных x число каналов)

Тип 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: данные изображения, хранящиеся в двоичном формате. Данные изображения представлены в виде трехмерного массива с фигурой измерения (высота, ширина, nChannels) и значениями массива типа t, заданного полем режима. Массив хранится в построчном порядке.

Limitations

Так как источник данных изображения декодирует файлы изображений во время создания кадра данных, он увеличивает размер данных и имеет следующие ограничения:

  • Использование диска при хранении: Декодированные данные изображения значительно превышают объём исходных байтов. Если вы сохраняете DataFrame в таблице Delta, сохраняйте необработанные байты вместо декодированных данных, чтобы сэкономить место на диске.
  • Производительность перемешивания: Перемешивание данных декодированного изображения требует больше дискового пространства и пропускной способности сети, что приводит к замедлению операций перемешивания. Откладывайте декодирование как можно дольше в вашем конвейере.
  • Фиксированная библиотека декодирования: Источник данных изображения использует библиотеку javax Image IO для декодирования изображений, что не позволяет использовать альтернативные библиотеки декодирования для повышения производительности или собственной логики декодирования.

Чтобы избежать этих ограничений, используйте источник данных «Двоичный файл», чтобы загружать данные изображения и декодировать их только при необходимости.

Дополнительные ресурсы

  • Чтение двоичных файлов. Если для рабочей нагрузки требуются необработанные байты изображений, а не декодированные структуры, источник данных двоичного файла избегает декодирования затрат и ограничений источника данных изображения.