SageMaker の組み込みオブジェクト検出アルゴリズムを使用したオブジェクトの計数

SageMaker の組み込みオブジェクト検出アルゴリズムを使用したオブジェクトの計数

岩佐 孝浩
岩佐 孝浩
12 min read
Ground Truth Object Detection SageMaker

はじめに

オブジェクト検出アルゴリズムは、画像内のオブジェクトを計数する上で非常に効果的です。SageMaker は、このプロセスを効率的かつスケーラブルに実行できる組み込みアルゴリズムを提供しています。

  • Ground Truth を使用した画像のラベリング
  • モデルのトレーニングとデプロイ
  • 推論の実行

概要

SageMaker 推論エンドポイントは、セキュリティ上のリスクがあるため、本番環境での直接使用は推奨されていません。ただし、本投稿で示すようにテスト目的では非常に有用です。

Ground Truth を使用したラベリング

Ground Truth は、データセットのラベリングにおいて強力な機能を提供します。詳細は Ground Truth documentation をご参照ください。

ラベリングジョブの作成

ラベリングワークフォースの作成

ラベリングを始めるには、まずラベリングワークフォースをセットアップする必要があります。本投稿では、プライベートワークフォースを作成します。チームメンバーは Cognito または OIDC を使用して認証を行います。

ワークフォースが作成されると、ワーカーに招待メールが送信されます。このメールにはラベリングポータルへの URL が含まれています。また、SageMaker 管理コンソールの以下の場所からラベリングポータル URL を取得することもできます。

Private workforce summary > Labeling portal sign-in URL

ラベリングポータルへのサインアップとサインイン

ワーカーは招待メールの指示に従い、ラベリングポータルにサインアップしてアクセスする必要があります。

招待メールの例は以下の通りです。

Hi,

You are invited by jane.doe@xyz.com from <COMPANY> to work on a labeling project.

Click on the link below to log into your labeling project.
"https://<LABELING_PORTAL_URL>"

You will need the following username and temporary password provided below to login for the first time.
User name: <USER_NAME>
Temporary password: <PASSWORD>

Once you log in with your temporary password, you will be required to create a new password for your account.
After creating a new password, you can log into your private team to access your labeling project.

If you have any questions, please contact us at jane.doe@xyz.com.

URL にアクセスすると、ワーカーは招待メールの usernametemporary password を入力する必要があります。

その後、仮パスワードを新しいパスワードに変更するよう求められます。

ログインが成功すると、ワーカーはラベリングポータルのトップページにリダイレクトされます。割り当てられたラベリングジョブがこのページに表示されます。

ラベリングジョブの作成

SageMaker 管理コンソールに戻り、新しいラベリングジョブを作成します。以下の画像のように必要なフィールドを入力します。

Complete data setup をクリックしてプロセスを完了してください。

複雑なラベリングタスクでは、Task timeout パラメータにより長い値を指定することを検討してください。

ラベリング開始

ラベリングポータルにサインインした後、作成したばかりのラベリングジョブが表示されるはずです。Start working ボタンをクリックして作業を開始してください。

ジョブの指示に従ってデータセットをラベリングします。以下はラベル付けされたデータセットの例です。

すべてのワーカーがタスクを完了したら、ラベリングジョブを停止してください。

ラベリング出力

ディレクトリ構造

ラベリングジョブが停止されると、最終的な出力は指定された S3 バケットに保存されます。オブジェクト検出タスクの場合、特に重要なのが manifests/output/output.manifest ファイルです。

詳細については SageMaker Ground Truth documentation をご参照ください。

<YOUR_OUTPUT_PATH>/
|-- annotation-tool/
|-- annotations/
|   |-- consolidated-annotation/
|   `-- worker-response/
|-- manifests/
|   |-- intermediate/
|   `-- output/
|       `-- output.manifest
`-- temp/

Ground Truth は、ラベリング結果を Augmented Manifest 形式で生成します。さらに詳細な情報は 公式ドキュメント をご参照ください。

SageMaker でのトレーニング

トレーニング

ラベリングプロセスの完了後、SageMaker コンソールを使用してモデルのトレーニングを開始します。トレーニングジョブを以下のように設定してください。

  • ジョブ設定

    • ジョブ名: 一意の値を使用 (例: uuidgen | tr "[:upper:]" "[:lower:]")。
    • アルゴリズムソース: Amazon SageMaker 組み込みアルゴリズム。
    • アルゴリズム: Vision - Object Detection (MXNet)。
    • 入力モード: Pipe
  • リソース構成

    • インスタンスタイプ: ml.p2.xlarge のような GPU インスタンスを使用。
    • SageMaker のオブジェクト検出アルゴリズムは GPU インスタンスのみ対応しています。
  • ハイパーパラメータ

    • num_classes: オブジェクトクラスの数 (例: 本投稿では 1)。
    • num_training_samples: マニフェストファイルの行数と等しい値。
  • 入力データ構成

    • トレーニングチャネル
      • チャネル名: train
      • 入力モード: Pipe
      • コンテンツタイプ: application/x-recordio
      • レコードラッパー: RecordIO
      • データソース: S3 (Augmented Manifest ファイル)
        • source-ref やバウンディングボックスデータキーなどの属性を含む。
        • トレーニングデータマニフェストファイルの S3 URI を指定。
    • 検証チャネル
      • チャネル名: validation
  • 出力データ構成

    • モデルアーティファクトを保存する S3 URI を指定。

Augmented Manifest 形式を利用することで、Pipe 入力モードと RecordIO ラッパータイプを使用でき、追加の RecordIO ファイルを作成する必要がありません。

詳細については Object Detection documentation をご参照ください。

The augmented manifest format enables you to do training in pipe mode using image files without needing to create RecordIO files.

When using Object Detection with Augmented Manifest, the value of parameter RecordWrapperType must be set as “RecordIO”.

推論

トレーニングジョブからのモデル作成

トレーニングジョブが完了したら、SageMaker コンソールで Create model をクリックしてモデルを作成します。

モデルのデプロイ

モデルを作成した後、Create endpoint をクリックしてモデルをデプロイします。コスト効率と低頻度の使用を考慮する場合は、サーバーレスエンドポイント の使用を検討してください。

Serverless Inference is a cost-effective option if you have an infrequent or unpredictable traffic pattern. During times when there are no requests, Serverless Inference scales your endpoint down to 0, helping you to minimize your costs.

リクエストの送信

SageMaker 推論エンドポイントの使用

エンドポイントの詳細ページから SageMaker 推論エンドポイント を確認します。このエンドポイントは、curlPostman またはカスタムアプリケーションを使用してアクセスできます。

例: Postman の設定

AWS Signature V4 を使用して認証するためのパラメータ:

  • AccessKey
  • SecretKey
  • Session Token: 一時的な認証情報 を使用し、永続的な認証情報は避けてください。
  • AWS Region: SageMaker エンドポイントのリージョン。
  • Service Name: sagemaker

リクエストには Accept: application/json ヘッダーを設定します。

トレーニング済みモデルはバイナリ形式の画像入力を期待するため、画像をバイナリ形式で提供してください。

例: AWS SDK (boto3)

boto3 の invoke_endpoint API を使用してプログラムで推論を行うこともできます。以下は例のスクリプトです。

import json

import boto3

# SageMaker ランタイムクライアントの初期化
runtime = boto3.client('sagemaker-runtime')

# エンドポイントと入力詳細を定義
endpoint_name = '<YOUR_ENDPOINT_NAME>'
content_type = 'application/x-image'
payload = None

# 画像ファイルをバイナリモードで読み込む
with open('/path/to/image.jpg', 'rb') as f:
    payload = f.read()

# エンドポイントを呼び出す
response = runtime.invoke_endpoint(
    EndpointName=endpoint_name,
    ContentType=content_type,
    Body=payload
)

# レスポンスを解析して表示
body = response['Body'].read()
predictions = json.loads(body.decode())
print(json.dumps(predictions, indent=2))

# レスポンスをファイルに保存
with open('./response.json', 'w') as f:
    json.dump(predictions, f, indent=2)

推論レスポンス

レスポンスの確認

レスポンスは JSON 形式で返され、以下を含みます。

  • クラスラベル ID
  • 信頼スコア
  • バウンディングボックス座標

詳細については 公式ドキュメント をご参照ください。

{
  "prediction": [
    [
      0.0,
      0.9953756332397461,
      0.3821756839752197,
      0.007661208510398865,
      0.525381863117218,
      0.19436971843242645
    ],
    [
      0.0,
      0.9928023219108582,
      0.3435703217983246,
      0.23781903088092804,
      0.5533013343811035,
      0.6385164260864258
    ],
    [
      0.0,
      0.9911478757858276,
      0.15510153770446777,
...
      0.9990172982215881
    ]
  ]
}

推論レスポンスの可視化

推論結果を視覚的に解釈するには、Jupyter Notebookmatplotlib を使用することができます。以下の Python スクリプトは、入力画像にバウンディングボックスと注釈をオーバーレイする方法を示しています。

import json

import matplotlib.patches as patches
import matplotlib.pyplot as plt
from PIL import Image

# プロットの設定
plt.figure()
axes = plt.axes()

# 画像の読み込み
im = Image.open('/path/to/image.jpg')
# 画像の表示
plt.imshow(im)

# SageMaker 推論結果の読み込み
with open('response.json') as f:
    predictions = json.loads(f.read())['prediction']

# カウントの初期化
count = 0

# 矩形の作成
for prediction in predictions:
    score = prediction[1]
    if score < 0.2:
        continue

    # カウントアップ
    count += 1

    x = prediction[2] * im.width
    y = prediction[3] * im.height
    width = prediction[4] * im.width - x
    height = prediction[5] * im.height - y

    rect = patches.Rectangle((x, y), width, height, linewidth=1, edgecolor='r', facecolor='none')
    axes.annotate(count, (x + width / 2, y + height / 2), color='yellow', weight='bold', fontsize=18, ha='center', va='center')
    axes.add_patch(rect)

# 矩形を表示
plt.show()

このスクリプトは、推論レスポンス(JSON 形式)を読み取り、バウンディングボックスの座標を抽出して、検出されたオブジェクトの周囲に矩形を描画します。それぞれのバウンディングボックスには、対応するオブジェクトの番号が注釈として付加されます。

まとめ

オブジェクト検出を用いた機械学習は、オブジェクトの計数などのタスクにおいて汎用性の高いアプローチです。SageMaker は、このプロセスを効率化するための包括的なエコシステムを提供しており、ラベリングからトレーニング、推論まで一貫してサポートしています。

本投稿が、同様のタスクに効果的なソリューションを構築する助けとなることを願っています。

Happy Coding! 🚀

岩佐 孝浩

岩佐 孝浩

Software Developer at KAKEHASHI Inc.
AWS を活用したクラウドネイティブ・アプリケーションの要件定義・設計・開発に従事。 株式会社カケハシで、処方箋データ収集の新たな基盤の構築に携わっています。 Japan AWS Top Engineers 2020-2023