Treinamento com o algoritmo integrado de detecção de objetos de imagem

O treinamento com algoritmos integrados no AI Platform Training permite enviar o conjunto de dados e treinar um modelo, sem a necessidade de escrever qualquer código de treinamento. Nesta página, explicamos como funciona o algoritmo integrado de detecção de objetos de imagem e como usá-lo.

Visão geral

O algoritmo integrado de detecção de objetos de imagem usa os conjuntos de dados de treinamento e de validação para treinar modelos de maneira contínua. Na sequência, ele produz o SavedModel mais preciso gerado durante o processo do job de treinamento. É possível também usar o ajuste de hiperparâmetros para atingir a melhor precisão do modelo. É possível usar o SavedModel exportado diretamente para previsão, seja localmente ou implantado no AI Platform Prediction para serviço de produção.

Limitações

Os algoritmos integrados de imagem permitem treinamento com CPUs, GPUs ou TPUs únicas. O SavedModel resultante é compatível com exibição em CPUs e GPUs.

Os seguintes recursos não permitem treinamento com o algoritmo integrado de detecção de objetos de imagem:

Tipos de máquina compatíveis

Os níveis de escalonamento e tipos de máquina do AI Platform Training a seguir são compatíveis:

  • ScaleTier BASIC
  • ScaleTier BASIC_TPU
  • CUSTOMNível de escalonamento PERSONALIZADO com qualquer um dos tipos de máquina do Compute Engine compatíveis com o AI Platform Training.
  • CUSTOMNível de escalonamento PERSONALIZADO com qualquer um dos tipos de máquina legados a seguir:
    • standard
    • large_model
    • complex_model_s
    • complex_model_m
    • complex_model_l
    • standard_gpu
    • standard_p100
    • standard_v100
    • large_model_v100
    • complex_model_m_gpu
    • complex_model_l_gpu
    • complex_model_m_p100
    • complex_model_m_v100
    • complex_model_l_v100
    • TPU_V2 (8 núcleos)

Autorize o acesso da Cloud TPU ao projeto

Siga estas etapas para autorizar o nome da conta de serviço do Cloud TPU associada ao seu projeto do Google Cloud:

  1. Chame projects.getConfig para receber o nome da conta de serviço do Cloud TPU. Exemplo:

    PROJECT_ID=PROJECT_ID
    
    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
        https://ml.googleapis.com/v1/projects/$PROJECT_ID:getConfig
    
  2. Salve os valores dos campos serviceAccountProject e tpuServiceAccount retornados pela API.

  3. Inicialize a conta de serviço do Cloud TPU:

    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
      -H "Content-Type: application/json" -d '{}'  \
      https://serviceusage.googleapis.com/v1beta1/projects/<serviceAccountProject>/services/tpu.googleapis.com:generateServiceIdentity
    

Agora adicione a conta de serviço da Cloud TPU como membro do seu projeto, com o papel Agente de serviço do Cloud ML. Conclua as etapas a seguir no Console do Google Cloud ou usando o comando gcloud:

Console

  1. Faça login no Console do Google Cloud e escolha o projeto em que você usa a TPU.
  2. Escolha IAM e Admin > IAM.
  3. Clique no botão Adicionar para adicionar um membro ao projeto.
  4. Digite a conta de serviço de TPU na caixa de texto Membros.
  5. Clique na lista suspensa Papéis.
  6. Ative o papel Agente de serviço do Cloud ML (Agentes de serviço > Agente de serviço do Cloud ML).

gcloud

  1. Defina as variáveis de ambiente que contêm o ID do projeto e a conta de serviço da Cloud TPU:

    PROJECT_ID=PROJECT_ID
    SVC_ACCOUNT=your-tpu-sa-123@your-tpu-sa.google.com.iam.gserviceaccount.com
    
  2. Atribua o papel ml.serviceAgent à conta de serviço do Cloud TPU.

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member serviceAccount:$SVC_ACCOUNT --role roles/ml.serviceAgent
    

Para mais detalhes sobre a concessão de papéis a contas de serviço, consulte a documentação do IAM.

Formatar dados de entrada para treinamento

O algoritmo integrado de detecção de objetos de imagem requer que os dados de entrada sejam formatados como tf.Examples e salvos no(s) arquivo(s) TFRecord. A estrutura de dados de tf.Example e o formato de arquivo TFRecord foram projetados para uma leitura de dados eficiente com o TensorFlow.

O TFRecord é um formato simples para armazenar uma sequência de registros binários. Neste caso, todos os registros contêm representações binárias de imagens. Cada imagem, com os respectivos rótulos de classe, é representada como tf.Example. É possível salvar muitos tf.Examples em um único arquivo TFRecord. É possível também fragmentar um conjunto de dados grande em vários arquivos TFRecord.

Saiba mais sobre TFRecord e tf.Example (em inglês).

Converter as imagens em TFRecords

Para converter imagens so formato necessário para receber previsões, siga o guia do TensorFlow Model Garden e prepare entradas para a detecção de objetos.

Verificar as permissões do bucket do Cloud Storage

Para armazenar seus dados, use um bucket do Cloud Storage no mesmo projeto do Google Cloud usado para executar jobs do AI Platform Training. Caso contrário, conceda acesso de treinamento do AI Platform ao intervalo do Cloud Storage onde os dados estão armazenados.

Formato de entrada obrigatório

Para treinar com o algoritmo integrado de detecção de objetos de imagem, os dados da imagem precisam ser estruturados como tf.Examples que incluam os seguintes campos:

  • image/encoded é a imagem bruta codificada como uma string.

  • image/object/class/label é uma lista de rótulos inteiros para a imagem correspondente (um rótulo por caixa).

    O conjunto de rótulos inteiros usados para o conjunto de dados precisa ser uma sequência consecutiva a partir de 1. Por exemplo, se o conjunto de dados tiver cinco classes, cada rótulo precisará ser um número inteiro no intervalo [1, 5].

  • image/object/bbox/xmin é uma lista de coordenadas x esquerda normalizadas para a imagem correspondente (uma coordenada por caixa). Cada coordenada precisa estar no intervalo [0, 1].

  • image/object/bbox/xmax é uma lista de coordenadas x corretas normalizadas para a imagem correspondente (uma coordenada por caixa). Cada coordenada precisa estar no intervalo [0, 1].

  • image/object/bbox/ymin é uma lista de coordenadas superior y normalizadas para a imagem correspondente (uma coordenada por caixa). Cada coordenada precisa estar no intervalo [0, 1].

  • image/object/bbox/ymax é uma lista de coordenadas y inferiores inferiorizadas para a imagem correspondente (uma coordenada por caixa). Cada coordenada precisa estar no intervalo [0, 1].

O exemplo a seguir mostra a estrutura de um tf.Example para uma imagem que contém duas caixas delimitadoras. A primeira caixa tem o rótulo 1, o canto superior esquerdo está nas coordenadas normalizadas (0.1, 0.4) e o canto inferior direito está nas coordenadas normalizadas (0.5, 0.8). A segunda caixa tem o rótulo 2, o canto superior esquerdo está nas coordenadas normalizadas (0.3, 0.5) e o canto inferior direito está nas coordenadas normalizadas (0.4, 0.7).

{
    'image/encoded': '<encoded image data>',
    'image/object/class/label': [1, 2],
    'image/object/bbox/xmin': [0.1, 0.3],
    'image/object/bbox/xmax': [0.5, 0.4],
    'image/object/bbox/ymin': [0.4, 0.5],
    'image/object/bbox/ymax': [0.8, 0.7]
}

Esse formato tf.Example segue o mesmo usado no script de detecção de objetos TFRecord.

Como atingir o melhor SavedModel no resultado

Quando o job de treinamento for concluído, o AI Platform Training gravará um SavedModel do TensorFlow no intervalo do Cloud Storage que você especificou como jobDir quando enviou o job. O SavedModel é gravado em jobDir/model. Por exemplo, se você enviar o job para gs://your-bucket-name/your-job-dir, o AI Platform Training gravará o SavedModel em gs://your-bucket-name/your-job-dir/model.

Se você ativou o ajuste de hiperparâmetros, o AI Platform Training retorna o SavedModel do TensorFlow com a maior precisão alcançada durante o processo de treinamento. Por exemplo, se você enviou um job de treinamento com 2.500 etapas de treinamento, e a precisão foi maior em 2.000 etapas, você consegue um SavedModel do TensorFlow salvo a partir desse ponto específico.

Cada avaliação do AI Platform Training grava o SavedModel do TensorFlow com a precisão mais alta no próprio diretório dele no seu intervalo do Cloud Storage. Por exemplo, gs://your-bucket-name/your-job-dir/model/trial_{trial_id}.

A assinatura do SavedModel de saída é:

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['encoded_image'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: encoded_image_string_tensor:0
    inputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: key:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['detection_boxes'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100, 4)
        name: detection_boxes:0
    outputs['detection_classes'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100)
        name: detection_classes:0
    outputs['detection_scores'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100)
        name: detection_scores:0
    outputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Identity:0
    outputs['num_detections'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1)
        name: num_detections:0
  Method name is: tensorflow/serving/predict

Entradas:

  • encoded_image: os bytes da imagem bruta (não decodificada). Trata-se do mesmo image/encoded armazenado em tf.Example.
  • key: o identificador do valor da string da entrada de previsão. Esse valor é transmitido para key de saída. Na previsão em lote, ele ajuda a mapear a saída da previsão para a entrada.

Saídas:

  • num_detections: o número de caixas delimitadoras detectadas.
  • detection_boxes: uma lista de coordenadas relativas (valor em [0,1]) ([ymin, xmin, ymax, xmax]) das caixas delimitadoras de detecção.
  • detection_classes: uma lista de rótulos de classe previstos (número inteiro) para cada caixa de detecção em detection_boxes.
  • detection_scores: uma lista de scores para cada caixa de detecção em detection_boxes.
  • key: a chave de saída.

Veja a seguir um exemplo de saídas de previsão:

{u'detection_classes': [1.0, 3.0, 3.0, ...],
u'key': u'test_key',
u'num_detections': 100.0,
u'detection_scores': [0.24401935935020447, 0.19375669956207275, 0.18359294533729553, ...]]}

Exemplos de configurações

Se você enviar um job usando gcloud, precisará criar um arquivo config.yaml para suas especificações de ajuste de hiperparâmetros e tipo de máquina. Se você usa o console do Google Cloud, não precisa criar esse arquivo. Saiba como enviar um job de treinamento.

No seguinte exemplo de arquivo config.yaml, mostramos como alocar recursos de TPU para seu job de treinamento:

cat << EOF > config.yaml
trainingInput:
  scaleTier: CUSTOM
  masterType: n1-standard-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: NVIDIA_TESLA_P100
      count: 1
  workerType:  cloud_tpu
  workerConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    tpuTfVersion: 1.14
    acceleratorConfig:
      type: TPU_V2
      count: 8
  workerCount: 1
EOF

Em seguida, use o arquivo config.yaml para enviar um job de treinamento.

Configuração de ajuste de hiperparâmetros

Para usar o ajuste de hiperparâmetros, inclua a respectiva configuração no mesmo arquivo config.yaml da configuração da máquina.

Encontre explicações resumidas de cada hiperparâmetro no console do Google Cloud e uma explicação mais abrangente na referência do algoritmo integrado de detecção de objetos de imagem.

No seguinte exemplo de arquivo config.yaml, você verá como alocar recursos de TPU para o job de treinamento, bem como a configuração de ajuste de hiperparâmetros:

cat << EOF > config.yaml
trainingInput:
  # Use a cluster with many workers and a few parameter servers.
  scaleTier: CUSTOM
  masterType: n1-standard-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: NVIDIA_TESLA_P100
      count: 1
  workerType:  cloud_tpu
  workerConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: TPU_V2
      count: 8
  workerCount: 1
  # The following are hyperparameter configs.
  hyperparameters:
   goal: MAXIMIZE
   hyperparameterMetricTag: "AP"
   maxTrials: 6
   maxParallelTrials: 3
   enableTrialEarlyStopping: True
   params:
   - parameterName: initial_learning_rate
     type: DOUBLE
     minValue: 0.001
     maxValue: 0.1
     scaleType: UNIT_LOG_SCALE
EOF

Enviar um job de treinamento de detecção de objetos de imagem

Nesta seção, explicamos como enviar um job de treinamento usando o algoritmo integrado de detecção de objetos de imagem.

Console

Selecionar o algoritmo

  1. Acesse a página "Jobs" do AI Platform Training no console do Google Cloud:

    Página "Jobs" do AI Platform Training

  2. Clique no botão Novo job de treinamento. Nas opções exibidas abaixo, clique em Treinamento de algoritmo integrado.

  3. Na página Criar um novo job de treinamento, selecione detecção de objetos de imagem e clique em Próxima.

Selecionar os dados de treinamento e validação

  1. No menu suspenso abaixo de Dados de treinamento, especifique se você usa um ou vários arquivos:

    • No caso de um único arquivo, mantenha selecionada a opção "Usar arquivo único em um intervalo do GCS".
    • No caso de vários arquivos, selecione "Usar vários arquivos armazenados em um diretório do Cloud Storage".
  2. Em Caminho do diretório, clique em Procurar. No painel à direita, clique no nome do intervalo em que você fez upload dos dados de treinamento e navegue até o arquivo.

    Se você selecionar vários arquivos, insira os caracteres curinga em Nome do caractere curinga. O "Caminho completo do GCS" é exibido abaixo para ajudar você a confirmar que o caminho está correto.

  3. No menu suspenso abaixo de Dados de validação, especifique se você usa um ou vários arquivos:

    • No caso de um único arquivo, mantenha selecionada a opção "Usar arquivo único em um intervalo do GCS".
    • No caso de vários arquivos, selecione "Usar vários arquivos armazenados em um diretório do Cloud Storage".
  4. Em Caminho do diretório, clique em Procurar. No painel à direita, clique no nome do intervalo em que você fez upload dos dados de treinamento e navegue até o arquivo.

    Se você selecionar vários arquivos, insira os caracteres curinga em Nome do caractere curinga. O "Caminho completo do GCS" é exibido abaixo para ajudar você a confirmar que o caminho está correto.

  5. Em Diretório de saída, insira o caminho para o intervalo do Cloud Storage em que o AI Platform Training armazenará as saídas do seu job de treinamento. Preencha o caminho do intervalo do Cloud Storage diretamente ou clique no botão Procurar para selecioná-lo.

    Para manter a organização, crie um novo diretório no intervalo do Cloud Storage para esse job de treinamento. Faça isso no painel Procurar.

    Clique em Próxima.

Definir os argumentos do algoritmo

Cada argumento específico de algoritmo exibe um valor padrão de jobs de treinamento sem ajuste de hiperparâmetros. Se você ativar o ajuste de hiperparâmetros em um argumento de algoritmo, precisará especificar os valores mínimo e máximo dele.

Para saber mais detalhes sobre todos os argumentos de algoritmo, siga os links no console do Google Cloud e consulte a referência da detecção integrada de objetos de imagempara mais detalhes.

Enviar o job

Na guia Configurações do job, faça o seguinte:

  1. Insira um ID do job exclusivo.
  2. Insira uma região disponível, como "us-central1".
  3. Para escolher tipos de máquina, selecione "CUSTOM" em nível de escalonamento. Será exibida uma seção para que você forneça sua Especificação de cluster personalizada.
    1. Selecione um tipo de máquina disponível em Tipo mestre.
    2. Se você quiser usar TPUs, defina o Tipo de worker como cloud_tpu. A contagem de workers é padronizada como 1.

Clique em Concluído para enviar o job de treinamento.

gcloud

  1. Defina as variáveis de ambiente do seu job:

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
    # Specify the same region where your data is stored
    REGION="YOUR_REGION"
    
    gcloud config set project $PROJECT_ID
    gcloud config set compute/region $REGION
    
    # Set Cloud Storage paths to your training and validation data
    # Include a wildcard if you select multiple files.
    TRAINING_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/train-*.tfrecord"
    VALIDATION_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/eval-*.tfrecord"
    
    # Specify the Docker container for your built-in algorithm selection
    IMAGE_URI="gcr.io/cloud-ml-algos/image_object_detection:latest"
    
    # Variables for constructing descriptive names for JOB_ID and JOB_DIR
    DATASET_NAME="coco"
    ALGORITHM="object_detection"
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}"
    DATE="$(date '+%Y%m%d_%H%M%S')"
    
    # Specify an ID for this job
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    # Specify the directory where you want your training outputs to be stored
    JOB_DIR="gs://${BUCKET_NAME}/algorithm_training/${JOB_ID}"
    
  2. Envie o job:

    gcloud ai-platform jobs submit training $JOB_ID \
      --region=$REGION \
      --config=config.yaml \
      --job-dir=$JOB_DIR \
      -- \
      --training_data_path=$TRAINING_DATA_PATH \
      --validation_data_path=$VALIDATION_DATA_PATH \
      --train_batch_size=64 \
      --num_eval_images=500 \
      --train_steps_per_eval=2000 \
      --max_steps=22500 \
      --num_classes=90 \
      --warmup_steps=500 \
      --initial_learning_rate=0.08 \
      --fpn_type="nasfpn" \
      --aug_scale_min=0.8 \
      --aug_scale_max=1.2

  3. Depois que o job for enviado com êxito, será possível ver os registros usando os comandos gcloud a seguir:

    gcloud ai-platform jobs describe $JOB_ID
    gcloud ai-platform jobs stream-logs $JOB_ID
    

A seguir