教學課程:使用 AutoML 和 Python 定型物件偵測模型

適用於:Azure CLI ml 延伸模組 v2 (目前)Python SDK azure-ai-ml v2 (目前)

在本教學課程中,您將了解如何使用 Azure Machine Learning 自動化 ML 搭配 Azure Machine Learning CLI 延伸模組 第 2 版或 Azure Machine Learning Python SDK 第 2 版來定型物件偵測模型。 此物件偵測模型會識別影像是否包含物件,例如罐頭、貨箱、牛奶瓶或水瓶。

自動化 ML 接受定型資料和組態設定,並自動逐一查看不同功能正規化/標準化方法、模型及超參數設定的組合,以獲得最佳模型。

您會在本教學課程中使用 Python SDK 來撰寫程式碼,並了解下列工作:

  • 下載與轉換資料
  • 將自動化機器學習物件偵測模型定型
  • 指定模型的超參數值
  • 執行超參數整理
  • 部署模型
  • 將偵測視覺化

必要條件

  • 若要使用 Azure Machine Learning,您必須先有工作區。 如果您沒有工作區,請完成建立要開始使用所需要的資源以建立工作區,並深入了解其使用方式。

  • 此功能支援 Python 3.6 或3.7

  • 下載並解壓縮 *odFridgeObjects.zip 資料檔案。 資料集會以 Pascal VOC 格式標注,其中每個影像皆會對應至 xml 檔案。 每個 xml 檔案皆包含其對應影像檔所在位置的相關資訊,也包含週框方塊和物件標籤的相關資訊。 如要使用此資料,您必須先將其轉換成所需的 JSONL 格式,如筆記本的將下載的資料轉換成 JSONL (英文) 一節所示。

  • 使用計算執行個體來遵循本教學課程,而不需進一步安裝。 (請參閱如何建立計算執行個體。)或安裝 CLI/SDK 以使用您自己的本機環境。

    適用於:Azure CLI ml 延伸模組 v2 (目前)

    本教學課程也適用於 GitHub 上的 azureml-examples 存放庫。 如果您想要在自己的本機環境中執行:

計算目標設定

注意

若要嘗試無伺服器計算 (預覽),請略過此步驟並繼續進行實驗設定

您必須先設定要用於自動化 ML 模型定型的計算目標。 映像工作的自動化 ML 模型需要 GPU SKU。

本教學課程使用 NCsv3 系列 (搭配 V100 GPU),因為這種類型的計算目標會使用多個 GPU 來加速定型。 此外,您可以設定多個節點,以在微調模型的超參數時利用平行處理原則。

下列程式碼會建立 GPU 計算,其大小為 Standard_NC24s_v3 且具有四個節點。

適用於:Azure CLI ml 延伸模組 v2 (目前)

使用下列設定建立 .yml 檔案。

$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

若要建立此計算,請使用 .yml 檔案的路徑、工作區名稱、資源群組和訂用帳戶識別碼來執行下列 CLI 第 2 版命令。

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

實驗設定

您可以使用實驗來追蹤模型定型作業。

適用於:Azure CLI ml 延伸模組 v2 (目前)

您可以使用 experiment_name 索引鍵來提供實驗名稱,如下所示:

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

視覺化輸入資料

當您在 JSONL (JSON 行) 格式中備妥輸入影像資料後,即可將影像的真實週框方塊視覺化。 如要執行此工作,請確認您已安裝 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))

針對任何指定的影像使用上述協助程式函式,即可執行下列程式碼來顯示週框方塊。

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

plot_ground_truth_boxes_jsonl(image_file, jsonl_file)

上傳資料並建立 MLTable

若要使用資料進行定型,請將資料上傳至 Azure Machine Learning 工作區的預設 Blob 儲存體,並將其註冊為資產。 註冊資料的優點如下:

  • 輕鬆與小組的其他成員共用
  • 中繼資料的版本設定 (位置、描述等)
  • 譜系追蹤

適用於:Azure CLI ml 延伸模組 v2 (目前)

使用下列設定建立 .yml 檔案。

$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

若要以資料資產形式上傳影像,請搭配您 .yml 檔案的路徑、工作區名稱、資源群組與訂用帳戶識別碼來執行下列 CLI 第 2 版命令。

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

下一個步驟是使用 jsonl 格式從您的資料建立 MLTable,如下所示。 MLtable 會將您的資料封裝至可取用的物件以進行定型。

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

適用於:Azure CLI ml 延伸模組 v2 (目前)

下列設定會從 MLTable 建立定型和驗證資料。

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

設定您的物件偵測實驗

若要為映像相關工作設定自動化 ML 作業,請建立工作特定的 AutoML 作業。

適用於:Azure CLI ml 延伸模組 v2 (目前)

若要使用無伺服器計算 (預覽),請使用下列程式碼取代 compute: azureml:gpu-cluster 這一行:

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

影像工作的自動超參數掃掠 (AutoMode)

重要

此功能目前處於公開預覽。 在此提供的這個預覽版本並無服務等級協定。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款

在您的 AutoML 作業中,您可以執行自動超參數掃掠來尋找最佳模型 (我們稱之為功能 AutoMode)。 您僅指定試用數目;不需要超參數搜尋空間、取樣方法和早期終止原則。 系統會根據試用數目自動判斷要掃掠的超參數空間區域。 介於 10 到 20 之間的值可能在許多資料集上運作良好。

適用於:Azure CLI ml 延伸模組 v2 (目前)

limits:
  max_trials: 10
  max_concurrent_trials: 2

然後,您可以提交作業來定型映像模型。

適用於:Azure CLI ml 延伸模組 v2 (目前)

若要提交 AutoML 作業,請使用 .yml 檔案的路徑、工作區名稱、資源群組和訂用帳戶識別碼來執行下列 CLI 第 2 版命令。

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]

影像工作的手動超參數掃掠

在 AutoML 作業中,您可以使用 model_name 參數來指定模型結構,並進行設定以對定義的搜尋空間執行超參數掃掠,以找出最佳模型。

在此範例中,我們會使用 yolov5fasterrcnn_resnet50_fpn 來定型物件偵測模型,後兩者皆在 COCO 上預先定型,COCO 是一個大型物件偵測、分割和字幕資料集,其中包含超過數千個已標示的影像 (具有超過 80 個標籤類別)。

您可對已定義的參數空間執行超參數整理,以找出最佳模型。

作業限制

您可藉由在限制設定中指定作業的 timeout_minutesmax_trialsmax_concurrent_trials,控制在 AutoML 影像定型作業上花費的資源。 請參閱作業限制參數的詳細描述

適用於:Azure CLI ml 延伸模組 v2 (目前)

limits:
  timeout_minutes: 60
  max_trials: 10
  max_concurrent_trials: 2

下列程式碼會針對每個已定義的結構 yolov5fasterrcnn_resnet50_fpn,定義準備進行超參數掃掠的搜尋空間。 在搜尋空間中,指定 learning_rateoptimizerlr_scheduler 等的值範圍,好讓 AutoML 可供選擇,因為其會嘗試以最佳的主要度量產生模型。 若未指定超參數值,則會使用每個結構的預設值。

針對微調設定,利用 random sampling_algorithm 來使用隨機取樣,以從這個參數空間挑選範例。 以上設定的作業限制會告知自動化 ML 使用這些不同的範例來嘗試總計 10 次的試驗,並在計算目標上一次執行兩次試驗 (使用四個節點進行設定)。 搜尋空間具有的參數愈多,您就需要更多次的試驗才能找到最佳模型。

此外也會使用 Bandit 提前終止原則。 此原則會終止效能不佳的試用;亦即,不在最佳執行試用 20% 寬限時間內的那些試用,如此可大幅節省計算資源。

適用於:Azure CLI ml 延伸模組 v2 (目前)

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]

定義搜尋空間和整理設定後,您可以接著提交作業,以使用定型資料集來定型映像模型。

適用於:Azure CLI ml 延伸模組 v2 (目前)

若要提交 AutoML 作業,請使用 .yml 檔案的路徑、工作區名稱、資源群組和訂用帳戶識別碼來執行下列 CLI 第 2 版命令。

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]

執行超參數掃掠時,視覺化那些使用 HyperDrive UI 嘗試的不同試用會很有用。 您可前往上述主要 automl_image_job (亦即 HyperDrive 父代作業) 的 UI 中的 [子作業] 索引標籤,以瀏覽至此 UI。 接著您就可以進入此項的 [子作業] 索引標籤。

或者,您可在下方此處直接查看 HyperDrive 父代作業,並瀏覽至其 [子作業] 索引標籤:

適用於:Azure CLI ml 延伸模組 v2 (目前)

CLI example not available, please use Python SDK.

註冊和部署模型

一旦作業完成,您就可以註冊從最佳試用 (產生最佳主要計量的設定) 建立的模型。 您可以在下載後,或使用對應的 jobid 指定 azureml 路徑,以註冊模型。

獲得最佳試用

適用於:Azure CLI ml 延伸模組 v2 (目前)

CLI example not available, please use Python SDK.

註冊模型

使用 azureml 路徑或本機下載的路徑來註冊模型。

適用於:Azure CLI ml 延伸模組 v2 (目前)

 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]

註冊要使用的模型之後,您可以使用受控線上端點 deploy-managed-online-endpoint 進行部署

設定線上端點

適用於:Azure CLI ml 延伸模組 v2 (目前)

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

建立端點

使用稍早建立的 MLClient,我們現在會在工作區中建立端點。 此命令會啟動端點建立,並在端點建立繼續時傳回確認回應。

適用於:Azure CLI ml 延伸模組 v2 (目前)

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

我們也可以建立批次端點,以在一段時間內針對大量資料進行批次推斷。 查看物件偵測批次評分筆記本,以使用批次端點進行批次推斷。

設定線上部署

部署是託管執行實際推斷模型所需的一組資源。 我們會使用 ManagedOnlineDeployment 類別為端點建立部署。 您可以針對您的部署叢集使用 GPU 或 CPU VM SKU。

適用於:Azure CLI ml 延伸模組 v2 (目前)

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 

建立部署

使用稍早建立的 MLClient,我們會在工作區中建立部署。 此命令會啟動部署建立,並在部署建立繼續時傳回確認回應。

適用於:Azure CLI ml 延伸模組 v2 (目前)

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

更新流量:

根據預設,目前部署設定為接收 0% 流量。 您可以設定目前部署應該接收的流量百分比。 具有一個端點的所有部署合計流量百分比不應超過 100%。

適用於:Azure CLI ml 延伸模組 v2 (目前)

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]

測試部署

適用於:Azure CLI ml 延伸模組 v2 (目前)

CLI example not available, please use Python SDK.

將偵測視覺化

您現已為測試影像評分,可以將此影像的週框方塊視覺化。 如要執行此工作,請確定您已安裝 matplotlib。

適用於:Azure CLI ml 延伸模組 v2 (目前)

CLI example not available, please use Python SDK.

清除資源

如果您打算執行其他 Azure Machine Learning 教學課程,請不要完成本節。

如果您不打算使用您建立的資源,請刪除它們,以免產生任何費用。

  1. 在 Azure 入口網站中,選取最左邊的 [資源群組]
  2. 在清單中,選取您所建立的資源群組。
  3. 選取 [刪除資源群組]
  4. 輸入資源群組名稱。 接著選取刪除

您也可以保留資源群組,但刪除單一工作區。 顯示工作區屬性,然後選取 [刪除]

下一步

在此自動化機器學習教學課程中,您已執行下列工作:

  • 設定工作區和備妥用於實驗的資料。
  • 已定型自動化物件偵測模型
  • 已指定模型的超參數值
  • 已執行超參數整理
  • 已部署您的模型
  • 已將偵測視覺化

注意

您可以透過 MIT 授權下的授權,來使用冰箱物件資料集。