Jetson Nano と AWS IoT サービスで 一家団欒の時間を作ろう
Author : 渡邉 聡
こんにちは、ソリューションアーキテクトの渡邉です。上の娘が今年から高校生になり、日々の成長に喜びを感じる一方で徐々に顔を合わせる時間も少なくなってきていることに危機感を感じ始めてきている今日此の頃です。下の娘はまだ私とじゃれ合ってくれますが上の娘のようになっていくのも時間の問題です。
そこで今回は一家団欒の時間を IT の技術を使ってなんとか解決していきたいなと思います。具体的には部屋の利用人数をカウントして規定人数以上であった場合に通知を上げるという仕組みを作ることで私以外の家族がそろったタイミングを素早く察知していきたいと思います。エッジデバイスとしてはお手軽に機械学習を始めることができる Jetson Nano 開発者キットを使って作ってみることにしました。また、機械学習推論を行う上で重要なパーツとなる機械学習モデルに関しても事前学習済みモデルを使うことでお手軽にシステムを作成したいと考えています。
実際にお試しいただくために、作成したソースコードも下記に置いておきました。
目次
1. 利用するデバイス
2. 利用する AWS のサービス
3. 全体のアーキテクチャ
4. Jetson Nano で人物検出できるようにデバイスをセットアップする
4-1. AC アダプタから給電するようにする
4-2. OS イメージを SD カードに書き込む
4-3. SWAP 領域を増やす
4-4. MXNet 及び GluonCV のセットアップ
4-5. 接続した USB カメラの有効な解像度を調べる
4-6. AWS IoT Greengrass のセットアップ
4-6-1. Greengrass 用の user、group の作成
4-6-2. Python 3.7
4-6-3. 環境のチェック
4-6-4. Greengrass グループの作成とソフトウェアのダウンロード
4-6-5. 設定の変更
4-6-6. Greengrass の起動確認
4-7. Jetson Nano の設置と USB カメラの位置を調整
4-8. GUI から CUI への変更
4-9. 推論 Lambda 関数のデプロイ
4-9-1. Lambda 関数の作成
4-9-2. Greengrass で Lambda 関数の設定
4-9-3. サブスクリプションの設定
4-9-4. デプロイ
4-9-5. 推論結果の確認
5. AWS IoT Events を使って人数状態に合わせた通知を設定する
6. Amazon QuickSight を使って変化を可視化してみる
6-1. AWS IoT Analytics の準備
6-2. Amazon QuickSight でのデータ分析
7. まとめ
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。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. 全体のアーキテクチャ
今回のシステムのアーキテクチャは以下のようになります。
エッジ側で映像に映った人物のカウントには 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 を利用できます。
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
...省略...
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 セクションから イントロダクション を選択し、グループの作成 をクリックします。
クリックすると拡大します
デフォルト作成を使用 をクリックします。
クリックすると拡大します
任意のグループ名を入力し、次へ をクリックします。
クリックすると拡大します
規定で入力されている Core 機能の名前で良ければそのままで 次へ をクリックして進みます
クリックすると拡大します
Coreのセキュリティリソースをダウンロードします。
クリックすると拡大します
プラットフォームの選択 をクリックして Greengrass の Core ソフトウェアダウンロードページを開きます。
クリックすると拡大します
今回は Jetson Nano が対象なので、Armv8 (AArch64) の Arch Linux 用のインストールイメージをダウンロードします。
クリックすると拡大します
ダウンロードが終わったら、元のコンソールに戻って 完了 ボタンを押してグループの作成を完了します。
クリックすると拡大します
ダウンロードした 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 で接続し電源を入れます。
用意したサンプルプログラムを用いてカメラの撮影範囲を確認し調整します。
$ python3.7 ./camera_check.py --camera=/dev/video0 --width=1280 --height=720
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 コンソールを表示して関数の作成を選択します。
クリックすると拡大します
一から作成 を選択し、任意の関数名を入力し、ランタイムを Python3.7 を選択して関数の作成をクリックします。
クリックすると拡大します
関数コードセクションのアクションで、.zip ファイルをアップロードするとしてサンプルとしてダウンロードした prediction_lambda.zip をアップロードします。
クリックすると拡大します
関数が展開されます。
クリックすると拡大します
画面の Top にあるアクションから 新しいバージョン を発行を選択し、バージョン番号を割り当てます。
クリックすると拡大します
4-9-2. Greengrass で Lambda 関数の設定
作成した Lambda 関数を Greengrass 上へデプロイするための設定を行います。
Greengrass のコンソールを開き、作成済みの Greengrass グループをクリックします。
クリックすると拡大します
Lambdaの追加 を選択します。
クリックすると拡大します
先程作成した Lambda 関数を適用するので、既存の Lambda の使用 を選択します。
クリックすると拡大します
作成済みの Lambda 関数を選択して 次へ をクリックします。
クリックすると拡大します
バージョン1 を選択して 完了 をクリックします。
クリックすると拡大します
関数の右上にある `...` をクリックして 設定の編集 をクリックします。
クリックすると拡大します
として実行 の項目で 別のユーザ ID / グループ ID を選択し UID に 0、GID に 0 を入力します。
クリックすると拡大します
コンテナ化の項目で コンテナなし (常時) を選択し、合わせてLambdaのライフサイクルで 存続時間が長く無制限に稼働する関数にする を選択し、画面下部の 更新 をクリックし設定を反映します。
クリックすると拡大します
4-9-3. サブスクリプションの設定
Greengrass 上で動作する Lambda 関数が Publish する MQTT メッセージをクラウド側の IoT Core に転送するために、サブスクリプションの設定を行います。
Greengrass Group のメニューから サブスクリプション を選択し、サブスクリプションの追加 をクリックします。
クリックすると拡大します
Greengrass 上で動作する Lambda 関数が Publish する MQTT メッセージをクラウド側の IoT Core に転送するために、サブスクリプションの設定を行います。
Greengrass Group のメニューから サブスクリプション を選択し、サブスクリプションの追加 をクリックします。
クリックすると拡大します
次に対象となるトピックを入力します。サンプルプログラムの中にデフォルト値として predict/person として埋め込んでいますので、変更がない場合はそのまま入力し 次へ をクリックします。
クリックすると拡大します
入力内容を確認して 完了 をクリックします。
クリックすると拡大します
4-9-4. デプロイ
エッジ側の設定がこれですべて完了したので、設定を Jetson Nano の Greengrass に反映します。
Greengrass グループの右上の アクション メニューから デプロイ を選択します。
クリックすると拡大します
エッジ側の設定がこれですべて完了したので、設定を Jetson Nano の Greengrass に反映します。
Greengrass グループの右上の アクション メニューから デプロイ を選択します。
クリックすると拡大します
4-9-5. 推論結果の確認
Greengrass から推論した結果が AWS IoT に到達しているか確認します。IoT Core のテストを用いて確認してみます。
IoT Core のコンソールにある テスト を開き、トピックのサブスクリプションに対象トピックを入力します。サンプルのまま変更が無い場合は predict/person となります。入力したら トピックのサブスクライブ ボタンをクリックしてサブスクライブを開始します。
クリックすると拡大します
1 分毎にデータが到達してきていることを確認できました。
クリックすると拡大します
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 としてダウンロードファイルに含めておきました。
クリックすると拡大します
5-2. 検知モデルの作成
入力の定義が出来たら、モデルを作成するのですが、今回通知先として Amazon SNS を利用しようと思うので、事前に SNS トピックを作成しておきました。その状態で探知機モデルの作成を行います。
作成したモデルはこちらのようになります。
クリックすると拡大します
各状態の設定は以下のようになっています。
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 の電源が不意に落とされた場合も気付くことができるようにもなります。
クリックすると拡大します
最後に発行ボタンを押して探知モデルの公開を行って設定有効にしていきます。
今回は一つのデバイスだけですので、単一の探知機 を作成していますが、複数のデバイスがある場合は、一意に特定できる値を入力値に入れておき、一意のキー値ごとに探知機を作成することでデバイス毎に管理できるようになります。また、現在の状態に基づいて定義されている順にイベント評価をしてもらいたいので、シリアル評価 を選択しています。
クリックすると拡大します
6. Amazon QuickSight を使って変化を可視化してみる
最後に、部屋の利用状況を可視化・分析してみようと思います。分析には QuickSight を使ってみようと思います。分析に適した形でデータセットを作成するために、IoT Analytics を用いて蓄積、データのフォーマットの変換を行いたいと思います。
6-1. AWS IoT Analytics の準備
IoT Analytics の準備はとても簡単です。トップの 素早く開始する でリソースのプレフィックス (今回は living_persons としました) と、対象メッセージが入ってくるトピック (今回は predict/person) をしていするだけで必要なリソースの準備は完了します。
クリックすると拡大します
今回はデータのフィルタなどは行わないので、データセットの項目だけ設定を変更して、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 分毎に更新するように設定してみました。
クリックすると拡大します
6-2. Amazon QuickSight でのデータ分析
QuickSight では、前項で作成した IoT Analytics のデータセットをデータソースとして QuickSight のデータセットを設定しています。
集計用に、カスタムフィールドとして時間と分を切り出したフィールドが欲しかったので計算フィールドとして追加しています。
具体的には、Hour のカラムは下記のようにして作成しています。
concat(formatDate({datetime}, 'HH'),'時')
クリックすると拡大します
このように作成したデータセットを用いて可視化してみると以下のようになりました。
クリックすると拡大します
7. まとめ
いかがでしたでしょうか。今回は部屋の中という特定の条件の元で試しているので、もしかしたら適用箇所は限定されるかもしれませんが、事前学習済みのモデルや AWS ソリューションを活用することで簡単に仕組みが実現出来ました。この仕組み、目的によっては家族がリビングに揃うタイミングを知る以外にも、色々な用途で使うことができるのではないかと思います。
我が家の状況としては、高校生の娘は休みやお盆シーズン関係なく部活でほとんど家にいないことが多くなってきたので、子どもたちが小さいときに比べて一家団欒の時間がとても少なくなって来ているのがデータからも見てとれます。一方で、21 時から 23 時の部屋の利用率が高いこともわかりましたし、Events を使って 3 人以上がリビングに集まったら SMS 通知を貰えるようにしてあるので、通知が来たらすぐさまリビングに向かい積極的に一家団欒の時間を作って行こうと思います。
筆者プロフィール
渡邉 聡
アマゾン ウェブ サービス ジャパン合同会社
デジタルトランスフォーメーション本部 プロトタイピングソリューションアーキテクト
趣味は DIY で棚や机の作成から、料理から手芸まで興味のあるものは何でも作ってみます。最近は何十年ぶりに自作 PC を組み立ててみました。
AWS を無料でお試しいただけます