Tutorial: Trainieren eines Objekterkennungsmodells mit AutoML und Python.

GILT FÜR:Azure CLI ML-Erweiterung v2 (aktuell)Python SDK azure-ai-ml v2 (aktuell)

In diesem Tutorial erfahren Sie, wie Sie das automatisierte maschinelle Lernen von Azure Machine Learning mit der Azure Machine Learning CLI-Erweiterung v2 oder dem Azure Machine Learning Python SDK v2 verwenden, um ein Objekterkennungsmodell zu trainieren. Dieses Objekterkennungsmodell ermittelt, ob das Bild Objekte wie etwa eine Dose, einen Karton, eine Milchflasche oder eine Wasserflasche enthält.

Automatisiertes maschinelles Lernen akzeptiert Trainingsdaten und Konfigurationseinstellungen und durchläuft automatisch Kombinationen von verschiedenen Methoden zur Featurenormalisierung/-standardisierung, Modellen und Hyperparametereinstellungen, um das bestmögliche Modell zu erhalten.

In diesem Tutorial wird Code mithilfe des Python SDK geschrieben, und es werden folgende Aufgaben vorgestellt:

  • Herunterladen und Transformieren von Daten
  • Trainieren eines Objekterkennungsmodells mit automatisiertem maschinellem Lernen
  • Angeben von Hyperparameterwerten für Ihr Modell
  • Durchführen eines Hyperparameter-Sweepings
  • Bereitstellen Ihres Modells
  • Visualisieren von Erkennungen

Voraussetzungen

  • Um Azure Machine Learning verwenden zu können, benötigen Sie zunächst einen Arbeitsbereich. Wenn Sie noch keinen haben, schließen Sie Erstellen von Ressourcen, die Sie für die ersten Schritte benötigen ab, um einen Arbeitsbereich zu erstellen, und mehr über dessen Verwendung zu erfahren.

  • Für dieses Feature werden Python 3.6 und 3.7 unterstützt.

  • Laden Sie die Datendatei *odFridgeObjects.zip herunter, und entzippen Sie sie. Das Dataset wird im Pascal-VOC-Format kommentiert, wobei jedes Bild einer XML-Datei entspricht. Jede XML-Datei enthält Informationen dazu, wo sich die entsprechende Bilddatei befindet, und enthält zudem Informationen zu den Begrenzungsrahmen und Objektbezeichnungen. Um diese Daten verwenden zu können, müssen Sie sie zunächst in das erforderliche JSONL-Format konvertieren, wie im Abschnitt Konvertieren der heruntergeladenen Daten in JSONL des Notebooks zu sehen.

  • Verwenden Sie eine Compute-Instanz, um diesem Tutorial ohne weitere Installation zu folgen. (Weitere Informationen finden Sie unter Erstellen einer Compute-Instanz.) Oder installieren Sie die CLI bzw. das SDK, um Ihre eigene lokale Umgebung zu nutzen.

    GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

    Dieses Tutorial ist auch im Repository „azureml-examples“ auf GitHub verfügbar. Wenn Sie es in Ihrer eigenen lokalen Umgebung ausführen möchten:

Einrichten des Computeziels

Hinweis

Um serverloses Computing (Vorschau) zu testen, überspringen Sie diesen Schritt, und fahren mit Einrichten des Experiments fort.

Zuerst muss ein Computeziel zum Trainieren des automatisierten ML-Modells eingerichtet werden. Automatisierte ML-Modelle für Bildaufgaben erfordern GPU-SKUs.

In diesem Tutorial wird die NCsv3-Serie (mit V100-GPUs) verwendet, da diese Art von Computeziel mehrere GPUs nutzt, um das Trainieren zu beschleunigen. Darüber hinaus können Sie mehrere Knoten einrichten, um bei der Optimierung von Hyperparametern für Ihr Modell von Parallelität zu profitieren.

Mit dem folgenden Code wird eine GPU-Computeressource der Größe Standard_NC24s_v3 mit vier Knoten erstellt.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

Erstellen Sie eine YML-Datei mit der folgenden 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

Um die Computeressource zu erstellen, führen Sie den folgenden CLI v2-Befehl mit dem Pfad zu Ihrer YML-Datei, dem Arbeitsbereichsnamen, der Ressourcengruppe und der Abonnement-ID aus.

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

Einrichten des Experiments

Sie können ein Experiment verwenden, um Ihre Modelltrainingsaufträge nachzuverfolgen.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

Der Experimentname kann mithilfe des experiment_name-Schlüssels wie folgt bereitgestellt werden:

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

Visualisieren von Eingabedaten

Nachdem Sie die Eingabebilddaten im Format JSONL (JSON-Zeilen) vorbereitet haben, können Sie die Ground Truth-Begrenzungsrahmen für ein Bild visualisieren. Vergewissern Sie sich hierzu, dass matplotlib installiert ist.

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

Mithilfe der oben angegebenen Hilfsfunktionen können Sie für jedes beliebige Bild den folgenden Code ausführen, um die Begrenzungsrahmen anzuzeigen.

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

plot_ground_truth_boxes_jsonl(image_file, jsonl_file)

Hochladen der Daten und Erstellen von MLTable

Um die Daten zum Training zu verwenden, laden Sie Daten in die standardmäßige Blob Storage-Instanz Ihres Azure Machine Learning-Arbeitsbereichs hoch und registrieren sie als Objekt. Die Vorteile der Registrierung von Daten sind:

  • Einfach zu teilen mit anderen Mitgliedern des Teams
  • Versionsverwaltung der Metadaten (Speicherort, Beschreibung usw.)
  • Datenherkunftsverfolgung

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

Erstellen Sie eine YML-Datei mit der folgenden 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

Um die Bilder als Datenressource hochzuladen, führen Sie den folgenden CLI v2-Befehl mit dem Pfad zu Ihrer YML-Datei, dem Arbeitsbereichsnamen, der Ressourcengruppe und der Abonnement-ID aus.

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

Der nächste Schritt besteht darin, MLTable aus Ihren Daten im JSONL-Format wie unten gezeigt zu erstellen. MLtable verpackt Ihre Daten in ein Objekt, das zum Trainieren genutzt werden kann.

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

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

Die folgende Konfiguration erstellt Trainings- und Validierungsdaten aus der MLTable.

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

Konfigurieren Ihres Objekterkennungsexperiments

Um automatisierte ML-Aufträge für bildbezogene Aufgaben zu konfigurieren, erstellen Sie einen aufgabenspezifischen AutoML-Auftrag.

GILT FÜRAzure CLI-ML-Erweiterung v2 (aktuell)

Wenn Sie serverloses Computing (Vorschau) verwenden möchten, ersetzen Sie die Zeile compute: azureml:gpu-cluster durch den folgenden Code:

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

Automatisches Sweeping von Hyperparametern für Bildaufgaben (AutoMode)

Wichtig

Dieses Feature ist zurzeit als öffentliche Preview verfügbar. Diese Vorschauversion wird ohne Vereinbarung zum Servicelevel bereitgestellt. Manche Features werden möglicherweise nicht unterstützt oder sind nur eingeschränkt verwendbar. Weitere Informationen finden Sie unter Zusätzliche Nutzungsbestimmungen für Microsoft Azure-Vorschauen.

In Ihrem AutoML-Auftrag können Sie einen automatischen Sweep von Hyperparametern ausführen, um das optimale Modell zu finden (wir nennen diese Funktionalität AutoMode). Sie geben nur die Anzahl der Tests an. Der Suchbereich für Hyperparameter, die Samplingmethode und die Richtlinie für vorzeitiges Beenden sind nicht erforderlich. Das System bestimmt auf Grundlage der Anzahl der Tests automatisch den Bereich des Hyperparameterraums für den Sweep. Ein Wert von 10–20 ist für viele Datasets geeignet.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

limits:
  max_trials: 10
  max_concurrent_trials: 2

Anschließend können Sie den Auftrag übermitteln, um ein Bildmodell zu trainieren.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

Zum Übermitteln Ihres AutoML-Auftrags führen Sie den folgenden CLI v2-Befehl mit dem Pfad zu Ihrer YML-Datei, dem Arbeitsbereichsnamen, der Ressourcengruppe und der Abonnement-ID aus.

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]

Manuelles Sweeping von Hyperparametern für Bildaufgaben

In Ihrem AutoML-Auftrag können Sie mit dem Parameter model_name die Modellarchitekturen angeben und die Einstellungen so konfigurieren, dass ein Hyperparameter-Sweeping innerhalb eines definierten Suchraums durchgeführt wird, um das optimale Modell zu finden.

In diesem Beispiel trainieren wir ein Objekterkennungsmodell mit yolov5 und fasterrcnn_resnet50_fpn. Beide wurden mit COCO vortrainiert – einem umfangreichen Dataset für Objekterkennung, Segmentierung und Beschriftung, das mehrere tausend beschriftete Bilder mit über 80 Beschriftungskategorien umfasst.

Sie können ein Hyperparameter-Sweeping innerhalb eines definierten Suchraums durchführen, um das optimale Modell zu finden.

Auftragsgrenzwerte

Sie können den Ressourcenverbrauch für Ihren AutoML-Auftrag zum Bildtraining kontrollieren, indem Sie die timeout_minutes, max_trials und max_concurrent_trials für den Auftrag in den Grenzwerteinstellungen festlegen. Lesen Sie die ausführliche Beschreibung der Parameter für Auftragsbeschränkungen.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

limits:
  timeout_minutes: 60
  max_trials: 10
  max_concurrent_trials: 2

Mit dem folgenden Code wird der Suchraum für die definierten Architekturen yolov5 und fasterrcnn_resnet50_fpn definiert, um das Sweeping von Hyperparametern vorzubereiten. Geben Sie in dem Suchraum den Wertebereich für learning_rate, optimizer, lr_scheduler usw. an, der AutoML zur Verfügung stehen soll, um ein Modell mit der optimalen primären Metrik zu generieren. Ohne Angabe von Hyperparameterwerten werden für die Architektur jeweils Standardwerte verwendet.

Verwenden Sie für die Optimierungseinstellungen die zufällige Stichprobenentnahme, um Stichproben aus diesem Parameterraum zu wählen, indem Sie den random-Algorithmus für die Stichprobenentnahme verwenden. Durch die oben konfigurierten Auftragsbeschränkungen wird das automatisierte maschinelle Lernen angewiesen, insgesamt 10 Testläufe mit diesen unterschiedlichen Stichproben durchzuführen, wobei für unser mit vier Knoten eingerichtetes Computeziel jeweils zwei Testläufe gleichzeitig ausgeführt werden. Je höher die Parameteranzahl des Suchraums, desto mehr Testläufe werden benötigt, um optimale Modelle zu finden.

Außerdem wird die Banditenrichtlinie für vorzeitige Beendigung verwendet. Diese Richtlinie bricht Versuche mit schlechter Leistung ab, d. h. Tests, die mehr als 20 % vom besten Test entfernt sind, was zu einer erheblichen Einsparung von Computeressourcen führt.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

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]

Nach dem Definieren des Suchraums und der Sweepingeinstellungen können Sie den Auftrag übermitteln, um ein Bildmodell mit Ihrem Trainingsdataset zu trainieren.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

Zum Übermitteln Ihres AutoML-Auftrags führen Sie den folgenden CLI v2-Befehl mit dem Pfad zu Ihrer YML-Datei, dem Arbeitsbereichsnamen, der Ressourcengruppe und der Abonnement-ID aus.

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]

Im Zuge eines Hyperparameter-Sweepings kann es hilfreich sein, die verschiedenen getesteten Testversionen mithilfe der HyperDrive-Benutzeroberfläche zu visualisieren. Zu dieser Benutzeroberfläche gelangen Sie, indem Sie auf der Benutzeroberfläche des weiter oben angegebenen Hauptauftrags „automl_image_job“ (also der übergeordnete HyperDrive-Auftrag) zur Registerkarte für untergeordnete Aufträge navigieren. Dort können Sie dann zur entsprechenden Registerkarte für untergeordnete Aufträge wechseln.

Alternativ können Sie wie folgt direkt den übergeordneten HyperDrive-Auftrag anzeigen und zur zugehörigen Registerkarte für untergeordnete Aufträge navigieren:

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

CLI example not available, please use Python SDK.

Registrieren und Bereitstellen von Modellen

Nach Abschluss des Auftrags können Sie das Modell registrieren, das aus dem besten Test erstellt wurde (Konfiguration, die zur besten primären Metrik führte). Sie können das Modell entweder nach dem Herunterladen oder durch Angabe des azureml-Pfads mit entsprechender jobid registrieren.

Abrufen des besten Tests

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

CLI example not available, please use Python SDK.

Registrieren des Modells

Registrieren Sie das Modell entweder unter Verwendung des azureml-Pfads oder Ihres lokal heruntergeladenen Pfads.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

 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]

Nachdem Sie das Modell, das Sie verwenden möchten, registriert haben, können Sie es mithilfe des verwalteten Onlineendpunkts deploy-managed-online-endpoint bereitstellen.

Konfigurieren des Online-Endpunkts

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

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

Erstellen des Endpunkts

Mit der MLClient zuvor erstellten Version erstellen wir nun den Endpunkt im Arbeitsbereich. Dieser Befehl startet die Endpunkterstellung und gibt eine Bestätigungsantwort zurück, während die Endpunkterstellung fortgesetzt wird.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

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

Wir können auch einen Batch-Endpunkt für Batchrückschlüsse für große Datenmengen über einen bestimmten Zeitraum erstellen. Schauen Sie sich das Notebook für die Batchbewertung der Objekterkennung für Batchrückschlüsse an, indem Sie den Batch-Endpunkt verwenden.

Konfigurieren der Onlinebereitstellung

Eine Einrichtung ist ein Satz von Ressourcen, die für das Hosting des Modells erforderlich sind, das die eigentliche Inferenz durchführt. Wir erstellen eine Bereitstellung für unseren Endpunkt mithilfe der ManagedOnlineDeployment-Klasse. Sie können entweder GPU- oder CPU-VM-SKUs für Ihren Bereitstellungscluster verwenden.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

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 

Erstellen der Bereitstellung

Mit dem zuvor erstellten MLClient-Element erstellen wir die Bereitstellung im Arbeitsbereich. Dieser Befehl startet die Bereitstellungserstellung und gibt eine Bestätigungsantwort zurück, während die Bereitstellungserstellung fortgesetzt wird.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

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

Datenverkehr aktualisieren:

Standardmäßig ist die aktuelle Bereitstellung so festgelegt, dass sie 0 % Datenverkehr empfängt. können Sie den Prozentsatz des Datenverkehrs festlegen, den die aktuelle Bereitstellung erhalten soll. Die Summe der prozentualen Anteile des Datenverkehrs aller Bereitstellungen mit einem Endpunkt sollte 100 % nicht überschreiten.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

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]

Testen der Bereitstellung

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

CLI example not available, please use Python SDK.

Visualisieren von Erkennungen

Nachdem Sie nun ein Testbild bewertet haben, können Sie die Begrenzungsrahmen für dieses Bild visualisieren. Hierzu muss „matplotlib“ installiert sein.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

CLI example not available, please use Python SDK.

Bereinigen von Ressourcen

Überspringen Sie diesen Abschnitt, wenn Sie weitere Azure Machine Learning-Tutorials absolvieren möchten.

Wenn Sie die erstellten Ressourcen nicht mehr benötigen, löschen Sie sie, damit Ihnen keine Kosten entstehen.

  1. Wählen Sie ganz links im Azure-Portal Ressourcengruppen aus.
  2. Wählen Sie in der Liste die Ressourcengruppe aus, die Sie erstellt haben.
  3. Wählen Sie die Option Ressourcengruppe löschen.
  4. Geben Sie den Ressourcengruppennamen ein. Wählen Sie anschließend die Option Löschen.

Sie können die Ressourcengruppe auch behalten und einen einzelnen Arbeitsbereich löschen. Zeigen Sie die Eigenschaften des Arbeitsbereichs an, und klicken Sie auf Löschen.

Nächste Schritte

In diesem Tutorial zum automatisierten maschinellen Lernen haben Sie folgende Aufgaben ausgeführt:

  • Konfigurieren eines Arbeitsbereichs und Vorbereiten der Daten für ein Experiment
  • Trainieren eines automatisierten Objekterkennungsmodells
  • Angeben von Hyperparameterwerten für Ihr Modell
  • Durchführen eines Hyperparameter-Sweepings
  • Bereitstellen Ihres Modells
  • Visualisieren von Erkennungen

Hinweis

Das Dataset „Fridge Objects“ kann über die Lizenz unter MIT-Lizenz genutzt werden.