ML オブジェクト検出コネクタ - AWS IoT Greengrass

AWS IoT Greengrass Version 1 は 2023 年 6 月 30 日に延長ライフフェーズに参加しました。詳細については、「AWS IoT Greengrass V1 メンテナンスポリシー」を参照してください。この日以降、 AWS IoT Greengrass V1 は機能、機能強化、バグ修正、またはセキュリティパッチを提供する更新をリリースしません。で実行されるデバイスは中断 AWS IoT Greengrass V1 されず、引き続き動作し、クラウドに接続します。に移行することを強くお勧めします。 AWS IoT Greengrass Version 2これにより、重要な新機能が追加され、プラットフォーム のサポートが追加されます

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

ML オブジェクト検出コネクタ

警告

このコネクタは延長ライフサイクルフェーズに移行しており、AWS IoT Greengrass では、機能、既存機能の拡張、セキュリティパッチ、バグ修正を提供するアップデートはリリースされません。詳細については、「AWS IoT Greengrass Version 1 メンテナンスポリシー」を参照してください。

ML オブジェクト検出コネクタは、AWS IoT Greengrass コアで動作する機械学習 (ML) 推論サービスを提供します。このローカル推論サービスは、SageMaker Neo 深層学習コンパイラでコンパイルされたオブジェクト検出モデルを使用してオブジェクトの検出を実行します。Single Shot Multibox Detector (SSD) と You Only Look Once (YOLO) v3 の 2 種類のオブジェクト検出モデルがサポートされています。詳細については、「オブジェクト検出モデルの要件」を参照してください。

ユーザー定義の Lambda 関数は AWS IoT Greengrass Machine Learning SDK を使用して、ローカル推論サービスに推論リクエストを送信します。このサービスは、入力イメージでローカル推論を実行し、イメージで検出された各オブジェクトの予測のリストを返します。各予測には、オブジェクトカテゴリ、予測の信頼スコア、および予測されたオブジェクトの周囲の境界ボックスを指定するピクセル座標が含まれます。

AWS IoT Greengrass は、複数のプラットフォーム用の ML オブジェクト検出コネクタを提供しています。

コネクタ

説明と ARN

ML オブジェクト検出 Aarch64 JTX2

NVIDIA Jetson TX2 のオブジェクト検出推論サービス。GPU アクセラレーションをサポートします。

ARN: arn:aws:greengrass:region::/connectors/ObjectDetectionAarch64JTX2/versions/1

ML オブジェクト検出 x86_64

x86_64 プラットフォームのオブジェクト検出推論サービス。

ARN: arn:aws:greengrass:region::/connectors/ObjectDetectionx86-64/versions/1

ML オブジェクト検出 ARMv7

ARMv7 プラットフォームのオブジェクト検出推論サービス。

ARN: arn:aws:greengrass:region::/connectors/ObjectDetectionARMv7/versions/1

要件

これらのコネクタには以下の要件があります。

  • AWS IoT Greengrass Core ソフトウェア v1.9.3 以降。

  • Python バージョン 3.7 または 3.8 が Core デバイスにインストールされ、PATH 環境変数に追加されている。

    注記

    Python 3.8 を使用するには、次のコマンドを実行して、Python 3.7 のデフォルトのインストールフォルダからインストール済みの Python 3.8 バイナリへのシンボリックリンクを作成します。

    sudo ln -s path-to-python-3.8/python3.8 /usr/bin/python3.7

    これにより、AWS IoT Greengrass の Python 要件を満たすようにデバイスが設定されます。

  • コアデバイスにインストールされた SageMaker Neo 深層学習ランタイムの依存関係。詳細については、「AWS IoT Greengrass Core に Neo 深層学習ランタイム依存関係をインストールする」を参照してください。

  • Greengrass グループの ML リソース。ML リソースは、オブジェクト検出モデルを含む Amazon S3 バケットを参照する必要があります。詳細については、「Amazon S3 のモデルソース」を参照してください。

    注記

    このモデルは、Single Shot Multibox Detector または You Only Look Once v3 オブジェクト検出モデルタイプである必要があります。SageMaker Neo 深層学習コンパイラを使用してコンパイルする必要があります。詳細については、「オブジェクト検出モデルの要件」を参照してください。

  • ML フィードバックコネクタが Greengrass グループに追加され、設定されている。これは、コネクタを使用してモデル入力データをアップロードし、予測を MQTT トピックに発行する場合にのみ必要です。

  • このコネクタを操作するには、AWS IoT Greengrass Machine Learning SDK v1.1.0 が必要です。

オブジェクト検出モデルの要件

ML オブジェクト検出コネクタは、Single Shot multibox Detector (SSD) および You Only Look Once (YOLO) v3 オブジェクト検出モデルタイプをサポートします。GluonCV が提供するオブジェクト検出コンポーネントを使用して、独自のデータセットでモデルをトレーニングできます。または、GluonCV Model Zoo から事前にトレーニングされたモデルを使用できます。

オブジェクト検出モデルは、512 x 512 の入力イメージを使用してトレーニングする必要があります。GluonCV Model Zoo の事前トレーニング済みモデルは、すでにこの要件を満たしています。

トレーニングされたオブジェクト検出モデルは、SageMaker Neo 深層学習コンパイラでコンパイルする必要があります。コンパイルするときは、ターゲットハードウェアが Greengrass コアデバイスのハードウェアと一致していることを確認します。詳細については、「Amazon SageMaker デベロッパーガイド」の「Amazon SageMaker とは」を参照してください。

コンパイルされたモデルは、コネクタと同じ Greengrass グループに ML リソース (Amazon S3 モデルソース) として追加する必要があります。

コネクタパラメータ

これらのコネクタでは、以下のパラメータを使用できます。

MLModelDestinationPath

Neo 互換 ML モデルを含む Amazon S3 バケットへの絶対パス。これは、ML モデルリソースに指定されたターゲットパスです。

AWS IoT コンソールでの表示名: [Model destination path] (モデルのターゲットパス)

必須: true

タイプ: string

有効なパターン: .+

MLModelResourceId

ソースモデルを参照する ML リソースの ID。

AWS IoT コンソールでの表示名: [Greengrass group ML resource] (Greengrass グループ ML リソース)

必須: true

タイプ: S3MachineLearningModelResource

有効なパターン: ^[a-zA-Z0-9:_-]+$

LocalInferenceServiceName

ローカル推論サービスの名前。ユーザー定義の Lambda 関数はこのサービスを呼び出すために、AWS IoT Greengrass Machine Learning SDK の invoke_inference_service 関数にこの名前を渡します。例については、「使用例」を参照してください。

AWS IoT コンソールでの表示名: [Local inference service name] (ローカル推論サービス名)

必須: true

タイプ: string

有効なパターン: ^[a-zA-Z0-9][a-zA-Z0-9-]{1,62}$

LocalInferenceServiceTimeoutSeconds

推論リクエストが終了するまでの時間 (秒単位)。最小値は 1 です。デフォルト値は 10 です。

AWS IoT コンソールでの表示名: [Timeout (second)] (タイムアウト (秒))

必須: true

タイプ: string

有効なパターン: ^[1-9][0-9]*$

LocalInferenceServiceMemoryLimitKB

サービスがアクセスできるメモリの量 (KB 単位)。最小値は 1 です。

AWS IoT コンソールでの表示名: [Memory limit] (メモリ制限)

必須: true

タイプ: string

有効なパターン: ^[1-9][0-9]*$

GPUAcceleration

CPU または GPU (アクセラレーション) コンピューティングの場合。このプロパティは ML イメージ分類 Aarch64 JTX2 コネクタにのみ適用されます。

AWS IoTコンソールでの表示名: [GPU acceleration] (GPU アクセラレーション)

必須: true

タイプ: string

有効な値: CPU または GPU

MLFeedbackConnectorConfigId

モデル入力データのアップロードに使用するフィードバック設定の ID。これは、ML フィードバックコネクタに定義されたフィードバック設定の ID と一致する必要があります。

この パラメータは、ML フィードバックコネクタを使用してモデル入力データをアップロードし、予測を MQTT トピックに発行する場合にのみ必要です。

AWS IoT コンソールでの表示名: [ML Feedback connector configuration ID] (ML フィードバックコネクタ設定 ID)

必須: false

タイプ: string

有効なパターン: ^$|^[a-zA-Z0-9][a-zA-Z0-9-]{1,62}$

サンプルコネクタを作成する (AWS CLI)

以下の CLI コマンドは、ML オブジェクト検出コネクタを含む初期バージョンで ConnectorDefinition を作成します。この例では、ML オブジェクト検出 ARMv7l コネクタのインスタンスを作成します。

aws greengrass create-connector-definition --name MyGreengrassConnectors --initial-version '{ "Connectors": [ { "Id": "MyObjectDetectionConnector", "ConnectorArn": "arn:aws:greengrass:region::/connectors/ObjectDetectionARMv7/versions/1", "Parameters": { "MLModelDestinationPath": "/path-to-model", "MLModelResourceId": "my-ml-resource", "LocalInferenceServiceName": "objectDetection", "LocalInferenceServiceTimeoutSeconds": "10", "LocalInferenceServiceMemoryLimitKB": "500000", "MLFeedbackConnectorConfigId" : "object-detector-random-sampling" } } ] }'
注記

これらのコネクタの Lambda 関数には、存続期間の長いライフサイクルがあります。

AWS IoT Greengrass コンソールでは、グループの [Connectors] (コネクタ) ページからコネクタを追加できます。詳細については、「Greengrass コネクタの開始方法 (コンソール)」を参照してください。

入力データ

これらのコネクタは、イメージファイルを入力として受け入れます。入力イメージファイルは jpeg または png 形式である必要があります。詳細については、「使用例」を参照してください。

これらのコネクタは MQTT メッセージを入力データとして受け入れません。

出力データ

これらのコネクタは、入力イメージで識別されたオブジェクトのフォーマットされた予測結果のリストを返します。

{ "prediction": [ [ 14, 0.9384938478469849, 0.37763649225234985, 0.5110225081443787, 0.6697432398796082, 0.8544386029243469 ], [ 14, 0.8859519958496094, 0, 0.43536216020584106, 0.3314110040664673, 0.9538808465003967 ], [ 12, 0.04128098487854004, 0.5976729989051819, 0.5747185945510864, 0.704264223575592, 0.857937216758728 ], ... ] }

リストの各予測は角括弧で囲まれ、6 つの値が含まれます。

  • 最初の値は、識別されたオブジェクトの予測されるオブジェクトカテゴリを表します。オブジェクトカテゴリと対応する値は、Neo 深層学習コンパイラでオブジェクト検出機械学習モデルをトレーニングするときに決定されます。

  • 2 番目の値は、オブジェクトカテゴリ予測の信頼スコアです。これは、予測が正しい確率を表します。

  • 最後の 4 つの値は、イメージの予測オブジェクト周囲の境界ボックスを表すピクセルディメンションに対応しています。

これらのコネクタは MQTT メッセージを出力データとして公開しません。

使用例

次の Lambda 関数の例は、AWS IoT Greengrass Machine Learning SDK を使用して、ML オブジェクト検出コネクタと対話します。

注記

この SDK は、AWS IoT Greengrass Machine Learning SDK のダウンロードページからダウンロードできます。

この例では、SDK クライアントを初期化し、SDK の invoke_inference_service 関数の同期呼び出しにより、ローカル推論サービスを呼び出します。次に、アルゴリズムタイプ、サービス名、イメージタイプ、イメージコンテンツを渡します。その後、サービスのレスポンスを解析して、確率の結果 (予測) を取得します。

import logging from threading import Timer import numpy as np import greengrass_machine_learning_sdk as ml # We assume the inference input image is provided as a local file # to this inference client Lambda function. with open('/test_img/test.jpg', 'rb') as f: content = bytearray(f.read()) client = ml.client('inference') def infer(): logging.info('invoking Greengrass ML Inference service') try: resp = client.invoke_inference_service( AlgoType='object-detection', ServiceName='objectDetection', ContentType='image/jpeg', Body=content ) except ml.GreengrassInferenceException as e: logging.info('inference exception {}("{}")'.format(e.__class__.__name__, e)) return except ml.GreengrassDependencyException as e: logging.info('dependency exception {}("{}")'.format(e.__class__.__name__, e)) return logging.info('resp: {}'.format(resp)) predictions = resp['Body'].read().decode("utf-8") logging.info('predictions: {}'.format(predictions)) predictions = eval(predictions) # Perform business logic that relies on the predictions. # Schedule the infer() function to run again in ten second. Timer(10, infer).start() return infer() def function_handler(event, context): return

AWS IoT Greengrass Machine Learning SDK の invoke_inference_service 関数は、以下の引数を受け入れます。

引数

説明

AlgoType

推論に使用するアルゴリズムタイプの名前。現在は、object-detection のみがサポートされます。

必須: true

タイプ: string

有効な値: object-detection

ServiceName

ローカル推論サービスの名前。コネクタを設定したときに LocalInferenceServiceName パラメータに指定した名前を使用します。

必須: true

タイプ: string

ContentType

入力イメージの MIME タイプ。

必須: true

タイプ: string

有効な値: image/jpeg, image/png

Body

入力イメージファイルの内容。

必須: true

タイプ: binary

AWS IoT Greengrass Core に Neo 深層学習ランタイム依存関係をインストールする

ML オブジェクト検出コネクタは SageMaker Neo 深層学習ランタイム (DLR) にバンドルされています。コネクタは、ランタイムを使用して ML モデルを提供します。これらのコネクタを使用するには、コアデバイスに DLR の依存関係をインストールする必要があります。

DLR の依存関係をインストールする前に、必要なシステムライブラリ (指定された最小バージョン) がデバイスに存在することを確認してください。

NVIDIA Jetson TX2
  1. CUDA Toolkit 9.0 と cuDNN 7.0 をインストールします。開始方法チュートリアルの「他のデバイスの設定」の手順に従うことができます。

  2. コネクタでコミュニティ管理のオープンなソフトウェアをインストールできるように、ユニバースリポジトリを有効にします。詳細については、Ubuntu ドキュメントの Repositories/Ubuntu を参照してください。

    1. /etc/apt/sources.list ファイルを開きます。

    2. 以下の行のコメントが解除されていることを確認してください。

      deb http://ports.ubuntu.com/ubuntu-ports/ xenial universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial universe deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe
  3. 以下のインストールスクリプトのコピーを Core デバイス上の nvidiajtx2.sh というファイルに保存します。

    #!/bin/bash set -e echo "Installing dependencies on the system..." echo 'Assuming that universe repos are enabled and checking dependencies...' apt-get -y update apt-get -y dist-upgrade apt-get install -y liblapack3 libopenblas-dev liblapack-dev libatlas-base-dev apt-get install -y python3.7 python3.7-dev python3.7 -m pip install --upgrade pip python3.7 -m pip install numpy==1.15.0 python3.7 -m pip install opencv-python || echo 'Error: Unable to install OpenCV with pip on this platform. Try building the latest OpenCV from source (https://github.com/opencv/opencv).' echo 'Dependency installation/upgrade complete.'
    注記

    OpenCV がこのスクリプトを使用して正常にインストールしない場合、ソースからビルドしてみることができます。詳細については、OpenCV ドキュメントの「Linux でのインストール」、またはお使いのプラットフォーム用の他のオンラインリソースを参照してください。

  4. ファイルを保存したディレクトリから、次のコマンドを実行します。

    sudo nvidiajtx2.sh
x86_64 (Ubuntu or Amazon Linux)
  1. 以下のインストールスクリプトのコピーを Core デバイス上の x86_64.sh というファイルに保存します。

    #!/bin/bash set -e echo "Installing dependencies on the system..." release=$(awk -F= '/^NAME/{print $2}' /etc/os-release) if [ "$release" == '"Ubuntu"' ]; then # Ubuntu. Supports EC2 and DeepLens. DeepLens has all the dependencies installed, so # this is mostly to prepare dependencies on Ubuntu EC2 instance. apt-get -y update apt-get -y dist-upgrade apt-get install -y libgfortran3 libsm6 libxext6 libxrender1 apt-get install -y python3.7 python3.7-dev elif [ "$release" == '"Amazon Linux"' ]; then # Amazon Linux. Expect python to be installed already yum -y update yum -y upgrade yum install -y compat-gcc-48-libgfortran libSM libXrender libXext else echo "OS Release not supported: $release" exit 1 fi python3.7 -m pip install --upgrade pip python3.7 -m pip install numpy==1.15.0 python3.7 -m pip install opencv-python || echo 'Error: Unable to install OpenCV with pip on this platform. Try building the latest OpenCV from source (https://github.com/opencv/opencv).' echo 'Dependency installation/upgrade complete.'
    注記

    OpenCV がこのスクリプトを使用して正常にインストールしない場合、ソースからビルドしてみることができます。詳細については、OpenCV ドキュメントの「Linux でのインストール」、またはお使いのプラットフォーム用の他のオンラインリソースを参照してください。

  2. ファイルを保存したディレクトリから、次のコマンドを実行します。

    sudo x86_64.sh
ARMv7 (Raspberry Pi)
  1. 以下のインストールスクリプトのコピーを Core デバイス上の armv7l.sh というファイルに保存します。

    #!/bin/bash set -e echo "Installing dependencies on the system..." apt-get update apt-get -y upgrade apt-get install -y liblapack3 libopenblas-dev liblapack-dev apt-get install -y python3.7 python3.7-dev python3.7 -m pip install --upgrade pip python3.7 -m pip install numpy==1.15.0 python3.7 -m pip install opencv-python || echo 'Error: Unable to install OpenCV with pip on this platform. Try building the latest OpenCV from source (https://github.com/opencv/opencv).' echo 'Dependency installation/upgrade complete.'
    注記

    OpenCV がこのスクリプトを使用して正常にインストールしない場合、ソースからビルドしてみることができます。詳細については、OpenCV ドキュメントの「Linux でのインストール」、またはお使いのプラットフォーム用の他のオンラインリソースを参照してください。

  2. ファイルを保存したディレクトリから、次のコマンドを実行します。

    sudo bash armv7l.sh
    注記

    Raspberry Pi では、pip を使用して機械学習の依存関係をインストールすると、メモリを大量に消費し、デバイスがメモリ不足になって応答しなくなる可能性があります。回避策として、スワップサイズを一時的に増やすことができます。/etc/dphys-swapfile で、CONF_SWAPSIZE 変数の値を増やし、次のコマンドを実行して dphys-swapfile を再起動します。

    /etc/init.d/dphys-swapfile restart

ログ記録とトラブルシューティング

グループ設定に応じて、イベントログとエラーログは、CloudWatch ログ、ローカルファイルシステム、またはその両方に書き込まれます。このコネクタのログにはプレフィックス LocalInferenceServiceName が使用されます。コネクタが予期しない動作を示した場合は、コネクタのログを確認します。このログには、通常、ML ライブラリの依存関係の不足やコネクタの起動失敗の原因など、デバッグに役立つ情報が含まれています。

AWS IoT Greengrass グループがローカルログを書き込むように設定されている場合、コネクタはにログファイルを greengrass-root/ggc/var/log/user/region/aws/ に書き込みます。Greengrass のログ記録の詳細については、「AWS IoT Greengrass ログでのモニタリング」を参照してください。

ML オブジェクト検出コネクタの問題のトラブルシューティングには、以下の情報が役立ちます。

必須のシステムライブラリ

以下の各タブは、ML オブジェクト検出コネクタごとに必要なシステムライブラリを一覧表示します。

ML Object Detection Aarch64 JTX2
[Library] (ライブラリ) 最小バージョン
ld-linux-aarch64.so.1 GLIBC_2.17
libc.so.6 GLIBC_2.17
libcublas.so.9.0 該当なし
libcudart.so.9.0 該当なし
libcudnn.so.7 該当なし
libcufft.so.9.0 該当なし
libcurand.so.9.0 該当なし
libcusolver.so.9.0 該当なし
libgcc_s.so.1 GCC_4.2.0
libgomp.so.1 GOMP_4.0、OMP_1.0
libm.so.6 GLIBC_2.23
libnvinfer.so.4 該当なし
libnvrm_gpu.so 該当なし
libnvrm.so 該当なし
libnvidia-fatbinaryloader.so.28.2.1 該当なし
libnvos.so 該当なし
libpthread.so.0 GLIBC_2.17
librt.so.1 GLIBC_2.17
libstdc++.so.6 GLIBCXX_3.4.21、CXXABI_1.3.8
ML Object Detection x86_64
[Library] (ライブラリ) 最小バージョン
ld-linux-x86-64.so.2 GCC_4.0.0
libc.so.6 GLIBC_2.4
libgfortran.so.3 GFORTRAN_1.0
libm.so.6 GLIBC_2.23
libpthread.so.0 GLIBC_2.2.5
librt.so.1 GLIBC_2.2.5
libstdc++.so.6 CXXABI_1.3.8、GLIBCXX_3.4.21
ML Object Detection ARMv7
[Library] (ライブラリ) 最小バージョン
ld-linux-armhf.so.3 GLIBC_2.4
libc.so.6 GLIBC_2.7
libgcc_s.so.1 GCC_4.0.0
libgfortran.so.3 GFORTRAN_1.0
libm.so.6 GLIBC_2.4
libpthread.so.0 GLIBC_2.4
librt.so.1 GLIBC_2.4
libstdc++.so.6 CXXABI_1.3.8、CXXABI_ARM_1.3.3、GLIBCXX_3.4.20

問題点

症状 解決策

Raspberry Pi で、次のエラーメッセージがログに記録される。カメラは使用していない。Failed to initialize libdc1394

次のコマンドを実行してドライバーを無効にします。

sudo ln /dev/null /dev/raw1394

このオペレーションはエフェメラルです。再起動すると、シンボリックリンクが消えます。再起動時にリンクを自動的に作成する方法については、OS ディストリビューションのマニュアルを参照してください。

ライセンス

ML オブジェクト検出コネクタには、以下のサードパーティーのソフトウェアおよびライセンスが含まれています。

このコネクタは、Greengrass Core ソフトウェアライセンス契約に従ってリリースされます。

以下も参照してください。