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。有关更多信息,请参阅对象检测模型要求

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

AWS IoT Greengrass 为多个平台提供 ML 对象检测连接器:

连接器

描述和 ARN

ML 对象检测 Aarch64 JTX2

适用于 NVIDIA Jetson TX2 的对象检测推导服务。支持 GPU 加速。

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

ML 对象检测 x86664

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

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

ML 对象检测 ARMv7

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

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

要求

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

  • AWS IoT Greengrass Core 软件 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

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

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

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

    注意

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

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

  • 与此连接器进行交互时需要 AWS IoT Greengrass 机器学习开发工具包 v1.1.0。

对象检测模型要求

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

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

必须使用 SageMaker Neo 深度学习编译器编译训练的对象检测模型。编译时,请确保目标硬件与您的 Greengrass 核心设备的硬件匹配。有关更多信息,请参阅 Amazon SageMaker 开发人员指南中的 SageMaker Neo

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

连接器参数

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

MLModelDestinationPath

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

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

必需:true

类型:string

有效模式:.+

MLModelResourceId

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

AWS IoT 控制台中的显示名称:Greengrass 组 ML 资源

必需:true

类型:S3MachineLearningModelResource

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

LocalInferenceServiceName

本地推理服务的名称。用户定义的 Lambda 函数将该服务的名称传递给 AWS IoT Greengrass 机器学习开发工具包的 invoke_inference_service 函数,从而调用该服务。有关示例,请参阅 用法示例

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 控制台中的显示名称:内存限制

必需: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 Greengrass 机器学习软件开发工具包与 ML 对象检测连接器进行交互。

注意

您可以从 AWS 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

AWS IoT Greengrass 机器学习开发工具包中的 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 核心上安装 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. 将以下安装脚本的副本保存到核心设备上一个名为 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 库依赖项或连接器启动故障的原因。

如果将 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

此操作是临时的。重新启动后,符号链接消失。请参阅您的操作系统分发手册以了解如何在重启时自动创建链接。

许可证

ML 对象检测连接器包含以下第三方软件/许可:

此连接器在 Greengrass Core 软件许可协议下发布。

另请参阅