

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

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

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

**注意**  
本教程访问了 [Raspberry Pi](https://www.raspberrypi.org/) 或 [NVIDIA Jetson Nano](https://developer.nvidia.com/embedded/jetson-nano) 设备的摄像头模块，但 AWS IoT Greengrass 支持 armv7L、Armv8 或 x86\$164 平台上的其他设备。要为其他设备设置摄像机，请查阅您设备的相关文档。

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

**Topics**
+ [先决条件](#ml-tutorial-camera-prereqs)
+ [步骤 1：在设备上配置摄像机模块](#ml-tutorial-image-classification-camera-install)
+ [步骤 2：验证您对默认通知主题的订阅](#ml-image-classification-camera-subscribe)
+ [步骤 3：修改 TensorFlow Lite 图像分类组件配置并进行部署](#ml-image-classification-camera-deploy)
+ [步骤 4：查看推理结果](#ml-image-classification-camera-results)
+ [后续步骤](#ml-image-classification-camera-next-steps)

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

要完成本教程，您首先必须完成 [教程：使用 TensorFlow Lite 执行样本图像分类推断](ml-tutorial-image-classification.md)。

您需要以下项目：
+ 带有摄像机接口的 Linux Greengrass 核心设备。本教程访问以下受支持设备之一上的摄像机模块：
  + 运行 [Raspberry Pi OS](https://www.raspberrypi.org/downloads/) 的 [Raspberry Pi](https://www.raspberrypi.org/)（以前称为 Raspbian）
  + [NVIDIA Jetson Nano](https://developer.nvidia.com/embedded/jetson-nano)

  有关设置 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。
+ 对于 Raspberry Pi 或 NVIDIA Jetson Nano 设备，[Raspberry Pi 摄像机模块 V2 – 800 万像素，1080p](https://www.amazon.com/Raspberry-Pi-Camera-Module-Megapixel/dp/B01ER2SKFS)。要了解如何设置摄像机，请参阅 Raspberry Pi 文档中的[连接摄像机](https://www.raspberrypi.org/documentation/usage/camera/)。

## 步骤 1：在设备上配置摄像机模块
<a name="ml-tutorial-image-classification-camera-install"></a>

在此步骤中，您将为设备安装并启用摄像机模块。在设备上运行以下命令。

------
#### [ Raspberry Pi (Armv7l) ]

1. <a name="install-picamera-step"></a>安装适用于摄像机模块的 `picamera` 接口。运行以下命令以安装摄像机模块以及本教程所需的其他 Python 库。

   ```
   sudo apt-get install -y python3-picamera
   ```

1. 验证是否成功安装了 Picamera。

   ```
   sudo -u ggc_user bash -c 'python3 -c "import picamera"'
   ```

   如果输出未包含错误，则表示验证成功。
**注意**  
如果设备上安装的 Python 可执行文件是 `python3.7`，请将 `python3.7` 而非 `python3` 用于本教程中的命令。确保 pip 安装映射到正确的 `python3.7` 或 `python3` 版本以避免依赖项错误。

1. 重新启动设备。

   ```
   sudo reboot
   ```

1. 打开 Raspberry Pi 配置工具。

   ```
   sudo raspi-config
   ```

1. 使用箭头键打开**接口选项**并启用摄像机接口。如果出现提示，请允许设备重新启动。

1. 运行以下命令测试摄像机设置。

   ```
   raspistill -v -o test.jpg
   ```

   这将在 Raspberry Pi 上打开一个预览窗口，将名为 `test.jpg` 的图片保存到您的当前目录，并在 Raspberry Pi 终端中显示有关摄像机的信息。

1. 运行以下命令创建符号链接，以使推理组件能够从运行时组件创建的虚拟环境中访问您的摄像机。

   ```
   sudo ln -s /usr/lib/python3/dist-packages/picamera "MLRootPath/greengrass_ml_tflite_venv/lib/python3.7/site-packages"
   ```

   本教程*MLRootPath*的默认值为`/greengrass/v2/work/variant.TensorFlowLite/greengrass_ml`。此位置中的 `greengrass_ml_tflite_venv` 文件夹是在 [教程：使用 TensorFlow Lite 执行样本图像分类推断](ml-tutorial-image-classification.md) 中首次部署推理组件时创建的。

------
#### [ Jetson Nano (Armv8) ]

1. 运行以下命令测试摄像机设置。

   ```
   gst-launch-1.0 nvarguscamerasrc num-buffers=1 ! "video/x-raw(memory:NVMM), width=1920, height=1080, format=NV12, framerate=30/1" ! nvjpegenc ! filesink location=test.jpg
   ```

   这会捕获一个名为 `test.jpg` 的图像并将其保存到您的当前目录。

1. （可选）重启设备。如果您在上一步中运行 `gst-launch` 命令时遇到问题，则重启设备可能会解决这些问题。

   ```
   sudo reboot
   ```

**注意**  
对于 Armv8 (AArch64) 设备，例如 Jetson Nano，您无需创建符号链接即可使推理组件能够从运行时组件创建的虚拟环境访问摄像机。

------

## 步骤 2：验证您对默认通知主题的订阅
<a name="ml-image-classification-camera-subscribe"></a>

在中[教程：使用 TensorFlow Lite 执行样本图像分类推断](ml-tutorial-image-classification.md)，您在 AWS IoT 控制台中将 AWS IoT MQTT 客户端配置为观看 TensorFlow Lite 图像分类组件针对该主题发布的 MQTT 消息。`ml/tflite/image-classification`在 AWS IoT 控制台中，验证此订阅是否存在。如果没有，请在将组件部署到 Greengrass 核心设备之前，按照 [步骤 1：订阅默认通知主题](ml-tutorial-image-classification.md#ml-image-classification-subscribe) 中的步骤订阅此主题。

## 步骤 3：修改 TensorFlow Lite 图像分类组件配置并进行部署
<a name="ml-image-classification-camera-deploy"></a>

在此步骤中，您将配置 TensorFlow Lite 图像分类组件并将其部署到您的核心设备：

### 配置和部署 TensorFlow Lite 图像分类组件（控制台）
<a name="ml-image-classification-camera-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. 在**配置更新**下的**要合并的配置**框中，输入以下配置更新。

      ```
      {
        "InferenceInterval": "60",
        "UseCamera": "true"
      }
      ```

      通过此配置更新，该组件将访问您设备上的摄像机模块，并对摄像机拍摄的图像进行推理。推理代码每 60 秒运行一次。

   1. 选择**确认**，然后选择**下一步**。

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

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

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

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

   ```
   {
     "targetArn":"targetArn",
     "components": {
       "aws.greengrass.TensorFlowLiteImageClassification": {
         "componentVersion": 2.1.0,
         "configurationUpdate": {
           "InferenceInterval": "60",
           "UseCamera": "true"
         }
       }
     }
   }
   ```
   + 在 `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.TensorFlowLiteImageClassification`组件对象中，替换*2.1.0*以使用其他版本的 TensorFlow Lite 图像分类组件。

   通过此配置更新，该组件将访问您设备上的摄像机模块，并对摄像机拍摄的图像进行推理。推理代码每 60 秒运行一次。替换以下值

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

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

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

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

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

**Topics**
+ **AWS IoT MQTT 客户端**-要查看推理组件在[默认通知主题](ml-tutorial-image-classification.md#ml-image-classification-subscribe)上发布的结果，请完成以下步骤：

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

  1. 在**订阅**下，选择 **ml/tflite/image-classification**。
+ **组件日志** – 要在组件日志中查看推理结果，请在 Greengrass 核心设备上运行以下命令。

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

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

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

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

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

本教程向您展示如何使用 TensorFlow 精简版图像分类组件以及自定义配置选项对相机拍摄的图像进行样本图像分类。

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