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 illustra come eseguire il training di un modello di rilevamento oggetti usando Machine Learning automatizzato di 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 scatola, un cartone, una bottiglia di latte o una bottiglia d'acqua.

Machine Learning automatizzato accetta i dati di training e le impostazioni di configurazione e scorre automaticamente le combinazioni di diversi metodi di normalizzazione/standardizzazione delle funzionalità, modelli e impostazioni degli iperparametri per arrivare al modello migliore.

Scrivere codice usando Python SDK in questa esercitazione e apprendere 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 sweep di iperparametri
  • Distribuire il modello
  • Visualizzare i rilevamenti

Prerequisiti

  • Per usare Azure Machine Learning, è necessario prima di tutto un'area di lavoro. Se non è disponibile, completare Crea risorse necessarie per iniziare a creare un'area di lavoro e ottenere altre informazioni sull'uso.

  • Python 3.6 o 3.7 sono supportati per questa funzionalità

  • Scaricare e decomprimere il * file di datiodFridgeObjects.zip. Il set di dati viene annotato in formato PASCAL, in cui ogni immagine corrisponde a un file XML. Ogni file XML contiene informazioni sulla posizione in cui si trova il file di immagine corrispondente e contiene anche informazioni sui rettangoli di selezione e sulle etichette degli oggetti. Per usare questi dati, è prima necessario convertirli nel formato JSONL richiesto, come illustrato nella sezione Convertire i dati scaricati in JSONL del notebook.

  • Usare un'istanza di calcolo per seguire questa esercitazione senza ulteriori installazioni. Vedere come creare un'istanza di calcolo. In alternativa, installare l'interfaccia della riga di comando/SDK per usare il proprio ambiente locale.

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

    Questa esercitazione è disponibile anche nel repository azureml-examples in GitHub. Se si vuole eseguirlo nel proprio ambiente locale:

Configurazione della destinazione di calcolo

È prima di tutto necessario configurare una destinazione di calcolo da usare per il training automatizzato del modello di Machine Learning. I modelli di Machine Learning automatizzati per le attività di immagine richiedono SKU GPU.

Questa esercitazione usa la serie NCsv3 (con GPU V100) perché questo tipo di destinazione di calcolo usa più GPU per velocizzare il training. È anche 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 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 il calcolo, eseguire il comando dell'interfaccia della riga di comando v2 seguente con il percorso del file con estensione yml, del nome dell'area di lavoro, del gruppo di risorse e dell'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)

È possibile specificare il nome dell'esperimento usando experiment_name la chiave come indicato di seguito:

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

Visualizzare i dati di input

Dopo aver preparato i dati dell'immagine di input in formato JSONL (JSON Lines), è possibile visualizzare i rettangoli di selezione dei dati reali per un'immagine. A tale scopo, assicurarsi di aver matplotlib installato.

%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, caricare i dati nell'archivio BLOB predefinito dell'area di lavoro di Azure Machine Learning e registrarlo come asset. I vantaggi della registrazione dei dati sono i seguenti:

  • Facile da condividere con altri membri del team
  • Controllo delle versioni dei metadati (posizione, descrizione e così via)
  • Rilevamento 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, del nome dell'area di lavoro, del gruppo di risorse e dell'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 di consumo 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 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 degli oggetti

Per configurare processi di Machine Learning automatizzati per le attività correlate alle immagini, creare un processo AutoML specifico per un'attività.

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

Per usare il calcolo serverless (anteprima), sostituire la riga compute: azureml:gpu-cluster con questo codice:

resources:
 instance_type: Standard_NC24s_v3
 instance_count: 4

```yaml
task: image_object_detection
primary_metric: mean_average_precision
compute: azureml:gpu-cluster

Sweep automatico degli iperparametri per le attività di immagine (AutoMode)

Importante

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

Nel processo AutoML è possibile eseguire uno sweep di iperparametri automatico per trovare il modello ottimale (questa funzionalità viene chiamata AutoMode). 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 da eseguire in base al numero di prove. È probabile che un valore compreso tra 10 e 20 funzioni correttamente in 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 AutoML, eseguire il comando dell'interfaccia della riga di comando v2 seguente con il percorso del file con estensione yml, del nome dell'area di lavoro, del gruppo di risorse e dell'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]

Sweep manuale degli iperparametri per le attività di immagine

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

In questo esempio verrà eseguito 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 oltre 80 categorie di etichette.

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

Limiti dei processi

È possibile controllare le risorse spese per il processo di training dell'immagine AutoML specificando timeout_minutesmax_trials e per max_concurrent_trials il processo nelle impostazioni di limite. Fare riferimento a una descrizione dettagliata sui parametri dei limiti dei processi.

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 per lo sweep degli iperparametri per ogni architettura yolov5 definita e fasterrcnn_resnet50_fpn. Nello spazio di ricerca specificare l'intervallo di valori per learning_rate, optimizer, lr_schedulere così via per AutoML tra cui 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 di parametri usando il random sampling_algorithm. I limiti dei processi configurati in precedenza indicano al Machine Learning automatizzato di provare un totale di 10 prove con questi diversi esempi, eseguendo due versioni di valutazione alla volta nella destinazione di calcolo, configurata usando quattro nodi. Maggiore è il numero di parametri disponibili nello spazio di ricerca, maggiore è il numero di versioni di valutazione necessarie per trovare modelli ottimali.

Viene usato anche il criterio di terminazione anticipata bandito. Questo criterio termina le prove con prestazioni scarse; ovvero quelle versioni di valutazione che non rientrano nel 20% del margine di valutazione con prestazioni migliori, che consente di risparmiare in modo significativo le 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 lo spazio di ricerca e le impostazioni di sweep, è possibile inviare il processo per eseguire il training di un modello di immagine usando 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 AutoML, eseguire il comando dell'interfaccia della riga di comando v2 seguente con il percorso del file con estensione yml, del nome dell'area di lavoro, del gruppo di risorse e dell'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 sweep di iperparametri, può essere utile visualizzare le diverse versioni di prova provate usando l'interfaccia utente di HyperDrive. È possibile passare a questa interfaccia utente passando alla scheda "Processi figlio" nell'interfaccia utente del automl_image_job principale dall'alto, ovvero il processo padre di HyperDrive. È quindi possibile passare alla scheda "Processi figlio" di questa.

In alternativa, di seguito è possibile visualizzare direttamente il processo padre di HyperDrive e passare alla relativa scheda "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 versione di valutazione migliore (configurazione che ha generato la metrica primaria migliore). È possibile registrare il modello dopo il download o specificando il percorso con l'oggetto azureml corrispondente jobid.

Ottenere la versione di valutazione 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 azureml percorso o il percorso scaricato localmente.

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'elemento MLClient creato in precedenza, verrà 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 continua.

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 in volumi elevati di dati in un 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

Una distribuzione è un set di risorse necessarie per ospitare il modello che esegue l'inferenza effettiva. Viene creata una distribuzione per l'endpoint usando la ManagedOnlineDeployment classe . È possibile usare SKU gpu o CPU per il cluster di distribuzione.

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 il 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 durante la creazione della distribuzione.

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 il traffico 0%. è possibile impostare la percentuale di traffico che dovrebbe 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 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]

Test della distribuzione

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

CLI example not available, please use Python SDK.

Visualizzare i rilevamenti

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

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

CLI example not available, please use Python SDK.

Pulire le risorse

Non completare questa sezione se si prevede di eseguire altre esercitazioni di Azure Machine Learning.

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. Selezionare 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
  • Valori di iperparametri specificati per il modello
  • Esecuzione di uno spazzamento di iperparametri
  • Distribuzione del modello
  • Rilevamenti visualizzati

Nota

L'uso del set di dati degli oggetti frigorifero è disponibile tramite la licenza con la licenza MIT.