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.

Si scriverà codice usando Python SDK in questa esercitazione e si apprenderà 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 sfrutta 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 spazzamento automatico dell'iperparametro per trovare il modello ottimale (chiamiamo questa funzionalità AutoMode). Si specifica solo il numero di versioni di valutazione; lo spazio di ricerca dell'iperparametro, il metodo di campionamento e i criteri di terminazione anticipata non sono necessari. Il sistema determina automaticamente l'area dello spazio iperparametro 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 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 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, nome dell'area di lavoro, gruppo di risorse e 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]

Scorrimento 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 spazio di ricerca definito 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 pre-sottoposti a training su 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 in impostazioni di limite. Fare riferimento alla descrizione dettagliata dei parametri Dei limiti del processo.

SI APPLICA A:Estensione 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 dell'iperparametro 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 da scegliere quando tenta di generare un modello con la metrica primaria ottimale. Se i valori di iperparametri non vengono specificati, i valori predefiniti vengono usati per ogni architettura.

Per le impostazioni di ottimizzazione, usare il campionamento casuale per selezionare esempi da questo spazio dei parametri usando la random sampling_algorithm. I limiti del processo configurati in precedenza indicano a Machine Learning automatizzato di provare un totale di 10 prove con questi diversi esempi, eseguendo due prove alla volta sulla destinazione di calcolo, che è stata configurata usando quattro nodi. Più parametri lo spazio di ricerca ha, più prove è necessario trovare modelli ottimali.

Viene usato anche il criterio di terminazione anticipata di Bandit. Questo criterio termina le prove con prestazioni scarse; vale a dire, quelle prove che non si trovano all'interno del 20% della versione di valutazione con prestazioni ottimali, che salvano significativamente le risorse di calcolo.

SI APPLICA A:Estensione 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, è quindi possibile inviare il processo per eseguire il training di un modello di immagine usando il set di dati di training.

SI APPLICA A:Estensione 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, nome dell'area di lavoro, gruppo di risorse e 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 che sono state 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 da sopra, ovvero il processo padre Di HyperDrive. È quindi possibile passare alla scheda "Processi figlio" di questa.

In alternativa, qui di seguito è possibile visualizzare direttamente il processo padre di HyperDrive e passare alla scheda "Processi figlio":

SI APPLICA A:Estensione 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 azureml percorso con il corrispondente jobid.

Ottenere la versione di valutazione migliore

SI APPLICA A:Estensione 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 o il azureml percorso scaricato in locale.

SI APPLICA A:Estensione 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 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 avvierà la creazione dell'endpoint e restituirà una risposta di conferma durante la creazione dell'endpoint.

SI APPLICA A:Estensione 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 periodo di tempo. Vedere il notebook di assegnazione dei punteggi batch di rilevamento degli 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. Verrà 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 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 la MLClient versione precedente creata, verrà ora creata la distribuzione nell'area di lavoro. Questo comando avvierà la creazione della distribuzione e restituirà una risposta di conferma durante la creazione della distribuzione.

SI APPLICA A:Estensione 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 del 0%. è possibile impostare la percentuale di traffico che deve ricevere la distribuzione corrente. La somma delle percentuali di traffico di tutte le distribuzioni con un punto finale 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

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. 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.