AIを活用したIoT Edgeデバイスの環境をAzure Percept DKで構築する

# Azure Perceptというコンセプト

最近はDigital Twinsという言葉が話題に上がります。Digital Twinsで重要なものの1つとしてIoTは切っても切り離せない関係だと思います。IoT機器のセンシング情報をデジタル環境で活用することはもはや当たり前の世界観になってきていると思います。
そういった中でより高度なセンシング情報を扱うためにIoTエッジデバイスと機械学習を組合わせる運用というのも徐々に増えていると思います。例えば、カメラ映像をただストリーミングするのではなく機械学習を使って人流や防犯といった方面で情報を活用するといったものです。
こういったシステムを構築するためにはそれなりの工数がかかります。IoT機器の準備、機械学習に必要なモデル定義や学習データ...

Azure Perceptはこの辺りを1つのソリューションとして構築するためのソリューションになっています。

https://azure.microsoft.com/ja-jp/services/azure-percept/?WT.mc_id=MR-MVP-5003104

IoT エッジデバイス上で機械学習を活用し、エッジデバイス下に接続されているIoT機器のセンシング情報を分析し必要な情報をクラウド送信します。
さらにエッジデバイス上の機械学習部分の環境設定を実現するクラウド上で利用できるIDEも提供されています。
具体的なサービスとしては以下のサービスを提供しています。

* Azure Percept DK
* Azure Percept Audio
* Azure Percept Studio

さらに深く理解したい方はリンク先も参照してください。
なお、Azure Perceptは現段階ではプレビューでの提供(2021/08時点)です。

今回はこのAzure Perceptのソリューションを活用して容易にPOCを実現することができる開発キットについてその環境構築と実際に利用についての情報を共有します。

## 各サービスの概要

まず、提供されている各種サービスの概要などを紹介します。

### Azure Percept DK

Azure Percept DKはAzure Perceptのソリューションを実現する基本的なハード構成を持つ開発キットです。以下の様にメインのコンポーネントにカメラモジュールがセットになっている構成です。Azure Percept DKは2021年8月から国内でも購入可能になっています。少し前までは個人輸入等で手配が必要だったものになります。

https://www.microsoft.com/ja-jp/d/azure-percept-dk/8mn84wxz7xww

どうも、提供時期なのかプレビュー版にも何段階かあるのか、一部で塗装無し版のものもあるようです。市販されているものは黒系ですね。
付属品含めて以下のような構成になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/2b0b7d85-caca-9e9a-3066-deac742716ba.png)

スペックは以下のサイトに詳細が記載されています。
https://docs.microsoft.com/ja-jp/azure/azure-percept/azure-percept-dk-datasheet?WT.mc_id=MR-MVP-5003104

サポートされれているサービスは以下の通りです。
これを見てわかるかと思うのですが、Azure Percept DKはAzureの機械学習サービスとのシームレスな連携が可能になっています。基本的にコンテナで管理されています。各種エッジデバイス上での動作をAzure IoT EdgeやAzure Device Updateを利用してリモートでチューニングが可能なところもポイントになっていると思います。特に多数のIoT エッジデバイスをグループ単位で複数更新するといったことも可能です。この辺りがプロトタイピングを容易にしているところですね。Tensorflowも対応しているのでAzureに頼らないカスタムも可能となようです。

* Azure Device Update
* Azure IoT
* Azure IoT Hub
* Azure IoT Central
* Azure IoT Edge および Marketplace
* Azure Container Registry
* Azure Mariner OS と接続性
* Azure Machine Learning
* ONNX Runtime
* TensorFlow
* Azure Analysis Services
* IoT プラグ アンド プレイ
* Azure Device Provisioning Service (DPS)
* Azure Cognitive Services
* Power BI

また、80/20レールに取り付けな可能な加工がされており、レールにはめ込む形で設営が可能となっています。
ただ、国内だと80/20レール自体を個人で手に入れるのはないかと面倒そうです。

#### 技適の件 - **技適マークあります！！！**

実はぱっと外観を調べてみても技適のマークが見当たらなかったです。Azure Percept DKは無線/有線LAN両方利用できるのですが。。。ということで本体をばらしてみて無線LANチップ確認しました。本体には六角レンチでメインボードを外すことができます。大半がヒートシンクでおおわれていますが、基盤が見えているところに無線LAN用のチップがついているので確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/9f570f2e-68a4-19a9-5f53-4a08f9f7b642.png)

ということで問題なく無線は使えますね。モデルはRealtek製のRTL8822CEです。

#### カメラモジュール

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/f32ed2f9-7313-fcd6-e492-b62e0646b8b0.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/8909764a-ad15-3914-c3e5-5020773ada55.png) |
|:-:|:-:|


カメラモジュールについてはTupe-C to Type-Cで本体と接続する形になっています。青いネジを緩めて角度を調整できます。カメラ自体は磁石で固定されているので自由度は高いです。
こちらもヒートシンクでおおわれているので土台を外して裏返してみました。左上の14pinは何に使うんだろう。。。見た目の形状からしてカメラ2つつけられる？はその通りで2個付けられるように端子は空いてます。なお、現状個別で買う手段はない気がしますが。。。2連装するとそれぞれに違う情報分析をさせたりとかすることができそうですね。カメラの種類を変えるなどしてそのうち暗視用のカメラとか魚眼とか出るんでしょうか。

### Azure Percept Audio

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/1a9db5a4-b90c-d571-50c9-7d7d554a6757.png)

Azure Percept DKに音声モジュールをアドオンするためのモジュールです。ちょっと注意がいりそうなのはAzure Percept Audioのみの購入ができなさそうということ。Azure Percept DKをカートに入れると「一緒にどうですか？」と聞かれる形です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/e8b532de-f030-0ce5-93a5-8a8990f0f81b.png)

本来の表面です。マイクアレイで4つついています。あとオーディオ出力も一応ついています。基本はインプットを想定しているようでスピーカー基板上にはないです。ボタンを2つついていてMuteなどが可能です。真ん中のLEDは稼働時、音声認識時にそのアクションがわかるようになっています。
この装置はType-B Micro to Type-Aで本体を接続します。音声モジュールを組み込むとLanguage Understanding (LUIS) 等の音声系の機械学習を利用できます。いわゆるスマートスピーカーを持たせたりと色々遊び甲斐はありそうなので購入の際はセットがいいと思います。

### Azure Percept Studio

Azure Percept のモジュールの管理を行うことができます。モジュールといってもデバイスとしての管理はAzure IoTサービスが担っています。こちらはソフトウェアとしての管理ですね。Azure Percept DKなどに接続されている各種センサーに適用する学習モデルの定義や動作確認が可能になっています。

https://docs.microsoft.com/ja-jp/azure/azure-percept/overview-azure-percept-studio?WT.mc_id=MR-MVP-5003104

https://portal.azure.com/#blade/AzureEdgeDevices/Main/overview

ポータルサイトは以下のようになっています。デバイスを選択すると登録したAzure Percept DKが表示されるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/dae56864-8629-dd3a-47d2-5a44a81f9e2e.png)

メニューの中にある「AIプロジェクト」はCognitive Serviceの「Custom Vision Service」「Speech Service」に関連しています。
Azure Percept DKはAzureで作成済みのCognitive Serviceを利用することが可能です。また、Azure Percept DKに関連していくつかの学習済みモデルがプリセットされており、学習モデルも作っていなくてもすぐに色々なことを体験することができます。

#### Vision系機能

Vision系機能の設定画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/9053ca94-f22b-c39e-a1e7-8c87563aa2ac.png)

個々ではカメラモジュールのライブラリ更新といくつかのアクションが実施可能です。

| アクション | 説明 |
|:-:|:-:|
| プロジェクトのイメージをキャプチャ | いわゆるスクショです。カメラからの画像を採取し、Custom Vision Service等の学習データとして取り込むことができます。  |
|  デバイスストリームの表示 | カメラ動画のストリーミングで確認することが可能です。実際に設定済みの機械学習済みモデルが稼働した状態で確認できます。この機能はリモートではなくAzure Percept DKと同一ネットワーク内の端末で利用できます。 |
| Custom Vision プロジェクトのデプロイ  | Azure上に構築したCustom Vision をAzure Perceptに組込みます。 |
| サンプルモデルのデプロイ  | あらかじめ用意されているサンプルのモデルをデプロイしプロトタイピングが可能です。  |

サンプルについては以下のものが用意されています。簡単なもの（オブジェクト検出、人流調査的なもの）であれば、ほぼポチポチ設定変えるだけで利用可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/f7b467a8-6543-3343-790f-1567ce28d33e.png)


以上が、簡単なAzure Percept の概要になります。非常によくできていますね。一般的に機械学習を活用したIoTエッジデバイスはハードを準備するところの敷居が高いように感じるので、子の手軽さで導入できるのは魅力的ではないでしょうか。
次は実際に環境構築を行い、簡単な動作チェックをしていきたいと思います。

### 環境構築

Azure Percept DKに最低限必要なAzureサービスは以下の2つになります。

* Azure IoT Hub
* Azure IoT Edge

Azure Percept DKはモジュールに設定された学習モデルを利用しセンシングデータを解析、結果をテレメトリ情報としてAzure IoT Hubに送信します。Azure IoT EdgeはAzure Percept DKのデバイスとしての管理を行います。Azure上から各種操作を可能にし遠隔でのメンテナンスを容易にしています。

では早速、Azure Percept DKをセットアップしてみましょう。
環境構築には、無線LANとブラウザが使える端末であれば何でもOKです。

#### 電源を入れるまで

基本的には本体部分だけでセットアップはできるのですが、まとめてやる方が後々楽なので全部接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/f45a2f0b-5152-d00b-9403-7f0da5c30ac3.png)

本体の左側にUSB端子があるので以下の通り接続します。

* Type-C To Type-Cでカメラに接続
* Type-A to Micro Type-Bで音声デバイスに接続

Type-Aは複数ありますが、どれさしても問題ないです。電源はACアダプタを右側の端子から接続します。よほどの無茶をしないと逆につなぐことはできないはずですが気を付けてください。一応うっかり抜けないようにビス止めも可能ですが、これは実運用向けの話ですね。また、運用環境が無線LANでは安定しない場合などを想定して左側に有線LANの口も用意されています。


| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/2094b0a5-358f-f845-b09b-3093d2e24daa.png)| 電源は本体の左部分にあります。 |
|:-:|:-:|

なお右側にはステータス用にLEDが用意されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/ef76406f-198c-31de-4e71-0d78e2a6acf2.png)

左から「無線LANのON」「Azureへの接続」「異常ランプ」となっています。あとはコンセントにプラグさして電源を入れます。なお、**「アース付きの3股プラグ」です！！！**
電源をいれて稼働すると上のように電源部分が光ります。そしてしばらくすると無線LANのLEDが光ります。この時点ではAzureに接続していないので光るのは一番左のみです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/e559748a-afb9-b059-85fe-fc83588c8485.png)

音声デバイスもLEDはつくのですが、最初は中央が光ります。音声デバイスとして利用可能になるとすべて青色になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/f6e048e0-8897-05a8-0013-0e494c964121.png)

これで準備完了です。次のセットアップに入っていきましょう。

#### 本体の設定をAzure IoT Hub/Azure IoT Edgeへの登録

次にAzure Percept DKをAzureに登録し、使えるようにします。Azure IoT Hubのサービス自体はあらかじめ作っても作らなくてもどちらでも問題ないです。作業途中で構築することになります。Azure Percept DKの無線LANのLEDがついていることを確認してAzure Percept DKのSSIDにアクセスします。SSIDは同梱の手順のところに書いてあります。ここに接続すると自動的にブラウザが起動しセットアップ画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/2dbe77ff-f20d-3881-f2c0-37e1c06145eb.png)
設定する場合は「Connect to a new WiFi network」を選択します。詳細を個別で定義する場合は高度な設定へ。
有線でいい場合はSkipしてしまいましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/0ef2dfa5-33ab-ea69-da1e-49c0461012ba.png)
Welcome画面ですね。まずは「Next」を押して次へ進みます。

##### Wi-Fiの設定

次にAzure Percept DKがインターネット接続する際の無線の設定を行います。この設定を飛ばして有線LANで接続することも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/1daf7420-3bc8-4a65-8c18-2793e6904f31.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/fea02e8e-a2d9-4d5b-557e-78f0a5ab8197.png)
設定する場合は一覧から接続したいアクセスポイントを選択して設定しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/806f737e-c39f-0dc6-3ac8-c6b583fbe6be.png)
問題なく設定できるとIPアドレスをMACアドレスが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/457f06df-2498-e7ce-c7a8-18f4f03e1d4e.png)
次にAzure Percept DKのSSHで接続するためのログイン情報を設定します。結構強力なパスワードを要求されるのではしっかり忘れないようにしましょう。

##### Azure IoT Hubへの登録

次にAzure IoT Hubへの登録です。ちなみに、Azure Percept DKはAzure IoT Edge側で管理され、テレメトリ情報がAzure IoT Hubに流れるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/80ddbaf2-3ee9-c547-095c-aa164b843d10.png)
「Setup as a new device」を選択します。この時点ですでにAzure IoT Hubのサービスにデバイスを登録している場合は接続文字列を使って接続も可能です。
再セットアップ等の時は下のメニュを使うことで再作成がないため運用が楽だと思います。

以降はAzureへのセットアップが必要となるため、ログインを行います。画面にアクセスコードが表示されるので、それをコピーしておきNextを押すと、
ログイン処理に進めることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/6d60d466-8843-b0e6-afd7-2f3c34fe3d6c.png)

ログイン後、「Setup as a new device」を選択した場合はAzure IoT Hubの設定画面に移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/c0c000b3-f793-4034-032d-c5c43cd162be.png)
この時点で自動的にAzure上に構築済みのAzure IoT Hubが表示されます。一覧にない場合はここから「Create a new Azure IoT Hub」を選択して作成します。
注意点としては価格タイプのBasicは利用できません。BasicはAzure IoT Edgeが使えないためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/637f4025-64ac-e7ed-b294-274e65e3b892.png)
Azure IoT Hubの構築が完了したら最後にAzure Percept DKのAzure IoT Edge上のデバイス名を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/6329f477-0681-8457-ebef-2bfa3f92844b.png)
完了しました！
この状態でネットワークが正常に稼働していると先ほどの本体のLEDのうちクラウドとの接続確認用のライトが付くようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/90deedfa-6951-9e69-d4c5-1a8144e9b188.png)

### Azure IoT Hub と Azure IoT Edgeの確認

次に各種設定を見てみましょう。Azure Percept DKはIoTデバイスとしてではなくIoT エッジデバイスとして管理されます。
Azure IoT EdgeはAzure IoT Hubへのテレメトリ情報の送信以外に、Edgeデバイスの管理が可能なサービスになっています。これらの機能をクラウド上から制御することで運用コストを削減することが可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/7259c68f-43c4-beb0-5515-d2845cbdf63c.png)
作成されたAzure Percept DKはAzure IoT Hubのメニュー内の「IoT Edge」から参照することができます。

IoT Edgeデバイスは通常、複数のセンシングデバイスを搭載しているためそれぞれに対するモジュール管理もここで可能になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/18421c90-31fc-53f5-6ade-ddcc5abd7e36.png)
$付きのモジュールはシステム管理のもので、実際のIoTデバイスとして持っている機能はそれ以外のモジュールになります。

### Azure Percept Studioでの簡単な動作確認

次にAzure Percept Studioを使ってサンプルのモデル等を使って動作確認してみましょう。

#### カメラの確認

カメラの確認についてはストリーミング動画のモジュールを組み込むのが早いと思います。
設定は簡単でAzure Percept Studioを起動し、登録したAzure Percept DKを選択し、上部の「Vision」タブを押すとモジュールの設定画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/4cc17f14-fd82-a075-ef66-1be42ed45e4b.png)

「デバイスストリームの表示」を選ぶと、モジュールのデプロイ処理が実施されます。しばらく待っているとブラウザが開いてカメラのストリーミング動画を見ることができます。
ただし、Azure Percept DKと同一ネットワークでの接続が必要となるため注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/90bfd8de-9dc9-bb9f-3918-81b31c63f07a.png)

#### 音声の確認
音声についても同じようにサンプルモデルを設定することで確認可能です。
音声については大きく2つの設定があります。

* キーワード：スマートスピーカーでもよくある、声かけに使うキーワード
* コマンド：音声コマンドの定義（例えばLUISなどで作ったコマンドリスト）

こちらも幾つかのサンプルがあります。
Azure Percept Studioを起動し、登録したAzure Percept DKを選択し、上部の「音声」タブを押すとモジュールの設定画面が表示されます。
キーワード横の「変更」を押して何か呼びかけるキーワードを設定してください。
次にコマンド横の「変更」を押して「azureperceptDemo-speech」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/3f1482a8-edc3-20d8-e53e-2910695e6134.png)

上記の設定後に「音声アシスタントのテスト」を選択すると以下のようなリビングが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/c50568c4-e3b4-0e4f-9468-7d9e1c0fbe3a.png)

Azure Percept DKの音声デバイスに向かって「Computer turn on the light」と話すと画像内のライトが点灯します。

以上で簡単な動作確認です。
このようにAzure Percept Studio使って簡単に機械学習の導入をIoT Edgeデバイスに取り込めるのは便利ですね。

### テレメトリデータの確認

実際にAzure Percept Dkがどういうデータを送信しているか確認してみましょう。
Azure Percept DKはAzure IoT Hubに向かってデバイスの情報と、分析データを返します。分析データはカメラの場合は、Base64エンコードされたJson形式のデータが送信されます。ですので今回は手っ取り早く、Azure IoT Hubを監視する「Event Grid System Topic」を作成しそこにAzure Functionsを組み込んでFunctionsのログにその情報を出力して確認してみたいと思います。

#### システムトピックとAzure Functionsの設定

Azure Percept DKはAzure IoT Hubと接続されると定期的にテレメトリ情報として分析データを送信します。テレメトリー情報はJson形式で以下の様になっています。


この中のBodyにBase64で情報が入っているのでAzure Functionsでログに出力して中身を確認してみます。

##### Azure Functionsの設定

まずはリソースの追加からAzure Functionsを追加しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/8eafccb5-f874-c208-daba-c00ffb7bef4a.png)
リソースの追加から「関数アプリ」を選択し作成します。今回のサンプルコードはC#なので.NET系で作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/89511f08-56f1-ccbd-4936-e6d285d31ceb.png)
また、ログをチェックするためにApplication Insightsも併せて設定しておきます。

デプロイが完了したら関数を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/ec215ca6-4161-93f5-fcb2-db6dbc94d64d.png)


簡単にチェックするだけなのでポータル上でコードを書けるようにします。

* 開発環境 : ポータルでの開発
* テンプレート : Azure Event Grid Trigger
* 新しい関数 : 任意の名前

関数を作成したらメニューから「コードとテスト」を選択し以下のコードで置き換えます。

```csharp
#r "Microsoft.Azure.EventGrid"
#r "Newtonsoft.Json"
using Microsoft.Azure.EventGrid.Models;
using Newtonsoft.Json.Linq;
using System;
using System.Text;

public static void Run(EventGridEvent eventGridEvent, ILogger log)
{
    string jsonStr = eventGridEvent.Data.ToString();
    JObject jsonObj = JObject.Parse(jsonStr);
    
    log.LogInformation("Classes Data > "+Encoding.UTF8.GetString(Convert.FromBase64String(jsonObj["body"].ToString())));
    
    log.LogInformation("Recieve Data > "+eventGridEvent.Data.ToString());
}
```

以上で関数の定義は完了です。次にAzure IoT Hubのテレメトリー情報を受け取るとこの関数が呼ばれるように設定します。

##### Event Grid System Topicの設定

Azure IoT Hubでの様々なアクションはEvent Gridの仕組みを利用して他のAzureサービスに利用することができます。今回はAzure IoT Hubのテレメトリー情報を受信すると関数が呼び出されるようにシステムトピックを構築したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/b23b399c-37bf-7760-1aa7-c250c02fba64.png)

まずは、Azure IoT Hubを監視するための「Event Grid System Topic」を作成します。Azureポータルからリソースの追加で「Event Grid System Topic」を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/9ee010dc-ec5c-5e65-486d-26d777b526c2.png)


監視するAzureのサービスは上記先ほど利用していたAzure IoT Hubになります。以下の通り設定し任意の名前を付けて作成します。

* Topic Types : Azure IoT Hub Accounts
* Subscription : 利用しているサブスクリプション
* Resource Group : Azure IoT Hubを登録しているリソースグループ
* Resource : Azure Percept を登録したAzure IoT Hub

作成後、先ほど作った関数アプリを割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/d9eb1325-c696-9256-5452-1c95d74805be.png)
作成したEvent Gridを選択し、上部のイベントサブスクリプションの追加を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/0aaebb43-5661-eb2f-ef9d-65f080578971.png)
イベントサブスクリプションの作成ではAzure IoT Hubで発生するイベントをフィルタリングし該当するイベント時にエンドポイントに指定されたAzureのサービスにデータを送信することができます。
今回はセンサーのテレメトリー情報をログに出力するので、フィルターには「Device Telemetry」エンドポイントには先ほど作った関数を指定します。

以上で、定義が終わりです。Azure Percept DKをすでに起動していた状態だとすでにログに情報が出力されているはずです。

#### 確認

ログの確認は先ほど作った関数アプリを選択しログストリームを開くとリアルタイムでログ出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/5d894203-5ba1-8646-ab21-508255a42809.png)

このような形で出てきます。

```
2021-08-11T23:25:58.409 [Information] Executing 'Functions.monitoring' (Reason='EventGrid trigger fired at 2021-08-11T23:25:58.4094517+00:00', Id=b6d2ebfe-a599-436c-9220-66c14119a420)
2021-08-11T23:25:58.411 [Information] Classes Data > {"NEURAL_NETWORK": [{"bbox": [0.401, 0.373, 0.618, 0.698],"label": "teddy bear", "confidence": "0.539062", "timestamp": "1628724357478137999"}]}
2021-08-11T23:25:58.411 [Information] Recieve Data > {"properties": {},"systemProperties": {"correlation-id": "CORE_ID","message-id": "MSG_ID","iothub-connection-device-id": "AzurePerceptDK","iothub-connection-module-id": "azureeyemodule","iothub-connection-auth-method": "{\"scope\":\"module\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","iothub-connection-auth-generation-id": "637640080159713911","iothub-enqueuedtime": "2021-08-11T23:25:57.947Z","iothub-message-source": "Telemetry"},"body": "eyJORVVSQUxfTkVUV09SSyI6IFt7ImJib3giOiBbMC40MDEsIDAuMzczLCAwLjYxOCwgMC42OThdLCJsYWJlbCI6ICJ0ZWRkeSBiZWFyIiwgImNvbmZpZGVuY2UiOiAiMC41MzkwNjIiLCAidGltZXN0YW1wIjogIjE2Mjg3MjQzNTc0NzgxMzc5OTkifV19"}
2021-08-11T23:25:58.411 [Information] Executed 'Functions.monitoring' (Succeeded, Id=b6d2ebfe-a599-436c-9220-66c14119a420, Duration=2ms)
```

わかりにくいのでデータ部分だけ整形します。
実際にカメラモジュールにより画像解析されたデータは以下の様に出力されます。

```json
"NEURAL_NETWORK": [
        {
            "bbox": [
                0.401,
                0.373,
                0.618,
                0.698
            ],
            "label": "teddy bear",
            "confidence": "0.539062",
            "timestamp": "1628724357478137999"
        }
    ]
}
```

典型的な画像認識用の学習モデルで分析した結果の情報と同じものが出力されています（ちなみにXamarinのぬいぐるみなんですがteddy bear認定です）。
bboxは画像上の認識位置のデータですね。Azure Percept DKはIoTエッジデバイスとして位置を固定するので空間上のどのあたりにあるかなどもこの情報があれば推定できるかもしれないですね。

ちなみに全体のJsonデータは以下の通りです。この通りセンサー情報はbodyにありテレメトリ情報はBase64でエンコードされています。

```json
{
    "properties": {},
    "systemProperties": {
        "correlation-id": "CORE_ID",
        "message-id": "MSG_ID",
        "iothub-connection-device-id": "AzurePerceptDK",
        "iothub-connection-module-id": "azureeyemodule",
        "iothub-connection-auth-method": "{\"scope\":\"module\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
        "iothub-connection-auth-generation-id": "637640080159713911",
        "iothub-enqueuedtime": "2021-08-11T23:25:57.947Z",
        "iothub-message-source": "Telemetry"
    },
    "body": "eyJORVVSQUxfTkVUV09SSyI6IFt7ImJib3giOiBbMC40MDEsIDAuMzczLCAwLjYxOCwgMC42OThdLCJsYWJlbCI6ICJ0ZWRkeSBiZWFyIiwgImNvbmZpZGVuY2UiOiAiMC41MzkwNjIiLCAidGltZXN0YW1wIjogIjE2Mjg3MjQzNTc0NzgxMzc5OTkifV19"
}
```

### Power BIで可視化

先日少し面白い記事があったので、せっかくなのでうごかしてみました。

https://thewindowsupdate.com/2021/08/06/detecting-room-occupancy-with-azure-percept/amp/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/d1e891c5-b8e9-8aad-723e-e1161a3af184.png)
詳細は記事に書かれている通りなのですが、Azure Percept で実行した人物検知の処理結果をAzure IoT Hubでテレメトリ情報として受け取りStream Analyticsを通してPower BIで可視化するといったものです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/c3d943be-6343-f1f7-592b-f4f41f782b1e.png)

とても簡単にできます。文字通りノーコードです。

ただし試すには以下の環境が必要になるようなので注意してください。

* PowerBIのライセンスはPremium Per User
* Power BIとAzureは同じテナント



手順は以下の通りです。
1. Power BIにワークスペースを作成する。
1. Azure Percept Dkのカメラ用学習モデルと人物検知に変更
1. Azure IoT Hubにコンシューマーグループを追加
1. Stream Analyticsを追加
1. Power BIに接続

#### 1.Power BIにワークスペースを作成する

今回のAzure PerceptのデータをPower BIするためにワークスペースを作成します。ここには後の作業で行うStream Analyticsからのデータがデータセット/テーブルとして連携されます。

#### 2.Azure Perceptのモデル変更

まずはAzure Percept のモデル変更を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/dd7663d9-33bf-79e4-5c9a-eab27d4bf0c8.png)
[Azure Percept Studio](https://docs.microsoft.com/ja-jp/azure/azure-percept/overview-azure-percept-studio)を開き、デバイスを選択した後にVisionタグから「サンプルモデルのデプロイ」から人物検出を選択してデプロイしましょう。

#### 3.Azure IoT Hubにコンシューマーグループの追加

次にAzure IoT Hubを他サービスで活用するためにコンシューマグループを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/fe741702-8129-1577-2531-cddbefa58b96.png)

Azure Percept が登録されているAzure IoT Hubの「組み込みのエンドポイント」を選択し、その中にあるコンシューマーグループに任意のグループを追加します。

#### 4.Stream Analyticsを追加

次に「Stream Analytics Job」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/49bcb65f-424c-cbf9-ab40-241a60d6d3f7.png)
リソースの追加から選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/a42f7e17-5c50-3625-a9f7-23a472c5b5a5.png)
任意の名前で作成します。

Stream Analytics Jobの追加が完了したら設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/6c4d380e-06ae-32ff-4538-98c0eb4fbb64.png)

「入力」-「ストリーム入力の追加」-「IoT Hub」を選択し、接続先のAzure IoT Hubの情報を設定します。
コンシューマーグループは先ほど追加したものを、共有アクセスポリシーは「service」に設定し以下はそのままで保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/715b6eea-414d-3edf-02bc-c37210524f33.png)

次に「出力」-「追加」-「Power BI」を選択します。この時点でAzureにログインしているユーザがPower BIのしかるべきライセンスでワークスペースを持っていると自動的にコンボボックスにリストが表示されます。必要な情報を連携して保存します。

最後に入力からの情報を処理し出力側に伝えるためのクエリ文を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/20d42e7d-40e1-ce31-3b4b-b81f74930721.png)

Stream Analyticsの「概要」を選択するとページ内にクエリの編集リンクをクリックして以下のSQL文を入力します。

```sql
SELECT
 NEURAL_NETWORK AS Detections,
 GetArrayLength (NEURAL_NETWORK) AS PersonCount,
 EventProcessedUtcTime AS Time
INTO
 [出力で定義したエリアス名] 
FROM
 [入力で定義したエリアス名]
WHERE
 NEURAL_NETWORK IS NOT NULL AND
 GetArrayLength (NEURAL_NETWORK) > 0
```

以上で、設定は完了です。最後に実際に動かしてみましょう。

#### 4.Power BIで確認

Azure Perceptを起動した状態で、Stream Analyticsを開始します。その状態で暫くカメラの前をうろうろするとカメラがとらえた人物の情報がAzure IoT Hubに送信され、その情報をStream Analyticsが解析し人が写っている場合はその人数をカウントしPower BIの指定のワークスペースにデータを格納します。1分ほど動かしたらデータはそれなりにとれていると思うのでStream Analyticsは一旦止めておきましょう。

次にPowerBIにログインし先ほど設定したワークスペースを選択するとStream Analyticsで定義したデータセットやテーブルが追加されます。
後は好きな形式でグラフ化してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/c3d943be-6343-f1f7-592b-f4f41f782b1e.png)

現状、未対応ですが将来的にはStream Analyticsからのリアルタイム同期もサポートされるようなのでPower BIをUIにして情報分析といったことも可能になりそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/a4b5198f-2590-7d61-e0c6-ca76cf66ff20.png)

## まとめ

今回はAzure Percept DK周りについて色々と概要を整理してみました。かなり完成度が高いソリューションだと思います。学習もモデルもAzure Cognitive Serviceで容易にカスタマイズできますし、Tensorflowといった完全にオリジナルで学習モデルを構築しIoTエッジデバイスとしての稼働も可能になっています。
先日のBuildでも公開されていましたが、Azure Digital Twins等のテクノロジーで情報を分析し、でHoloLens 2での情報を活用するといったシナリオの開発もシミュレーションデータではなく、実際のデータをセンシングして実践可能になります。興味深いデバイスなので機会があればぜひ体験してみてください。

https://qiita.com/miyaura/items/dcd76fc796d8974fd099

https://qiita.com/miyaura/items/14812caf737afd48a460


## 参照リンク

* Azure サービス
    * [Azure Stream Analytics のドキュメント(docs.microsoft.com)](https://docs.microsoft.com/ja-jp/azure/stream-analytics/?WT.mc_id=MR-MVP-5003104)
    * [Azure Percept のドキュメント(docs.microsoft.com)](https://docs.microsoft.com/ja-jp/azure/azure-percept/?WT.mc_id=MR-MVP-5003104)
    * [Azure IoT Hub のドキュメント(docs.microsoft.com)](https://docs.microsoft.com/ja-jp/azure/iot-hub/?WT.mc_id=MR-MVP-5003104)
    * [Azure Functionsのドキュメント(docs.microsoft.com)](https://docs.microsoft.com/ja-jp/azure/azure-functions/?WT.mc_id=MR-MVP-5003104)
    * [Azure Event Grid のドキュメントのドキュメント(docs.microsoft.com)](https://docs.microsoft.com/ja-jp/azure/event-grid/?WT.mc_id=MR-MVP-5003104)
* 関連しそうな機械学習系
    * [Language Understanding (LUIS) のドキュメント(docs.microsoft.com)](https://docs.microsoft.com/ja-jp/azure/cognitive-services/luis/?WT.mc_id=MR-MVP-5003104)
    * [Custom Vision とは - Azure Cognitive Services(docs.microsoft.com)](https://docs.microsoft.com/ja-jp/azure/cognitive-services/custom-vision-service/overview?WT.mc_id=MR-MVP-5003104)
    * [Speech Service のドキュメント(docs.microsoft.com)](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/?WT.mc_id=MR-MVP-5003104)
* ツール関連
    * [Azure Percept Studio の概要(docs.microsoft.com)](https://docs.microsoft.com/ja-jp/azure/azure-percept/overview-azure-percept-studio?WT.mc_id=MR-MVP-5003104)
    * [Speech Studio の概要 - 音声サービス - Azure Cognitive Services(docs.microsoft.com)](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/speech-studio-overview?WT.mc_id=MR-MVP-5003104)