Jetson Nano と AWS IoT サービスで 一家団欒の時間を作ろう

2020-09-01
日常生活で楽しむクラウドテクノロジー

Author : 渡邉 聡

こんにちは、ソリューションアーキテクトの渡邉です。上の娘が今年から高校生になり、日々の成長に喜びを感じる一方で徐々に顔を合わせる時間も少なくなってきていることに危機感を感じ始めてきている今日此の頃です。下の娘はまだ私とじゃれ合ってくれますが上の娘のようになっていくのも時間の問題です。

そこで今回は一家団欒の時間を IT の技術を使ってなんとか解決していきたいなと思います。具体的には部屋の利用人数をカウントして規定人数以上であった場合に通知を上げるという仕組みを作ることで私以外の家族がそろったタイミングを素早く察知していきたいと思います。エッジデバイスとしてはお手軽に機械学習を始めることができる Jetson Nano 開発者キットを使って作ってみることにしました。また、機械学習推論を行う上で重要なパーツとなる機械学習モデルに関しても事前学習済みモデルを使うことでお手軽にシステムを作成したいと考えています。

実際にお試しいただくために、作成したソースコードも下記に置いておきました。

サンプルコードはこちら »

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

builders.flash メールメンバーへの登録・特典の入手はこちら »

*ハンズオン記事およびソースコードにおける免責事項 »


1. 利用するデバイス

この記事で作ったものは以下のデバイスを利用しています。 

  • NVIDIA Jetson Nano
    • 安定動作のために 5V/4A の AC アダプタも用意
    • AC アダプタ利用設定のためのジャンパピンも用意
    • 32GB MicroSD カード

  • USB カメラ
    • 部屋全体を撮影できるようワイド撮影できるものを準備

2. 利用する AWS のサービス

今回の仕組み全体を作成するにあたり利用したサービスは以下のものになります。

  • AWS IoT Greengrass
  • AWS Lambda (Greengrass にデプロイする Lambda 関数の作成に利用)
  • AWS IoT Core
  • AWS IoT Events
  • AWS IoT Analytics
  • Amazon QuickSight

これらのサービスについてはこの後セットアップしながら説明していきますが、より詳しく知りたい場合は、「詳しくはこちらを」から各種サービスの特徴ページをご覧ください。

AWS IoT Greengrass

AWS IoT Greengrass では、AWS をエッジデバイスにシームレスに拡張します。AWS IoT Greengrass を使用すると、接続されたデバイスで AWS Lambda 関数を実行し、機械学習モデルに基づいて予測を実行し、デバイスデータを常に同期させ、他のデバイスと安全に通信できます。

詳しくはこちら »

AWS Lambda

AWS Lambda はイベント発生時にお客様のコードを実行し、基盤となるコンピューティングリソースをお客様に代わって管理する、サーバーレスコンピューティングサービスです。

詳しくはこちら »

AWS IoT Core

AWS IoT Core は、インターネットに接続されたデバイスから、クラウドアプリケーションやその他のデバイスに簡単かつ安全に通信するためのマネージド型クラウドサービスです。

詳しくはこちら »

AWS IoT Events

AWS IoT Events は、IoT センサーやアプリケーションで発生したイベントを容易に検出し対応できるようにする、完全マネージド型の IoT サービスです。

詳しくはこちら »

AWS IoT Analytics

AWS IoT Analytics は、膨大な量の IoT データの高度な分析を簡単に実行および操作できる完全マネージド型サービスです。

詳しくはこちら »

Amazon QuickSight

Amazon QuickSight は、クラウド駆動の高速なビジネスインテリジェンスサービスです。組織のすべてのユーザーにインサイトを提供します。

詳しくはこちら »


3. 全体のアーキテクチャ

今回のシステムのアーキテクチャは以下のようになります。 

architecture

エッジ側で映像に映った人物のカウントには Gluon が公開しているコンピュータービジョンのツールキットである GluonCV を使い、物体検出に機械学習のフレームワークとして MXNet を利用しました。1 分毎にカメラに映った人数をカウントし、人数と検知した時間を JSON ドキュメントととして AWS IoT Core に送信するようにしています。

AWS IoT Core に到達したデータは IoT Core のルールエンジンによって、人が集まったタイミングに通知を行う目的と、デバイス動作の確認を行う目的で、AWS IoT Events にデータを転送しています。

また、データの可視化と分析にあたり、AWS IoT Analytics にデータを送信し蓄積を行い、BI 分析用にデータを加工し、QuickSight で BI ダッシュボードを作成してみました。

では、早速作ってみたいと思います。


4. Jetson Nano で人物検出できるようにデバイスをセットアップする

4-1. AC アダプタから給電するようにする

Jetson Nano で AC アダプタから給電して使用するために J45 のジャンパーをショートさせる必要があるので、ジャンパピンを取り付けショートさせました。これで、フルパワーで安定して Jetson Nano を利用できます。

img_iot-greengrass-family_02

4-2. OS イメージを SD カードに書き込む

公式サイトから Jetson Nano の最新の SD カードイメージをダウンロードして用意した MicroSD カードに書き込みます。今回使用した JetPack のバージョンは 4.4 となります。

この後導入する機械学習フレームワークで GPU を使った推論を行っていく上で、モジュール類のバージョンが一致している必要があるので、同様の手順をお試しする場合には、JetPack のバージョンを確認した上で SD イメージを作成してください。

4-3. SWAP 領域を増やす

Jetson Nano は搭載メモリが 4 GB となり、処理によってはメモリ不足となり、OS が落ちてしまったりするので、SWAP 領域を拡張します。以下の実行で簡単に 6 GB の SWAP 領域を設定できます。

$ git clone https://github.com/JetsonHacksNano/installSwapfile
$ cd installSwapfile
$ ./installSwapfile.sh

4-4. MXNet 及び GluonCV のセットアップ

GluonCV の公式ページにある、NVIDIA Jetson で Object Detection モデルを動かす手順がかかれたこちらのページの手順を参考に MXNet および GluonCV をインストールします。

すべてのセットアップが完了したら、ページの最後にある、サンプルを動かし動作を確認します。

 

4-5. 接続した USB カメラの有効な解像度を調べる

v4l2-ctl をインストールします。 

$ sudo apt-get install v4l-utils

以下のコマンドでデバイス (/dev/video0) がサポートするフォーマットと解像度、フレームレートを確認できます。

$ v4l2-ctl -d /dev/video0 --list-formats-ext

私が持っていた USB カメラでは下記のような情報を得られました。

ioctl: VIDIOC_ENUM_FMT
	Index       : 0
	Type        : Video Capture
	Pixel Format: 'MJPG' (compressed)
	Name        : Motion-JPEG
		Size: Discrete 1920x1080
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 1280x960
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 1280x720
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 800x600
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 640x480
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)

                     ....省略...

処理の負荷を考えて、低解像度でありながらもワイドで扱えそうな 1280x720 あたりが使えそうです。

4-6. AWS IoT Greengrassのセットアップ

エッジ側で機械学習推論を行って結果をクラウド側と連携する上で、今回は AWS IoT Greengrass に機械学習推論する Lambda 関数をデプロイして動かして行こうと思います。

それでは、以下の手順で GreengrassをJetson Nano にセットアップしていきます。

4-6-1. Greengrass 用の user、group の作成

以下のコマンドで user、group を作成します。

$ sudo adduser --system ggc_user
$ sudo groupadd --system ggc_group

4-6-2. Python 3.7

今回セットアップした Jetson Nano には予め Python 3.6.9 が導入されていますが、現在の AWS IoT Greengrass では、Python 3.7 である必要があります。今回はこちらにある通り、Python 3.7 から Python 3.6 に対してシンボリックリンクを貼ることで対応することとしました。

$ sudo ln -s /usr/bin/python3.6 /usr/bin/python3.7

4-6-3. 環境のチェック

環境チェック用のスクリプトをダウンロードして、展開をしていきます。 

$ wget https://github.com/aws-samples/aws-greengrass-samples/raw/master/greengrass-dependency-checker-GGCv1.10.x.zip
$ unzip greengrass-dependency-checker-GGCv1.10.x.zip

スクリプトの展開ができたら、実行します。

$ cd greengrass-dependency-checker-GGCv1.10.x/
$ sudo ./check_ggc_dependencies
==========================Checking script dependencies==============================
The device has all commands required for the script to run.

========================Dependency check report for GGC v1.10.x=========================
System configuration:
Kernel architecture: aarch64
Init process: /lib/systemd/systemd
Kernel version: 4.9.140
C library: Ubuntu GLIBC 2.27-3ubuntu1.2
C library version: 2.27
Directory /var/run: Present
/dev/stdin: Found
/dev/stdout: Found
/dev/stderr: Found
----------------------------Commands and software packages--------------------------
Python 2.7 version: 2.7.17
Python 3.7 version: 3.6.9
NodeJS 12.x: Not found
Java 8: Not found
                                  ...省略...

------------------------------------Results-----------------------------------------
Note:
1. It looks like the kernel uses 'systemd' as the init process. Be sure to set the
'useSystemd' field in the file 'config.json' to 'yes' when configuring Greengrass core.

Missing optional dependencies:
1. Could not find the binary 'nodejs12.x'.

If NodeJS 12.x or later is installed on the device, name the binary 'nodejs12.x' and
add its parent directory to the PATH environment variable. NodeJS 12.x or later is
required to execute NodeJS lambdas on Greengrass core.

2. Could not find the binary 'java8'.

If Java 8 or later is installed on the device name the binary 'java8' and add its
parent directory to the PATH environment variable. Java 8 or later is required to
execute Java lambdas as well as stream management features on Greengrass core.

Supported lambda isolation modes:
No Container: Supported
Greengrass Container: Supported

----------------------------------Exit status---------------------------------------
You can now proceed to installing the Greengrass core 1.10.x software on the device.
Please reach out to the AWS Greengrass support if issues arise.

エラーが出ていないことを確認します。Python 3.7 version が 3.6.9となっていますが、今回はこちらは意図通りなので問題ありません。また、node.js や java8 が入っていないと警告が表示されていますが、今回は使用しませんのでこちらも問題ありません。

動作可能なことがわかったのでセットアップを進めていきます。

4-6-4. Greengrass グループの作成とソフトウェアのダウンロード

Greeengrass のコンソールを開き Greengrass グループの作成を行い Geeegrass Core ソフトウェアのダウンロード、設定ファイルのダウンロードを行い Jetson Nano に対して設定していきます。

※設定ファイルや Greengrass Core ソフトウェアのダウンロードも行うので、Jetson Nano 上のブラウザで作業すると効率的です。

左のメニューの Greengrass セクションから イントロダクション を選択し、グループの作成 をクリックします。

img_iot-greengrass-family_03
img_iot-greengrass-family_03

クリックすると拡大します

デフォルト作成を使用 をクリックします。

img_iot-greengrass-family_04
img_iot-greengrass-family_04

クリックすると拡大します

任意のグループ名を入力し、次へ をクリックします。

img_iot-greengrass-family_05
img_iot-greengrass-family_05

クリックすると拡大します

規定で入力されている Core 機能の名前で良ければそのままで 次へ をクリックして進みます

img_iot-greengrass-family_06
img_iot-greengrass-family_06

クリックすると拡大します

Coreのセキュリティリソースをダウンロードします。 

img_iot-greengrass-family_08
img_iot-greengrass-family_08

クリックすると拡大します

プラットフォームの選択 をクリックして Greengrass の Core ソフトウェアダウンロードページを開きます。

img_iot-greengrass-family_09
img_iot-greengrass-family_09

クリックすると拡大します

今回は Jetson Nano が対象なので、Armv8 (AArch64) の Arch Linux 用のインストールイメージをダウンロードします。

img_iot-greengrass-family_10
img_iot-greengrass-family_10

クリックすると拡大します

ダウンロードが終わったら、元のコンソールに戻って 完了 ボタンを押してグループの作成を完了します。

img_iot-greengrass-family_11
img_iot-greengrass-family_11

クリックすると拡大します

ダウンロードした Greengrass Core ソフトウェアと、セキュリティリソースを以下のコマンドで展開します。

※ 上記までの作業を Jetson Nano 上で行っていない場合はファイルを Jetson Nano に転送してください。

$ sudo tar zxvf greengrass-linux-aarch64-1.10.2.tar.gz -C /
$ sudo tar zxvf xxxxxxxxxx-setup.tar.gz -C /greengrass/

合わせて以下のコマンドで Amazon Root CA1 証明書をダウンロードして配置します。 

$ sudo wget https://www.amazontrust.com/repository/AmazonRootCA1.pem -O /greengrass/certs/root.ca.pem

4-6-5. 設定の変更

Greengrass 上で動作する Lambda 関数は、デフォルトでは作成した ggc_user、かつコンテナ上で動作する動きとなりますが、実行権限を操作したり、コンテナではなくホスト上で直接動作させることもできます。ホスト上で直接動作させることによりデバイスリソースの制限や構成を行うことなく、デバイスの GPU やカメラにアクセスできるようになります。

今回は Lambda 関数をホスト上で直接動作させ、加えて今回利用するライブラリやリソースアクセスの関係から Lambda 関数を root 権限で動作させていきたいと思います。デフォルトでは root 権限での Lambda 実行は許可されていないので、以下の設定を Greengrass の設定ファイル (/greengrass/config/config.json) に追加することで Lambda 関数を root 権限で実行させることができます。
ただし、通常はドキュメントにも書かれている通り、やむをえない場合を除き root として実行するのは避けるよう考慮ください。

{
  ...
  "runtime" : {
    ...
    "allowFunctionsToRunAsRoot" : "yes"
  },
  ....
}

4-6-6. Greengrass の起動確認

以下のコマンドを実行して Greengrass が正しく起動するか確認します。 

$ sudo /greengrass/ggc/core/greengrassd start
Setting up greengrass daemon
Validating hardlink/softlink protection
Waiting for up to 1m10s for Daemon to start

Greengrass successfully started with PID: 20813

起動成功のメッセージが出れば Greengrass のインストールは完了です。 


4-7. Jetson Nano の設置と USB カメラの位置を調整

リビングにいる人数をカウントしたいと思いますので、リビング全体を見回せる位置として TV の位置が丁度良さそうでしたのでここに USB カメラを設置しました。カメラ位置を確認する上でも一度画面に出してみる必要があるため、TV をディスプレイ代わりに使います。TV 上部に USB カメラを設置し、TV と Jetson Nano を HDMI で接続し電源を入れます。

用意したサンプルプログラムを用いてカメラの撮影範囲を確認し調整します。

$ ./camera_check.py --camera=/dev/video0 --width=1280 --height=720
img_iot-greengrass-family_13

TVに映った映像を元にカメラの調整を行います。設定が終わったら、表示されている映像にカーソルをあわせて`q`ボタンを押すとプログラムは終了します。 

4-8. GUI から CUI への変更

ここまでセットアップが完了したら Jetson Nano の GUI 環境を無効にしてメモリ領域を空けようと思います。

$ sudo systemctl set-default multi-user.target
$ sudo reboot

これで、GUI ログインから CUI に変更されてメモリの空きも増えました。
ちなみに、GUI ログインに戻すには以下のコマンドを実行します。

sudo systemctl set-default graphical.target

4-9. 推論 Lambda 関数のデプロイ

Greengrass 上で動作する Lambda 関数は指定した事前学習済みモデルを読み込み、そこから人だけを検出するようにモデルをリセットしています。

そのモデルを使って設定したサイクルで接続されたカメラから画像を取得し、推論を実行しています。推論結果から検出できた人の数と検出した時間、検出速度 (デバッグ用途) を JSON ドキュメントに埋めて指定した Topic に対して Publish しています。設定値などはデフォルト値で問題なく動作するうようにしていますが、環境変数でも変更できるようにしているので、必要に応じて変更してみてください。下記にソースコードの抜粋を載せていますが、処理の詳細はソースコードをご確認ください。

# ビデオキャプチャデバイスを作成
cap = cv2.VideoCapture(GST_STR, cv2.CAP_GSTREAMER)

# 事前学習済みモデルを読み込み、人物だけ検知できるようにclassをリセット
net = gcv.model_zoo.get_model('ssd_512_mobilenet1.0_voc', pretrained=True, ctx=ctx)
net.reset_class(classes=['person'], reuse_weights=['person'])

def predict():
	# USBカメラから画像を読み込み
    ret, frame = cap.read()
    if ret == False:
		# エラーをPublish
        client.publish(topic=ERROR_TOPIC, qos=0, payload=json.dumps({'error': 'capture read error'}))
    else:
		# 推論に向けて画像を変換
        frame = mx.nd.array(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)).astype('uint8')
        rgb_nd, _ = gcv.data.transforms.presets.ssd.transform_test(frame, short=512, max_size=700)
        rgb_nd = rgb_nd.as_in_context(ctx)

		# 推論
        predict_start = time.time()
        _, scores, _ = net(rgb_nd)
        predict_sec = time.time() - predict_start

		# 推論結果をPublish
        persons = np.count_nonzero(scores.asnumpy() > PREDICT_THRESHOLD, axis=1)[0][0]
        result = {'persons': int(persons), 'timestamp': int(time.time()), 'predict_sec': predict_sec}
        client.publish(topic=TOPIC, qos=0, payload=json.dumps(result))

	# タイマーを作成して指定時間後に改めてpredict関数を呼び出す
    Timer(PREDICT_INTERVAL, predict).start()

4-9-1. Lambda 関数の作成

Lambda コンソールを表示して関数の作成を選択します。

img_iot-greengrass-family_14
img_iot-greengrass-family_14

クリックすると拡大します

一から作成 を選択し、任意の関数名を入力し、ランタイムを Python3.7 を選択して関数の作成をクリックします。

img_iot-greengrass-family_15
img_iot-greengrass-family_15

クリックすると拡大します

関数コードセクションのアクションで、.zip ファイルをアップロードするとしてサンプルとしてダウンロードした prediction_lambda.zip をアップロードします。

img_iot-greengrass-family_16
img_iot-greengrass-family_16

クリックすると拡大します

関数が展開されます。 

img_iot-greengrass-family_17
img_iot-greengrass-family_17

クリックすると拡大します

画面の Top にあるアクションから 新しいバージョン を発行を選択し、バージョン番号を割り当てます。

img_iot-greengrass-family_18
img_iot-greengrass-family_18

クリックすると拡大します

4-9-2. Greengrass で Lambda 関数の設定

作成した Lambda 関数を Greengrass 上へデプロイするための設定を行います。

Greengrass のコンソールを開き、作成済みの Greengrass グループをクリックします。

img_iot-greengrass-family_19
img_iot-greengrass-family_19

クリックすると拡大します

Lambdaの追加 を選択します。

img_iot-greengrass-family_20
img_iot-greengrass-family_20

クリックすると拡大します

先程作成した Lambda 関数を適用するので、既存の Lambda の使用 を選択します。

img_iot-greengrass-family_21
img_iot-greengrass-family_21

クリックすると拡大します

作成済みの Lambda 関数を選択して 次へ をクリックします。  

img_iot-greengrass-family_22
img_iot-greengrass-family_22

クリックすると拡大します

バージョン1 を選択して 完了 をクリックします。

img_iot-greengrass-family_23
img_iot-greengrass-family_23

クリックすると拡大します

関数の右上にある `...` をクリックして 設定の編集 をクリックします。

img_iot-greengrass-family_24
img_iot-greengrass-family_24

クリックすると拡大します

として実行 の項目で 別のユーザ ID / グループ ID を選択し UID に 0、GID に を入力します。

img_iot-greengrass-family_25
img_iot-greengrass-family_25

クリックすると拡大します

コンテナ化の項目で コンテナなし (常時) を選択し、合わせてLambdaのライフサイクルで 存続時間が長く無制限に稼働する関数にする を選択し、画面下部の 更新 をクリックし設定を反映します。 

img_iot-greengrass-family_26_new
img_iot-greengrass-family_26_new

クリックすると拡大します

4-9-3. サブスクリプションの設定

Greengrass 上で動作する Lambda 関数が Publish する MQTT メッセージをクラウド側の IoT Core に転送するために、サブスクリプションの設定を行います。

Greengrass Group のメニューから サブスクリプション を選択し、サブスクリプションの追加 をクリックします。

img_iot-greengrass-family_27
img_iot-greengrass-family_27

クリックすると拡大します

Greengrass 上で動作する Lambda 関数が Publish する MQTT メッセージをクラウド側の IoT Core に転送するために、サブスクリプションの設定を行います。

Greengrass Group のメニューから サブスクリプション を選択し、サブスクリプションの追加 をクリックします。

img_iot-greengrass-family_28
img_iot-greengrass-family_28

クリックすると拡大します

次に対象となるトピックを入力します。サンプルプログラムの中にデフォルト値として predict/person として埋め込んでいますので、変更がない場合はそのまま入力し 次へ をクリックします。

img_iot-greengrass-family_29
img_iot-greengrass-family_29

クリックすると拡大します

入力内容を確認して 完了 をクリックします。

img_iot-greengrass-family_30
img_iot-greengrass-family_30

クリックすると拡大します

4-9-4. デプロイ

エッジ側の設定がこれですべて完了したので、設定を Jetson Nano の Greengrass に反映します。

Greengrass グループの右上の アクション メニューから デプロイ を選択します。

img_iot-greengrass-family_31
img_iot-greengrass-family_31

クリックすると拡大します

エッジ側の設定がこれですべて完了したので、設定を Jetson Nano の Greengrass に反映します。

Greengrass グループの右上の アクション メニューから デプロイ を選択します。

img_iot-greengrass-family_32
img_iot-greengrass-family_32

クリックすると拡大します

4-9-5. 推論結果の確認

Greengrass から推論した結果が AWS IoT に到達しているか確認します。IoT Core のテストを用いて確認してみます。

IoT Core のコンソールにある テスト を開き、トピックのサブスクリプションに対象トピックを入力します。サンプルのまま変更が無い場合は predict/person となります。入力したら トピックのサブスクライブ ボタンをクリックしてサブスクライブを開始します。

img_iot-greengrass-family_33
img_iot-greengrass-family_33

クリックすると拡大します

1 分毎にデータが到達してきていることを確認できました。 

img_iot-greengrass-family_34
img_iot-greengrass-family_34

クリックすると拡大します


5. AWS IoT Events を使って人数状態に合わせた通知を設定する

次にクラウド側に上った情報から AWS IoT Events を使って一定人数以上を検知したら一度だけ Amazon SNS で警告を上げるようにしてみようと思います。また、デバイスから一定時間メッセージが上がってこなかった場合にも、警告として通知するようにしてみたいと思います。

AWS IoT Events を使うことでプログラミングなしにデバイスの状態からアクションを起こせるようになるためとても便利です。

5-1. 入力の作成

今回 Greengrass から Publish されるメッセージはエラーのケースも含めると以下のようなフォーマットになります。

{
    "persons": 2,
    "timestamp": 1597284546,
    "predict_sec": 0.08776521682739258,
    "error": "error message"
}

これを入力として、IoT Events の入力を作成します。 iot_events_input.json としてダウンロードファイルに含めておきました。

img_iot-greengrass-family_37
img_iot-greengrass-family_37

クリックすると拡大します

5-2. 検知モデルの作成

入力の定義が出来たら、モデルを作成するのですが、今回通知先として Amazon SNS を利用しようと思うので、事前に SNS トピックを作成しておきました。その状態で探知機モデルの作成を行います。

作成したモデルはこちらのようになります。

img_iot-greengrass-family_36
img_iot-greengrass-family_36

クリックすると拡大します

各状態の設定は以下のようになっています。

Normal
  • OnEnter
    • タイマー作成 (3 分)
  • OnInput
    • Input 値 (person, timestamp) を変数に入れる
    • タイマーのリセット
  • OnExit (設定無し)
Over_3_person
  • OnEnter
    • SNS メッセージの送信
  • OnInput
    • Input 値 (person, timestamp) を変数に入れる
    • タイマーのリセット
Device_alert
  • OnEnter
    • SNS メッセージの送信
    • 変数 timestamp に 0 を設定
  • OnInput
    • Input 値 (person, timestamp) を変数に入れる

また、各状態遷移は以下の条件としています。 

To_Over_3_person

変数 person に入れた値が 3 以上となった場合遷移 

To_Normal

変数 personvに入れた値が 3 未満となった場合遷移 

Message_not_arrival

作成したタイマーがタイムアウトになったら遷移 

Message_arrival

変数 timestamp が 1 以上の値 (時間が入ったら) になったら遷移 

上記の設定をエクスポートした Json ドキュメントを iot_events_model.json としてダウンロードファイルの中に含めておきました。  

探知モデル画面の アクション メニューの 探知モデルのインポート からファイルをインポートすることでご利用いただけます。

※ ただし SNS 通知のアクションは除いているので、 Over_3_person 及び、Device_alert OnEnter に個別に追加ください。

以上の設定をすることで 3 人以上が検知された場合、Amazon SNS を経由して携帯で SMS 通知を受けることができるようになります。また、Jetson の電源が不意に落とされた場合も気付くことができるようにもなります。

img_iot-greengrass-family_37
img_iot-greengrass-family_37

クリックすると拡大します

最後に発行ボタンを押して探知モデルの公開を行って設定有効にしていきます。

今回は一つのデバイスだけですので、単一の探知機 を作成していますが、複数のデバイスがある場合は、一意に特定できる値を入力値に入れておき、一意のキー値ごとに探知機を作成することでデバイス毎に管理できるようになります。また、現在の状態に基づいて定義されている順にイベント評価をしてもらいたいので、シリアル評価 を選択しています。

img_iot-greengrass-family_38
img_iot-greengrass-family_38

クリックすると拡大します


6. Amazon QuickSight を使って変化を可視化してみる

最後に、部屋の利用状況を可視化・分析してみようと思います。分析には QuickSight を使ってみようと思います。分析に適した形でデータセットを作成するために、IoT Analytics を用いて蓄積、データのフォーマットの変換を行いたいと思います。

6-1. AWS IoT Analytics の準備

IoT Analytics の準備はとても簡単です。トップの 素早く開始する でリソースのプレフィックス (今回は living_persons としました) と、対象メッセージが入ってくるトピック (今回は predict/person) をしていするだけで必要なリソースの準備は完了します。

img_iot-greengrass-family_39
img_iot-greengrass-family_39

クリックすると拡大します

今回はデータのフィルタなどは行わないので、データセットの項目だけ設定を変更して、QuickSight での分析に備えようと思います。データセットで変更した項目は、SQLクエリ スケジュール を変更しています。

SQL クエリに関しては、クエリにてメッセージに含まれる UNIX タイムスタンプを日本時間に合わせて ISO8601 形式にしています。

SELECT date_format(from_unixtime(timestamp, 9, 0),'%Y-%m-%dT%H:%i:%s') as datetime, * FROM living_persons_datastore order by timestamp desc

また、スケジュールは 30 分毎に更新するように設定してみました。 

img_iot-greengrass-family_40
img_iot-greengrass-family_40

クリックすると拡大します

6-2. Amazon QuickSight でのデータ分析

QuickSight では、前項で作成した IoT Analytics のデータセットをデータソースとして QuickSight のデータセットを設定しています。

集計用に、カスタムフィールドとして時間と分を切り出したフィールドが欲しかったので計算フィールドとして追加しています。

具体的には、Hour のカラムは下記のようにして作成しています。

concat(formatDate({datetime}, 'HH'),'時')
img_iot-greengrass-family_41
img_iot-greengrass-family_41

クリックすると拡大します

このように作成したデータセットを用いて可視化してみると以下のようになりました。 

img_iot-greengrass-family_42
img_iot-greengrass-family_42

クリックすると拡大します


7. まとめ

いかがでしたでしょうか。今回は部屋の中という特定の条件の元で試しているので、もしかしたら適用箇所は限定されるかもしれませんが、事前学習済みのモデルや AWS ソリューションを活用することで簡単に仕組みが実現出来ました。この仕組み、目的によっては家族がリビングに揃うタイミングを知る以外にも、色々な用途で使うことができるのではないかと思います。

我が家の状況としては、高校生の娘は休みやお盆シーズン関係なく部活でほとんど家にいないことが多くなってきたので、子どもたちが小さいときに比べて一家団欒の時間がとても少なくなって来ているのがデータからも見てとれます。一方で、21 時から 23 時の部屋の利用率が高いこともわかりましたし、Events を使って 3 人以上がリビングに集まったら SMS 通知を貰えるようにしてあるので、通知が来たらすぐさまリビングに向かい積極的に一家団欒の時間を作って行こうと思います。 

筆者プロフィール

photo_watanabe-satoshi

渡邉 聡
アマゾン ウェブ サービス ジャパン株式会社
デジタルトランスフォーメーション本部 プロトタイピングソリューションアーキテクト

趣味は DIY で棚や机の作成から、料理から手芸まで興味のあるものは何でも作ってみます。最近は何十年ぶりに自作 PC を組み立ててみました。

AWS のベストプラクティスを毎月無料でお試しいただけます

さらに最新記事・デベロッパー向けイベントを検索

下記の項目で絞り込む
絞り込みを解除 ≫
フィルタ
フィルタ
1

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する