亚马逊AWS官方博客

边缘机器学习:借助 AWS IoT Greengrass 使用和重新训练图像分类模型(第 1 部分)| AWS 上的物联网

Original URL : https://aws.amazon.com/blogs/iot/machine-learning-at-the-edge-using-and-retraining-image-classification-models-with-aws-iot-greengrass-part-1/

随着 AWS IoT Greengrass 图像分类连接器在今年的 re:Invent 大会上推出,在边缘站点通过 AWS IoT Greengrass 使用图像分类变得比以往更加轻松。AWS IoT Greengrass 是驻留在本地设备上的软件,因此它可以分析更接近数据源(传感器等)的数据。通过使用 AWS IoT Greengrass 图像分类连接器,无需编写代码,即可将 AWS IoT Greengrass Core 设备连接到第三方应用程序、本地软件和 AWS 服务。AWS IoT Greengrass 图像分类连接器可以使 AWS IoT Greengrass Core 设备将图像分类为多个类别之一(例如,将工厂中的微芯片分类为有缺陷/无缺陷、对库存类型进行分类,或确定您在 Instagram 上关注的狗狗的种类)。这种预测被称为 推理。总之,图像分类和 AWS IoT Greengrass 使您即使在设备与云断开连接时也能够执行推理!AWS IoT Greengrass 图像分类连接器在后台使用机器学习模型,该模型已经使用 Amazon SageMaker 中的 图像分类算法进行训练。通过部署连接器,可以自动在 AWS IoT Greengrass Core 设备上拉取和配置进行预测所需的所有 Lambda 函数和机器学习库 (MXNet)。

在这两篇博文中,我们将介绍一个使用图像分类创建应用程序的端到端示例。在第 1 部分中,我们将在 Amazon SageMaker 中创建一个新的图像分类模型,并使用 AWS IoT Greengrass 图像分类连接器启动和运行该模型。在第 2 部分中,我们将收集现场数据,重新训练我们的模型,并观察推理结果的变化情况。

构建的对象

我们将解决一个可通过使用图像分类来解决的实际问题:在回收利用设施中对饮料包装容器进行分类。我们将训练我们的模型,确定图像中是否包含啤酒杯、酒瓶、咖啡杯或易拉罐。如果图像不属于其中的任何一类,我们还将包含杂类。

首先,我们将使用 Caltech 256 数据集构建图像分类模型。然后,我们将创建一个 AWS IoT Greengrass 图像分类连接器,并通过专门用于对饮料包装容器进行分类的 Lambda 函数与之交互。在第 1 部分末尾,我们将得到以下架构:

先决条件

要遵循本文中的说明,您需要:

请确保在运行 AWS IoT Greengrass Core v1.7.0 的 Raspberry Pi 中部署一个 Greengrass 组。请确保您的 Greengrass 组具有 IAM 组角色,该角色至少附加 AWSGreengrassResourceAccessRolePolicy 和 AWSGreengrassFullAccess 策略。您可以通过打开 AWS IoT 控制台并选择设置来执行此操作。有关使用 AWS IoT Greengrass 设置设备的信息,请访问 AWS IoT Greengrass 开发人员指南中的 AWS IoT Greengrass 入门

要使用 IoT Greengrass 图像分类连接器,我们需要安装用于图像分类的机器学习库 MXNet 所需的依赖项。按照 图像分类连接器连接器文档中有关 ARMv7 概述的安装脚本进行操作。

注意:要在 Raspberry Pi 上安装依赖项,必须增加交换文件的大小。我们建议将大小设置为 1000。此安装最多可能需要 1 小时。

最后,按照 图像分类连接器文档中的故障排除部分,运行以下命令,以防止在部署期间出现特定 Raspberry Pi/opencv 的问题:

$ sudo ln /dev/null /dev/raw1394

如果您在执行这些步骤时遇到了问题,请参阅 AWS IoT Greengrass 文档中的故障排除部分

构建和测试应用程序

首先,我们将创建一个 Lambda 函数,该函数可以使用 Pi 摄像头拍照,并使用图像分类模型进行预测。

创建 Lambda 函数

创建 Lambda 函数。从 GitHub 将 beverageclassifier.py 下载到一个新目录中,然后将 AWS IoT Greengrass Machine Learning SDK 下载并解压到同一个位置。将该目录压缩到一个 .zip 文件中,并使用该文件在 AWS Lambda 控制台中创建一个 Lambda 函数。我们将 Lambda 函数命名为 beverage_classifier。在 AWS IoT 控制台中,将此 Lambda 函数添加到您的组,并将其配置为长期使用的 Lambda 函数,内存限制为 128MB,超时为 10 秒,如以下屏幕截图所示。有关创建和打包 Lambda 函数的更多信息,请参阅 AWS IoT Greengrass 开发人员指南中的创建和打包 Lambda 函数

在 Raspberry Pi 上运行以下命令,以安装 AWS IoT Greengrass Core SDK:

$ pip install greengrasssdk

要使用 Pi 摄像头,我们需要设置 Raspberry Pi 和一些本地资源。按照 AWS IoT Greengrass 开发人员指南中的配置 Rasberry Pi将资源添加到 Greengrass 组部分中的步骤进行操作。

请注意,与图像分类连接器的交互通过 AWS IoT Greengrass Machine Learning SDK 实现。

创建模型

我们将使用 Amazon SageMaker 来创建和训练我们的图像分类模型。在 Amazon SageMaker 控制台中,使用我们在 GitHub 上提供的示例创建笔记本。

遵循笔记本中针对第 1 部分的说明。完成后,您将拥有一个用于配置图像分类连接器的 Amazon SageMaker 训练作业。

配置图像分类连接器

现在我们有了训练作业,就可以设置连接器了。将连接器部署到我们的 Greengrass Core 设备后,我们的图像分类模型可以由我们在上一步中创建的 Lambda 函数在本地使用。

首先,在您的 Greengrass 组中创建机器学习资源。您可以在 AWS IoT 控制台的 Greengrass 组页面中找到您的组。在页面上的资源下,选择机器学习选项卡,然后选择添加机器学习资源。使用以下屏幕截图中的值填写字段。对于 SageMaker 模型,请务必选择我们在上一步中创建的 Amazon SageMaker 模型。

选择保存并创建部署。

现在我们准备创建连接器。导航到您的 Greengrass 组,选择连接器选项卡,然后选择添加连接器。我们会将此连接器部署到 Raspberry Pi,因此在选择连接器上,选择 Image Classification ARMv7 连接器。

在下一页,我们将为连接器配置一些参数。选择您在上一步中创建的机器学习资源。对于本地推理服务名称,请输入beverage-classifier。当我们通过 AWS IoT Greengrass Machine Learning SDK 调用连接器时,此名称将用于我们的 Lambda 代码中。使用此屏幕截图中的值配置连接器的其余参数。

选择添加,然后创建新部署。我们的 Lambda 函数现在可以访问我们的图像分类模型了!

如果您在执行上述任一步骤时遇到了问题,请参阅 图像分类连接器文档中的故障排除部分

配置订阅

现在我们已经设置了连接器和 Lambda 函数,接下来我们创建一种与我们的应用程序交互的方法。在 AWS IoT 控制台中的测试页面中,我们将配置 AWS 云和 beverage_classifier Lambda 函数之间的订阅,以便我们可以触发设备捕获图像并在控制台中查看推理结果。实际上,任何 MQTT 消息都可以触发 beverage_classifier Lambda 函数。我们使用 AWS IoT 控制台来触发此示例的事件,因为该控制台提供了简单的调试反馈,此外,还可以使用其他方法触发这些事件。在生产环境中,您可以从其他设备或 Lambda 函数发送这些 MQTT 事件。(即使在 Greengrass Core 设备与云断开连接时,也可以在设备和 Greengrass Core 设备之间发送消息!) 根据您的使用案例,AWS IoT 作业提供了另一种与 Greengrass Core 设备交互的方式。

在 AWS IoT 控制台中,为您的组配置以下订阅:

  1. 关于 /request/classify/beverage_container(主题)的 AWS IoT Cloud(源)到 beverage_classifier Lambda(目标)。有关此主题的消息将触发 Lambda 代码。
  2. 关于 /response/prediction/beverage_container(主题)的 beverage_classifier Lambda(源)到 AWS IoT Cloud(源)。这些消息将出现在 AWS IoT 控制台并报告预测。

设置本地资源

为我们将存储所捕获图像的本地目录配置卷资源:

在部署之前,我们需要在设备上创建 /home/ggc_user/raw_field_data 目录。我们还需要为 ggc_user 提供读取和写入权限:

$ sudo mkdir -p /home/ggc_user/raw_field_data
$ sudo chown -R ggc_user:ggc_group /home/ggc_user/raw_field_data/

您也可以通过在饮料包装容器分类器 AWS IoT Greengrass Lambda 函数配置中设置运行为(Run as)字段来授予您自己的用户 ID/组 ID 权限。有关更多信息,请参阅 AWS IoT Greengrass 开发人员指南中的使用组特定配置控制 Greengrass Lambda 函数的执行

创建部署。

测试

所有内容都设置完后,我们就可以测试饮料包装容器分类器了。在 AWS IoT 控制台中,选择测试,并订阅主题 /response/prediction/beverage_container。发布到主题 /request/classify/beverage_container 后将捕获并对图像进行分类! 将咖啡杯、啤酒杯、酒瓶或易拉罐放在 Pi 摄像头前面,然后选择发布到主题。您的 Greengrass Core 设备将捕获图像、进行预测,并将结果发送回 AWS IoT 控制台:

小结

测试将证明 Caltech 256 数据集的局限性。您会注意到许多预测不正确或置信度很低。在测试中,除啤酒杯之外,我们发现其他对象的置信度较低或预测不正确:

如果我们的模型准确度能得以提升,这将会很棒。在第 2 部分中,我们将向您展示如何扩展此应用程序来收集您自己的图像并重新训练模型,尝试提高模型性能!