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:

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

  1. Crie um contentor do Cloud Storage com o seguinte comando:

    gcloud storage buckets create gs://bucket-name --project=your-project-id --location=us-central2
  2. 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.
  3. 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 para username@vm-name.

  4. Instale os pacotes necessários.

    (vm)$ pip3 install opencv-python-headless pillow
    (vm)$ pip3 install tensorflow-datasets
  5. 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"
  6. 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

  1. 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
  2. Execute o simple_example.pyscript.

    (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 se generate=True ou ao caminho onde os dados não processados são armazenados se generate=False.
  • num_examples_per_class_low e num_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.

  1. 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' *
  2. Copie os TFRecords para o Cloud Storage:

    (vm)$ gcloud storage cp train* $GCS_CONVERTED
    (vm)$ gcloud storage cp validation* $GCS_CONVERTED

Limpar

  1. 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.

  2. No Cloud Shell, execute gcloud para eliminar o recurso de VM.

    $ gcloud compute tpus tpu-vm delete tpu-name \
      --zone=us-central2-b
  3. 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.
    
  4. 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