教學課程:使用 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 機器學習,您需要工作區。 如果您沒有工作區,請完成建立要開始使用所需要的資源以建立工作區,並深入了解其使用方式。
此功能支援 Python 3.9 或 3.10
下載並解壓縮 *odFridgeObjects.zip 資料檔案。 資料集會以 Pascal VOC 格式標注,其中每個影像皆會對應至 xml 檔案。 每個 xml 檔案皆包含其對應影像檔所在位置的相關資訊,也包含週框方塊和物件標籤的相關資訊。 如要使用此資料,您必須先將其轉換成所需的 JSONL 格式,如筆記本的將下載的資料轉換成 JSONL (英文) 一節所示。
使用計算執行個體來遵循本教學課程,而不需進一步安裝。 (請參閱如何建立計算執行個體。)或安裝 CLI/SDK 以使用您自己的本機環境。
本教學課程也適用於 GitHub 上的 azureml-examples 存放庫。 如果您想要在自己的本機環境中執行:
- 安裝並設定 CLI (第 2 版),並確定您已安裝
ml
延伸模組。
- 安裝並設定 CLI (第 2 版),並確定您已安裝
計算目標設定
注意
若要嘗試無伺服器計算 (預覽),請略過此步驟並繼續進行實驗設定。
您必須先設定要用於自動化 ML 模型定型的計算目標。 映像工作的自動化 ML 模型需要 GPU SKU。
本教學課程使用 NCsv3 系列 (搭配 V100 GPU),因為這種類型的計算目標會使用多個 GPU 來加速定型。 此外,您可以設定多個節點,以在微調模型的超參數時利用平行處理原則。
下列程式碼會建立 GPU 計算,其大小為 Standard_NC24s_v3
且具有四個節點。
使用下列設定建立 .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]
實驗設定
您可以使用實驗來追蹤模型定型作業。
您可以使用 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 儲存體,並將其註冊為資產。 註冊資料的優點如下:
- 輕鬆與小組的其他成員共用
- 中繼資料的版本設定 (位置、描述等)
- 譜系追蹤
使用下列設定建立 .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
下列設定會從 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 作業。
若要使用無伺服器計算 (預覽),請使用下列程式碼取代
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 之間的值可能在許多資料集上運作良好。
limits:
max_trials: 10
max_concurrent_trials: 2
然後,您可以提交作業來定型映像模型。
若要提交 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
參數來指定模型結構,並進行設定以對定義的搜尋空間執行超參數掃掠,以找出最佳模型。
在此範例中,我們會使用 yolov5
和 fasterrcnn_resnet50_fpn
來定型物件偵測模型,後兩者皆在 COCO 上預先定型,COCO 是一個大型物件偵測、分割和字幕資料集,其中包含超過數千個已標示的影像 (具有超過 80 個標籤類別)。
您可對已定義的參數空間執行超參數整理,以找出最佳模型。
作業限制
您可藉由在限制設定中指定作業的 timeout_minutes
、max_trials
和 max_concurrent_trials
,控制在 AutoML 影像定型作業上花費的資源。 請參閱作業限制參數的詳細描述。
limits:
timeout_minutes: 60
max_trials: 10
max_concurrent_trials: 2
下列程式碼會針對每個已定義的結構 yolov5
和 fasterrcnn_resnet50_fpn
,定義準備進行超參數掃掠的搜尋空間。 在搜尋空間中,指定 learning_rate
、optimizer
、lr_scheduler
等的值範圍,好讓 AutoML 可供選擇,因為其會嘗試以最佳的主要度量產生模型。 若未指定超參數值,則會使用每個結構的預設值。
針對微調設定,利用 random
sampling_algorithm 來使用隨機取樣,以從這個參數空間挑選範例。 以上設定的作業限制會告知自動化 ML 使用這些不同的範例來嘗試總計 10 次的試驗,並在計算目標上一次執行兩次試驗 (使用四個節點進行設定)。 搜尋空間具有的參數愈多,您就需要更多次的試驗才能找到最佳模型。
此外也會使用 Bandit 提前終止原則。 此原則會終止效能不佳的試用;亦即,不在最佳執行試用 20% 寬限時間內的那些試用,如此可大幅節省計算資源。
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]
定義搜尋空間和整理設定後,您可以接著提交作業,以使用定型資料集來定型映像模型。
若要提交 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 父代作業,並瀏覽至其 [子作業] 索引標籤:
CLI example not available, please use Python SDK.
註冊和部署模型
一旦作業完成,您就可以註冊從最佳試用 (產生最佳主要計量的設定) 建立的模型。 您可以在下載後,或使用對應的 jobid
指定 azureml
路徑,以註冊模型。
獲得最佳試用
CLI example not available, please use Python SDK.
註冊模型
使用 azureml
路徑或本機下載的路徑來註冊模型。
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 進行部署
設定線上端點
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: od-fridge-items-endpoint
auth_mode: key
建立端點
使用稍早建立的 MLClient
,我們現在會在工作區中建立端點。 此命令會啟動端點建立,並在端點建立繼續時傳回確認回應。
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。
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
,我們會在工作區中建立部署。 此命令會啟動部署建立,並在部署建立繼續時傳回確認回應。
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%。
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]
測試部署
CLI example not available, please use Python SDK.
將偵測視覺化
您現已為測試影像評分,可以將此影像的週框方塊視覺化。 如要執行此工作,請確定您已安裝 matplotlib。
CLI example not available, please use Python SDK.
清除資源
如果您打算執行其他 Azure Machine Learning 教學課程,請不要完成本節。
如果您不打算使用您建立的資源,請刪除它們,以免產生任何費用。
- 在 Azure 入口網站中,選取最左邊的 [資源群組]。
- 在清單中,選取您所建立的資源群組。
- 選取 [刪除資源群組]。
- 輸入資源群組名稱。 接著選取刪除。
您也可以保留資源群組,但刪除單一工作區。 顯示工作區屬性,然後選取 [刪除]。
下一步
在此自動化機器學習教學課程中,您已執行下列工作:
- 設定工作區和備妥用於實驗的資料。
- 已定型自動化物件偵測模型
- 已指定模型的超參數值
- 已執行超參數整理
- 已部署您的模型
- 已將偵測視覺化
請參閱電腦視覺工作可用的超參數。
程式碼範例:
- 在自動化機器學習樣本的 azureml-examples 存放庫中,檢閱詳細的程式碼範例和使用案例。 請檢查具有 'cli-automl-image-' 前置詞的資料夾,以取得建置電腦視覺模型的特定範例。
注意
您可以透過 MIT 授權下的授權,來使用冰箱物件資料集。