Esercitazione: Eseguire il training di un modello di rilevamento oggetti con AutoML e Python

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)Python SDK azure-ai-ml v2 (corrente)

Questa esercitazione descrive come eseguire il training di un modello di rilevamento oggetti con ML automatizzato di Azure Machine Learning con l'estensione dell'interfaccia della riga di comando di Azure Machine Learning v2 o Azure Machine Learning Python SDK v2. Questo modello di rilevamento oggetti identifica se l'immagine contiene oggetti, ad esempio una lattina, una scatola, una bottiglia di latte o una bottiglia d'acqua.

ML automatizzato accetta le impostazioni di configurazione e dati di training e scorre automaticamente le combinazioni di diversi metodi di normalizzazione/standardizzazione di funzionalità, modelli e impostazioni di iperparametri allo scopo di ottenere il modello ottimale.

In questa esercitazione si scriverà codice usando Python SDK e verranno illustrate le attività seguenti:

  • Scaricare e trasformare i dati
  • Eseguire il training di un modello di rilevamento oggetti di Machine Learning automatizzato
  • Specificare i valori degli iperparametri per il modello
  • Eseguire uno sweeping di iperparametri
  • Distribuire il modello
  • Visualizzare i rilevamenti

Prerequisiti

Configurazione della destinazione di calcolo

Nota

Per provare l'ambiente di elaborazione serverless (anteprima), ignorare questo passaggio e procedere con la configurazione dell'esperimento.

È prima necessario configurare una destinazione di calcolo da usare per il training del modello di ML automatizzato. I modelli di ML automatizzati per le attività correlate alle immagini richiedono SKU GPU.

Per questa esercitazione si usa la serie NCsv3 (con GPU V100) perché questo tipo di destinazione di calcolo usa più GPU per velocizzare il training. È inoltre possibile configurare più nodi per sfruttare il parallelismo durante l'ottimizzazione degli iperparametri per il modello.

Il codice seguente crea un calcolo GPU di dimensioni pari a Standard_NC24s_v3 con quattro nodi.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

Creare un file con estensione yml con la configurazione seguente.

$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

Per creare l'ambiente di calcolo, eseguire il comando dell'interfaccia della riga di comando v2 seguente con il percorso del file con estensione yml, il nome dell'area di lavoro, il gruppo di risorse e l'ID sottoscrizione.

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

Configurazione dell'esperimento

È possibile usare un esperimento per tenere traccia dei processi di training del modello.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

Il nome dell'esperimento può essere specificato usando la chiave experiment_name come indicato di seguito:

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

Visualizzare i dati di input

Dopo aver preparato i dati di immagine di input in formato JSONL (JSON Lines), è possibile visualizzare i rettangoli di selezione della verità di base per un'immagine. A tale scopo, assicurarsi che sia installato matplotlib.

%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))

Usando le funzioni helper precedenti, per qualsiasi immagine specifica, è possibile eseguire il codice seguente per visualizzare i rettangoli di selezione.

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

plot_ground_truth_boxes_jsonl(image_file, jsonl_file)

Caricare dati e creare MLTable

Per usare i dati per il training, caricarli nell'archivio BLOB predefinito dell'area di lavoro di Azure Machine Learning e registrarli come asset. I vantaggi della registrazione dei dati sono i seguenti:

  • Sono facilmente condivisibili con altri membri del team
  • Supportano il controllo delle versioni dei metadati (posizione, descrizione e così via)
  • Rilevamento della derivazione

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

Creare un file con estensione yml con la configurazione seguente.

$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

Per caricare le immagini come asset di dati, eseguire il comando dell'interfaccia della riga di comando v2 seguente con il percorso del file con estensione yml, il nome dell'area di lavoro, il gruppo di risorse e l'ID sottoscrizione.

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

Il passaggio successivo consiste nel creare MLTable dai dati in formato jsonl, come illustrato di seguito. MLtable inserisce i dati in un oggetto utilizzabile per il training.

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

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

La configurazione seguente crea dati di training e di convalida da MLTable.

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

Configurare l'esperimento di rilevamento oggetti

Per configurare processi di ML automatizzati per attività correlate alle immagini, creare un processo AutoML specifico dell'attività.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

Per usare l'ambiente di elaborazione serverless (anteprima), sostituire la riga compute: azureml:gpu-cluster con il codice seguente:

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

Sweeping automatico degli iperparametri per le attività correlate alle immagini (AutoMode)

Importante

Questa funzionalità è attualmente in anteprima pubblica. Questa versione in anteprima viene fornita senza un contratto di servizio. Alcune funzionalità potrebbero non essere supportate o potrebbero presentare funzionalità limitate. Per altre informazioni, vedere le Condizioni supplementari per l'uso delle anteprime di Microsoft Azure.

Nel processo AutoML è possibile eseguire uno sweeping automatico degli iperparametri per trovare il modello ottimale (questa funzionalità viene chiamata AutoMode). Occorre specificare solo il numero di prove. Lo spazio di ricerca degli iperparametri, il metodo di campionamento e i criteri di terminazione anticipata non sono necessari. Il sistema determinerà automaticamente l'area dello spazio degli iperparametri per eseguire lo sweeping in base al numero di prove. È probabile che un valore compreso tra 10 e 20 sia corretto con molti set di dati.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

limits:
  max_trials: 10
  max_concurrent_trials: 2

È quindi possibile inviare il processo per eseguire il training di un modello di immagine.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

Per inviare il processo di AutoML, è possibile eseguire il comando dell'interfaccia della riga di comando v2 seguente con il percorso del file con estensione yml, il nome dell'area di lavoro, il gruppo di risorse e l'ID sottoscrizione.

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]

Sweeping manuale degli iperparametri per le attività correlate alle immagini

Nel processo AutoML è possibile specificare le architetture del modello usando il parametro model_name e configurare le impostazioni per eseguire uno sweeping di iperparametri su uno spazio di ricerca definito per trovare il modello ottimale.

In questo esempio si eseguirà il training di un modello di rilevamento oggetti con yolov5 e fasterrcnn_resnet50_fpn, entrambi sottoposti a training preliminare in COCO, un rilevamento di oggetti su larga scala, segmentazione e set di dati di didascalia che contiene oltre migliaia di immagini etichettate con più di 80 categorie di etichette.

È possibile eseguire uno sweeping di iperparametri su uno spazio di ricerca definito per trovare il modello ottimale.

Limiti dei processi

È possibile controllare le risorse utilizzate per il processo di training dell'immagine AutoML specificando timeout_minutes, max_trials e max_concurrent_trials per il processo nelle impostazioni di limite. Vedere la descrizione dettagliata nei parametri dei limiti del processo.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

limits:
  timeout_minutes: 60
  max_trials: 10
  max_concurrent_trials: 2

Il codice seguente definisce lo spazio di ricerca in preparazione dello sweeping degli iperparametri per ogni architettura definita, yolov5 e fasterrcnn_resnet50_fpn. Nello spazio di ricerca specificare l'intervallo di valori per learning_rate, optimizer, lr_scheduler e così via da cui AutoML potrà scegliere durante il tentativo di generare un modello con la metrica primaria ottimale. Se i valori degli iperparametri non vengono specificati, vengono usati i valori predefiniti per ogni architettura.

Per le impostazioni di ottimizzazione, usare il campionamento casuale per selezionare campioni da questo spazio dei parametri con il parametro sampling_algorithm impostato su random. I limiti del processo configurati in precedenza indicano a ML automatizzato di provare un totale di 10 prove con questi campioni diversi, eseguendo due prove alla volta nella destinazione di calcolo, configurata con quattro nodi. Più parametri sono presenti per lo spazio di ricerca, maggiore è il numero di prove da effettuare per trovare modelli ottimali.

Vengono usati anche i criteri di terminazione anticipata di Bandit. Questi criteri vengono usati per terminare le prove ritenute insufficienti, ovvero quelle che non rientrano nel 20% del margine di flessibilità delle prove migliori e questo consente di risparmiare in modo significativo sulle risorse di calcolo.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

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]

Dopo aver definito le impostazioni dello spazio di ricerca e dello sweeping, è possibile inviare il processo per eseguire il training di un modello di immagini con il set di dati di training.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

Per inviare il processo di AutoML, è possibile eseguire il comando dell'interfaccia della riga di comando v2 seguente con il percorso del file con estensione yml, il nome dell'area di lavoro, il gruppo di risorse e l'ID sottoscrizione.

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]

Quando si esegue uno sweeping di iperparametri, può essere utile visualizzare le diverse prove effettuate con l'interfaccia utente di HyperDrive. È possibile passare a questa interfaccia utente dalla scheda dei processi figlio dell'interfaccia utente di automl_image_job principale a partire dall'alto, ovvero il processo padre di HyperDrive. È quindi possibile passare alla scheda dei processi figlio di tale processo.

In alternativa, come illustrato di seguito è possibile visualizzare direttamente il processo padre di HyperDrive e passare alla relativa scheda dei processi figlio:

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

CLI example not available, please use Python SDK.

Registrare e distribuire modelli

Al termine del processo, è possibile registrare il modello creato dalla prova migliore (configurazione che ha generato la metrica primaria migliore). È possibile registrare il modello dopo il download o specificando il percorso di azureml con jobid corrispondente.

Ottenere la prova migliore

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

CLI example not available, please use Python SDK.

Registrare il modello

Registrare il modello usando il percorso di azureml o il percorso scaricato in locale.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

 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]

Dopo aver registrato il modello da usare, è possibile distribuirlo usando l'endpoint online gestito deploy-managed-online-endpoint.

Configurare l'endpoint online

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

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

Creare l'endpoint

Usando l'oggetto MLClient creato in precedenza, verrà ora creato l'endpoint nell'area di lavoro. Questo comando avvia la creazione dell'endpoint e restituisce una risposta di conferma mentre la creazione dell'endpoint è ancora in corso.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

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

È anche possibile creare un endpoint batch per l'inferenza batch su grandi volumi di dati in un certo periodo di tempo. Vedere il notebook di assegnazione dei punteggi batch di rilevamento oggetti per l'inferenza batch usando l'endpoint batch.

Configurare la distribuzione online

Per distribuzione si intende un set di risorse necessarie per ospitare il modello che esegue l'inferenza effettiva. Per creare una distribuzione per l'endpoint, si usa la classe ManagedOnlineDeployment. Per il cluster di distribuzione è possibile usare SKU di VM GPU o CPU.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

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 

Creare la distribuzione

Usando l'oggetto MLClient creato in precedenza, verrà creata la distribuzione nell'area di lavoro. Questo comando avvia la creazione della distribuzione e restituisce una risposta di conferma mentre la creazione della distribuzione è ancora in corso.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

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

Aggiornare il traffico

Per impostazione predefinita, la distribuzione corrente è impostata per ricevere lo 0% del traffico. È possibile impostare la percentuale di traffico che dovrà ricevere la distribuzione corrente. La somma delle percentuali di traffico di tutte le distribuzioni con un endpoint non deve superare il 100%.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

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]

Testare la distribuzione

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

CLI example not available, please use Python SDK.

Visualizzare i rilevamenti

Dopo aver ottenuto un punteggio per un'immagine di test, è possibile visualizzare i rettangoli di selezione per questa immagine. A tale scopo, assicurarsi di avere installato matplotlib.

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

CLI example not available, please use Python SDK.

Pulire le risorse

Se si intende eseguire altre esercitazioni su Azure Machine Learning, non completare questa sezione.

Se non si prevede di usare le risorse create, eliminarle per evitare addebiti.

  1. Nel portale di Azure fare clic su Gruppi di risorse all'estrema sinistra.
  2. Nell'elenco selezionare il gruppo di risorse creato.
  3. Selezionare Elimina gruppo di risorse.
  4. Immettere il nome del gruppo di risorse. Quindi seleziona Elimina.

È anche possibile mantenere il gruppo di risorse ma eliminare una singola area di lavoro. Visualizzare le proprietà dell'area di lavoro e selezionare Elimina.

Passaggi successivi

In questa esercitazione sulla modalità automatizzata di apprendimento automatico sono state eseguite queste attività:

  • Configurare un'area di lavoro e preparare i dati per un esperimento.
  • Training di un modello di rilevamento oggetti automatizzato
  • Specifica dei valori degli iperparametri per il modello
  • Esecuzione di uno sweeping di iperparametri
  • Distribuzione del modello
  • Visualizzazione dei rilevamenti

Nota

L'uso del set di dati degli oggetti fridge è disponibile tramite licenza in MIT License.