Imagem

Importante

A Databricks recomenda que você use o arquivo binário fonte de dados para carregar dados de imagem no Spark DataFrame como bytes brutos. Consulte Soluções de referência para aplicativos de imagem para obter o fluxo de trabalho recomendado para lidar com dados de imagem.

A imagem fonte de dados abstrai os detalhes das representações de imagens e fornece uma API padrão para carregar dados de imagens. Para ler arquivos de imagem, especifique a fonte de dados format como image.

df = spark.read.format("image").load("<path-to-image-data>")

Existem APIs semelhantes para Scala, Java e R.

Você pode importar uma estrutura de diretório aninhada (por exemplo, usar um caminho como /path/to/dir/) e usar a descoberta de partição especificando um caminho com um diretório de partição (ou seja, um caminho como /path/to/dir/date=2018-01-02/category=automobile).

Estrutura da imagem

Os arquivos de imagem são carregados como um DataFrame contendo uma única coluna do tipo struct chamada image com os seguintes campos:

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

onde estão os campos:

  • nChannels: O número de canais de cores. Os valores típicos são 1 para imagens em tons de cinza, 3 para imagens coloridas (por exemplo, RGB) e 4 para imagens coloridas com canal alfa.

  • mode: Flag inteiro que indica como interpretar o campo de dados. Ele especifica o tipo de dados e a ordem do canal em que os dados são armazenados. Espera-se que o valor do campo (mas não obrigatório) seja mapeado para um dos tipos OpenCV exibidos na tabela a seguir. Os tipos OpenCV são definidos para 1, 2, 3 ou 4 canais e vários tipos de dados para os valores de pixel. ordem do canal especifica a ordem em que as cores são armazenadas. Por exemplo, se você tiver uma imagem típica de três canais com componentes vermelho, azul e verde, existem seis ordenações possíveis. A maioria das bibliotecas usa RGB ou BGR. Espera-se que três (quatro) tipos de canais OpenCV estejam na ordem BGR(A).

    Mapa de tipo para números em OpenCV (tipos de dados x número de canal)

    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: Dados de imagem armazenados em formato binário. Os dados da imagem são representados como uma matriz tridimensional com o formato da dimensão (altura, largura, nCanais) e valores de matriz do tipo t especificados pelo campo de modo. A matriz é armazenada em ordem de linha principal.

Exibir dados de imagem

A função display do Databricks dá suporte à exibição de dados de imagem. Veja Imagens.

Exemplo Notebook : ler e gravar dados em arquivos de imagem

O Notebook a seguir mostra como ler e gravar dados em arquivos de imagem.

Notebook de fonte de dados de imagem

Abra o bloco de anotações em outra guia

Limitações da imagem fonte de dados

A imagem fonte de dados decodifica os arquivos de imagem durante a criação do Spark DataFrame, aumenta o tamanho dos dados e introduz limitações nos seguintes cenários:

  1. Persistindo o DataFrame: Se quiser persistir o DataFrame em uma tabela Delta para facilitar o acesso, você deve persistir os bytes brutos em vez dos dados decodificados para economizar espaço em disco.

  2. Embaralhamento das partições: O embaralhamento dos dados da imagem decodificada ocupa mais espaço em disco e largura de banda da rede, o que resulta em um embaralhamento mais lento. Você deve atrasar a decodificação da imagem tanto quanto possível.

  3. Escolhendo outro método de decodificação: A imagem fonte de dados utiliza a biblioteca Image IO do javax para decodificar a imagem, o que impede que você escolha outras bibliotecas de decodificação de imagens para melhor desempenho ou implemente lógica de decodificação customizada.

Essas limitações podem ser evitadas usando o arquivo binário fonte de dados para carregar os dados da imagem e decodificar apenas quando necessário.