Tutoriel : Entraîner un modèle de détection d’objet avec AutoML et Python

S’APPLIQUE À :Extension Azure CLI v2 (actuelle)Kit de développement logiciel (SDK) Python azure-ai-ml v2 (version actuelle)

Dans ce tutoriel, vous allez découvrir comment entraîner un modèle de détection d’objet à l’aide du ML automatisé d’Azure Machine Learning avec l’extension Azure Machine Learning CLI v2 ou le Kit de développement logiciel (SDK) Python Azure Machine Learning v2. Ce modèle de détection d’objet détermine si l’image contient des objets, tels qu’une canette, un carton, une bouteille de lait ou une bouteille d’eau.

Le ML automatisé accepte des données d’entraînement et des paramètres de configuration, et itère automatiquement des combinaisons de différentes méthodes de normalisation/standardisation des fonctionnalités, de modèles et de paramètres hyperparamètres afin d’obtenir le meilleur modèle.

Dans ce tutoriel, vous allez écrire du code à l’aide du kit de développement logiciel (SDK) Python et découvrir comment effectuer les tâches suivantes :

  • Télécharger et transformer des données
  • Entraîner un modèle de détection d’objet Machine Learning automatisé
  • Spécifier des valeurs d’hyperparamètres pour votre modèle
  • Effectuer un balayage hyperparamétrique
  • Déployer votre modèle
  • Visualiser les détections

Prérequis

  • Pour utiliser Azure Machine Learning, vous avez besoin d’un espace de travail. Si vous n’en avez pas, suivez la procédure Créer les ressources nécessaires pour commencer pour créer un espace de travail et en savoir plus sur son utilisation.

  • Python 3.9 ou 3.10 sont pris en charge pour cette fonctionnalité

  • Téléchargez et décompressez le fichier de données *odFridgeObjects.zip. Le jeu de données est annoté au format Pascal VOC, dans lequel chaque image correspond à un fichier XML. Chaque fichier XML contient des informations sur l’emplacement de son fichier image correspondant. Il contient également des informations sur les cadres englobants et les étiquettes d’objet. Pour pouvoir utiliser ces données, vous devez d’abord les convertir au format JSON, comme indiqué dans la section Convert the downloaded data to JSONL de ce notebook.

  • Utilisez une instance de calcul pour suivre ce tutoriel sans autre installation. (Découvrez comment créer une instance de calcul.) Vous pouvez également installer l’interface CLI/SDK pour utiliser votre propre environnement local.

    S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

    Ce didacticiel est également disponible dans le référentiel azureml-examples sur GitHub. Si vous souhaitez l’exécuter dans votre propre environnement local :

Configuration de la cible de calcul

Notes

Pour essayer le calcul serverless (préversion), ignorez cette étape et passez à Entraîner le modèle.

Vous devez d’abord configurer une cible de calcul à utiliser pour l’entraînement de votre modèle ML automatisé. Les modèles ML automatisé pour les tâches d’image requièrent des références (SKU) GPU.

Ce tutoriel utilise la série NCsv3 (avec des GPU V100), car ce type de cible de calcul utilise plusieurs GPU pour accélérer la formation. En outre, vous pouvez configurer plusieurs nœuds afin de tirer parti du parallélisme lors du réglage des hyperparamètres pour votre modèle.

Le code suivant crée un calcul GPU d’une taille de Standard_NC24s_v3 avec 4 nœuds.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

Créez un fichier yml avec la configuration suivante.

$schema: https://azuremlschemas.azureedge.net/latest/amlCompute.schema.json 
name: gpu-cluster
type: amlcompute
size: Standard_NC24s_v3
min_instances: 0
max_instances: 4
idle_time_before_scale_down: 120

Pour créer le calcul, vous exécutez la commande CLI v2 suivante avec le chemin d’accès à votre fichier .yml, le nom de l’espace de travail, le groupe de ressources et l’ID d’abonnement.

az ml compute create -f [PATH_TO_YML_FILE] --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

Configuration de l’expérience

Vous pouvez utiliser une expérience pour suivre les travaux d’entraînement de votre modèle.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

Le nom de l’essai peut être fourni à l’aide de la clé experiment_name comme suit :

experiment_name: dpv2-cli-automl-image-object-detection-experiment

Visualiser les données d’entrée

Une fois les données d’image d’entrée préparées au format JSONL (JSON Lines), vous pouvez visualiser les cadres englobants de vérité fondamentale pour une image. Pour cela, vérifiez que matplotlib est installé.

%pip install --upgrade matplotlib

%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import matplotlib.patches as patches
from PIL import Image as pil_image
import numpy as np
import json
import os

def plot_ground_truth_boxes(image_file, ground_truth_boxes):
    # Display the image
    plt.figure()
    img_np = mpimg.imread(image_file)
    img = pil_image.fromarray(img_np.astype("uint8"), "RGB")
    img_w, img_h = img.size

    fig,ax = plt.subplots(figsize=(12, 16))
    ax.imshow(img_np)
    ax.axis("off")

    label_to_color_mapping = {}

    for gt in ground_truth_boxes:
        label = gt["label"]

        xmin, ymin, xmax, ymax =  gt["topX"], gt["topY"], gt["bottomX"], gt["bottomY"]
        topleft_x, topleft_y = img_w * xmin, img_h * ymin
        width, height = img_w * (xmax - xmin), img_h * (ymax - ymin)

        if label in label_to_color_mapping:
            color = label_to_color_mapping[label]
        else:
            # Generate a random color. If you want to use a specific color, you can use something like "red".
            color = np.random.rand(3)
            label_to_color_mapping[label] = color

        # Display bounding box
        rect = patches.Rectangle((topleft_x, topleft_y), width, height,
                                 linewidth=2, edgecolor=color, facecolor="none")
        ax.add_patch(rect)

        # Display label
        ax.text(topleft_x, topleft_y - 10, label, color=color, fontsize=20)

    plt.show()

def plot_ground_truth_boxes_jsonl(image_file, jsonl_file):
    image_base_name = os.path.basename(image_file)
    ground_truth_data_found = False
    with open(jsonl_file) as fp:
        for line in fp.readlines():
            line_json = json.loads(line)
            filename = line_json["image_url"]
            if image_base_name in filename:
                ground_truth_data_found = True
                plot_ground_truth_boxes(image_file, line_json["label"])
                break
    if not ground_truth_data_found:
        print("Unable to find ground truth information for image: {}".format(image_file))

À l’aide des fonctions d’assistance ci-dessus, pour une image donnée, vous pouvez exécuter le code suivant pour afficher les cadres englobants.

image_file = "./odFridgeObjects/images/31.jpg"
jsonl_file = "./odFridgeObjects/train_annotations.jsonl"

plot_ground_truth_boxes_jsonl(image_file, jsonl_file)

Charger des données et créer MLTable

Pour utiliser les données pour la formation, chargez les données dans le Stockage Blob par défaut de votre espace de travail Azure Machine Learning et inscrivez-les en tant que ressources. Les avantages de l’inscription des données sont les suivants :

  • Partager facilement avec d’autres membres de l’équipe
  • Contrôle de version des métadonnées (emplacement, description, etc.)
  • Suivi de la traçabilité

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

Créez un fichier yml avec la configuration suivante.

$schema: https://azuremlschemas.azureedge.net/latest/data.schema.json
name: fridge-items-images-object-detection
description: Fridge-items images Object detection
path: ./data/odFridgeObjects
type: uri_folder

Pour charger des images comme ressource de données, vous exécutez la commande CLI v2 suivante avec le chemin de votre fichier .yml, le nom de l’espace de travail, le groupe de ressources et l’ID d’abonnement.

az ml data create -f [PATH_TO_YML_FILE] --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

L’étape suivante consiste à créer MLTable à partir de vos données au format jsonl, comme indiqué ci-dessous. MLtable intègre vos données dans un objet consommable à des fins de formation.

paths:
  - file: ./train_annotations.jsonl
transformations:
  - read_json_lines:
        encoding: utf8
        invalid_lines: error
        include_path_column: false
  - convert_column_types:
      - columns: image_url
        column_type: stream_info

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

La configuration suivante crée des données de formation et de validation à partir de MLTable.

target_column_name: label
training_data:
  path: data/training-mltable-folder
  type: mltable
validation_data:
  path: data/validation-mltable-folder
  type: mltable

Configurer votre expérience de détection d’objet

Afin de configurer des travaux de ML automatisé pour les tâches liées à une image, créez un travail AutoML propre à une tâche.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

Pour utiliser le calcul serverless (préversion), remplacez la ligne compute: azureml:gpu-cluster par ce code :

resources:
 instance_type: Standard_NC24s_v3
 instance_count: 4
task: image_object_detection
primary_metric: mean_average_precision
compute: azureml:gpu-cluster

Balayage automatique des hyperparamètres pour les tâches d’image (Mode automatique)

Important

Cette fonctionnalité est actuellement disponible en préversion publique. Cette préversion est fournie sans contrat de niveau de service. Certaines fonctionnalités peuvent être limitées ou non prises en charge. Pour plus d’informations, consultez Conditions d’Utilisation Supplémentaires relatives aux Évaluations Microsoft Azure.

Dans votre travail AutoML, vous pouvez effectuer un balayage automatique des hyperparamètres afin de trouver le modèle optimal (nous appelons cette fonctionnalité AutoMode). Vous spécifiez uniquement le nombre d’essais ; l’espace de recherche des hyperparamètres, la méthode d’échantillonnage et la stratégie d’arrêt anticipé ne sont pas nécessaires. Le système détermine automatiquement la région de l’espace d’hyperparamètre à balayer en fonction du nombre d’essais. Une valeur comprise entre 10 et 20 fonctionnera probablement bien sur de nombreux jeux de données.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

limits:
  max_trials: 10
  max_concurrent_trials: 2

Vous pouvez ensuite envoyer le travail pour entraîner un modèle d’image.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

Pour soumettre votre travail AutoML, vous exécutez la commande CLI v2 suivante avec le chemin d’accès à votre fichier .yml, le nom de l’espace de travail, le groupe de ressources et l’ID d’abonnement.

az ml job create --file ./hello-automl-job-basic.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

Balayage manuel des hyperparamètres pour les tâches d’image

Dans votre travail AutoML, vous pouvez spécifier des architectures de modèle en utilisant le paramètre model_name et configurer les paramètres de façon à effectuer un balayage hyperparamétrique sur un espace de recherche défini afin de trouver le modèle optimal.

Dans cet exemple, nous allons effectuer l'apprentissage d’un modèle de détection d’objet avec yolov5 et fasterrcnn_resnet50_fpn, tous deux étant préformés sur COCO, un jeu de données de détection d’objet, de segmentation et de sous-titrage à grande échelle qui contient des milliers d’images étiquetées avec plus de 80 catégories d’étiquettes.

Vous pouvez effectuer un balayage hyperparamétrique sur un espace de recherche défini pour trouver le modèle optimal.

Limites du travail

Vous pouvez contrôler les ressources dépensées sur votre travail d’apprentissage d’image AutoML en spécifiant timeout_minutes, max_trials et max_concurrent_trials pour le travail dans les paramètres de limite. Consultez la description détaillée des paramètres de limites du travail.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

limits:
  timeout_minutes: 60
  max_trials: 10
  max_concurrent_trials: 2

Le code suivant définit l’espace de recherche en vue du balayage hyperparamétrique pour chaque architecture définie, yolov5 et fasterrcnn_resnet50_fpn. Dans l’espace de recherche, spécifiez la plage de valeurs pour learning_rate, optimizer, lr_scheduler, etc., parmi laquelle AutoML devra choisir lorsqu’il tentera de générer un modèle avec la métrique principale optimale. Si les valeurs des hyperparamètres ne sont pas spécifiées, les valeurs par défaut sont utilisées pour chaque architecture.

Pour les paramètres de réglage, utilisez l’échantillonnage aléatoire afin de choisir des échantillons à partir de cet espace de paramètres en utilisant le sampling_algorithm random. Les limites du travail configurées ci-dessus indiquent au ML automatisé qu’il doit effectuer en tout 10 essais avec ces différents échantillons, en exécutant deux essais à la fois sur notre cible de calcul, qui a été configurée à l’aide de quatre nœuds. Plus l’espace de recherche contient de paramètres, plus il faut d’essais pour trouver des modèles optimaux.

La stratégie d’arrêt anticipé Bandit est également utilisée. Cette stratégie met fin aux essais ayant des performances médiocres, autrement dit ceux qui ne sont pas dans une fourchette de 20 % par rapport à l’essai le plus performant, ce qui permet d’économiser de manière significative les ressources de calcul.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

sweep:
  sampling_algorithm: random
  early_termination:
    type: bandit
    evaluation_interval: 2
    slack_factor: 0.2
    delay_evaluation: 6
search_space:
  - model_name:
      type: choice
      values: [yolov5]
    learning_rate:
      type: uniform
      min_value: 0.0001
      max_value: 0.01
    model_size:
      type: choice
      values: [small, medium]

  - model_name:
      type: choice
      values: [fasterrcnn_resnet50_fpn]
    learning_rate:
      type: uniform
      min_value: 0.0001
      max_value: 0.001
    optimizer:
      type: choice
      values: [sgd, adam, adamw]
    min_size:
      type: choice
      values: [600, 800]

Une fois les paramètres de l’espace de recherche et de balayage définis, vous pouvez soumettre le travail pour effectuer l'apprentissage d’un modèle d’image à l’aide de votre jeu de données de formation.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

Pour soumettre votre travail AutoML, vous exécutez la commande CLI v2 suivante avec le chemin d’accès à votre fichier .yml, le nom de l’espace de travail, le groupe de ressources et l’ID d’abonnement.

az ml job create --file ./hello-automl-job-basic.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

Quand vous faites un balayage hyperparamétrique, vous pouvez visualiser les différents essais qui ont été tentés en utilisant l’interface utilisateur HyperDrive. Vous pouvez accéder à cette interface utilisateur à travers l’onglet « Travaux enfants » dans l’interface utilisateur de l’automl_image_job principal ci-dessus, qui est le travail parent HyperDrive. Vous pouvez ensuite accéder à l’onglet « Travaux enfants » correspondant.

Vous pouvez aussi voir ci-dessous le travail parent HyperDrive et accéder à son onglet « Travaux enfants » :

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

CLI example not available, please use Python SDK.

Inscrire et déployer un modèle

Une fois le travail terminé, vous pouvez inscrire le modèle qui a été créé à partir du meilleur essai (configuration qui a généré la meilleure métrique principale). Vous pouvez inscrire le modèle après le téléchargement ou en spécifiant le azureml chemin avec le jobid correspondant.

Obtenir le meilleur essai

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

CLI example not available, please use Python SDK.

Inscrire le modèle

Inscrivez le modèle à l’aide du chemin azureml ou de votre chemin téléchargé localement.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

 az ml model create --name od-fridge-items-mlflow-model --version 1 --path azureml://jobs/$best_run/outputs/artifacts/outputs/mlflow-model/ --type mlflow_model --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

Après avoir inscrit le modèle que vous souhaitez utiliser, vous pouvez le déployer à l’aide du point de terminaison en ligne managé deploy-managed-online-endpoint

Configurer le point de terminaison en ligne

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: od-fridge-items-endpoint
auth_mode: key

Créer le point de terminaison

À l’aide de MLClient créé précédemment, nous allons maintenant créer le point de terminaison dans l’espace de travail. Cette commande lance la création du point de terminaison et retourne une réponse de confirmation pendant que la création du point de terminaison se poursuit.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

az ml online-endpoint create --file .\create_endpoint.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

Nous pouvons également créer un point de terminaison de lot pour l’inférence par lot sur de grands volumes de données sur une période. Examinez le notebook de scoring par lot de détection d’objets pour l’inférence par lots à l’aide du point de terminaison de lot.

Configurer le déploiement en ligne

Un déploiement est un ensemble de ressources nécessaires pour héberger le modèle qui effectue l’inférence réelle. Nous créons un déploiement pour notre point de terminaison en utilisant la classe ManagedOnlineDeployment. Vous pouvez utiliser l’une des références SKU de machine virtuelle GPU ou CPU pour votre cluster de déploiement.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

name: od-fridge-items-mlflow-deploy
endpoint_name: od-fridge-items-endpoint
model: azureml:od-fridge-items-mlflow-model@latest
instance_type: Standard_DS3_v2
instance_count: 1
liveness_probe:
    failure_threshold: 30
    success_threshold: 1
    timeout: 2
    period: 10
    initial_delay: 2000
readiness_probe:
    failure_threshold: 10
    success_threshold: 1
    timeout: 10
    period: 10
    initial_delay: 2000 

Créer le déploiement

En utilisant le MLClient créé précédemment, nous allons créer le déploiement dans l’espace de travail. Cette commande lance la création du déploiement et retourne une réponse de confirmation pendant que la création du déploiement se poursuit.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

az ml online-deployment create --file .\create_deployment.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

Mettre à jour le trafic :

Par défaut, le déploiement actuel est défini pour recevoir 0 % de trafic. vous pouvez définir le pourcentage de trafic que le déploiement actuel doit recevoir. Somme des pourcentages de trafic de tous les déploiements avec un point de terminaison qui ne doit pas dépasser 100 %.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

az ml online-endpoint update --name 'od-fridge-items-endpoint' --traffic 'od-fridge-items-mlflow-deploy=100' --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

test du déploiement

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

CLI example not available, please use Python SDK.

Visualiser les détections

Maintenant que vous avez attribué un score à une image de test, vous pouvez visualiser les cadres englobants pour cette image. Pour ce faire, vérifiez que matplotlib est installé.

S’APPLIQUE À : Extension ml Azure CLI v2 (actuelle)

CLI example not available, please use Python SDK.

Nettoyer les ressources

Sautez cette section si vous prévoyez d’exécuter d’autres tutoriels Azure Machine Learning.

Si vous n’avez pas l’intention d’utiliser les ressources que vous avez créées, supprimez-les pour éviter des frais.

  1. Dans le portail Azure, sélectionnez Groupes de ressources tout à gauche.
  2. À partir de la liste, sélectionnez le groupe de ressources créé.
  3. Sélectionnez Supprimer le groupe de ressources.
  4. Entrez le nom du groupe de ressources. Puis sélectionnez Supprimer.

Vous pouvez également conserver le groupe de ressources mais supprimer un espace de travail unique. Affichez les propriétés de l’espace de travail, puis sélectionnez Supprimer.

Étapes suivantes

Dans ce tutoriel sur le machine learning automatisé, vous avez effectué les tâches suivantes :

  • Configuration d’un espace de travail et préparation des données pour une expérience
  • Entraînement d’un modèle de détection d’objet automatisé
  • Spécification des valeurs d’hyperparamètres pour votre modèle
  • Balayage hyperparamétrique
  • Déploiement de votre modèle
  • Visualisation des détections

Remarque

L’utilisation du jeu de données des objets réfrigérants est disponible sous la licence MIT.