Converter um conjunto de dados de classificação de imagens para utilização com a Cloud TPU
Este tutorial descreve como usar o script de exemplo do conversor de dados de classificação de imagens para converter um conjunto de dados de classificação de imagens não processadas no formato TFRecord usado para preparar modelos de TPU na nuvem.
Os TFRecords tornam a leitura de ficheiros grandes do Cloud Storage mais eficiente do que a leitura de cada imagem como um ficheiro individual. Pode usar o TFRecord em qualquer lugar onde esteja a usar um pipeline tf.data.Dataset
.
Consulte os seguintes documentos do TensorFlow para mais informações sobre a utilização do TFRecord:
- TFRecord e tf.train.Example
- tf.data.Dataset
- tf.data: crie pipelines de entrada do TensorFlow
- Leitor e gravador TFRecord do PyTorch
Se usar a framework PyTorch ou JAX e não usar o Cloud Storage para o armazenamento do conjunto de dados, pode não obter a mesma vantagem dos TFRecords.
Vista geral das conversões
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 exemplo, simple_example.py
, que pode copiar e modificar para fazer
a sua própria conversão de dados.
O exemplo do conversor de dados de classificação de imagens define duas classes: ImageClassificationConfig
e ImageClassificationBuilder
. Estas aulas estão definidas em tpu/tools/data_converter/image_classification_data.py
.
ImageClassificationConfig
é uma classe base abstrata. Subclasse ImageClassificationConfig
para definir a configuração necessária para instanciar um ImageClassificationBuilder
.
O ImageClassificationBuilder
é um criador de conjuntos de dados do TensorFlow
para conjuntos de dados de classificação de imagens. É uma subclasse de tdfs.core.GeneratorBasedBuilder
.
Extrai exemplos de dados do conjunto de dados e converte-os em TFRecords. Os TFRecords são escritos num caminho especificado pelo parâmetro data_dir
para o método __init__
de ImageClassificationBuilder
.
Em simple_example.py,
SimpleDatasetConfig
é uma subclasse de ImageClassificationConfig
, que implementa
propriedades que definem os modos suportados, o número de classes de imagens e um
gerador de exemplos que produz um dicionário com dados de imagens e uma classe
de imagens para cada exemplo no conjunto de dados.
A função main()
cria um conjunto de dados de dados de imagens gerados aleatoriamente e instancia um objeto SimpleDatasetConfig
que especifica o número de classes e o caminho para o conjunto de dados no disco. Em seguida, main()
instancia um objeto ImageClassificationBuilder
, transmitindo a instância SimpleDatasetConfig
. Por fim, main()
liga a download_and_prepare()
. Quando este método é chamado, a instância ImageClassificationBuilder
usa o gerador de exemplos de dados implementado por SimpleDatasetConfig
para carregar cada exemplo e guardá-los numa série de ficheiros TFRecord.
Para uma explicação mais detalhada, consulte o Bloco de notas do conversor de classificação.
Modificar o exemplo de conversão de dados para carregar o conjunto de dados
Para converter o seu conjunto de dados no formato TFRecord, crie uma subclasse da classe ImageClassificationConfig
que defina as seguintes propriedades:
- num_labels: devolve o número de classes de imagens
- supported_modes: devolve uma lista de modos suportados pelo seu conjunto de dados (por exemplo: test, train e validate)
- text_label_map: devolve um dicionário que modela o mapeamento entre uma etiqueta de classe de texto e uma etiqueta de classe de número inteiro (SimpleDatasetConfig não usa esta propriedade, porque não requer um mapeamento)
- download_path: o caminho a partir do qual transferir o conjunto de dados (SimpleDatasetConfig não usa esta propriedade, o example_generator carrega os dados do disco)
Implemente a função do gerador example_generator. Este método tem de gerar um dicionário que contenha os dados da imagem e o nome da classe da imagem para cada exemplo.
ImageClassificationBuilder
usa a função example_generator()
para obter cada exemplo e escreve-os no disco no formato TFRecord.
Executar o exemplo de conversão de dados
Crie um contentor do Cloud Storage com o seguinte comando:
gcloud storage buckets create gs://bucket-name --project=your-project-id --location=us-central2
Inicie uma Cloud TPU através do comando
gcloud
.$ gcloud compute tpus tpu-vm create tpu-name \ --zone=us-central2-b \ --accelerator-type=v4-8 \ --version=tpu-vm-tf-2.17.1-pjrt
Descrições das flags de comando
zone
- A zona onde planeia criar a sua Cloud TPU.
accelerator-type
- O tipo de acelerador especifica a versão e o tamanho da Cloud TPU que quer criar. Para mais informações sobre os tipos de aceleradores suportados para cada versão da TPU, consulte Versões da TPU.
version
- A versão do software do Cloud TPU.
Estabeleça ligação à TPU através de SSH:
$ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b
Quando se liga à TPU, a linha de comandos da shell muda de
username@projectname
parausername@vm-name
.Instale os pacotes necessários.
(vm)$ pip3 install opencv-python-headless pillow (vm)$ pip3 install tensorflow-datasets
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"
Transfira o repositório da TPU do TensorFlow.
(vm)$ cd /usr/share/ (vm)$ git clone https://github.com/tensorflow/tpu.git (vm)$ cd tpu/tools/data_converter
Executar o conversor de dados num conjunto de dados falso
O script simple_example.py
encontra-se na pasta image_classification
do exemplo do conversor de dados. A execução do script com os seguintes parâmetros gera um conjunto de imagens falsas e converte-as 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
Executar o conversor de dados num dos nossos conjuntos de dados não processados
Crie uma variável de ambiente para a localização dos dados não processados.
(vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
Execute o
simple_example.py
script.(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
refere-se ao número de classes no conjunto de dados. Estamos a usar 1000 aqui para corresponder ao formato ImageNet.generate
determina se os dados não processados são gerados ou não.data_path
refere-se ao caminho onde os dados são gerados segenerate=True
ou ao caminho onde os dados não processados são armazenados segenerate=False
.num_examples_per_class_low
enum_examples_per_class_high
determinam quantos exemplos por classe gerar. O script gera um número aleatório de exemplos neste intervalo.save_dir
refere-se ao local onde os TFRecords guardados são guardados. Para formar um modelo na Cloud TPU, os dados têm de ser armazenados no Cloud Storage. Pode estar no Cloud Storage ou na VM.
Mudar o nome e mover os TFRecords para o Cloud Storage
O exemplo seguinte usa os dados convertidos com o modelo ResNet.
Mude o nome dos TFRecords para o mesmo formato que os TFRecords do ImageNet:
(vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/ (vm)$ sudo apt update (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
Desligue-se da Cloud TPU, se ainda não o tiver feito:
(vm)$ exit
O comando deve agora ser
user@projectname
, o que indica que está no Cloud Shell.No Cloud Shell, execute
gcloud
para eliminar o recurso de VM.$ gcloud compute tpus tpu-vm delete tpu-name \ --zone=us-central2-b
Verifique se a VM foi eliminada executando
gcloud compute tpus tpu-vm list
. A eliminação pode demorar vários minutos. Uma resposta como a seguinte indica que as suas instâncias foram eliminadas com êxito.$ gcloud compute tpus tpu-vm list --zone=us-central2-b
Listed 0 items.
Execute a CLI gcloud conforme mostrado, substituindo bucket-name pelo nome do contentor do Cloud Storage que criou para este tutorial:
$ gcloud storage rm gs://bucket-name --recursive