

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

# チュートリアル: 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 ライブラリ](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 を再起動します。

## ステップ 1: デフォルトの通知トピックへサブスクライブ
<a name="ml-image-classification-subscribe"></a>

このステップでは、TensorFlow Lite イメージ分類コンポーネントによって発行された AWS IoT MQTT メッセージを監視するように AWS IoT 、コンソールで MQTT クライアントを設定します。デフォルトでは、コンポーネントは推論結果を `ml/tflite/image-classification` トピックにパブリッシュします。コンポーネントを Greengrass コアデバイスにデプロイする前に、このトピックにサブスクライブして、コンポーネントが初めて実行されたときの推論結果を確認します。



**デフォルトの通知トピックへサブスクライブするには**

1. [AWS IoT コンソール](https://console.aws.amazon.com/iot/)のナビゲーションメニューで、**[Test, MQTT test client]** (テスト、MQTT テストクライアント) を選択します。

1. **Subscribe to a topic** (トピックへサブスクライブ) 内の**[Topic name]** (トピック名) ボックスで、**ml/tflite/image-classification** と入力します。

1. **[サブスクライブ]** を選択します。

## ステップ 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)のナビゲーションメニューで、**[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]** (コンポーネント設定) ページで、デフォルト設定のままにして、**[Next]** (次へ) を選択します。

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

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

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

  1. **[Subscriptions]** (サブスクリプション) 内で、**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 Core ソフトウェアログファイルを表示します。このファイルは、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)」を参照してください。