チュートリアル: AutoML と Python を使用して物体検出モデルをトレーニングする

適用対象:Azure CLI ml extension v2 (現行)Python SDK azure-ai-ml v2 (現行)

このチュートリアルでは、Azure Machine Learning CLI 拡張機能 v2 または Azure Machine Learning Python SDK v2 で Azure Machine Learning の自動 ML を使って、物体検出モデルをトレーニングする方法について説明します。 このオブジェクト検出モデルは、画像に缶、箱、牛乳瓶、水のボトルなどのオブジェクトが含まれているかどうかを識別します。

自動 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 が利用されるためです。 さらに、複数のノードを設定すると、モデルのハイパーパラメーターをチューニングするときに並列処理を利用できます。

次のコードを実行すると、サイズが Standard_NC24s_v3 で 4 つのノードを持つ GPU コンピューティングが作成されます。

適用対象: 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 ファイルへのパス、ワークスペース名、リソース グループ、サブスクリプション ID を指定して、次の CLI v2 コマンドを実行します。

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 Storage にデータをアップロードし、資産として登録します。 データを登録する利点は次のとおりです。

  • チームの他のメンバーと簡単に共有できます
  • メタデータ (場所、説明など) のバージョン管理
  • 系列の追跡

適用対象: 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 ファイルへのパス、ワークスペース名、リソース グループ、サブスクリプション ID を指定して、次の CLI v2 コマンドを実行します。

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 ファイルへのパス、ワークスペース名、リソース グループ、サブスクリプション ID を指定して、次の CLI v2 コマンドを実行します。

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、大規模なオブジェクト検出、セグメンテーション、および 80 を超えるラベル カテゴリと数千を超えるラベル付き画像を含むキャプション データセットで事前トレーニングされています。

最適なモデルを見つけるために、定義された検索空間に対してハイパーパラメーター スイープを実行できます。

ジョブの制限

制限の設定でジョブの timeout_minutesmax_trialsmax_concurrent_trials を指定することにより、AutoML の画像トレーニング ジョブに使われるリソースを制御できます。 ジョブの制限のパラメーターに関する詳細な説明に関する記事を参照してください。

適用対象: Azure CLI ML 拡張機能 v2 (現行)

limits:
  timeout_minutes: 60
  max_trials: 10
  max_concurrent_trials: 2

次のコードは、定義された各アーキテクチャ (yolov5 および fasterrcnn_resnet50_fpn) のハイパーパラメーター スイープに備えて検索空間を定義します。 検索空間で、AutoML が最適な主要メトリックでモデルの生成を試みるときに選択できるようにするため、learning_rateoptimizerlr_scheduler などの値の範囲を指定します。 ハイパーパラメーター値を指定しない場合は、アーキテクチャごとに既定値が使用されます。

チューニング設定では、random sampling_algorithm を使用することで、ランダム サンプリングを使用してこのパラメーター空間からサンプルを選択します。 上のようにジョブ制限を構成することで、自動 ML に、これらの異なるサンプルで合計 10 回の試行を実行し、4 つのノードを使用して設定されたコンピューティング先で一度に 2 回の試行を実行するように指示します。 検索空間に含まれるパラメーターが多いほど、最適なモデルを見つけるために必要な試行の回数が多くなります。

バンディット早期終了ポリシーも使用されます。 このポリシーは、パフォーマンスが低い試行 (つまり、最高のパフォーマンスを発揮する試行と比較してパフォーマンスが 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 ファイルへのパス、ワークスペース名、リソース グループ、サブスクリプション ID を指定して、次の CLI v2 コマンドを実行します。

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 を使用して試行されたさまざまな試行を視覚化すると便利な場合があります。 この UI に移動するには、上の HyperDrive の親ジョブからメイン automl_image_job の UI の [Child jobs] (子ジョブ) タブに移動します。 その後、この UI の [Child jobs] (子ジョブ) タブに移動できます。

または、以下を実行すると、HyperDrive の親ジョブを直接確認し、その [Child jobs] (子ジョブ) タブに移動することができます。

適用対象: Azure CLI ML 拡張機能 v2 (現行)

CLI example not available, please use Python SDK.

モデルを登録して展開する

ジョブが完了したら、最適な試行 (最適な主要メトリックになった構成) から作成されたモデルを登録できます。 モデルの登録は、ダウンロードの後で、または azureml パスと対応する jobid を指定して、行うことができます。

最適な試行を取得する

適用対象: 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% のトラフィックを受信するように設定されています。 現在のデプロイで受信するトラフィックの割合を設定できます。 1 つのエンドポイントを使用するすべてのデプロイのトラフィックの割合の合計が 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 Portal で、左端にある [リソース グループ] を選択します。
  2. 作成したリソース グループを一覧から選択します。
  3. [リソース グループの削除] を選択します。
  4. リソース グループ名を入力します。 次に、 [削除] を選択します。

リソース グループは保持しつつ、いずれかのワークスペースを削除することもできます。 ワークスペースのプロパティを表示し、 [削除] を選択します。

次のステップ

自動化された機械学習に関するこのチュートリアルでは、以下のタスクを学習しました。

  • 実験用のワークスペースと準備されたデータを構成しました。
  • 自動オブジェクト検出モデルをトレーニングしました
  • モデルのハイパーパラメーター値を指定しました
  • ハイパーパラメーター スイープを実行しました
  • モデルをデプロイしました
  • 検出を視覚化しました

Note

fridge オブジェクト データセットの使用は、MIT ライセンスのライセンスを通じて利用できます。