

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# チュートリアル: 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) デバイスのカメラモジュールにアクセスしますが、Armv7l, Armv8または x86\$164 プラットフォーム上の他のデバイス AWS IoT Greengrass をサポートしています。別のデバイスにカメラを設定するには、デバイスの関連マニュアルを参照してください。

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/) (以前は Raspbian と呼ばれていた) を実行中の [Raspberry Pi](https://www.raspberrypi.org/)
  + [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 以降がデバイスにインストールされている必要があります。
  + Raspberry Pi などの Armv7l デバイスでは、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. **[Interface Options]** (インターフェイスオプション) を選択します。

      1. **[Legacy camera]** (レガシーカメラ) を選択して、レガシーカメラスタックを有効にします。

      1. Raspberry Pi を再起動します。
+ Raspberry Pi または NVIDIA Jetson Nano デバイスの場合、[Raspberry Pi カメラモジュール V2 - 8 megapixel、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` ではなく、`python3.7` を使用します。依存関係のエラーを回避するために、pip インストールが正しい `python3` バージョンまたは `python3.7` バージョンにマップされていることを確認してください。

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
   ```

**注記**  
Jetson Nano など、Armv8 (Aarch64) デバイスの場合、推論コンポーネントが、ランタイムコンポーネントによって作成されたバーチャル環境からカメラにアクセスできるようにするシンボリックリンクを作成する必要はありません。

------

## ステップ 2: デフォルトの通知トピックのサブスクライブ状況を確認
<a name="ml-image-classification-camera-subscribe"></a>

では[チュートリアル: TensorFlow Lite を使用したサンプルイメージ分類推論の実行](ml-tutorial-image-classification.md)、`ml/tflite/image-classification`トピックの TensorFlow Lite イメージ分類コンポーネントによって発行された MQTT メッセージを監視するように AWS IoT MQTT クライアントが AWS IoT コンソールで設定されました。 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)のナビゲーションメニューで、**[Components]** (コンポーネント) を選択します。

1. **[Components]** (コンポーネント) ページの **[Public components]** (公開コンポーネント) タブで、[`aws.greengrass.TensorFlowLiteImageClassification`] を選択します。

1. [**aws.greengrass.TensorFlowLiteImageClassification**] ページで、**[Deploy]** (デプロイ) を選択します。

1. <a name="add-deployment"></a>**[Add to deployment]** (デプロイに追加) から、次のいずれかを選択します。

   1. ターゲットデバイスにある既存のデプロイにこのコンポーネントをマージするには、**[Add to existing deployment]** (既存のデプロイに追加) をクリックし、修正するデプロイを選択します。

   1. ターゲットデバイスに新しいデプロイを作成するには、**[Create new deployment]** (新しいデプロイの作成) を選択します。デバイスに既存のデプロイがある場合は、このステップを選択すると既存のデプロイが置き換えられます。

1. <a name="specify-deployment-target"></a>**[Specify device state]** (ターゲットを指定) ページで、次を実行します。

   1. **[Deployment information]** (デプロイ情報) で、デプロイの名前を入力または変更して、わかりやすくします。

   1. **[Deployment targets]** (デプロイターゲット) でデプロイのターゲットを選択し、**[Next]** (次へ) を選択します。既存のデプロイを修正する場合は、デプロイターゲットを変更できません。

1. **[Select components]** (コンポーネントを選択) ページの **[Public components]** (パブリックコンポーネント) 内で、`aws.greengrass.TensorFlowLiteImageClassification` コンポーネントが選択されていることを確認して、**[Next]** (次) を選択します。

1. **[Configure components]** (コンポーネントの設定) ページで、次の手順を実行します: 

   1. 推論コンポーネントを選択して、**[Configure component]** (コンポーネントの設定) を選択します。

   1. **[Configuration update]** (設定更新) 内で、**[Configuration to merge]** (マージの設定) ボックスに次の設定更新を入力します:

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

      この設定更新により、コンポーネントはデバイスのカメラモジュールにアクセスし、カメラで撮影した画像の推論を実行します。推論コードは 60 秒ごとに実行されます。

   1. **[Confirm]** (確認)、**[Next]** (次へ) の順に選択します。

1. **[Configure advanced settings]** (詳細設定) ページはデフォルト設定のままにし、**[Next]** (次へ) を選択します。

1. **[Review]** (レビュー) ページで、**[Deploy]** (デプロイ) を選択します。

### 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 コアデバイスのコンポーネントログと 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/)のナビゲーションメニューで、**[Test, MQTT test client]** (テスト、MQTT テストクライアント) を選択します。

  1. **[Subscriptions]** (サブスクリプション) 内で、**ml/tflite/image-classification** を選択します。
+ **コンポーネントログ** - コンポーネントログで推論結果を確認するには、Greengrass コアデバイスで次のコマンドを実行します。

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

コンポーネントログまたは MQTT クライアントで推論結果が確認できない場合、デプロイが失敗しているか、コアデバイスに到達していません。これは、コアデバイスがインターネットに接続されていない、あるいはコンポーネントを実行するために必要な許可がない場合に発生します。コアデバイスで次のコマンドを実行して、 AWS IoT Greengrass Core ソフトウェアログファイルを表示します。このファイルは、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)」を参照してください。