Pular para o conteúdo principal

Imagem

important

Databricks recomenda que o senhor use o arquivo binário fonte de dados para carregar dados de imagem no site 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 fonte de dados de imagem abstrai os detalhes das representações de imagem e fornece um padrão API para carregar dados de imagem. Para ler arquivos de imagem, especifique a fonte de dados format como image.

Python
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órios aninhada (por exemplo, usar um caminho como /path/to/dir/) e usar a descoberta de partições 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 que contém 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 os campos são:

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

  • mode: sinalizador de número 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 (mas não imposto) que o valor do campo seja mapeado para um dos tipos de OpenCV exibidos na tabela a seguir. Os tipos do OpenCV são definidos para 1, 2, 3 ou 4 canais e vários tipos de dados para os valores de pixel. canal order especifica a ordem em que as cores são armazenadas. Por exemplo, se o senhor tiver uma imagem típica de três canais com componentes vermelhos, azuis e verdes, há seis ordenações possíveis. A maioria das bibliotecas usa RGB ou BGR. Espera-se que três (quatro) tipos de canal OpenCV estejam na ordem BGR(A).

    Mapa de tipo para números no OpenCV (tipos de dados x número de canais)

    | 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 a forma da dimensão (altura, largura, nChannels) e os valores da matriz do tipo t especificados pelo campo mode. A matriz é armazenada na ordem principal da linha.

Exibir dados da imagem

A função Databricks display suporta a exibição de dados de imagem. Veja as imagens.

Notebook exemplo: Ler e gravar dados em arquivos de imagem

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

Image fonte de dados Notebook

Open notebook in new tab

Limitações da fonte de dados de imagem

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

  1. Persistência do DataFrame: Se quiser manter o DataFrame em uma tabela Delta para facilitar o acesso, o senhor deve manter os bytes brutos em vez dos dados decodificados para economizar espaço em disco.
  2. Embaralhar as partições: embaralhar os dados da imagem decodificada ocupa mais espaço em disco e largura de banda da rede, o que resulta em uma mistura mais lenta. Você deve atrasar a decodificação da imagem o máximo possível.
  3. Escolha de outro método de decodificação: A fonte de dados de imagem usa a biblioteca Image IO do javax para decodificar a imagem, o que impede que o senhor escolha outra biblioteca de decodificação de imagem para obter melhor desempenho ou implementar uma lógica de decodificação personalizada.

Essas limitações podem ser evitadas com o uso do arquivo binário fonte de dados para carregar dados de imagem e decodificar somente quando necessário.