Entraînement à l'aide de l'algorithme intégré de détection d'objets au sein des images

L'entraînement à l'aide des algorithmes intégrés d'AI Platform Training vous permet d'envoyer votre ensemble de données et d'entraîner un modèle sans avoir à écrire de code d'entraînement. Cette page explique comment fonctionne l'algorithme intégré de détection d'objets au sein des images et comment l'utiliser.

Présentation

L'algorithme intégré de détection d'objets au sein des images utilise vos ensembles de données d'entraînement et de validation pour entraîner des modèles en continu. Il renvoie ensuite le modèle SavedModel le plus précis généré pendant l'exécution de la tâche d'entraînement. Vous pouvez également utiliser le réglage d'hyperparamètres pour obtenir le modèle le plus précis possible. Le modèle SavedModel exporté peut être utilisé directement pour la prédiction, soit en local, soit dans AI Platform Prediction pour le service de production.

Limites

Les algorithmes d'images intégrés permettent d'effectuer des entraînements avec des processeurs, des GPU ou des TPU uniques. Le modèle SavedModel obtenu est compatible avec les processeurs et les GPU.

Les fonctionnalités suivantes ne sont pas compatibles avec l'entraînement à l'aide de l'algorithme intégré de détection d'objets au sein des images :

Types de machines compatibles

Voici les niveaux d'évolutivité et types de machines d'AI Platform Training qui sont compatibles :

  • Niveau d'évolutivité BASIC
  • Niveau d'évolutivité BASIC_TPU
  • Niveau d'évolutivité CUSTOM avec n'importe lequel des types de machine Compute Engine compatible avec AI Platform Training.
  • Niveau d'évolutivité d'évolutivité CUSTOM avec l'un des anciens types de machines suivants :
    • 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 cœurs)

Autoriser Cloud TPU à accéder à votre projet

Pour autoriser le nom de compte de service Cloud TPU associé à votre projet Google Cloud, procédez comme suit :

  1. Obtenez le nom de votre compte de service Cloud TPU en appelant projects.getConfig. Exemple :

    PROJECT_ID=PROJECT_ID
    
    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
        https://ml.googleapis.com/v1/projects/$PROJECT_ID:getConfig
    
  2. Enregistrez les valeurs des champs serviceAccountProject et tpuServiceAccount renvoyées par l'API.

  3. Initialisez le compte de service 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
    

Ajoutez ensuite le compte de service Cloud TPU en tant que membre de votre projet, avec le rôle Agent de service Cloud ML. Effectuez les étapes suivantes dans Google Cloud Console ou à l'aide de l'outil de ligne de commande gcloud :

Console

  1. Connectez-vous à Google Cloud Console, puis sélectionnez le projet dans lequel vous utilisez le TPU.
  2. Choisissez IAM et administration > IAM.
  3. Cliquez sur le bouton Ajouter pour ajouter un membre au projet.
  4. Saisissez le compte de service TPU dans la zone de texte Membres.
  5. Cliquez sur la liste déroulante Rôles.
  6. Activez le rôle Agent de service Cloud ML (Agents de service > Agent de service Cloud ML).

gcloud

  1. Définissez les variables d'environnement contenant votre ID de projet et le compte de service Cloud TPU :

    PROJECT_ID=PROJECT_ID
    SVC_ACCOUNT=your-tpu-sa-123@your-tpu-sa.google.com.iam.gserviceaccount.com
    
  2. Attribuez le rôle ml.serviceAgent au compte de service Cloud TPU :

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

Pour en savoir plus sur l'attribution de rôles aux comptes de service, consultez la documentation IAM.

Mettre en forme les données d'entrée pour l'entraînement

L'algorithme intégré de détection d'objets au sein des images exige que vos données d'entrée soient au format tf.Examples et enregistrées dans des fichiers TFRecord. La structure de données tf.Example et le format de fichier TFRecord sont tous deux conçus pour une lecture efficace des données avec TensorFlow.

Le format TFRecord est un format simple utilisé pour le stockage d'une séquence d'enregistrements binaires. Dans ce cas, tous les enregistrements contiennent des représentations binaires d'images. Chaque image, ainsi que sa ou ses étiquettes de classe, est représentée au format tf.Example. Vous pouvez enregistrer de nombreuses images tf.Example dans un seul fichier TFRecord. Vous pouvez également partitionner un ensemble de données volumineux entre plusieurs fichiers TFRecord.

En savoir plus sur TFRecord et tf.Example

Convertir vos images au format TFRecord

Pour convertir des images au format requis pour obtenir des prédictions, suivez le guide Préparer les entrées pour la détection d'objets dans le guide du jardin de modèles TensorFlow.

Vérifier les autorisations du bucket Cloud Storage

Pour stocker vos données, utilisez un bucket Cloud Storage dans le projet Google Cloud que vous utilisez pour exécuter les tâches AI Platform Training. Sinon, accordez à AI Platform Training l'accès au bucket Cloud Storage où vos données sont stockées.

Format d'entrée requis

Pour effectuer des entraînements avec l'algorithme intégré de détection d'objets au sein des images, vos données d'image doivent être structurées au format tf.Example avec les champs suivants :

  • image/encoded est l'image brute encodée sous forme de chaîne.

  • image/object/class/label est une liste d'étiquettes d'entiers pour l'image correspondante (une étiquette par cadre).

    L'ensemble d'étiquettes d'entiers utilisées pour votre ensemble de données doit être une séquence consécutive commençant par 1. Par exemple, si votre ensemble de données comporte cinq classes, chaque étiquette doit être un entier dans l'intervalle [1, 5].

  • image/object/bbox/xmin est une liste de coordonnées X normalisées à gauche pour l'image correspondante (une coordonnée par cadre). Chaque coordonnée doit se trouver dans l'intervalle [0, 1].

  • image/object/bbox/xmax est une liste de coordonnées X normalisées à droite pour l'image correspondante (une coordonnée par cadre). Chaque coordonnée doit se trouver dans l'intervalle [0, 1].

  • image/object/bbox/ymin est une liste de coordonnées Y normalisées en haut pour l'image correspondante (une coordonnée par cadre). Chaque coordonnée doit se trouver dans l'intervalle [0, 1].

  • {image/object/bbox/ymax est une liste de coordonnées Y normalisées en bas pour l'image correspondante (une coordonnée par case). Chaque coordonnée doit se trouver dans l'intervalle [0, 1].

L'exemple suivant montre la structure d'un objet tf.Example pour une image contenant deux cadres de délimitation. Le premier cadre est étiqueté 1, son coin supérieur gauche correspond aux coordonnées normalisées (0.1, 0.4) et son coin inférieur droit aux coordonnées normalisées (0.5, 0.8). Le deuxième cadre est étiqueté 2, son coin supérieur gauche correspond aux coordonnées normalisées (0.3, 0.5) et son coin inférieur droit aux coordonnées normalisées (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]
}

Ce format tf.Example suit celui utilisé dans le script de détection d'objets TFRecord.

Obtenir le meilleur modèle SavedModel en sortie

Une fois l'entraînement terminé, AI Platform Training écrit un modèle TensorFlow SavedModel dans le bucket Cloud Storage que vous avez spécifié comme jobDir lorsque vous avez envoyé la tâche. Le modèle SavedModel est écrit dans jobDir/model. Par exemple, si vous envoyez la tâche dans gs://your-bucket-name/your-job-dir, AI Platform Training écrit le modèle SavedModel dans gs://your-bucket-name/your-job-dir/model.

Si vous avez activé le réglage d'hyperparamètres, AI Platform Training renvoie le modèle TensorFlow SavedModel avec la précision la plus élevée obtenue pendant l'entraînement. Par exemple, si vous avez envoyé une tâche d'entraînement composée de 2 500 étapes et que la précision était la plus élevée à 2 000 étapes, vous obtenez un modèle TensorFlow SavedModel enregistré à partir de ce point particulier.

Chaque essai d'AI Platform Training écrit le modèle TensorFlow SavedModel avec la plus grande précision dans son propre répertoire au sein de votre bucket Cloud Storage. Par exemple, gs://your-bucket-name/your-job-dir/model/trial_{trial_id}.

La signature du modèle SavedModel obtenu est la suivante :

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

Entrées :

  • encoded_image : octets bruts de l'image (non décodés). Cette valeur est identique à la valeur image/encoded stockée dans tf.Example.
  • key : identifiant de valeur de chaîne de l'entrée de prédiction. Cette valeur est transmise via la clé de sortie (key). Pour la prédiction par lot, cela permet de mapper les données de sortie de prédiction aux données d'entrée.

Sorties :

  • num_detections : nombre de cadres de délimitation détectés.
  • detection_boxes : liste des coordonnées ([ymin, xmin, ymax, xmax]) relatives (valeur [0,1]) des cadres de délimitation pour la détection.
  • detection_classes : liste des étiquettes de classe (entier) prédites pour chaque cadre de détection dans detection_boxes.
  • detection_scores : liste de scores pour chaque cadre de détection dans detection_boxes.
  • key : clé de sortie.

Voici un exemple de sorties de prédiction :

{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, ...]]}

Exemples de configurations

Si vous envoyez une tâche à l'aide de gcloud, vous devez créer un fichier config.yaml contenant les spécifications de votre type de machine et du réglage d'hyperparamètres. Si vous utilisez Google Cloud Console, vous n'avez pas besoin de créer ce fichier. Découvrez comment envoyer une tâche d'entraînement.

L'exemple de fichier config.yaml suivant montre comment allouer des ressources TPU pour votre tâche d'entraînement :

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

Utilisez ensuite votre fichier config.yaml pour envoyer une tâche d'entraînement.

Configurer le réglage d'hyperparamètres

Pour utiliser le réglage d'hyperparamètres, incluez votre configuration de réglage d'hyperparamètres dans le même fichier config.yaml que la configuration de votre machine.

Vous trouverez de brèves explications sur chaque hyperparamètre dans Google Cloud Console, ainsi qu'une explication plus complète dans la documentation de référence sur l'algorithme intégré de détection d'objets au sein des images.

L'exemple de fichier config.yaml suivant montre comment allouer des ressources TPU pour votre tâche d'entraînement et inclut la configuration du réglage d'hyperparamètres :

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

Envoyer une tâche d'entraînement pour la détection d'objets au sein des images

Cette section explique comment envoyer une tâche d'entraînement à l'aide de l'algorithme intégré de détection d'objets au sein des images.

Console

Sélectionner un algorithme

  1. Accédez à la page "Tâches" d'AI Platform Training dans Google Cloud Console :

    Page "Tâches" d'AI Platform Training

  2. Cliquez sur le bouton Nouvelle tâche d'entraînement. Dans les options qui s'affichent en dessous, cliquez sur Entraînement de l'algorithme intégré.

  3. Sur la page Créer une tâche d'entraînement, sélectionnez image object detection (Détection d'objets au sein des images), puis cliquez sur Suivant.

Sélectionner vos données d'entraînement et de validation

  1. Dans le menu déroulant sous Données d'entraînement, indiquez si vous utilisez un ou plusieurs fichiers :

    • Pour un seul fichier, sélectionnez "Utiliser un fichier unique stocké dans un bucket GCS".
    • Pour plusieurs fichiers, sélectionnez "Utiliser plusieurs fichiers stockés dans un répertoire Cloud Storage".
  2. Pour Chemin d'accès au répertoire, cliquez sur Parcourir. Dans le panneau de droite, cliquez sur le nom du bucket dans lequel vous avez importé les données d'entraînement, puis accédez à votre fichier.

    Si vous sélectionnez plusieurs fichiers, utilisez des caractères génériques dans Nom générique. Le chemin d'accès GCS complet s'affiche en dessous pour vous aider à confirmer qu'il est correct.

  3. Dans le menu déroulant sous Données de validation, indiquez si vous utilisez un ou plusieurs fichiers :

    • Pour un seul fichier, sélectionnez "Utiliser un fichier unique stocké dans un bucket GCS".
    • Pour plusieurs fichiers, sélectionnez "Utiliser plusieurs fichiers stockés dans un répertoire Cloud Storage".
  4. Pour Chemin d'accès au répertoire, cliquez sur Parcourir. Dans le panneau de droite, cliquez sur le nom du bucket dans lequel vous avez importé les données d'entraînement, puis accédez à votre fichier.

    Si vous sélectionnez plusieurs fichiers, utilisez des caractères génériques dans Nom générique. Le chemin d'accès GCS complet s'affiche en dessous pour vous aider à confirmer qu'il est correct.

  5. Dans Répertoire de sortie, saisissez le chemin d'accès à votre bucket Cloud Storage, où vous souhaitez qu'AI Platform Training stocke les résultats de votre tâche d'entraînement. Vous pouvez renseigner directement le chemin de votre bucket Cloud Storage ou cliquer sur le bouton Parcourir pour le sélectionner.

    Pour maintenir une bonne organisation, créez un répertoire dans votre bucket Cloud Storage destiné à cette tâche d'entraînement. Utilisez pour cela le panneau Parcourir.

    Cliquez sur Suivant.

Définir les arguments algorithmiques

Chaque argument spécifique à un algorithme affiche une valeur par défaut pour les tâches d'entraînement sans réglage d'hyperparamètres. Si vous activez le réglage d'hyperparamètres pour un argument algorithmique, vous devez spécifier ses valeurs minimale et maximale.

Pour en savoir plus sur tous les arguments algorithmiques, cliquez sur les liens dans Google Cloud Console et consultez la documentation de référence sur l'algorithme intégré de détection d'objets au sein des images.

Envoyer la tâche

Dans l'onglet Paramètres de la tâche :

  1. Saisissez un ID de tâche unique.
  2. Entrez une région disponible (telle que "us-central1").
  3. Pour les types de machines, sélectionnez "CUSTOM" pour le niveau d'évolutivité. Une section vous invitant à indiquer les spécifications de votre cluster personnalisé s'affiche.
    1. Sous Type de maître, sélectionnez un type de machine disponible.
    2. Si vous souhaitez utiliser des TPU, définissez le type de nœud de calcul sur cloud_tpu. Le nombre de nœuds de calcul est défini sur 1 par défaut.

Cliquez sur Terminé pour envoyer la tâche d'entraînement.

gcloud

  1. Définissez des variables d'environnement pour votre tâche :

    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. Envoyez la tâche :

    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. Une fois la tâche envoyée, vous pouvez afficher les journaux à l'aide des commandes gcloud suivantes :

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

Étapes suivantes