Azure Perceptで物体検知後メール発報するには

# Azure Perceptとは？
Azure Perceptとは，マイクロソフトが発表したエッジAIの包括的なプラットフォームの名称です。Azure Perceptの詳細は，[マイクロソフトのサイト](https://azure.microsoft.com/ja-jp/services/azure-percept/)や[こちらのドキュメント](https://docs.microsoft.com/ja-jp/azure/azure-percept/overview-azure-percept)をご参照ください。
IoTを活用したAIソリューションを構築する際，「まずはPoCをササッと始めたいけど，IoTのエッジデバイスは何を使えば良いのだろうか？」や，「クラウド側で作成したAIモデルをエッジデバイスにデプロイするのは大変だなぁ...」といった課題は，Azure Perceptを使用すると解決できます。Azure Perceptでは，[開発者キット](https://docs.microsoft.com/ja-jp/azure/azure-percept/overview-azure-percept-dk)が提供されるため，PoC用途でどのエッジデバイスを使用するか悩まれている場合は，開発者キットを用いてお手軽にエッジAIのソリューションを構築できます。また，簡単な物体・人物検出を行うAIモデルであれば，コーディングなしで[4ステップ](https://docs.microsoft.com/ja-jp/azure/azure-percept/tutorial-nocode-vision)でできてしまいます。

このように導入が簡単なAzure Perceptなのですが，Azure Perceptで検出した物体・人物のテレメトリをどのようにMicrosoft Azure側でテレメトリを処理するのかという点では，残念ながら2021年7月末時点ではマイクロソフトの公開ドキュメントに記載はありません。そこで本記事では，人物の検知を参考にAzure Perceptの画像認識結果を基にメール発報する構成をご紹介しようと思います。

![Overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/c08d39e1-6f3f-0f80-601d-80b345571955.png)


# Azure Perceptのセットアップ
まずはAzure Perceptをセットアップする必要があります。セットアップ自体はマイクロソフトのサイトに詳しく書かれていますので，Azure Percept 開発者キットを取得された後は，[箱から取り出し](https://docs.microsoft.com/ja-jp/azure/azure-percept/quickstart-percept-dk-unboxing)，[こちらのサイト](https://docs.microsoft.com/ja-jp/azure/azure-percept/quickstart-percept-dk-set-up)を基に，Azure Perceptをセットアップしてください。

# Azure Percept 開発者キットにStreamFPSを追加設定
本来であれば，この手順は不要かと思いますが，Azure PerceptのFPSの値を変更しないと，私の環境では後ほどご紹介するSQL Databaseのところでテレメトリが書き込めないというエラーが発生してしまいました。また，StreamFPSの値を設定することにより，Azure Percept開発者キットのビデオストリームも安定的に動作しますので，下記方法でぜひ設定してみてください。

1. Azure Percept開発者キットの電源を入れ，インターネットに接続します。
2. [Azure ポータル](https://azure.microsoft.com/ja-jp/)にログインします。
3. Azure ポータルの上の方に「リソース、サービス、ドキュメントの検索(G+/)」という項目があると思いますので，そこにAzure Perceptと入力します。すると[Azure Percept Studio]というアイコンがサービスの項目にリストされますので，[Azure Percept Studio]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/84b1a4c3-8895-843a-002a-bb522f4dfef8.png)
4. Azure Percept Studioの左側にある[デバイス]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/9671fac3-aad3-547d-776a-837f915aa53f.png)
5. 対象のAzure Percept 開発者キットをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/2e88975a-3fc8-8e69-5ed7-b8695801cba9.png)
6. [デバイスをIoT Hubで開く]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/942d36c6-678d-4519-c6e7-414908af8d26.png)
7. [azureeymodule]モジュールをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/4bc10e01-1050-27f9-aee4-68355bc9f166.png)
8. [モジュールIDツイン]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/212ee647-e9ce-c0b4-fa56-2173fbba3379.png)
9. Properties.desired内に，"StreamFPS": 10, という記載を下記要領で追記します。追記後，上部にある[保存]アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/c8fc1edc-68b1-40fa-47d7-ed26325e3ba6.png)

これで，Azure Percept開発者キットのビデオストリームが安定的に動作します。

# Azure Perceptが送信するテレメトリを確認
Azure PerceptのテレメトリをStorageやSQL Databaseに保管する際，事前にAzure Perceptが送信するテレメトリを確認し，どのような形式で各サービスに保管するか考えておく必要があります。そこでまずはAzure Perceptがどのようなテレメトリを送信しているのか，確認してみましょう。

1. Azure Percept開発者キットの電源を入れ，インターネットに接続します。
2. [Azure ポータル](https://azure.microsoft.com/ja-jp/)にログインします。
3. Azure Percept Studioを開き，[デモとチュートリアル]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/e4fd1cdf-ecf7-33ca-c447-d519f9e0f23b.png)
4. [Visionモデルのサンプルを試す]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/96155e67-3740-963d-b3a7-d145ae7b53d3.png)
5. ご利用中のIoT ハブ，デバイス(Azure Percept開発者キット)を指定し，[一般的なオブジェクトの検出]を選択後，[デバイスへのデプロイ]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/5cf5e441-e7ae-c71b-d52a-2e675dcdd58a.png)
6. [デバイス]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/7b676ca4-0f6f-edc5-7893-4355562e9991.png)
7. 対象のAzure Percept 開発者キットをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/2e88975a-3fc8-8e69-5ed7-b8695801cba9.png)
8. [ライブテレメトリの表示]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/ff5aefad-1675-a146-8303-7d48dd790026.png)
9. 何も検知していない時は，Azure PerceptはIoT Hubに対して下記の様なテレメトリを送っていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/784611ef-d5b6-bff2-0fc4-de1722433e48.png)
10. Eyeモジュール(Azure Perceptのカメラ)の前で手をかざしてみると，恐らく下記の様な"Person"として認識するかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/d60140f7-b08e-4f92-863e-8bc98321015f.png)

ここまでで，Azure Perceptが認識した人物のテレメトリがIoT Hubに送信されていることが分かります。

# Service Bus，Stream Analytics，Logic Appsの準備
私が解説するよりも[このサイト](
https://qiita.com/mstakaha1113/items/1c9b8f61452147a87640#%E3%82%B7%E3%83%8A%E3%83%AA%E3%82%AA%EF%BC%92%E3%83%86%E3%83%AC%E3%83%A1%E3%83%88%E3%83%AA%E3%83%BC%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%A8%88%E6%B8%AC%E3%81%97%E3%81%A6%E7%95%B0%E5%B8%B8%E3%82%92%E6%A4%9C%E7%9F%A5%E3%81%97%E3%81%9F%E6%99%82%E3%81%AF%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%80%81%E4%BF%A1%E3%81%97%E3%81%BE%E3%81%99)に丁寧な記載がありますので，こちらをご参照ください。
ただ，私の場合はStream Analyticsのクエリを以下のように書き換えました。

```sql
WITH
ReadQuery AS (
    SELECT
        Getarrayelement(input.NEURAL_NETWORK,0) AS array0,
        input.EventEnqueuedUtcTime AS recognitionTime
    FROM
        input
),
DivideQuery AS (
    SELECT
        array0.label AS label0,
        array0.confidence AS confidence0,
        recognitionTime
    FROM
        ReadQuery
    WHERE array0.label IS NOT NULL
)

SELECT
    label0, confidence0, recognitionTime
INTO
    queueoutput
FROM
    DivideQuery
WHERE TRY_CAST(confidence0 AS float) > 0.5
```
ここではConfidenceの値が0.5以上の場合のみ，Service Busに必要な情報のみ送信するクエリを書いています。また，今回は"Person"というラベル名でAzure Perceptからテレメトリが送られてくる前提ですが，もし気になる方は条件にラベル名がPersonの時だけテレメトリを送信するという条件を追記しても良いかもしれません。また，WITHの使い方が分からない場合は，[こちらのサイト](https://docs.microsoft.com/ja-jp/stream-analytics-query/with-azure-stream-analytics)も合わせてご参照ください。

また，inputではAzure Perceptをデプロイする際に生成されたIoT Hub，queueoutputには今回作成したService Busを指定しています。

# Stream Analyticsの実行
作成したStream Analyticsの[概要] -> [開始]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492296/23dcc170-ab44-c9fd-836d-8550b290521e.png)

クエリに問題なければ正常に実行され，Stream Analytics -> Service Bus -> Logic Apps経由でメール通報されます。