

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

# 教程：使用 TensorFlow Lite 执行样本图像分类推断
<a name="ml-tutorial-image-classification"></a>

本教程向您展示如何使用 [TensorFlow Lite 图像分类](tensorflow-lite-image-classification-component.md)推理组件在 Greengrass 核心设备上执行样本图像分类推理。此组件包括以下组件依赖关系：
+ TensorFlow 精简版图像分类模型存储组件
+ TensorFlow 精简版运行时组件

部署此组件时，它会下载预先训练的 MobileNet v1 模型并安装 [TensorFlow Lite](https://www.tensorflow.org/lite/guide/python) 运行时及其依赖项。此组件会发布有关 `ml/tflite/image-classification` 主题的推理结果。要查看这些推理结果，请使用 AWS IoT 控制台中的 AWS IoT MQTT 客户端订阅此主题。

在本教程中，您将部署示例推理组件，以便对 AWS IoT Greengrass提供的示例图像执行图像分类。完成本教程后，您可以完成 [教程：使用 TensorFlow Lite 对来自相机的图像执行样本图像分类推断](ml-tutorial-image-classification-camera.md)，其中向您展示如何修改示例推理组件，以便在 Greengrass 核心设备上在本地对来自摄像机的图像进行图像分类。

有关在 Greengrass 设备上进行机器学习的更多信息，请参阅[执行机器学习推理](perform-machine-learning-inference.md)。

**Topics**
+ [先决条件](#ml-tutorial-prereqs)
+ [步骤 1：订阅默认通知主题](#ml-image-classification-subscribe)
+ [步骤 2：部署 TensorFlow Lite 图像分类组件](#ml-image-classification-deploy)
+ [步骤 3：查看推理结果](#ml-image-classification-results)
+ [后续步骤](#ml-image-classification-next-steps)

## 先决条件
<a name="ml-tutorial-prereqs"></a>

要完成本教程，您需要：
+ 一个 Linux Greengrass 核心设备。如果没有，请参阅[教程：AWS IoT Greengrass V2 入门](getting-started.md)。核心设备必须满足以下要求：<a name="ml-component-requirements"></a>
  + 在运行 Amazon Linux 2 或 Ubuntu 18.04 的 Greengrass 核心设备上，[GNU C 库](https://www.gnu.org/software/libc/)（glibc）版本 2.27 或更高版本已安装在设备上。
  + 在 Armv7l 设备（例如 Raspberry Pi）上，OpenCV-Python 的依赖关系已安装在设备上。运行以下命令以安装依赖关系。

    ```
    sudo apt-get install libopenjp2-7 libilmbase23 libopenexr-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libgtk-3-0 libwebp-dev
    ```
  + 运行 Raspberry Pi OS Bullseye 的 Raspberry Pi 设备必须满足以下要求：
    + NumPy 设备上安装了 1.22.4 或更高版本。Raspberry Pi OS Bullseye 包含的早期版本 NumPy，因此你可以运行以下命令在设备 NumPy 上进行升级。

      ```
      pip3 install --upgrade numpy
      ```
    + 旧摄像机堆栈已在设备上启用。Raspberry Pi OS Bullseye 包含一个新摄像机堆栈，该堆栈默认处于启用状态且不兼容，因此您必须启用旧摄像机堆栈。<a name="raspberry-pi-bullseye-enable-legacy-camera-stack"></a>

**启用旧摄像机堆栈**

      1. 运行以下命令以打开 Raspberry Pi 配置工具。

         ```
         sudo raspi-config
         ```

      1. 选择**接口选项**。

      1. 选择**旧摄像机**以启用旧摄像机堆栈。

      1. 重启 Raspberry Pi。

## 步骤 1：订阅默认通知主题
<a name="ml-image-classification-subscribe"></a>

在此步骤中，您将在 AWS IoT 控制台中配置 AWS IoT MQTT 客户端，以查看 TensorFlow 精简版图像分类组件发布的 MQTT 消息。默认情况下，组件会发布有关 `ml/tflite/image-classification` 主题的推理结果。在将组件部署到 Greengrass 核心设备之前，请订阅此主题，以便在组件首次运行时查看推理结果。



**订阅默认通知主题**

1. 在 [AWS IoT 控制台](https://console.aws.amazon.com/iot/)导航菜单中，选择**测试、MQTT 测试客户端**。

1. 在**订阅主题**下的**主题名称**框中输入 **ml/tflite/image-classification**。

1. 选择**订阅**。

## 步骤 2：部署 TensorFlow Lite 图像分类组件
<a name="ml-image-classification-deploy"></a>

在此步骤中，您将 TensorFlow 精简版图像分类组件部署到您的核心设备：

### 部署 TensorFlow Lite 图像分类组件（控制台）
<a name="ml-image-classification-deploy-console"></a>

1. 在 [AWS IoT Greengrass 控制台](https://console.aws.amazon.com/greengrass)导航菜单中，选择**组件**。

1. 在**组件**页面的**公有组件**选项卡上，选择 `aws.greengrass.TensorFlowLiteImageClassification`。

1. 在 **aws.greengrass.TensorFlowLiteImageClassification** 页面上，选择**部署**。

1. <a name="add-deployment"></a>在**添加到部署**中，选择以下选项之一：

   1. 要将此组件合并到目标设备上的现有部署，请选择**添加到现有部署**，然后选择要修改的部署。

   1. 要在目标设备上创建新部署，请选择**创建新部署**。如果您的设备上已有部署，选择此步骤将替换现有部署。

1. <a name="specify-deployment-target"></a>在**指定目标**页面中，执行以下操作：

   1. 在**部署信息**下，输入或修改部署的友好名称。

   1. 在**部署目标**下，选择部署目标，然后选择**下一步**。如果您正在修改现有部署，则无法更改部署目标。

1. 在**选择组件**页面的**公有组件**下，确认已选择 `aws.greengrass.TensorFlowLiteImageClassification` 组件，然后选择**下一步**。

1. 在**配置组件**页面上，保留默认配置设置，然后选择**下一步**。

1. 在**配置高级设置**页面上，保留默认配置设置，然后选择**下一步**。

1. 在**检查**页面上，选择**部署**。

### 部署 TensorFlow Lite 图像分类组件 (AWS CLI)
<a name="ml-image-classification-deploy-cli"></a>

1. 创建一个`deployment.json`文件来定义 TensorFlow Lite 图像分类组件的部署配置。此文件应类似以下内容：

   ```
   {
     "targetArn":"targetArn",
     "components": {
       "aws.greengrass.TensorFlowLiteImageClassification": {
         "componentVersion": 2.1.0,
         "configurationUpdate": {
         }
       }
     }
   }
   ```
   + 在 `targetArn` 字段中，按以下格式将 `targetArn` 替换为部署目标的事物或事物组的 Amazon 资源名称（ARN）：
     + 事物：`arn:aws:iot:region:account-id:thing/thingName`
     + 事物组：`arn:aws:iot:region:account-id:thinggroup/thingGroupName`
   + 本教程使用组件版本 2.1.0。在`aws.greengrass.TensorFlowLiteObjectDetection`组件对象中，替换*2.1.0*以使用其他版本的 TensorFlow Lite 对象检测组件。

1. 运行以下命令在设备上部署 TensorFlow Lite 图像分类组件：

   ```
   aws greengrassv2 create-deployment \
       --cli-input-json file://path/to/deployment.json
   ```

完成部署可能需要数分钟。在下一步中，检查组件日志，以验证部署是否成功完成并查看推理结果。

## 步骤 3：查看推理结果
<a name="ml-image-classification-results"></a>

部署组件后，您可以在 Greengrass 核心设备的组件日志和控制台的 MQTT 客户端中 AWS IoT 查看推理结果。 AWS IoT 要订阅与组件所发布的推理结果有关的主题，请参阅[步骤 1：订阅默认通知主题](#ml-image-classification-subscribe)。
+ **AWS IoT MQTT 客户端**-要查看推理组件在[默认通知主题](#ml-image-classification-subscribe)上发布的结果，请完成以下步骤：

  1. 在 [AWS IoT 控制台](https://console.aws.amazon.com/iot/)导航菜单中，选择**测试、MQTT 测试客户端**。

  1. 在**订阅**下，选择 **ml/tflite/image-classification**。

     您应该会看到类似于以下示例的消息。

     ```
     {
       "timestamp": "2021-01-01 00:00:00.000000",
       "inference-type": "image-classification",
       "inference-description": "Top 5 predictions with score 0.3 or above ",
       "inference-results": [
         {
           "Label": "cougar, puma, catamount, mountain lion, painter, panther, Felis concolor",
           "Score": "0.5882352941176471"
         },
         {
           "Label": "Persian cat",
           "Score": "0.5882352941176471"
         },
         {
           "Label": "tiger cat",
           "Score": "0.5882352941176471"
         },
         {
           "Label": "dalmatian, coach dog, carriage dog",
           "Score": "0.5607843137254902"
         },
         {
           "Label": "malamute, malemute, Alaskan malamute",
           "Score": "0.5450980392156862"
         }
       ]
     }
     ```
+ **组件日志** – 要在组件日志中查看推理结果，请在 Greengrass 核心设备上运行以下命令。

  ```
  sudo tail -f /greengrass/v2/logs/aws.greengrass.TensorFlowLiteImageClassification.log
  ```

  您应看到类似于以下示例的结果。

  ```
  2021-01-01 00:00:00.000000 [INFO] (Copier) aws.greengrass.TensorFlowLiteImageClassification: stdout. Publishing results to the IoT core.... {scriptName=services.aws.greengrass.TensorFlowLiteImageClassification.lifecycle.Run.script, serviceName=aws.greengrass.TensorFlowLiteImageClassification, currentState=RUNNING}
          
  2021-01-01 00:00:00.000000 [INFO] (Copier) aws.greengrass.TensorFlowLiteImageClassification: stdout. {"timestamp": "2021-01-01 00:00:00.000000", "inference-type": "image-classification", "inference-description": "Top 5 predictions with score 0.3 or above ", "inference-results": [{"Label": "cougar, puma, catamount, mountain lion, painter, panther, Felis concolor", "Score": "0.5882352941176471"}, {"Label": "Persian cat", "Score": "0.5882352941176471"}, {"Label": "tiger cat", "Score": "0.5882352941176471"}, {"Label": "dalmatian, coach dog, carriage dog", "Score": "0.5607843137254902"}, {"Label": "malamute, malemute, Alaskan malamute", "Score": "0.5450980392156862"}]}. {scriptName=services.aws.greengrass.TensorFlowLiteImageClassification.lifecycle.Run.script, serviceName=aws.greengrass.TensorFlowLiteImageClassification, currentState=RUNNING}
  ```

如果您在组件日志或 MQTT 客户端中看不到推理结果，则表示部署失败或未到达核心设备。如果您的核心设备未连接到互联网或无权运行组件，则可能会发生这种情况。在您的核心设备上运行以下命令以查看 AWS IoT Greengrass 核心软件日志文件。此文件包含来自 Greengrass 核心设备的部署服务的日志。

```
sudo tail -f /greengrass/v2/logs/greengrass.log
```

有关更多信息，请参阅 [机器学习推理故障排除](ml-troubleshooting.md)。

## 后续步骤
<a name="ml-image-classification-next-steps"></a>

如果您的 Greengrass 核心设备支持摄像机接口，则可以完成 [教程：使用 TensorFlow Lite 对来自相机的图像执行样本图像分类推断](ml-tutorial-image-classification-camera.md)，其中向您展示如何修改示例推理组件以对来自摄像机的图像进行图像分类。

要进一步探索 [TensorFlow Lite 图像分类](tensorflow-lite-image-classification-component.md)推理示例组件的配置，请尝试以下操作：
+ 修改 `InferenceInterval` 配置参数以更改推理代码的运行频率。
+ 修改推理组件配置中的 `ImageName` 和 `ImageDirectory` 配置参数，以指定要用于推理的自定义图像。

有关自定义公有组件配置或创建自定义机器学习组件的信息，请参阅[自定义您的机器学习组件](ml-customization.md)。