AWS DeepLensを使ってみた！

## この記事の目的
AWS DeepLensを触ってみたので、開封から[開発者ガイド](https://docs.aws.amazon.com/ja_jp/deeplens/latest/dg/deeplens-getting-started.html)に従いDeepLensでアプリケーションを実行するまでの流れを書いてみます。全体の流れは、公式サイトに記載の通り以下の流れになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/5d41530d-d96b-f343-8088-1cee995f812a.png)

- AWS DeepLens の電源をオンにすると、動画ストリームがキャプチャされます。
- AWS DeepLens は、2 つの出力ストリームを生成します。
    - デバイスストリーム—処理されずに渡される動画ストリーム。
    - プロジェクトストリーム — モデルによる動画フレームの処理結果
- Lambda 推論関数は未処理の動画フレームを受け取ります。
- Lambda 推論関数からプロジェクトのディープラーニングモデルに未処理のフレームが渡されて処理されます。
- Lambda 推論関数は、モデルから処理済みのフレームを受け取ってプロジェクトストリームに渡します。

## 開発環境、必要なもの
- AWSアカウント
- DeepLens（自分の場合はHW v1.1でした）

## セットアップ
### AWS DeepLens
中はこんな感じ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/bae66064-54fe-bd54-779f-76cf45e28000.jpeg" height="200"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/ab3b6629-ec48-9dca-88fe-21cb23f56388.jpeg" height="200"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/a6b66482-c7e2-a5b2-e925-955330999d63.jpeg" height="200">
Hardwareの技術仕様は[開発者ガイド](https://docs.aws.amazon.com/ja_jp/deeplens/latest/dg/deeplens-hardware.html)をご確認ください。

### 開発環境のセットアップ
- AWSアカウント、IAMユーザーを作成します。
- IAMロールについては、事前に作成しなくても、AWS DeepLensコンソールを操作する中で自動的に作成されるので、事前に作成はしませんでした。

## AWS DeepLensでアプリケーションの実行

### AWS DeepLensデバイスの登録
DeepLensでアプリケーションを実行するには、事前にデバイスをAWSに登録し、その後にプロジェクト(アプリケーション)をデバイスと紐付けるという手順のため、まず、DeepLensデバイスをAWSに登録します。

- AWSコンソールで、DeepLensサービスを開き、`デバイスの登録`から、説明に従い、デバイスの登録を進めます。
- 自分の場合は、デバイスの検出のところでデバイスがなかなか検出されずにつまづきましたが、DeepLens底面に記載されているSSIDにWiFi接続する[[参考]](https://forums.aws.amazon.com/thread.jspa?threadID=268493)と、なぜか検出され、登録が完了できました;;
- 補足
    - デバイス登録の最後に、IAMロールの追加を求めるチェックボックスがあり、このタイミングでDeepLensサービスで必要なIAMロールは追加されていました。

### プロジェクトの作成とデプロイ
AWS DeepLensのプロジェクトは、ディープラーニングモデルと入力イメージを処理するLambda関数で構成されます。
プロジェクトタイプとして、事前設定されたプロジェクトの利用と、空のプロジェクトの２種類選択できるのですが、まずは動作確認として、サンプルプロジェクトを試してみます。

- サンプルプロジェクトでは、以下の８つが選択可能でした。
    - 物体検出
    - 画風変換
    - 顔検知
    - ホットドッグ認識
    - 猫/犬認識
    - 行動認識
    - 頭部姿勢検知
    - 鳥の分類 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/6deca673-ae23-ac23-7900-f7090444336c.png)


### サンプルプロジェクト：物体検出
まずはプロジェクトを作成します。

- プロジェクトテンプレートは、`物体検出`を選択しました。物体検出の画像データセットとして、Pascal VOCデータセットを利用しているみたいです。テンプレートを利用すると、数クリックでプロジェクトを作成できるので、かなり楽にプロジェクトが作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/ad398acc-c466-f83f-ff79-6218bdd83369.png)

次に、デバイスへデプロイします。

- プロジェクト画面で、プロジェクトを選択し、デバイスへのデプロイを選択すると、デバイス一覧が表示されるので、デプロイしたいデバイスを選択して、デプロイボタンを押すと、デプロイが実行されます。
- ２〜３分待つと、プロジェクトのデプロイが完了していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/558772b8-bb3a-7d7c-db6e-9bf8699937e9.png)

- デプロイが完了すると、同じRegionにLambdaが3つ作成されていました。上の二つがDeepLensの管理系のLambda、一番したのLambdaが推論処理をしているLambdaでした。Greengrassを使ってLambdaをDeepLensにデプロイして処理しているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/e7acc9b6-b9a4-65c5-2012-941c1bbf097f.png)


最後に、プロジェクトの実行結果を確認してみようと思います。

- ブラウザで映像を確認するには、ブラウザに証明書を設定する必要があります。その後、ローカルIPでブラウザに接続すると、↓のように画像が確認できます。うまくbottleと認識されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128594/ff847270-80bb-fbf1-4aa1-a17af825d772.png)

- 認識結果をAWS IoTのMQTTクライアントでも確認することができます。下記のように、認識結果が確認できました。

```
{
  "sofa": 0.41943359375,
  "chair": 0.388427734375,
  "tvmonitor": 0.30517578125
}
```

## 終わりに
- 大体30分くらいはかかりましたが、割と簡単にサンプルは実行できました。
- 推論処理にかかる時間も意外に早くて、200msecくらいかなと。
- 今回は、サンプルテンプレートの実行だけだったので、次はカスタムプロジェクトで実施してみたいと思います。

## 参考記事
- https://aws.amazon.com/jp/deeplens/
- https://docs.aws.amazon.com/ja_jp/deeplens/latest/dg/what-is-deeplens.html