

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

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

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

**注意**  
本教學課程會存取 [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](https://www.raspberrypi.org/) OS 的 Raspberry Pi （先前稱為 Raspbian) [https://www.raspberrypi.org/downloads/](https://www.raspberrypi.org/downloads/) 
  + [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 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。
+ 對於 Raspberry Pi 或 NVIDIA Jetson Nano 裝置，[Raspberry Pi 相機模組 V2 - 8 百萬像素，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. 請使用箭頭鍵開啟 **Interfacing Options (連接選項)** 並啟用攝影機界面。如果出現提示，請允許重新啟動裝置。

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 MQTT 用戶端在 AWS IoT 主控台中設定為監看主題上 TensorFlow Lite 影像分類元件發佈的 MQTT 訊息`ml/tflite/image-classification`。在 AWS IoT 主控台中，驗證此訂閱是否存在。如果沒有，請遵循中的步驟[步驟 1：訂閱預設通知主題](ml-tutorial-image-classification.md#ml-image-classification-subscribe)訂閱此主題，然後再將元件部署到 Greengrass 核心裝置。

## 步驟 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 Resource Name (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 核心裝置上的元件日誌中，以及在 AWS IoT 主控台的 AWS IoT MQTT 用戶端中檢視推論結果。若要訂閱元件發佈推論結果的主題，請參閱 [步驟 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 Lite 影像分類元件，搭配自訂組態選項，在相機拍攝的影像上執行範例影像分類。

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