ML 对象检测连接器 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

终止支持通知:2026 年 10 月 7 日, Amazon 将停止对的支持。 Amazon IoT Greengrass Version 1 2026 年 10 月 7 日之后,您将无法再访问这些 Amazon IoT Greengrass V1 资源。如需了解更多信息,请访问迁移自 Amazon IoT Greengrass Version 1

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

ML 对象检测连接器

警告

此连接器已进入生命周期延长阶段, Amazon IoT Greengrass 不会发布更新来提供功能、现有功能增强、安全补丁或错误修复。有关更多信息,请参阅 Amazon IoT Greengrass Version 1 维护政策

ML 对象检测连接器提供在 Amazon IoT Greengrass 核心上运行的机器学习 (ML) 推理服务。此本地推理服务使用 SageMaker AI Neo 深度学习编译器编译的对象检测模型执行对象检测。支持两种类型的对象检测模型:Single Shot Multibox Detector(单步多框检测器,SSD)和 You Only Look Once(只用看一遍,YOLO)v3。有关更多信息,请参阅对象检测模型要求

用户定义的 Lambda 函数使用 M Amazon IoT Greengrass achine Learning SDK 向本地推理服务提交推理请求。该服务对输入图像执行本地推理,并针对图像中检测到的每个对象返回预测列表。每个预测都包含一个对象类别、一个预测置信度得分和像素坐标,这些像素坐标指定围绕预测对象的边界框。

Amazon IoT Greengrass 为多个平台提供机器学习对象检测连接器:

Connector

描述和 ARN

机器学习目标检测 Aarch64 JTX2

适用于 NVIDIA Jet TX2 son 的物体检测推理服务。支持 GPU 加速。

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

ML 对象检测 x86664

适用于 x86_64 平台的对象检测推理服务。

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

机器学习对象检测 ARMv7

ARMv7 平台对象检测推理服务。

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

要求

这些连接器具有以下要求:

  • Amazon IoT Greengrass 核心软件 v1.9.3 或更高版本。

  • Python 版本 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

    这会将设备配置为满足 Amazon IoT Greengrass的 Python 要求。

  • 安装在核心设备上的 SageMaker AI Neo 深度学习运行时的依赖关系。有关更多信息,请参阅 在 Amazon IoT Greengrass 核心上安装 Neo 深度学习运行时依赖关系

  • Greengrass 组中的 ML 资源。ML 资源必须引用包含对象检测模型的 Amazon S3 存储桶。有关更多信息,请参阅 Amazon S3 模型来源

    注意

    该模型必须是 Single Shot Multibox Detector(单步多框检测器,SSD)或 You Only Look Once(只用看一遍,YOLO)v3 对象检测模型类型。它必须使用 SageMaker AI Neo 深度学习编译器进行编译。有关更多信息,请参阅对象检测模型要求

  • 添加到 Greengrass 组且已配置的 ML 反馈连接器。仅当您要使用此连接器上传模型输入数据并将预测发布到 MQTT 主题时,这才是必需的。

  • Amazon IoT Greengrass 需要使用 M@@ achine Learning SDK v1.1.0 才能与此连接器进行交互。

对象检测模型要求

ML 对象检测连接器支持单步多框检测器(SSD)和只用看一遍(YOLO)v3 对象检测模型类型。您可以使用 GluonCV 提供的对象检测组件来通过您自己的数据集训练模型。或者,您可以使用 GluonCV Model Zoo 中的预训练模型:

您的对象检测模型必须使用 512 x 512 输入图像进行训练。来自 GluonCV Model Zoo 的预训练模型已经满足了这一要求。

必须使用 SageMaker AI Neo 深度学习编译器编译经过训练的物体检测模型。编译时,请确保目标硬件与您的 Greengrass 核心设备的硬件匹配。有关更多信息,请参阅 SageMaker A mazon 人工智能开发者指南中的 SageMaker AI Neo

必须将已编译的模型作为 ML 资源(Amazon S3 模型源)添加到与连接器相同的 Greengrass 组中。

连接器参数

这些连接器提供以下参数。

MLModelDestinationPath

包含 Neo 兼容 ML 模型的 Amazon S3 存储桶的绝对路径。这是为 ML 模型资源指定的目标路径。

Amazon IoT 控制台中的显示名称:模型目标路径

必需:true

类型:string

有效模式:.+

MLModelResourceId

引用源模型的 ML 资源的 ID。

在 Amazon IoT 控制台中显示名称:Greengrass 群组 ML 资源

必需:true

类型:S3MachineLearningModelResource

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

LocalInferenceServiceName

本地推理服务的名称。用户定义的 Lambda 函数通过将名称传递给 Machine Learn Amazon IoT Greengrass ing SD invoke_inference_service K 的函数来调用服务。有关示例,请参阅用法示例

Amazon IoT 控制台中的显示名称:本地推理服务名称

必需:true

类型:string

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

LocalInferenceServiceTimeoutSeconds

在推理请求终止之前经过的时间(以秒为单位)。最小值为 1。默认值是 10。

Amazon IoT 控制台中的显示名称:超时(秒)

必需:true

类型:string

有效模式:^[1-9][0-9]*$

LocalInferenceServiceMemoryLimitKB

该服务有权访问的内存量(以 KB 为单位)。最小值为 1。

Amazon IoT 控制台中的显示名称:内存限制

必需:true

类型:string

有效模式:^[1-9][0-9]*$

GPUAcceleration

CPU 或 GPU(加速)计算上下文。此属性仅适用于 ML 图像分类 Aarch64 JTX2 连接器。

Amazon IoT 控制台中的显示名称:GPU 加速

必需:true

类型:string

有效值:CPUGPU

MLFeedbackConnectorConfigId

用于上传模型输入数据的反馈配置的 ID。这必须与为 ML 反馈连接器定义的反馈配置的 ID 匹配。

仅当您要使用 ML 反馈连接器上传模型输入数据并将预测发布到 MQTT 主题时,才需要此参数。

Amazon IoT 控制台中的显示名称:ML 反馈连接器配置 ID

必需:false

类型:string

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

创建连接器示例 (Amazon 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 函数的生命周期很长

在 Amazon 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 函数使用 Amazon IoT Greengrass 机器学习软件开发工具包与 ML 对象检测连接器进行交互。

注意

您可以从 Amazon IoT Greengrass 机器学习开发工具包下载页面下载软件开发工具包。

该示例初始化一个开发工具包客户端,并同步调用该开发工具包的 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

Machine Lear Amazon IoT Greengrass ning 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

在 Amazon IoT Greengrass 核心上安装 Neo 深度学习运行时依赖关系

机器学习对象检测连接器与 SageMaker AI 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. 将以下安装脚本的副本保存到核心设备上一个名为 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. 将以下安装脚本的副本保存到核心设备上一个名为 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. 将以下安装脚本的副本保存到核心设备上一个名为 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 库依赖项或连接器启动故障的原因。

如果将 Amazon IoT Greengrass 组配置为写入本地日志,则连接器会将日志文件写入到greengrass-root/ggc/var/log/user/region/aws/。有关 Greengrass 日志记录的更多信息,请参阅 使用 Amazon 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 软件许可协议下发布。

另请参阅