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 にアクセスすると、ワーカーは招待メールの username と temporary password を入力する必要があります。
その後、仮パスワードを新しいパスワードに変更するよう求められます。
ログインが成功すると、ワーカーはラベリングポータルのトップページにリダイレクトされます。割り当てられたラベリングジョブがこのページに表示されます。
ラベリングジョブの作成
SageMaker 管理コンソールに戻り、新しいラベリングジョブを作成します。以下の画像のように必要なフィールドを入力します。
uuidgen | tr "[:upper:]" "[:lower:]"
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 推論エンドポイント を確認します。このエンドポイントは、curl
、Postman またはカスタムアプリケーションを使用してアクセスできます。
例: 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 Notebook と matplotlib を使用することができます。以下の 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! 🚀