Dela via


Självstudie: Träna en objektidentifieringsmodell med AutoML och Python

GÄLLER FÖR:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (aktuell)

I den här självstudien får du lära dig hur du tränar en objektidentifieringsmodell med azure machine learning automatiserad ML med Azure Machine Learning CLI-tillägget v2 eller Azure Machine Learning Python SDK v2. Den här objektidentifieringsmodellen identifierar om bilden innehåller objekt, till exempel en burk, kartong, mjölkflaska eller vattenflaska.

Automatiserad ML accepterar träningsdata och konfigurationsinställningar och itererar automatiskt genom kombinationer av olika funktionsnormaliserings-/standardiseringsmetoder, modeller och hyperparameterinställningar för att komma fram till den bästa modellen.

Du skriver kod med Python SDK i den här självstudien och lär dig följande uppgifter:

  • Ladda ned och transformera data
  • Träna en modell för identifiering av automatiserade maskininlärningsobjekt
  • Ange hyperparametervärden för din modell
  • Utföra en hyperparametersvepning
  • Distribuera din modell
  • Visualisera identifieringar

Förutsättningar

  • Om du vill använda Azure Machine Learning behöver du en arbetsyta. Om du inte har någon slutför du Skapa resurser som du behöver för att komma igång med att skapa en arbetsyta och lära dig mer om hur du använder den.

  • Python 3.9 eller 3.10 stöds för den här funktionen

  • Ladda ned och packa upp odFridgeObjects.zip-datafilen*. Datamängden kommenteras i Pascal VOC-format, där varje bild motsvarar en XML-fil. Varje XML-fil innehåller information om var dess motsvarande bildfil finns och innehåller även information om avgränsningsrutorna och objektetiketterna. För att kunna använda dessa data måste du först konvertera dem till det JSONL-format som krävs enligt avsnittet Konvertera nedladdade data till JSONL i notebook-filen.

  • Använd en beräkningsinstans för att följa den här självstudien utan ytterligare installation. (Se hur du skapar en beräkningsinstans.) Eller installera CLI/SDK för att använda din egen lokala miljö.

    GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

    Den här självstudien är också tillgänglig på lagringsplatsen azureml-examples på GitHub. Om du vill köra den i din egen lokala miljö:

Konfiguration av beräkningsmål

Kommentar

Om du vill prova serverlös beräkning (förhandsversion) hoppar du över det här steget och fortsätter till Experiment-konfigurationen.

Du måste först konfigurera ett beräkningsmål som ska användas för din automatiserade ML-modellträning. Automatiserade ML-modeller för avbildningsuppgifter kräver GPU-SKU:er.

I den här självstudien används NCsv3-serien (med V100 GPU:er) eftersom den här typen av beräkningsmål använder flera GPU:er för att påskynda träningen. Dessutom kan du konfigurera flera noder för att dra nytta av parallellitet när du justerar hyperparametrar för din modell.

Följande kod skapar en GPU-beräkning av storlek Standard_NC24s_v3 med fyra noder.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

Skapa en .yml fil med följande konfiguration.

$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

För att skapa beräkningen kör du följande CLI v2-kommando med sökvägen till din .yml fil, arbetsytans namn, resursgrupp och prenumerations-ID.

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

Experimentkonfiguration

Du kan använda ett experiment för att spåra dina modellträningsjobb.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

Experimentnamnet kan anges med hjälp av experiment_name nyckeln på följande sätt:

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

Visualisera indata

När du har förberett indata för bilddata i JSONL-format (JSON Lines) kan du visualisera mark sanningsgränsrutorna för en bild. Kontrollera att du har matplotlib installerat för att göra det.

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

Med hjälpfunktionerna ovan kan du för en viss bild köra följande kod för att visa avgränsningsrutorna.

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

plot_ground_truth_boxes_jsonl(image_file, jsonl_file)

Ladda upp data och skapa MLTable

För att kunna använda data för träning laddar du upp data till standardbloblagringen för din Azure Machine Learning-arbetsyta och registrerar dem som en tillgång. Fördelarna med att registrera data är:

  • Lätt att dela med andra medlemmar i teamet
  • Versionshantering av metadata (plats, beskrivning osv.)
  • Spårning av ursprung

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

Skapa en .yml fil med följande konfiguration.

$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

Om du vill ladda upp avbildningarna som en datatillgång kör du följande CLI v2-kommando med sökvägen till din .yml-fil, arbetsytans namn, resursgrupp och prenumerations-ID.

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

Nästa steg är att skapa MLTable från dina data i jsonl-format enligt nedan. MLtable paketera dina data i ett förbrukningsbart objekt för träning.

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

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

Följande konfiguration skapar tränings- och valideringsdata från MLTable.

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

Konfigurera objektidentifieringsexperimentet

Om du vill konfigurera automatiserade ML-jobb för avbildningsrelaterade uppgifter skapar du ett uppgiftsspecifikt AutoML-jobb.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

Om du vill använda serverlös beräkning (förhandsversion) ersätter du raden compute: azureml:gpu-cluster med den här koden:

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

Automatisk hyperparameter som sveper för bilduppgifter (AutoMode)

Viktigt!

Den här funktionen är för närvarande i allmänt tillgänglig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.

I ditt AutoML-jobb kan du utföra en automatisk hyperparameterrensning för att hitta den optimala modellen (vi kallar den här funktionen AutoMode). Du anger bara antalet utvärderingsversioner. Hyperparameterns sökutrymme, samplingsmetod och princip för tidig avslutning behövs inte. Systemet avgör automatiskt vilken region i hyperparameterutrymmet som ska sopa baserat på antalet försök. Ett värde mellan 10 och 20 kommer sannolikt att fungera bra på många datauppsättningar.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

limits:
  max_trials: 10
  max_concurrent_trials: 2

Du kan sedan skicka jobbet för att träna en avbildningsmodell.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

Om du vill skicka ditt AutoML-jobb kör du följande CLI v2-kommando med sökvägen till din .yml-fil, arbetsytans namn, resursgrupp och prenumerations-ID.

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]

Manuell hyperparameter som sveper för bilduppgifter

I ditt AutoML-jobb kan du ange modellarkitekturerna med hjälp model_name av parametern och konfigurera inställningarna för att utföra en hyperparameters svepning över ett definierat sökutrymme för att hitta den optimala modellen.

I det här exemplet tränar vi en objektidentifieringsmodell med yolov5 och fasterrcnn_resnet50_fpn, som båda tränas på COCO, en storskalig objektidentifiering, segmentering och textningsdatauppsättning som innehåller över tusentals etiketterade bilder med över 80 etikettkategorier.

Du kan utföra en hyperparameters svepning över ett definierat sökutrymme för att hitta den optimala modellen.

Jobbgränser

Du kan styra de resurser som spenderas på autoML-avbildningsträningsjobbet timeout_minutesgenom att ange , max_trials och max_concurrent_trials för jobbet i gränsinställningarna. Se detaljerad beskrivning av parametrar för jobbbegränsningar.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

limits:
  timeout_minutes: 60
  max_trials: 10
  max_concurrent_trials: 2

Följande kod definierar sökutrymmet som förberedelse för hyperparameter-svepet för varje definierad arkitektur och yolov5 fasterrcnn_resnet50_fpn. I sökutrymmet anger du intervallet med värden för learning_rate, optimizer, lr_scheduler, osv., för AutoML att välja mellan när den försöker generera en modell med det optimala primära måttet. Om hyperparametervärden inte anges används standardvärdena för varje arkitektur.

För justeringsinställningarna använder du slumpmässig sampling för att välja exempel från det här parameterutrymmet med hjälp random av sampling_algorithm. Jobbgränserna som konfigurerats ovan säger till automatiserad ML att prova totalt 10 utvärderingsversioner med dessa olika exempel och köra två utvärderingsversioner i taget på vårt beräkningsmål, som konfigurerades med fyra noder. Ju fler parametrar sökutrymmet har, desto fler utvärderingsversioner behöver du hitta optimala modeller.

Principen för tidig uppsägning av Bandit används också. Den här principen avslutar utvärderingsversioner med dåliga resultat. det vill: de utvärderingsversioner som inte ligger inom 20 % slack från den utvärderingsversion som fungerar bäst, vilket avsevärt sparar beräkningsresurser.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

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]

När sökutrymmet och svepinställningarna har definierats kan du sedan skicka jobbet för att träna en bildmodell med hjälp av din träningsdatauppsättning.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

Om du vill skicka ditt AutoML-jobb kör du följande CLI v2-kommando med sökvägen till din .yml-fil, arbetsytans namn, resursgrupp och prenumerations-ID.

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]

När du gör en hyperparametersrensning kan det vara användbart att visualisera de olika utvärderingsversioner som provades med hjälp av HyperDrive-användargränssnittet. Du kan navigera till det här användargränssnittet genom att gå till fliken Underordnade jobb i användargränssnittet för huvud-automl_image_job ovan, som är det överordnade HyperDrive-jobbet. Sedan kan du gå till fliken Underordnade jobb i den här.

Här nedan kan du också se det överordnade HyperDrive-jobbet direkt och gå till fliken Underordnade jobb:

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

CLI example not available, please use Python SDK.

Registrera och distribuera modell

När jobbet är klart kan du registrera den modell som skapades från den bästa utvärderingsversionen (konfiguration som resulterade i det bästa primära måttet). Du kan antingen registrera modellen efter nedladdningen eller genom att azureml ange sökvägen med motsvarande jobid.

Få den bästa utvärderingsversionen

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

CLI example not available, please use Python SDK.

Registrera modellen

Registrera modellen antingen med hjälp av azureml sökvägen eller din lokalt nedladdade sökväg.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

 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]

När du har registrerat den modell som du vill använda kan du distribuera den med hjälp av den hanterade onlineslutpunkten deploy-managed-online-endpoint

Konfigurera onlineslutpunkt

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

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

Skapa slutpunkten

Med hjälp av den MLClient som skapades tidigare skapar vi nu slutpunkten på arbetsytan. Det här kommandot startar skapandet av slutpunkten och returnerar ett bekräftelsesvar medan skapandet av slutpunkten fortsätter.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

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

Vi kan också skapa en batchslutpunkt för batch-slutsatsdragning på stora mängder data under en viss tidsperiod. Kolla in batchbedömningsanteckningsboken för objektidentifiering för batch-slutsatsdragning med hjälp av batchslutpunkten.

Konfigurera onlinedistribution

En distribution är en uppsättning resurser som krävs för att vara värd för den modell som utför den faktiska inferensen. Vi skapar en distribution för vår slutpunkt med hjälp av ManagedOnlineDeployment klassen . Du kan använda GPU- eller CPU VM-SKU:er för distributionsklustret.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

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 

Skapa distributionen

Med hjälp av den MLClient som skapades tidigare skapar vi distributionen på arbetsytan. Det här kommandot startar distributionen och returnerar ett bekräftelsesvar medan distributionen fortsätter.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

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

Uppdatera trafik:

Som standard är den aktuella distributionen inställd på att ta emot 0 % trafik. du kan ange vilken trafikprocentuell distribution som ska tas emot. Summan av trafikprocenterna för alla distributioner med en slutpunkt får inte överstiga 100 %.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

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]

Testa distributionen

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

CLI example not available, please use Python SDK.

Visualisera identifieringar

Nu när du har fått en testbild kan du visualisera avgränsningsrutorna för den här bilden. För att göra det måste du ha matplotlib installerat.

GÄLLER FÖR: Azure CLI ml-tillägget v2 (aktuellt)

CLI example not available, please use Python SDK.

Rensa resurser

Slutför inte det här avsnittet om du planerar att köra andra Azure Machine Learning-självstudier.

Om du inte planerar att använda de resurser som du har skapat tar du bort dem så att du inte debiteras några avgifter.

  1. I Azure-portalen väljer du Resursgrupper längst till vänster.
  2. Välj den resursgrupp i listan som du har skapat.
  3. Välj Ta bort resursgrupp.
  4. Ange resursgruppsnamnet. Välj sedan ta bort.

Du kan också behålla resursgruppen men ta bort en enstaka arbetsyta. Visa arbetsytans egenskaper och välj Ta bort.

Nästa steg

I den här automatiserade självstudiekursen om maskininlärning har du gjort följande uppgifter:

  • Konfigurerat en arbetsyta och förberett data för ett experiment.
  • Tränat en modell för automatisk objektidentifiering
  • Angivna hyperparametervärden för din modell
  • Utförde en hyperparametersrensning
  • Distribuerade din modell
  • Visualiserade identifieringar

Kommentar

Användning av datamängden kylobjekt är tillgänglig via licensen under MIT-licensen.