

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 教學課程：使用 TensorFlow Lite 執行範例影像分類推論
<a name="ml-tutorial-image-classification"></a>

本教學課程說明如何使用 [TensorFlow Lite 影像分類](tensorflow-lite-image-classification-component.md)推論元件，在 Greengrass 核心裝置上執行範例影像分類推論。此元件包含下列元件相依性：
+ TensorFlow Lite 影像分類模型存放區元件
+ TensorFlow Lite 執行時間元件

當您部署此元件時，它會下載預先訓練的 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 Library](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 Lite 影像分類元件發佈的 MQTT 訊息。根據預設，元件會在`ml/tflite/image-classification`主題上發佈推論結果。在您將元件部署到 Greengrass 核心裝置之前，請訂閱此主題，以查看元件第一次執行時的推論結果。



**訂閱預設通知主題**

1. 在[AWS IoT 主控台](https://console.aws.amazon.com/iot/)導覽功能表中，選擇**測試、MQTT 測試用戶端**。

1. 在**訂閱主題**下，於**主題名稱**方塊中，輸入 **ml/tflite/image-classification**。

1. 選擇 **Subscribe (訂閱)**。

## 步驟 2：部署 TensorFlow Lite 影像分類元件
<a name="ml-image-classification-deploy"></a>

在此步驟中，您將 TensorFlow Lite 映像分類元件部署至核心裝置：

### 部署 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 Resource Name (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 核心裝置上的元件日誌中，以及在 AWS IoT 主控台的 AWS IoT MQTT 用戶端中檢視推論結果。若要訂閱元件發佈推論結果的主題，請參閱 [步驟 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`組態參數，以變更推論程式碼執行的頻率。
+ 修改推論元件`ImageDirectory`組態中的 `ImageName`和 組態參數，以指定用於推論的自訂映像。

如需自訂公有元件組態或建立自訂機器學習元件的詳細資訊，請參閱 [自訂您的機器學習元件](ml-customization.md)。