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核心。此本機推論服務會使用 SageMaker Neo 深度學習編譯器。支持兩種類型的對象檢測模型:Single Shot Multibox Detector (SSD) 和 YOLO Only Look Once (YOLO) v3。如需詳細資訊,請參閱物件偵測模型需求

用户定義的 Lambda 函數使用AWS IoT GreengrassMachine Learning SDK,將推論請求提交至本機推論服務。此服務會在輸入影像上執行本機推論,並針對影像中偵測到的每個物件傳回預測清單。每個預測都包含一個物件類別、預測可信度分數,以及指定預測物件之週框方塊的像素座標。

AWS IoT Greengrass提供適用於多個平台的 ML 物件偵測連接器:

連接器

描述和 ARN

ML 物件偵測 Aarch64 JTX2

適用於 NVIDIA Jetson TX2 的物件偵測推論服務。支援 GPU 加速。

ARNarn:aws:greengrass:region::/connectors/ObjectDetectionAarch64JTX2/versions/1

ML 物件偵測

適用於 x86_64 平台的物件偵測推論服務。

ARNarn:aws:greengrass:region::/connectors/ObjectDetectionx86-64/versions/1

ML 物體檢測臂 7

適用於 ARMv7 平台的物件偵測推論服務。

ARNarn:aws:greengrass:region::/connectors/ObjectDetectionARMv7/versions/1

要求

這些連接器有下列要求:

  • AWS IoT Greengrass核心軟體 1.9.3 版或更新版本。

  • 蟒蛇版本 3.7 或 3.8 安裝在核心裝置上並已新增至 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 核心上安裝 Neo 深度學習執行時間相依性

  • Greengrass 群組中的 ML 資源。ML 資源必須引用包含物件偵測模型的 Amazon S3 存儲段。如需詳細資訊,請參閱「」Amazon S3 模式來源

    注意

    模型必須是 Single Shot Multibox Detector 或 You Only Look Once v3 物件偵測模型類型。它必須使用 SageMaker Neo 深度學習編譯器。如需詳細資訊,請參閱物件偵測模型需求

  • 所以此ML 意見回饋連接器已新增至 Greengrass 組並進行了配置。只有在您想要使用連接器上傳模型輸入資料,並將預測發佈至 MQTT 主題時,才需要此項目。

  • AWS IoT GreengrassMachine Learning SDK需有 1.1.0 版,才能與此連接器互動。

物件偵測模型需求

ML 物件偵測連接器支援 Single Shot Multibox Detector (SSD) 和 YOLO Only Look Once (YOLO) v3 物件偵測模型類型。您可以使用 GluonCV 提供的物件偵測元件,搭配您自己的資料集來訓練模型。或者,您可以使用來自 GluonCV Model Zoo 的預先訓練模型:

您的物件偵測模型必須使用 512 x 512 輸入影像進行訓練。來自 GluonCV Model Zoo 的預先訓練模型已符合此需求。

經過訓練的物件偵測模型必須使用 SageMaker Neo 深度學習編譯器。編譯時,請確定目標硬體符合 Greengrass 核心裝置的硬體。如需詳細資訊,請參閱「」 SageMaker Neo中的亞馬遜 SageMaker 開發人員指南

編譯後的模型必須添加為 ML 資源(Amazon S3 模式來源)設定為與連接器相同的 Greengrass 組。

連接器參數

這些連接器提供下列參數。

MLModelDestinationPath

Amazon S3 儲存貯體的絕對路徑,此儲存貯體包含 Neo 相容的 ML 模型。這是指定給 ML 模型資源的目的地路徑。

主頁面的顯示名稱AWS IoT主控台:模型目的地路徑

:必要true

類型:string

有效模式:.+

MLModelResourceId

參考來源模型的機器學習資源 ID。

主頁面的顯示名稱AWS IoT主控台:Greengrass Learning 資源

:必要true

類型:S3MachineLearningModelResource

有效模式:^[a-zA-Z0-9:_-]+$

LocalInferenceServiceName

本機推論服務的名稱。使用者定義的 Lambda 函數會藉由將名稱傳給invoke_inference_service函數AWS IoT GreengrassMachine Learning 軟體開發套件 如需範例,請參閱 使用範例

主頁面的顯示名稱AWS IoT主控台:本機推論服務名稱

:必要true

類型:string

有效模式:^[a-zA-Z0-9][a-zA-Z0-9-]{1,62}$

LocalInferenceServiceTimeoutSeconds

推論請求終止之前的時間 (以秒為單位)。最小值為 1。預設值為 10。

主頁面的顯示名稱AWS IoT主控台:超時 (秒)

:必要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 加速

:必要true

類型:string

有效值:CPUGPU

MLFeedbackConnectorConfigId

用來上傳模型輸入資料的意見回饋組態 ID。這必須符合針對 ML 意見回饋連接器定義的意見回饋組態 ID。

這一個參數僅在您想要使用 ML 意見回饋連接器上傳模型輸入資料,並將預測發佈至 MQTT 主題時,才需要此項目。

主頁面的顯示名稱AWS IoT主控台:ML 意見回饋連接器配置 ID

:必要false

類型:string

有效模式:^$|^[a-zA-Z0-9][a-zA-Z0-9-]{1,62}$

建立範例連接器 (AWS CLI)

下列 CLI 命令會建立ConnectorDefinition的最初版本,其中包含 ML 物件偵測連接器。此範例會建立 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控制台中,您可以從組的連接器(憑證已建立!) 頁面上的名稱有些許差異。如需詳細資訊,請參閱 Greengrass 連接器入門 (主控台)

輸入資料

這些連接器接受影像檔做為輸入。輸入影像檔必須採用 jpegpng 格式。如需詳細資訊,請參閱 使用範例

這些連接器不接受 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 ], ... ] }

清單中的每個預測都包含在方括號中,並包含六個值:

  • 第一個值代表所識別物件的預測物件類別。在 Neo 深度學習編譯器中訓練您的物件偵測機器學習模型時,即會決定物件類別及其對應值。

  • 第二個值是物件類別預測的可信度分數。這代表預測正確的機率。

  • 最後四個值對應至像素維度,代表影像中所預測物件的週框方塊。

這些連接器不會將 MQTT 消息發佈為輸出數據。

使用範例

下列範例 Lambda 函數使用AWS IoT GreengrassMachine Learning SDK與 ML 對象檢測連接器進行交互。

注意

您可以從AWS IoT GreengrassMachine Learning 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

所以此invoke_inference_service函數AWS IoT GreengrassMachine Learning SDK 接受下列引數。

引數

描述

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 核心上安裝 Neo 深度學習執行時間相依性

ML 物件偵測連接器會與 SageMaker Neo 深度學習執行時間 (DLR)。連接器使用執行時間來提供 ML 模型。若要使用這些連接器,您必須在核心裝置上安裝 DLR 的相依性。

在安裝 DLR 相依性之前,請確保所需的系統程式庫 (使用指定的最低版本) 存在於裝置上。

NVIDIA Jetson TX2
  1. 安裝 CUDA Toolkit 9.0 和 cuDNN 7.0。您可以按照入門教學課程的設定其他裝置中的指示。

  2. 啟用世界各地的儲存庫,讓連接器可以安裝社群維護的開放式軟體。如需詳細資訊,請參閱 Ubuntu 文件中的儲存庫/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. 在核心裝置上將以下安裝指令碼的複本儲存成名為 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 文件中的 Installation in Linux,或參閱適用於您平台的其他線上資源。

  4. 在檔案儲存所在之目錄中執行下列命令:

    sudo nvidiajtx2.sh
x86_64 (Ubuntu or Amazon Linux)
  1. 在核心裝置上將以下安裝指令碼的複本儲存成名為 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 文件中的 Installation in Linux,或參閱適用於您平台的其他線上資源。

  2. 在檔案儲存所在之目錄中執行下列命令:

    sudo x86_64.sh
ARMv7 (Raspberry Pi)
  1. 在核心裝置上將以下安裝指令碼的複本儲存成名為 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 文件中的 Installation in Linux,或參閱適用於您平台的其他線上資源。

  2. 在檔案儲存所在之目錄中執行下列命令:

    sudo bash armv7l.sh
    注意

    在 Raspberry Pi 上,使用 pip 來安裝機器學習相依性是一種記憶體密集型操作,可能會導致裝置記憶體不足、無法回應。若要解決這項問題,您可以暫時增加交換大小。在 /etc/dphys-swapfile 中,增加 CONF_SWAPSIZE 變數的值,然後執行下列命令來重新啟動 dphys-swapfile

    /etc/init.d/dphys-swapfile restart

記錄和疑難排解

根據您的組設定,事件和錯誤日誌會寫入 CloudWatch 日誌、本機檔案系統或兩者。來自這個連接器的日誌使用字首 LocalInferenceServiceName。如果連接器發生非預期的行為,請檢查連接器的日誌。日誌通常會包含有用的偵錯資訊,例如遺失機器學習程式庫相依性或連接器啟動失敗的原因。

如果AWS IoT Greengrass組設定為寫入本機日誌,則連接器會將日誌檔案寫入greengrass-root/ggc/var/log/user/region/aws/。如需 Greengrass 日誌記錄的詳細資訊,請參使用 AWS IoT Greengrass 日誌進行監控

使用下列資訊來協助您診斷 ML 物件偵測連接器的故障問題。

必要系統程式庫

下列標籤列出每個 ML 物件偵測連接器所需的系統程式庫。

ML Object Detection Aarch64 JTX2
程式庫 最低版本
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
程式庫 最低版本
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
程式庫 最低版本
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

此為是暫時性的操作。符號連結會在您重新啟動後消失。請參閱您作業系統版本的手冊,了解如何在重新啟動時自動建立連結。

授權

ML 物件偵測連接器包含下列第三方軟體/授權:

此連接器在Greengrass Core 軟體授權合約

另請參閱