Fazer o download, o pré-processamento e o upload do conjunto de dados do ImageNet

Neste documento, descrevemos como fazer o download, o pré-processamento e o upload do conjunto de dados do ImageNet para uso com a arquitetura de VM do Cloud TPU.

O ImageNet é um banco de dados de imagens. As imagens nele estão organizadas de maneira hierárquica, e cada nó da hierarquia é representado por centenas e milhares de imagens.

O tamanho do banco de dados do ImageNet significa que o treinamento de um modelo pode levar um tempo considerável. Uma alternativa é usar uma versão de demonstração do conjunto de dados, chamada de fake_imagenet. Essa versão de demonstração permite testar o modelo e reduzir os requisitos de armazenamento e tempo associados ao uso do banco de dados completo do ImageNet.

Como pré-processar todo o conjunto de dados do ImageNet

O conjunto de dados do ImageNet consiste em três partes: dados de treinamento, dados de validação e rótulos de imagem.

Os dados de treinamento contêm mil categorias e 1,2 milhão de imagens, empacotadas para facilitar o download. Os dados de validação e de teste não estão contidos nos dados de treinamento do ImageNet (as cópias foram removidas).

Os dados de validação e de teste consistem em 150 mil fotografias, coletadas do Flickr e de outros mecanismos de pesquisa, que estão rotulados com a presença ou ausência de mil categorias de objeto. As mil categorias de objeto contêm nós internos e nós de folha do ImageNet, mas não se sobrepõem. Um subconjunto aleatório de 50 mil das imagens com rótulos foi lançado como dados de validação, com uma lista das mil categorias. As imagens restantes são usadas para avaliação e foram liberadas sem rótulos.

Etapas para pré-processar todo o conjunto de dados do ImageNet

Há cinco etapas para preparar todo o conjunto de dados do ImageNet para uso por um modelo de machine learning:

  1. Verifique se você tem espaço no local de destino do download.
  2. Configure os diretórios de destino.
  3. Cadastre-se no site do ImageNet e solicite uma permissão de download.
  4. Faça o download do conjunto de dados no disco local ou na instância de VM.

  5. Execute o script de pré-processamento e upload.

Verificar requisitos de espaço

Não importa se você vai fazer o download do conjunto de dados na máquina local ou em uma instância de VM, você ainda vai precisar de cerca de 300 GiB de espaço disponível nesse local de destino.

A alocação de disco padrão para uma VM de TPU é de 100 GiB. Como o download na VM de TPU exige 300 GiB, se você fizer o download na instância de VM de TPU, vai precisar adicionar um volume de armazenamento em blocos durável com 200 GiB de espaço adicional para concluir o download. Em uma VM de TPU, é possível verificar o armazenamento disponível usando o comando df -ha. Para saber como redimensionar discos conectados, consulte Modificar as configurações de um volume do Google Cloud Hyperdisk e Aumentar o tamanho de um volume do Persistent Disk.

Ao adicionar o armazenamento em blocos durável, anote o diretório em que você ativou o disco. Por exemplo, /mnt/disks/mnt-dir.

Configurar os diretórios de destino

Na máquina local ou na instância de VM, configure a estrutura de diretórios para armazenar os dados do download.

  1. Mude para o diretório em que você quer fazer o download dos dados. Ao usar um disco permanente, substitua DATASET_ROOT_DIR pelo diretório em que o disco está ativado, como /mnt/disks/mnt-dir:

    cd DATASET_ROOT_DIR
  2. Crie um diretório, como imagenet, no local de destino do download, seja a máquina local ou a VM de TPU.

    mkdir imagenet
    
  3. Nesse diretório, crie dois subdiretórios: train e validation.

    mkdir imagenet/train
    mkdir imagenet/validation
    
  4. Exporte o diretório imagenet como IMAGENET_HOME.

    export IMAGENET_HOME=DATASET_ROOT_DIR/imagenet
    sudo chown ${USER} ${IMAGENET_HOME}

Cadastrar-se e solicitar permissão para fazer o download do conjunto de dados

Cadastre-se no site do Imagenet. Só é possível fazer o download do conjunto de dados depois que o ImageNet confirma seu cadastro e envia um e-mail de confirmação. Se você não receber o e-mail de confirmação em alguns dias, entre em contato com o suporte do ImageNet para saber por que o cadastro não foi confirmado. Depois de confirmar o cadastro, faça o download do conjunto de dados. Os tutoriais do Cloud TPU que usam o conjunto de dados do ImageNet usam as imagens do ImageNet Large Scale Visual Recognition Challenge de 2012 (ILSVRC2012).

Fazer o download do conjunto de dados do ImageNet

  1. No site de download do LSRVC 2012, acesse a seção Imagens da página e clique com o botão direito do mouse em Imagens de treinamento (tarefas 1 e 2). O URL para fazer o download da maior parte do conjunto de treinamento. Salve o URL.

    Clique com o botão direito do mouse em Imagens de treinamento (tarefa 3) para ter acesso ao URL do segundo conjunto de treinamento. Salve o URL.

    Clique com o botão direito do mouse em Imagens de validação (todas as tarefas) para ter acesso ao URL do conjunto de dados de validação. Salve o URL.

    Ao fazer o download dos arquivos do ImageNet na máquina local, copie os diretórios dela para o diretório $IMAGENET_HOME correspondente na instância de VM. A cópia do conjunto de dados do ImageNet do host local para a instância de VM leva cerca de 13 horas.

    Antes de copiar o conjunto de dados do ImageNet para a VM de TPU, identifique o nome da instância da VM de TPU. Para isso, conecte-se por SSH à VM de TPU. O nome da instância de VM é mostrado no prompt de comando após o símbolo @.

    Use o comando a seguir para copiar os arquivos em ~/imagenet na máquina local para $IMAGENET_HOME na VM.

    gcloud compute scp --recurse $IMAGENET_HOME username@vm-instance-name:~/imagenet
  2. Em $IMAGENET_HOME, faça o download dos arquivos de Imagens de treinamento (tarefas 1 e 2) usando o URL salvo.

    O arquivo de Imagens de treinamento (tarefas 1 e 2) é o conjunto de treinamento grande. Ele tem 138 GiB. Ao fazer o download na VM de TPU usando o Cloud Shell, ele vai levar cerca de 40 horas. Se o Cloud Shell perder a conexão com a VM, adicione nohup ao início do comando ou use screen.

    cd $IMAGENET_HOME
    nohup wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train.tar

    Substitua o URL por aquele que você salvou anteriormente para Imagens de treinamento (tarefas 1 e 2), já que ele pode ter mudado.

  3. Extraia os diretórios de treinamento individuais no diretório $IMAGENET_HOME/train usando o comando a seguir. A extração leva de uma a três horas.

    tar xf $IMAGENET_HOME/ILSVRC2012_img_train.tar -C $IMAGENET_HOME/train

    Extraia os arquivos .tar de treinamento individuais que estão no diretório $IMAGENET_HOME/train, conforme mostrado neste script:

    cd $IMAGENET_HOME/train

    for f in *.tar; do d=basename $f .tar mkdir $d tar xf $f -C $d done

    Exclua os arquivos .tar depois de extraí-los para liberar espaço em disco.

  4. Em $IMAGENET_HOME, faça o download dos arquivos de Imagens de treinamento (tarefa 3) usando o URL salvo.

    O arquivo de Imagens de treinamento (tarefa 3) tem 728 MB e o download dele leva apenas alguns minutos. Portanto, não se preocupe com a perda da conexão do Cloud Shell.

    wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train_t3.tar

    Substitua o URL por aquele que você salvou anteriormente para Imagens de treinamento (tarefa 3), já que ele pode ter mudado.

  5. Extraia os diretórios de treinamento individuais no diretório $IMAGENET_HOME/train usando o comando a seguir.

    tar xf $IMAGENET_HOME/ILSVRC2012_img_train_t3.tar -C $IMAGENET_HOME/train

    Extraia os arquivos .tar de treinamento individuais que estão no diretório $IMAGENET_HOME/train, conforme mostrado neste script:

    cd ${IMAGENET_HOME}/train
    
    for f in *.tar; do
        d=`basename $f .tar`
        mkdir $d
        tar xf $f -C $d
    done

    Exclua os arquivos .tar depois de extraí-los para liberar espaço em disco.

  6. Em $IMAGENET_HOME, faça o download dos arquivos de Imagens de validação (todas as tarefas) usando o URL salvo.

    Ao fazer o download do arquivo de Imagens de validação (todas as tarefas), o Cloud Shell pode ser desconectado. Você pode usar nohup ou screen para evitar a desconexão do Cloud Shell.

    wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_val.tar

    Substitua o URL por aquele que você salvou anteriormente para Imagens de validação (todas as tarefas), já que ele pode ter mudado.

    Esse download leva cerca de 30 minutos.

  7. Extraia os arquivos de validação individuais no diretório $IMAGENET_HOME/validation usando o comando a seguir.

    tar xf $IMAGENET_HOME/ILSVRC2012_img_val.tar -C $IMAGENET_HOME/validation

    Ao fazer o download dos arquivos de validação na máquina local, copie o diretório $IMAGENET_HOME/validation dela para o diretório $IMAGENET_HOME/validation na instância de VM. Essa operação de cópia leva cerca de 30 minutos.

  8. Faça o download do arquivo de rótulos.

    wget -O $IMAGENET_HOME/synset_labels.txt \
    https://raw.githubusercontent.com/tensorflow/models/master/research/slim/datasets/imagenet_2012_validation_synset_labels.txt

    Ao fazer o download do arquivo de rótulos na máquina local, copie o diretório $IMAGENET_HOME dela para $IMAGENET_HOME na instância de VM. Essa operação de cópia leva alguns segundos.

    Os nomes dos subdiretórios de treinamento, como n03062245, são IDs do WordNet (wnid). A API ImageNet mostra a associação dos IDs do WordNet com os rótulos de validação no arquivo synset_labels.txt. Uma sincronia nesse contexto é um grupo visualmente semelhante de imagens.

Processar o conjunto de dados do ImageNet e, opcionalmente, fazer o upload dele no Cloud Storage

  1. No GitHub, faça o download do script imagenet_to_gcs.py:

    wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
  2. Ao fazer o upload do conjunto de dados no Cloud Storage:

    1. Use um bucket atual ou crie um novo seguindo as instruções em Criar buckets.

    2. Especifique o local do bucket de armazenamento para fazer o upload do conjunto de dados do ImageNet:

      export STORAGE_BUCKET=gs://bucket-name
  3. Ao fazer o upload do conjunto de dados na VM ou na máquina local, especifique um diretório de dados para armazenar o conjunto:

    (vm)$ export DATA_DIR=$IMAGENET_HOME/dataset-directory
  4. Instale as seguintes bibliotecas na máquina ou em um ambiente virtual:

    pip3 install google-cloud-storage
    pip3 install tensorflow
    
  5. Execute o script para pré-processar o conjunto de dados bruto como TFRecords e faça o upload dele no Cloud Storage usando este comando:

     python3 imagenet_to_gcs.py \
      --project=$PROJECT \
      --gcs_output_path=$STORAGE_BUCKET  \
      --raw_data_dir=$IMAGENET_HOME \
      --local_scratch_dir=$IMAGENET_HOME/tf_records

O script gera um conjunto de diretórios do formulário para treinamento e validação:

${DATA_DIR}/train-00000-of-01024
${DATA_DIR}/train-00001-of-01024
...
${DATA_DIR}/train-01023-of-01024

e

${DATA_DIR}/validation-00000-of-00128
${DATA_DIR}/validation-00001-of-00128
...
${DATA_DIR}/validation-00127-of-00128

Depois do upload dos dados no bucket do Cloud, execute o modelo e defina --data_dir=${DATA_DIR}.