チュートリアル:IoT デバイスで Custom Vision を使用して視覚的な状態を報告する

このサンプル アプリでは、Custom Vision を使用して、カメラでデバイスをトレーニングして視覚的な状態を検出する方法を示します。 この検出シナリオは、エクスポートされた ONNX モデルを使用して、IoT デバイスで実行できます。

視覚的な状態は、誰もいない部屋あるいは人がいる部屋、または空の私道やトラックが通っている私道などの画像の内容を表します。 次の図では、カメラの前にバナナまたはりんごが配置されているかどうかをアプリが検出しています。

Animation of a UI labeling fruit in front of the camera

ここでは、次の操作方法について説明します。

  • 独自の Custom Vision と IoT Hub リソースを使用するようにサンプル アプリを構成します。
  • アプリを使用して、Custom Vision プロジェクトをトレーニングします。
  • アプリを使用して、新しいイメージをリアルタイムでスコア付けし、結果を Azure に送信します。

Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。

前提条件

  • Custom Vision サービスを使用するには、Azure で Custom Vision Training リソースと Prediction リソースを作成する必要があります。 Azure portal でこれを行うには、[Create Custom Vision](Custom Vision の作成) ページのダイアログ ウィンドウに入力し、Training リソースと Prediction リソースの両方を作成します。

    重要

    このプロジェクトではモデルを後で ONNX にエクスポートするため、コンパクトな画像分類プロジェクトである必要があります。

  • また、Azure で IoT Hub リソースを作成する必要があります。
  • Visual Studio 2015 またはそれ以降
  • 必要に応じて、Windows 10 IoT Core バージョン 17763 以上を実行している IoT デバイス。 PC からアプリを直接実行することもできます。
    • Raspberry Pi 2 および 3 では、IoT ダッシュボード アプリから Windows 10 を直接設定できます。 DrangonBoard などの他のデバイスの場合、eMMC の方法を使用してフラッシュする必要があります。 新しいデバイスのセットアップでヘルプが必要な場合は、Windows IoT ドキュメントの「デバイスのセットアップ」を参照してください。

Visual Alerts アプリについて

IoT Visual Alerts アプリは状況に応じて 4 つの異なる状態を切り替えて連続したループで実行されています。

  • モデルなし:操作なしの状態です。 アプリは継続的に 1 秒間スリープ状態になり、カメラを検査します。
  • トレーニング イメージのキャプチャ中:この状態では、アプリは画像をキャプチャし、ターゲットの Custom Vision プロジェクトにトレーニング イメージとしてアップロードします。 その後、アプリは 500 ミリ秒間スリープ状態になり、イメージのターゲット数が設定回数キャプチャされるまで操作を繰り返します。 次に、Custom Vision モデルのトレーニングをトリガーします。
  • トレーニング済みモデルの待機中:この状態では、アプリは 1 秒ごとに Custom Vision API を呼び出して、ターゲット プロジェクトにトレーニング済みのイテレーションが含まれているかどうかを確認します。 トレーニング済みのイテレーションが検出されると、対応する ONNX モデルがローカル ファイルにダウンロードされ、スコアリング状態に切り替わります。
  • スコアリング:この状態では、アプリはローカル ONNX モデルに対して Windows ML を使用してカメラから 1 つのフレームを評価します。 最終的なイメージの分類が画面に表示され、IoT Hub にメッセージとして送信されます。 アプリは、新しいイメージをスコアリングする前に 1 秒間スリープ状態になります。

コードの構造を調べる

このアプリの主な機能は、以下のファイルで処理されています。

ファイル 説明
MainPage.xaml このファイルは、XAML ユーザー インターフェイスを定義します。 Web カメラ コントロールをホストし、ステータスの更新に使用されるラベルを含みます。
MainPage.xaml.cs このコードは、XAML UI の動作を制御します。 ステート マシンの処理コードが含まれています。
CustomVision\CustomVisionServiceWrapper.cs このクラスは、Custom Vision Service との統合を処理するラッパーです。
CustomVision\CustomVisionONNXModel.cs このクラスは、ONNX モデルとスコアリング イメージを読み込む Windows ML との統合を処理するラッパーです。
IoTHub\IotHubWrapper.cs このクラスは、スコアリング結果を Azure にアップロードする IoT Hub との統合を処理するラッパーです。

Visual Alerts アプリの設定

次のステップに従って、お使いの PC または IoT デバイスで実行されている IoT Visual Alerts アプリを取得します。

  1. GitHub で IoTVisualAlerts サンプルを複製またはダウンロードします。
  2. Visual Studio で、ソリューション IoTVisualAlerts.sln を開きます
  3. Custom Vision プロジェクトを次のように統合します。
    1. CustomVision\CustomVisionServiceWrapper.cs スクリプトで、トレーニング キーを使用して ApiKey 変数を更新します。
    2. 次に、キーに関連付けられているエンドポイント URL を使用して、Endpoint 変数を更新します。
    3. targetCVSProjectGuid 変数を、使用する Custom Vision プロジェクトに対応する ID に更新します。
  4. IoT Hub リソースを次のように設定します。
    1. IoTHub\IotHubWrapper.cs スクリプトで、s_connectionString 変数をデバイスの適切な接続文字列に更新します。
    2. Azure portal で IoT Hub インスタンスを読み込み、[エクスプローラー] の下にある [IoT デバイス] を選択してターゲット デバイスを選択し (または必要に応じて作成し)、[プライマリ接続文字列] から接続文字列を指定します。 文字列には、{your iot hub name}.azure-devices.net;DeviceId={your device id};SharedAccessKey={your access key} の形式の IoT Hub 名、デバイス ID、共有アクセスキーが含まれます。

アプリを実行する

PC でアプリを実行している場合は、Visual Studio ではターゲット デバイスの [ローカル コンピューター] を選択し、ターゲット プラットフォームでは x64 または x86 を選択します。 その後、F5 を押して、プログラムを実行します。 アプリが起動し、カメラからのライブ フィードとステータス メッセージが表示されます。

ARM プロセッサを搭載した IoT デバイスにデプロイする場合は、ターゲット プラットフォームとして ARM を選択し、ターゲット デバイスとしてリモート マシンを選択する必要があります。 メッセージが表示されたら、デバイスの IP アドレスを指定します (PC と同じネットワーク上にある必要があります)。 デバイスを起動してネットワークに接続すると、Windows IoT の既定アプリから IP アドレスを取得できます。 F5 を押して、プログラムを実行します。

アプリの初回実行時は、視覚的な状態に関する情報は表示されません。 使用可能なモデルがないことを示すステータス メッセージが表示されます。

トレーニング イメージをキャプチャする

モデルを設定するには、アプリをトレーニング イメージのキャプチャ中状態にする必要があります。 次のいずれかのステップを使用します。

  • PC でアプリを実行している場合は、UI の右上隅にあるボタンを使用します。
  • アプリを IoT デバイスで実行している場合は、IoT Hub を通してデバイスで EnterLearningMode メソッドを呼び出します。 これは、Azure portal の [IoT Hub] メニューのデバイス エントリ、または IoT Hub Device Explorer などのツールを使用して呼び出すことができます。

アプリの状態がトレーニング イメージのキャプチャ中になると、目標のイメージ数に達するまで、1 秒ごとに 2 枚のイメージがキャプチャされます。 既定では、目標のイメージ数は 30 ですが、設定したい数を引数として EnterLearningMode IoT Hub メソッドに渡すことによって、このパラメーターを設定できます。

アプリがイメージをキャプチャしている間、検出する視覚的な状態の種類 (たとえば、空の部屋、人がいる部屋、空の机、おもちゃのトラックが乗っている机など) にカメラを向ける必要があります。

Custom Vision モデルをトレーニングする

アプリでイメージのキャプチャが完了すると、イメージがアップロードされ、トレーニング済みモデルの待機中状態に切り替わります。 切り替わったら Custom Vision Web サイトにアクセスし、新しいトレーニング イメージに基づいてモデルを作成する必要があります。 以下のアニメーションはこのプロセスの例を示したものです。

Animation: tagging multiple images of bananas

独自のシナリオでこのプロセスを繰り返すには、次のステップを実行します。

  1. Custom Vision Web サイトにサインインします。
  2. アプリがアップロードしたすべてのトレーニング イメージが含まれているターゲット プロジェクトを見つけます。
  3. 識別する視覚的な状態ごとに適切なイメージを選択し、タグを手動で適用します。
    • たとえば、空の部屋と人がいる部屋を区別することが目的である場合は、人が含まれている 5 枚以上の画像を新しいクラス () としてタグ付けし、人がいない 5 枚以上の写真をのタグとしてタグ付けすることをお勧めします。 これにより、モデルは 2 つの状態を区別できます。
    • もう 1 つの例として、棚がどの程度いっぱいであるかを推定したい場合は、EmptyShelfPartiallyFullShelfFullShelf のようなタグを使用します。
  4. 完了したら、 [トレーニングする] ボタンをクリックします。
  5. トレーニングが完了すると、アプリがトレーニング済みのイテレーションが使用可能であることを検出します。 トレーニング済みのモデルを ONNX にエクスポートし、デバイスにダウンロードするプロセスがアプリで開始されます。

トレーニング済みのモデルを使用する

トレーニング済みのモデルがアプリによってダウンロードされるとスコアリング状態に切り替わり、連続したループでカメラからのイメージのスコアリングが開始されます。

アプリでは、キャプチャされたイメージごとに、上位のタグが画面に表示されます。 視覚的な状態が認識できない場合は [一致なし] と表示されます。 また、アプリはこれらのメッセージを IoT Hub に送信し、クラスが検出された場合、メッセージには、ラベル、信頼スコア、および detectedClassAlert というプロパティが含まれます。このプロパティは、プロパティに基づく高速メッセージ ルーティングを行うために必要な IoT Hub クライアントで使用できます。

さらに、このサンプルでは、Sense HAT ライブラリを使用して Raspberry Pi 上で Sense HAT unit がいつ実行されているかを検出します。これにより、クラスが検出されるたびにすべてのディスプレイ ライトを赤に設定して、検出されていない間は空白に設定する出力ディスプレイとして使用できます。

アプリを再利用する

アプリを元の状態にリセットする場合は、UI の右上隅にあるボタンをクリックするか、IoT Hub を使用して DeleteCurrentModel メソッドを呼び出します。

右上の UI ボタンをクリックするか、EnterLearningMode メソッドを再度呼び出すことで、いつでもトレーニング イメージのアップロード ステップを繰り返すことができます。

アプリをデバイスで実行していて、IP アドレスを再度取得する必要がある場合 (たとえば、Windows IoT Remote Client を使用してリモート接続を確立する場合)、IoT Hub を使用して GetIpAddress メソッドを呼び出すことができます。

リソースをクリーンアップする

Custom Vision プロジェクトを保持する必要がなくなった場合は削除します。 Custom Vision Web サイト[Projects] に移動し、新しいプロジェクトのごみ箱アイコンを選びます。

Screenshot of a panel labeled My New Project with a trash can icon

次のステップ

このチュートリアルでは、IoT デバイスで視覚的な状態に関する情報を検出し、結果を IoT Hub に送信するアプリケーションを設定して実行しました。 次の手順として、ソース コードをさらに調査するか、以下の推薦される変更を行います。

  • IoT Hub メソッドを追加して、アプリをトレーニング済みモデルの待機中状態に直接切り替えます。 これにより、デバイス以外でキャプチャされたイメージを使用してモデルをトレーニングし、新しいモデルをコマンドを通じてデバイスにプッシュすることができます。
  • Power BI ダッシュボードを作成し、サンプルによって送信された IoT Hub アラートを視覚化するには、リアルタイム センサー データを視覚化する方法に関するチュートリアルに従います。
  • 視覚的な状態が検出されたときに IoT Hub アラートに応答するロジック アプリを作成するには、IoT リモート監視に関するチュートリアルに従います。