자습서: AutoML 및 Python으로 개체 감지 모델 학습

적용 대상:Azure CLI ml 확장 v2(현재)Python SDK azure-ai-ml v2(현재)

이 자습서에서는 Azure Machine Learning 자동화 ML을 Azure Machine Learning CLI 확장 v2 또는 Azure Machine Learning Python SDK v2와 함께 사용하여 개체 감지 모델을 학습시키는 방법에 대해 알아봅니다. 이 개체 검색 모델은 이미지에 깡통, 상자, 우유병 또는 물병과 같은 개체가 포함되어 있는지 여부를 식별합니다.

자동화된 ML은 학습 데이터 및 구성 설정을 적용하고, 다양한 기능 정규화/표준화 방법, 모델 및 하이퍼 매개 변수 설정의 조합을 자동으로 반복하여 최상의 모델에 도달합니다.

이 자습서에서는 Python SDK를 사용하여 코드를 작성하고 다음 작업에 대해 알아봅니다.

  • 데이터 다운로드 및 변환
  • 자동화된 Machine Learning 개체 검색 모델 학습
  • 모델에 대한 하이퍼 매개 변수 값 지정
  • 하이퍼 매개 변수 비우기 수행
  • 모델 배포
  • 검색 시각화

필수 조건

  • Azure Machine Learning을 사용하려면 먼저 작업 영역이 필요합니다. 작업 영역이 없으면 시작하는 데 필요한 리소스 만들기를 완료하여 작업 영역을 만들고 사용 방법에 대해 자세히 알아봅니다.

  • 이 기능에는 Python 3.6 또는 3.7이 지원됩니다.

  • *odFridgeObjects.zip 데이터 파일을 다운로드하고 압축을 풉니다. 데이터 세트는 Pascal VOC 형식으로 주석 처리됩니다. 여기서 각 이미지는 xml 파일에 해당합니다. 각 xml 파일에는 해당 이미지 파일이 있는 위치에 대한 정보가 포함되며 경계 상자 및 개체 레이블에 대한 정보도 포함됩니다. 이 데이터를 사용하려면 먼저 Notebook의 다운로드한 데이터를 JSONL로 변환 섹션에 표시된 대로 필요한 JSONL 형식으로 변환해야 합니다.

  • 추가 설치 없이 이 자습서를 따르려면 컴퓨팅 인스턴스를 사용합니다. (컴퓨팅 인스턴스 만들기 방법을 참조하세요.) 또는 CLI/SDK를 설치하여 자체 로컬 환경을 사용합니다.

    적용 대상:Azure CLI ml 확장 v2(현재)

    이 자습서는 GitHub의 azureml-examples 리포지토리에서도 사용할 수 있습니다. 고유의 로컬 환경에서 실행하려면 다음을 수행합니다.

컴퓨팅 대상 설정

참고 항목

서버리스 컴퓨팅(미리 보기)을 사용해 보려면 이 단계를 건너뛰고 실험 설정으로 진행합니다.

먼저 자동화된 ML 모델 학습에 사용할 컴퓨팅 대상을 설정해야 합니다. 이미지 작업에 대한 자동화된 ML 모델에는 GPU SKU가 필요합니다.

이 자습서에서는 NCsv3 시리즈(V100 GPU 포함)를 사용합니다. 이 형식의 컴퓨팅 대상은 여러 GPU를 사용하여 학습 속도를 높입니다. 또한 모델에 대한 하이퍼 매개 변수를 튜닝할 때 병렬 처리를 활용하도록 여러 노드를 설정할 수 있습니다.

다음 코드는 4개의 노드가 있는 Standard_NC24s_v3 크기의 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)

Important

이 기능은 현재 공개 미리 보기로 제공됩니다. 이 미리 보기 버전은 서비스 수준 계약 없이 제공됩니다. 특정 기능이 지원되지 않거나 기능이 제한될 수 있습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.

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을 사용하여 개체 감지 모델을 학습시킵니다. 둘 모두는 80개가 넘는 레이블 범주가 있는 레이블이 지정된 수천 개가 넘는 이미지가 포함된 대규모 개체 감지, 조각화 및 캡션 데이터 세트인 COCO에 대해 미리 학습되었습니다.

정의된 검색 공간에 대해 하이퍼 매개 변수 비우기를 수행하여 최적의 모델을 찾을 수 있습니다.

작업 한도

제한 설정에서 작업에 대해 timeout_minutes, max_trialsmax_concurrent_trials를 지정하여 AutoML 이미지 학습 작업에 소요된 리소스를 제어할 수 있습니다. 작업 제한 매개 변수에 대한 자세한 설명을 참조하세요.

적용 대상:Azure CLI ml 확장 v2(현재)

limits:
  timeout_minutes: 60
  max_trials: 10
  max_concurrent_trials: 2

다음 코드는 정의된 각 아키텍처(yolov5fasterrcnn_resnet50_fpn)에 대한 하이퍼 매개 변수 비우기를 준비하기 위해 검색 공간을 정의합니다. 검색 공간에서 AutoML이 최적의 기본 메트릭을 사용하여 모델을 생성하려고 시도할 때 선택할 learning_rate, optimizer, lr_scheduler 등의 값 범위를 지정합니다. 하이퍼 매개 변수 값을 지정하지 않으면 기본값이 각 아키텍처에 사용됩니다.

튜닝 설정의 경우 무작위 샘플링을 통해 random 샘플링 알고리즘을 사용하여 이 매개 변수 공간에서 샘플을 선택합니다. 위에 구성된 작업 제한은 자동화된 ML에서 이러한 다양한 샘플을 사용하여 총 10회를 시도하고, 4개의 노드를 사용하여 설정된 컴퓨팅 대상에서 한 번에 2회의 시도를 실행하도록 지시합니다. 검색 공간에 매개 변수가 많을수록 최적의 모델을 찾는 데 더 많은 시도가 필요합니다.

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 파일 경로, 작업 영역 이름, 리소스 그룹 및 구독 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를 사용하여 시도된 다양한 평가판을 시각화하는 것이 유용할 수 있습니다. HyperDrive 부모 작업인 위의 기본 automl_image_job의 UI에서 '자식 작업' 탭으로 이동하여 이 UI로 이동할 수 있습니다. 그런 다음, 이 항목의 '자식 작업' 탭으로 이동할 수 있습니다.

또는 아래에서 HyperDrive 부모 작업을 직접 확인하여 '자식 작업' 탭으로 이동할 수 있습니다.

적용 대상:Azure CLI ml 확장 v2(현재)

CLI example not available, please use Python SDK.

모델 등록 및 배포

작업이 완료되면 최상의 평가판에서 생성된 모델을 등록할 수 있습니다(최상의 기본 메트릭에서 생성된 구성). 다운로드한 후 또는 해당 jobidazureml 경로를 지정하여 모델을 등록할 수 있습니다.

최상의 평가판 가져오기

적용 대상: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]

또한 일정 기간 동안 대량의 데이터를 일괄 처리 유추를 위한 일괄 처리 엔드포인트를 만들 수도 있습니다. 일괄 처리 엔드포인트를 사용하여 일괄 처리 유추에 대한 개체 검색 일괄 처리 채점 Notebook을 체크 아웃합니다.

온라인 배포 구성

배포는 실제 유추를 수행하는 모델을 호스팅하는 데 필요한 리소스의 세트입니다. 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 Portal 맨 왼쪽에서 리소스 그룹을 선택합니다.
  2. 목록에서 만든 리소스 그룹을 선택합니다.
  3. 리소스 그룹 삭제를 선택합니다.
  4. 리소스 그룹 이름을 입력합니다. 그런 다음 삭제를 선택합니다.

또한 리소스 그룹을 유지하면서 단일 작업 영역을 삭제할 수도 있습니다. 작업 영역 속성을 표시하고 삭제를 선택합니다.

다음 단계

이 자동화된 Machine Learning 자습서에서 다음 작업을 수행했습니다.

  • 작업 영역을 구성하고 실험을 위해 데이터를 준비했습니다.
  • 자동화된 개체 검색 모델 학습
  • 모델에 대한 하이퍼 매개 변수 값 지정
  • 하이퍼 매개 변수 비우기 수행
  • 모델 배포
  • 검색 시각화

참고 항목

냉장고 개체 데이터 세트는 MIT 라이선스의 라이선스를 통해 사용할 수 있습니다.