Path: blob/master/site/pt-br/tutorials/load_data/images.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
Carregue e faça o pré-processamento de imagens
Este tutorial mostra como carregar e fazer o pré-processamento de um dataset de imagens de três maneiras:
Primeiro, você usará utilitários de pré-processamento do Keras de alto nível (como
tf.keras.utils.image_dataset_from_directory
) e camadas (comotf.keras.layers.Rescaling
) para ler um diretório de imagens no disco.Em seguida, você escreverá seu próprio pipeline de entrada do zero usando tf.data.
Por fim, você baixará um dataset do vasto catálogo disponível no TensorFlow Datasets.
Configuração
Baixe o dataset Flowers
Este tutorial usa um dataset de milhares de fotos de flores. O dataset Flowers contém cinco subdiretórios, um por classe:
Observação: todas as imagens têm uma licença CC-BY. Os criadores estão listados no arquivo LICENSE.txt.
Depois de baixar (218MB), você terá uma cópia das fotos de flores disponíveis. Há 3.670 imagens no total:
Cada diretório contém imagens do tipo específico de flor. Aqui estão algumas rosas:
Carregue os dados usando um utilitário do Keras
Vamos carregar essas imagens fora do disco usando o utilitário tf.keras.utils.image_dataset_from_directory
prático.
Crie um dataset
Defina alguns parâmetros para o loader:
É recomendável usar uma divisão de validação ao desenvolver seu modelo. Você usará 80% das imagens para treinamento e 20% para validação.
Encontre os nomes das classes na característica class_names
desses datasets.
Visualize os dados
Aqui estão as primeiras nove imagens do dataset de treinamento.
Você pode treinar um modelo usando esses datasets ao passá-los para model.fit
(mostrado mais adiante neste tutorial). Se você quiser, também pode iterar o dataset manualmente e recuperar lotes de imagens:
O image_batch
é um tensor de formato (32, 180, 180, 3)
. Ele é um lote de 32 imagens com o formato 180x180x3
(a última dimensão refere-se aos canais de cores RGB). O label_batch
é um tensor de formato (32,)
, que são os rótulos correspondentes às 32 imagens.
Você pode chamar .numpy()
em qualquer um desses tensores para convertê-los em um numpy.ndarray
.
Padronize os dados
Os valores de canais RGB estão no intervalo [0, 255]
. Isso não é o ideal para uma rede neural. Em geral, você deve procurar diminuir seus valores de entrada.
Aqui, você padronizará os valores para colocá-los no intervalo [0, 1]
usando tf.keras.layers.Rescaling
:
Há duas maneiras de usar essa camada. Você pode aplicá-la ao dataset ao chamar Dataset.map
:
Ou você pode incluir a camada dentro da definição do modelo para simplificar a implantação. Você usará a segunda abordagem aqui.
Observação: se você quiser escalar os valores de pixel para [-1,1]
, é possível escrever tf.keras.layers.Rescaling(1./127.5, offset=-1)
.
Observação: você redimensionou imagens anteriormente usando o argumento image_size
de tf.keras.utils.image_dataset_from_directory
. Se você quiser incluir a lógica de redimensionamento no seu modelo também, pode usar a camada tf.keras.layers.Resizing
.
Configure o dataset para melhor desempenho
Vamos usar a pré-busca em buffer para gerar dados do disco sem o bloqueio de I/O. Esses são dois métodos importantes que você deve usar ao carregar os dados:
Dataset.cache
mantém a imagem na memória após o carregamento fora do disco durante a primeira época. Isso garante que o dataset não se torne um gargalo ao treinar seu modelo. Se o dataset for muito grande para a memória, você também pode usar esse método para criar um cache no disco eficaz.Dataset.prefetch
sobrepõe o pré-processamento de dados e a execução do modelo durante o treinamento.
Os leitores interessados podem saber mais sobre ambos os métodos, além de como armazenar os dados em cache no disco, na seção Pré-busca do guia Melhor desempenho com a API tf.data.
Treine um modelo
Para completar, veja como treinar um modelo simples usando os datasets que você acabou de preparar.
O modelo Sequential consiste em três blocos de convolução (tf.keras.layers.Conv2D
) com uma camada de pooling máximo (tf.keras.layers.MaxPooling2D
) em cada um. Há uma camada totalmente conectada (tf.keras.layers.Dense
) com 128 unidades sobre ela, que é ativada por uma função de ativação ReLU ('relu'
). Esse modelo não foi ajustado de maneira alguma — o objetivo é mostrar a mecânica de uso dos datasets que você acabou de criar. Para saber mais sobre a classificação de imagens, acesse o tutorial Classificação de imagens.
Escolha o otimizador tf.keras.optimizers.Adam
e a função de perda tf.keras.losses.SparseCategoricalCrossentropy
. Para ver a exatidão do treinamento e da validação para cada época de treinamento, passe o argumento metrics
para Model.compile
.
Observação: você só treinará para algumas épocas, então este tutorial é rápido.
Observação: você também pode escrever um loop de treinamento personalizado em vez de usar Model.fit
. Para saber mais, acesse o tutorial Escrevendo um loop de treinamento do zero.
Talvez a exatidão da validação seja baixa comparada à exatidão do treinamento, indicando o overfitting do modelo. Saiba mais sobre o overfitting e como reduzir isso neste tutorial.
Usando tf.data para controle mais fino
O utilitário de pré-processamento do Keras acima — tf.keras.utils.image_dataset_from_directory
— é uma maneira conveniente de criar um tf.data.Dataset
a partir de um diretório de imagens.
Para um controle granular mais fino, você pode escrever seu próprio pipeline de entrada usando tf.data
. Esta seção mostra como fazer exatamente isso, começando com os caminhos do arquivo TGZ que você já baixou.
A estrutura de árvores dos arquivos pode ser usada para compilar uma lista class_names
.
Divida o dataset em conjuntos de treinamento e validação.
Você pode imprimir o comprimento de cada dataset da seguinte maneira:
Escreva uma breve função para converter um caminho de arquivo em um par (img, label)
:
Use Dataset.map
para criar um dataset de pares image, label
:
Configure o dataset para melhor desempenho
Para treinar um modelo com esse dataset, os dados devem:
Ser bem misturados.
Ser divididos em lotes.
Ter os lotes disponíveis assim que possível.
Essas características podem ser adicionadas usando a API tf.data
. Para mais detalhes, acesse o guia Desempenho do pipeline de entrada.
Visualize os dados
É possível visualizar esse dataset de forma parecida com o que você criou antes.
Continue a treinar o modelo
Você criou manualmente um tf.data.Dataset
parecido com o criado pelo tf.keras.utils.image_dataset_from_directory
acima. É possível continuar a treinar o modelo com ele. Como antes, você treinará para apenas algumas épocas, diminuindo o tempo de execução.
Usando o TensorFlow Datasets
Até aqui, este tutorial focou no carregamento de dados fora do disco. Você também pode encontrar um dataset para usar explorando o vasto catálogo de datasets que podem ser facilmente baixados no TensorFlow Datasets.
Como você já carregou o dataset Flowers fora do disco, vamos importá-lo com o TensorFlow Datasets.
Baixe o dataset Flowers usando o TensorFlow Datasets:
O dataset Flowers tem cinco classes:
Recupere uma imagem do dataset:
Como antes, lembre-se de criar lotes, misturar os dados e configurar os datasets de treinamento, validação e teste para melhor desempenho:
Encontre um exemplo completo de como trabalhar com o dataset Flowers e o TensorFlow Datasets ao acessar o tutorial Ampliação de dados.
Próximos passos
Este tutorial mostra duas maneiras de carregar imagens fora do disco. Primeiro, você aprendeu a carregar e fazer o pré-processamento de um dataset de imagens usando camadas e utilitários de pré-processamento do Keras. Em seguida, você aprendeu a escrever um pipeline de entrada do zero usando tf.data
. Por fim, você aprendeu a baixar um dataset do TensorFlow Datasets.
Para seus próximos passos:
Aprenda a adicionar a ampliação de dados.
Para saber mais sobre o
tf.data
, acesse o guia tf.data: Crie pipelines de entrada do TensorFlow.