Como converter um conjunto de dados de classificação de imagem para uso com o Cloud TPU
Neste tutorial, descrevemos como usar o script de amostra de conversor de dados de classificação de imagens para converter um conjunto de dados brutos de classificação de imagens no formato TFRecord usado para treinar modelos do Cloud TPU.
Os TFRecords facilitam
a leitura de arquivos grandes do Cloud Storage é mais eficiente do que a leitura de cada
a imagem como um arquivo individual. É possível usar o TFRecord sempre que você usa um
pipeline tf.data.Dataset
.
Consulte os seguintes documentos do TensorFlow para mais informações sobre como usar o TFRecord:
- TFRecord e tf.train.Example
- tf.data.Dataset (em inglês)
- tf.data: criar pipelines de entrada do TensorFlow
- Leitor e gravador do PyTorch TFRecord
Se você usa o framework PyTorch ou JAX e não usa o Cloud Storage para armazenamento de conjunto de dados, talvez não tenha a mesma vantagem dos TFRecords.
Visão geral da conversão
A pasta de classificação de imagens no repositório do conversor de dados
no GitHub contém o script converter
, image_classification_data.py
e uma
implementação de amostra, simple_example.py
, que podem ser copiados e modificados para você fazer a própria
conversão de dados.
A amostra de conversão de dados de classificação de imagem define duas classes, ImageClassificationConfig
e ImageClassificationBuilder
. Essas classes são definidas em tpu/tools/data_converter/image_classification_data.py
.
ImageClassificationConfig
é uma classe base abstrata. Você usa a subclasse ImageClassificationConfig
para definir a configuração necessária para criar uma instância de ImageClassificationBuilder
.
ImageClassificationBuilder
é um builder de conjunto de dados do Tensorflow
para conjuntos de dados de classificação de imagens. É uma subclasse de tdfs.core.GeneratorBasedBuilder
.
Ele recupera exemplos de dados do conjunto de dados e os converte em TFRecords. Os TFRecords são gravados em um caminho especificado pelo parâmetro data_dir
para o método __init__
de ImageClassificationBuilder
.
Em simples_example.py, SimpleDatasetConfig
usa a subclasse ImageClassificationConfig
, implementando propriedades que definem os modos compatíveis, o número de classes de imagem e um gerador de exemplo que produz um dicionário contendo dados de imagem e uma classe de imagem para cada exemplo no conjunto de dados.
A função main()
cria um conjunto de dados de imagem gerados aleatoriamente e instancia um objeto SimpleDatasetConfig
, especificando o número de classes e o caminho para o conjunto de dados no disco. Em seguida, main()
instancia um objeto ImageClassificationBuilder
, inserindo a instância SimpleDatasetConfig
. Por fim, main()
chama download_and_prepare()
. Quando esse método é chamado, a instância ImageClassificationBuilder
usa o gerador de exemplo de dados implementado por SimpleDatasetConfig
para carregar cada exemplo e os salva em uma série de arquivos TFRecord.
Para uma explicação mais detalhada, consulte o Notebook do conversor de classificação.
Como modificar a amostra de conversão de dados para carregar seu conjunto de dados
Para converter seu conjunto de dados no formato TFRecord, subclassifique a classe ImageClassificationConfig
que define as seguintes propriedades:
- num_labels: retorna o número de classes de imagem
- supported_modes: retorna uma lista de modos compatíveis com seu conjunto de dados (por exemplo: teste, treinamento e validação)
- text_label_map: retorna um dicionário que modela o mapeamento entre um rótulo de classe de texto e um rótulo de classe de número inteiro (SimpleDatasetConfig não usa essa propriedade, porque não requer um mapeamento)
- download_path: o caminho do qual fazer o download do conjunto de dados (SimpleDatasetConfig não usa essa propriedade, o example_generator carrega os dados do disco)
Implemente a função do gerador example_generator. Esse método precisa produzir um dicionário contendo os dados da imagem e o nome da classe da imagem para cada exemplo.
ImageClassificationBuilder
usa a função example_generator()
para recuperar cada exemplo e grava-os no disco no formato TFRecord.
Como executar a amostra de conversão de dados
Crie um bucket do Cloud Storage usando o seguinte comando:
gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central2
Inicie uma Cloud TPU usando o comando
gcloud
.$ gcloud compute tpus tpu-vm create tpu-name \ --zone=us-central2-b \ --accelerator-type=v4-8 \ --version=tpu-vm-tf-2.17.0-pjrt
Descrições de sinalizações de comando
zone
- A zona em que você planeja criar a Cloud TPU.
accelerator-type
- O tipo de acelerador especifica a versão e o tamanho do Cloud TPU que você quer criar. Para mais informações sobre os tipos de aceleradores compatíveis com cada versão de TPU, consulte versões de TPU.
version
- A versão do software do Cloud TPU.
Conecte-se à TPU usando SSH:
$ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b
Quando você se conecta à TPU, o prompt do shell muda de
username@projectname
parausername@vm-name
.Instalar os pacotes necessários
(vm)$ pip3 install opencv-python-headless pillow
Crie as seguintes variáveis de ambiente usadas pelo script.
(vm)$ export STORAGE_BUCKET=gs://bucket-name (vm)$ export CONVERTED_DIR=$HOME/tfrecords (vm)$ export GENERATED_DATA=$HOME/data (vm)$ export GCS_CONVERTED=$STORAGE_BUCKET/data_converter/image_classification/tfrecords (vm)$ export GCS_RAW=$STORAGE_BUCKET/image_classification/raw (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
Altere para o diretório
data_converter
:(vm)$ cd /usr/share/tpu/tools/data_converter
Como executar o conversão de dados em um conjunto de dados falso
O script simple_example.py
está localizado na pasta image_classification
da amostra do conversor de dados. Executar o script com os parâmetros a seguir gera um conjunto de imagens falsas e as converte em TFRecords.
(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GENERATED_DATA \ --generate=True \ --num_examples_per_class_low=10 \ --num_examples_per_class_high=11 \ --save_dir=$CONVERTED_DIR
Como executar o conversão de dados em um dos nossos conjuntos de dados brutos
Crie uma variável de ambiente para o local dos dados brutos.
(vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
Execute o script
simple_example.py
:(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GCS_RAW \ --generate=False \ --save_dir=$CONVERTED_DIR
O script simple_example.py
usa os seguintes parâmetros:
num_classes
se refere ao número de classes no conjunto de dados. Usamos 1.000 aqui para corresponder ao formato ImageNetgenerate
determina se os dados brutos serão ou não gerados.data_path
se refere ao caminho onde os dados devem ser gerados segenerate=True
ou o caminho onde os dados brutos são armazenados segenerate=False
.num_examples_per_class_low
enum_examples_per_class_high
determinam quantos exemplos cada classe gerar. O script gera um número aleatório de exemplos nesse intervalo.save_dir
se refere ao local onde os TFRecords salvos são armazenados. Para treinar um modelo no Cloud TPU, os dados precisam ser armazenados no Cloud Storage. Isso pode ser feito no Cloud Storage ou na VM.
Como renomear e mover os TFRecords para o Cloud Storage
O exemplo a seguir usa os dados convertidos com o modelo ResNet.
Renomeie os TFRecord para o mesmo formato que os TFRecords ImageNet:
(vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/ (vm)$ sudo apt install rename
(vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
Copie os TFRecords para o Cloud Storage:
(vm)$ gcloud storage cp train* $GCS_CONVERTED (vm)$ gcloud storage cp validation* $GCS_CONVERTED
Limpar
Desconecte-se do Cloud TPU, caso ainda não tenha feito isso:
(vm)$ exit
Agora, o prompt será
user@projectname
, mostrando que você está no Cloud Shell.No Cloud Shell, execute
gcloud
para excluir o recurso de VM.$ gcloud compute tpus tpu-vm delete tpu-name \ --zone=us-central2-b
Execute
gcloud compute tpus tpu-vm list
para verificar se a VM foi excluída. A exclusão pode levar vários minutos. Uma resposta como esta indica suas instâncias foram excluídas.$ gcloud compute tpus tpu-vm list --zone=us-central2-b
Listed 0 items.
Execute a CLI gcloud conforme mostrado, substituindo bucket-name por o nome do bucket do Cloud Storage criado para este tutorial:
$ gcloud storage rm gs://bucket-name --recursive