AWS DeepLens で子供の正しい TV 視聴を見守るアプリケーションを作る

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

Author : 園田 修平, 福井 厚

こんにちは、ソリューションアーキテクトの園田です。
執筆時点で弊社では在宅勤務が推奨されているのですが、我が家は 3 歳になる前の娘がおり、「わたしもおしごとする!」といってバシバシと私のキーボードをしばきに来てくれます。するとついつい、Eテレの素晴らしいコンテンツや Prime Video のしまじろうといった 「TV 子守」に頼ってしまうのですが、仕事に集中しているといつの間にか子供が TV にものすごく接近して視聴していることや、一時間以上連続で TV を視聴している事に気づかないといった状況が発生しておりました。

そこで今回は AWS DeepLens を用いて、「TV を見るときは離れて見る」、「TV を連続して長時間見ないようにする」という二大ルールを遵守するためのアプリケーションを作ってみたいと思います。

今回紹介する手順をすべて行った結果の動画を用意しましたので、どの様な動きをするか確認することが出来ます。動画では AWS DeepLens のアウトプットストリームを通じて子供が TV (の前に配置した AWS DeepLens) に接近しすぎると音声による注意が走る様子と、連続視聴により親の PC に Slack で通知が飛んでくる様子をご確認いただけます。 

テレビに接近しすぎると音声で注意する様子
連続視聴していると親の PC に Slack で通知が届く様子

こんにちは、サーバーレス ソリューションアーキテクトの福井です。今回園田と一緒にこのソリューションを作りました。私にも娘がいますが、すでに結婚して家庭を持っているので今回のソリューションを適用することは少し困難が伴います。娘の家には DeepLens もないですし。そもそも結婚して家庭を持つ娘に「TV を見るときは離れて見る」とか、1 時間以上テレビを見ているという警告を Slack で受け取っても・・・。しかしながら園田と一緒にこの素晴らしいソリューションを作りましたので一緒に紹介させて頂きます (^^)。


実際にお試しいただくために、あらかじめサンプルコードをダウンロードしておきましょう。

ダウンロードはこちら »


利用するデバイス

今回利用したデバイスは下記になります。

本投稿では AWS DeepLens に ssh でログインして操作を行いますが、AWS DeepLens 上で作業をされたい場合はモニター、マウス、キーボードをご用意ください。

利用する AWS のサービス

全体の仕組みを作るために利用する AWS のサービスは以下のものになります。

  • AWS DeepLens
  • AWS IoT Core
  • AWS IoT Events
  • AWS Lambda (AWS SAM を利用)
  • Amazon Polly

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

全体のアーキテクチャ

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

img_deeplens-tv-watching_01

本システムでは TV に設置された AWS DeepLens デバイスが、クラウドからデプロイされた Lambda と機械学習のモデルを用いてエッジで顔検出を行い、そちらの情報を用いて TV の視聴や接近を検知します。視聴を検知すると、視聴ログを AWS IoT Core にアップロードし、接近を検知すると、あらかじめ Amazon Polly で生成した音声データを AWS DeepLens 上で再生します。

AWS IoT Core にアップロードされた視聴ログを AWS IoT Core のルールエンジンにより AWS IoT Events に転送します。この視聴ログをベースに、AWS IoT Events は各 TV (AWS DeepLens デバイス) が視聴されているかどうかの状態を管理します。ここで長時間視聴 (今回は 1 時間) を検出すると、AWS IoT Events は Lambda を呼び出し、この Lambda が Slack を通じて親への通知を行います。

では早速作ってみましょう。


Step 1 : AWS DeepLens に顔検出を行うプロジェクトをデプロイする

1-1. AWS DeepLens デバイスの登録

まずは AWS DeepLens を初期設定していきましょう。AWS DeepLens を初めて利用する場合、こちらの手順の 1 から 6 までを実施してデバイスを登録する必要があります。ここからの作業はデバイスの登録が完了している前提で進めます。

1-2. AWS DeepLens で顔検出を行うサンプルプロジェクトをデプロイ

AWS DeepLens には、すぐに推論をデプロイして実行するためのサンプルプロジェクトがいくつか用意されています。どのようなサンプルプロジェクトが用意されているのかはこちらから確認できます。

本アプリケーションでは顔の検出と認識のサンプルプロジェクトをベースに、TV の視聴判定、TV との距離判定を行うプログラムを構築していきます。

では早速デプロイしていきましょう。

1. AWS DeepLens のマネージメントコンソールを開きます

2. 『個のプロジェクト』セクションから『新しいプロジェクトの作成』に進みます

img_deeplens-tv-watching_02

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

3. 『プロジェクトタイプの選択』画面で、『プロジェクトテンプレートを使用する』オプションを選択し、プロジェクトテンプレートから 『顔検知』を選択し、『次へ』に進みます

img_deeplens-tv-watching_03

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

4. 『プロジェクトの詳細を指定する』画面にてプロジェクト名を任意の名前 (ここでは  Face-detection-for-kids-watching-tv) とし、任意の説明文を記入の上、 『作成する』に進みます

img_deeplens-tv-watching_04

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

5. 『個のプロジェクト』 画面に戻り、先ほど作成したプロジェクトが表示されます。プロジェクト名の左にあるラジオボタンを選択するか、プロジェクトを選択してプロジェクトの詳細ページを開き、『デバイスへのデプロイ』を選択します。

img_deeplens-tv-watching_05

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

6. 『ターゲットデバイス』画面の AWS DeepLens デバイスのリストで、このプロジェクトをデプロイする先のデバイスの左にあるラジオボタンを選択し『確認』に進みます。

7. 『確認とデプロイ』画面にて、『デプロイ』を選択します。

img_deeplens-tv-watching_06

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

これで顔検出を行うアプリケーションが AWS DeepLens デバイスにデプロイされました。AWS DeepLens コンソールから AWS DeepLens の出力画像を確認できます。プロジェクトの出力を表示する手順については、AWS DeepLens 出力ストリームの表示を参照してください。

img_deeplens-tv-watching_07

また、顔を検出すると AWS DeepLens が顔検出の結果を AWS IoT Core に送信します。AWS IoT コンソールから AWS DeepLens が送信する顔検出結果のメッセージを確認できます。こちらの手順については、AWS DeepLens プロジェクト出力の AWS IoT コンソールでの表示を参照してください。

img_deeplens-tv-watching_08

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


Step 2 : AWS DeepLens に視聴及び接近を検出する Lambda をデプロイ

ここからは実際に AWS DeepLens に視聴及び接近を検出するアプリケーションをデプロイしていきます。

img_deeplens-tv-watching_09

2-1. Amazon Polly を用いて接近検出時に再生する音声データを作成する

まず前準備として、顔が AWS DeepLens(=TV) に接近しすぎた際に子供に優しく警告を行う音声データを Amazon Polly を用いて作成します。音声データを作る手順はこちらを参照してください。今回は事前にダウンロードしたサンプルコードの中にこちらで作成した mp3 ファイルを用意しておりますので、こちらの手順はスキップしてもかまいません。異なる音声を再生したい場合はサンプルコードの mp3 ファイルを作成した音声データで上書きしてください。

img_deeplens-tv-watching_10

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

2-2. AWS DeepLens で音声再生を可能にする設定を行う

続いて、AWS DeepLens に音声を再生するための各種設定を行っていきます。

  1. AWS DeepLens に ssh でログイン (もしくは AWS DeepLens 上でターミナルを起動)
  2. 音声を再生するためのライブラリをインストールします。
sudo apt-get install python-gst-1.0 gstreamer1.0-fluendo-mp3
sudo pip install playsound

これで AWS DeepLens 上で音声を再生する準備ができました。 

2-3. AWS DeepLens デバイスにデプロイする Lambda を作成

続いて TV(AWS DeepLens デバイス) の視聴及び接近を検出する Lambda を作成していきます。Lambda のサンプルソースは、ダウンロードしたファイルの中の lambda_for_deeplens.zip を利用します。
 

1. AWS Lambda のマネージメントコンソールを開きます。

2. 『関数』セクションから『関数の作成』に進みます

img_deeplens-tv-watching_11

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

3. 『一から作成』オプションを選択し、関数名を任意の名前 (ここでは deeplens-face-detection-for-kids-watching-tv)、ランタイムに『Python2.7』を選択し『関数の作成』に進みます

img_deeplens-tv-watching_12

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

4. 作成した関数の詳細画面の『関数コード』の『コードエントリタイプ』で『.zipファイルをアップロード』を選択、『関数パッケージ』の『アップロード』を選択してダウンロードしたファイルの中の『lambda_for_deeplens.zip』を選択します。また、『ハンドラ』を『greengrassHelloWorld.function_handler』に変更のうえ、『保存』に進みます。

img_deeplens-tv-watching_13

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

5. 『アクション』から『新しいバージョンを発行』を選択、バージョンの説明を任意で記載のうえ、『発行』に進みます。

img_deeplens-tv-watching_14

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

これで AWS DeepLens にデプロイする Lambda の準備が整いました。

2-4. AWS DeepLens デバイスに Lambda をデプロイ

いよいよ AWS DeepLens に Lambda をデプロイしていきます。


1. AWS DeepLens のマネージメントコンソールを開きます

2. 『個のプロジェクト』セクションから先ほど作成したプロジェクト名の左にあるラジオボタンを選択するか、プロジェクトを選択してプロジェクトの詳細ページを開き、『編集』を選択します。

img_deeplens-tv-watching_15

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

3. 『プロジェクトの編集』画面で『プロジェクトコンテンツ』にて『関数 deeplens-face-detection』を削除のうえ、『関数の追加』を選択します。

img_deeplens-tv-watching_16

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

4. 『関数の追加』画面にて、先ほど作成した Lambda 名の左にあるラジオボタンを選択し、『関数の追加』に進みます。

img_deeplens-tv-watching_17

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

5. 『関数』を展開して、『推論出力アクション』を『パブリッシュ』に変更のうえ、『保存』します。

img_deeplens-tv-watching_18

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

6. 『個のプロジェクト』画面に戻りますので、最初に顔検知プロジェクトをデプロイしたときと同様に、プロジェクトを選択、プロジェクトの詳細ページにて関数名が更新されていることを確認のうえ、『デバイスへのデプロイ』を選択、プロジェクトを選択し『確認』へと進んでください。

既に顔検知のプロジェクトをデプロイしているため、『デバイスに既存のプロジェクトがあります。置き換えますか ?』という警告が出ています。問題ないので『デプロイ』へと進みます。

img_deeplens-tv-watching_19

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

7. デプロイが始まります。

img_deeplens-tv-watching_20

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

8. 無事完了しました!

img_deeplens-tv-watching_21

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

これで TV (AWS DeepLens デバイス) の視聴及び接近を検出する Lambda が AWS DeepLens デバイスにデプロイされました。AWS DeepLens コンソールから AWS DeepLens の出力画像を確認できます。また、AWS DeepLens デバイスをスピーカーに接続すると、接近時に音声で注意される様子が確認できます。

img_deeplens-tv-watching_22

正常時

img_deeplens-tv-watching_23

接近時

2-5. AWS Lambdaファンクションのコード解説

AWS DeepLens 上で動作する Lambda ファンクション(lambda_for_deeplens/greengrassHelloWorld.py)では、AWS DeepLens 顔検知サンプルプロジェクトのコードを一部改修して利用しています。サンプルプロジェクトでは顔を検出し、取得した画像に bounding box を書き込み、AWS IoT Core に検出結果を送信します。この処理に、その検出した bounding box の大きさで TV (AWS DeepLens デバイス)に接近していることを検知し、音声データを再生するコードを追記しています。

処理の詳細は実際のコードを確認してみてください。


Step 3 Slack の Webhookアプリを設定する

それでは、バックエンドの実行環境の構築を行っていきましょう。まず初めに、Slack へメッセージを送信するための準備を行います。

img_deeplens-tv-watching_24

3-1. slack へのメッセージの送信準備

1. AWS Lambda から Slack へメッセージを送信するために、Slack 側でチャネルにメッセージ送信するためのアプリを作成します。今回はもっともシンプルな方法として Webhook によるメッセージの送信を行います。以下の URL へアクセスして Slack api のページを開きます。

https://api.slack.com/apps

img_deeplens-tv-watching_25

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

2. 『Create New App』ボタンをクリックして表示されるダイアログにアプリケーション名を入力し、対象のSlack Workspaceを選択して『Create App』ボタンをクリックします。

img_deeplens-tv-watching_26

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

3. アプリを作成すると詳細ページに遷移します。左側のペインから『Incomming Webhooks』を選択し、『Activate Incoming Webhooks』を『on」にします。

img_deeplens-tv-watching_27

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

img_deeplens-tv-watching_28

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

4. 『Add New WebHook to Workspace』ボタンをクリックするとアクセス権限の確認が面が表示されるので、対象のチャンネルを指定して『許可する』ボタンをクリックします。

img_deeplens-tv-watching_29

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

5. 『Incomming Webhooks』の画面に戻ると『Webhook URLs for Your Workspace』のセクションに Webhook URL が追加されているので、その URL をコピーして保存します。この URL は後ほど AWS Lambda の環境変数に渡します。

img_deeplens-tv-watching_30

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

Step 4 : Slack へメッセージを送信する AWS Lambda ファンクションをデプロイする

次に上のステップで作成した Slack の Webhook アプリを利用してメッセージを送信する AWS Lambda ファンクションをデプロイします。

img_deeplens-tv-watching_31

4-1. Serverless Application Model (SAM) を利用したデプロイ

今回は Lambda ファンクションのデプロイに Serverless Application Model (SAM) の CLI を利用します。SAM CLI のインストールについてはこちらをご参照ください。


1. SAM CLI のインストールが完了したらダウンロードしたサンプルコード内の  lambda_for_slack フォルダへ移動して下記のコマンドを実行します。

$ sam build

2. 以下のような結果が表示されます。

Building resource 'DeepLensEventHandler'
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource

Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided

3. 続けてデプロイを実行します。

$ sam deploy --guided

4. ガイドに対して以下を入力します。

Stack Name [sam-app]: safe-for-kids-watching-tv
	AWS Region [us-east-1]: ap-northeast-1
	Confirm changes before deploy [y/N]: N
	Allow SAM CLI IAM role creation [Y/n]: Y
	Save arguments to samconfig.toml [Y/n]: Y

5. 以下のような結果が表示されれば成功です。

...

	Deploying with following values
	===============================
	Stack name                 : safe-for-kids-watching-tv
	Region                     : ap-northeast-1
	Confirm changeset          : False
	Deployment s3 bucket       : aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxx
	Capabilities               : ["CAPABILITY_IAM"]
	Parameter overrides        : {}

Initiating deployment
=====================
Uploading to safe-for-kids-watching-tv/c7a8d0609ddb21ff2eb54e5ef9745563  1930634 / 1930634.0  (100.00%)
Uploading to safe-for-kids-watching-tv/98e139feb60c032f818c55146cbb2743.template  797 / 797.0  (100.00%)

Waiting for changeset to be created..

CloudFormation stack changeset
---------------------------------------------------------------------------------------------------------------------------------------------
Operation                                       LogicalResourceId                               ResourceType
---------------------------------------------------------------------------------------------------------------------------------------------
* Modify                                        DeepLensEventHandler                            AWS::Lambda::Function
---------------------------------------------------------------------------------------------------------------------------------------------

Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:123456789012:changeSet/samcli-deploy1587030867/cd380a98-ca7d-4911-9a9a-61804d3e1a2f


2020-04-16 18:54:33 - Waiting for stack create/update to complete

CloudFormation events from changeset
---------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus                      ResourceType                        LogicalResourceId                   ResourceStatusReason
---------------------------------------------------------------------------------------------------------------------------------------------
UPDATE_IN_PROGRESS                  AWS::Lambda::Function               DeepLensEventHandler                -
UPDATE_COMPLETE                     AWS::Lambda::Function               DeepLensEventHandler                -
UPDATE_COMPLETE_CLEANUP_IN_PROGRE   AWS::CloudFormation::Stack          deeplens-event-handler              -
SS
UPDATE_COMPLETE                     AWS::CloudFormation::Stack          deeplens-event-handler              -
---------------------------------------------------------------------------------------------------------------------------------------------

CloudFormation outputs from deployed stack
----------------------------------------------------------------------------------------------------------------------------------------------
Outputs
----------------------------------------------------------------------------------------------------------------------------------------------
Key                 DeepLensEventHandler
Description         Deeplens Event Handler Lambda Function ARN
Value               arn:aws:lambda:ap-northeast-1:123456789012:function:safe-for-kids-watching-tv-DeepLensEventHandler-xxxxxxxxx
----------------------------------------------------------------------------------------------------------------------------------------------

Successfully created/updated stack - safe-for-kids-watching-tv in ap-northeast-1

4-2. 環境変数のセット

Lambda ファンクションのデプロイが完了したら、マネージメントコンソールを開いて Lambda ファンクションの環境変数をセットします。
 

1. AWS Lambda コンソールを開きます。

2. デプロイした Lambda ファンクションを選択し、Environment Variables のセクションで『Edit』ボタンをクリックします。

img_deeplens-tv-watching_32

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

3. Edit environment variables の画面で、Key が 『SLACK_SEND_MESSAGE_URL』の値を先程保存した Slack Webhook URL の値で更新し、『Save』ボタンをクリックして保存します。

img_deeplens-tv-watching_33

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

4. また、後述の Step 5 にて、AWS IoT Events から本 Lambda ファンクションを呼び出すため、ARN をメモしておきましょう。

img_deeplens-tv-watching_34

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

4-3. Lambda ファンクションのコード解説

Slack へメッセージを送信する Lambda ファンクション (lambda_for_slack/deeplens_event_handler/app.py) のイベントハンドラ部分は以下の通りです。

def lambda_handler(event: dict, context: dict)->dict:
    '''
    Lambdaのイベントハンドラ
    
    parameter:
    event イベントパラメータ
    context Lambda Context
    
    return:
    テストのために取得した以下の値を返す
        requestsへPOSTした結果のresponseオブジェクトのテキスト
        送信先URL
        watching_too_long_timerの文字列
    '''
    slack_send_message_url = get_slack_send_message_url(SLACK_SEND_MESSAGE_URL)
    
    watching_too_long_timer = get_watching_too_long_timer(event)

    if is_slack_send_message_url_valid(slack_send_message_url):
        message = build_message_text(watching_too_long_timer)
        response = send_slack_message(slack_send_message_url, message)

    return json.dumps({
        SLACK_SEND_MESSAGE_URL: slack_send_message_url,
        WATCHING_TOO_LONG_TIMER: watching_too_long_timer,
        RESPONSE_STATUS_CODE: response.status_code
        })

簡単に解説すると以下の処理を行っています。

  1. 環境変数から Slack の Webhook URL を取得
  2. Labmda ファンクション実行時に AWS IoT Core 側から渡される event 変数から WachingTooLongTimer の値を取得
  3. 1 で取得した URL が有効な値の場合、送信するメッセージを組み立てて、Slack へメッセージを送信
  4. ファンクション内で取得した値を JSON に埋め込んで返す

それぞれの処理の詳細は個々の関数の実装を確認してください。


Step 5 : AWS IoT Events により視聴状態を管理するステートマシンを作る

最後に長時間視聴を検出する部分を構築します。AWS IoT Core にアップロードされた視聴ログを AWS IoT Core のルールエンジンにより AWS IoT Events に転送します。この視聴ログをベースに、AWS IoT Events は各 TV (AWS DeepLens デバイス) が視聴されているかどうかの状態を管理します。

img_deeplens-tv-watching_35

5-1. AWS CloudFormation による AWS IoT ルールと AWS IoT Events の構築

構築には CloudFormation を利用します。ダウンロードしたサンプルコード内の iot_events フォルダにある、cfn.yml を利用します。


1. CloudFormation のマネージメントコンソールを開きます。

2. 『スタックの作成』をクリックします。

img_deeplens-tv-watching_36

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

3. 『テンプレートの指定』で、『テンプレートファイルのアップロード』を選択し、『ファイルの選択』でサンプルコード内の iot_events フォルダにある、cfn.yml を選び、『次へ』をクリックします。

img_deeplens-tv-watching_37

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

4. 『スタックの詳細を指定」で、『スタックの名前』を任意の名前 (ここでは safe-for-kids-watching-tv) にし、パラメータのランタイムに『Python2.7』を選択し『関数の作成』に進みます。

img_deeplens-tv-watching_38

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

5. 『スタックオプションの設定』では何も変更せずにそのまま『次へ』をクリック。

6. レビュー画面で内容を確認し、『AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。』にチェックを付け、『スタックの作成』をクリックします。

img_deeplens-tv-watching_39

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

以上で、AWS IoT Core にアップロードされた視聴ログを AWS IoT Events に転送する AWS IoT ルールの設定と、AWS IoT Events によるイベント検出モデルが構築されました。 この CloudFormation テンプレートでは AWS IoT ルールが AWS IoT Events にデータを転送するための Role と、AWS IoT Events が Slack に通知する Lambda を実行する Role も合わせて作成しています。

5-2. AWS IoT ルールの確認

CloudFormation で作成した AWS IoT ルールの中身を確認しましょう。


1. AWS IoT Core のコンソールを開きます。

2. 『ACT』から『ルール』セクションへと進み、『SafeForKidsWatchingTV_Rule』を選択します。(CloudFormation スタックの作成時、パラメータとして『AppNameParameter』を変更した場合、『${AppNameParameter}_Rule』を選択します。)

img_deeplens-tv-watching_40

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

3. ルールクエリステートメントに『SELECT *, topic(3) as deeplensid FROM '$aws/things/+/infer' 』と登録されていることがわかります。これは AWS DeepLens が利用する 『$aws/things/+/infer』トピックに発行されたメッセージを条件にアクションを実行することを意味します。また、『*, topic(3) as deeplensid』は、メッセージの payload 全体(*) に、topic の 3 階層目に含まれる値 (DeepLens デバイスのユニーク ID)を『deeplensid』として加えたうえでアクションすることを意味します。また、アクションとしては AWS IoT Events が設定されていることがわかります。

img_deeplens-tv-watching_41

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

5-3. AWS IoT Events の確認

続いて、CloudFormation で作成した AWS IoT Events のイベント検出モデルの中身を確認しましょう。


1. AWS IoT Events のコンソールを開きます。

2. 『探知機モデル』から『WatchingDetectorModel』を選択します。

img_deeplens-tv-watching_42

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

3. 『編集』を選択します。

img_deeplens-tv-watching_43

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

4. イベントを検出するモデルが表示されます。

img_deeplens-tv-watching_44

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

こちらのモデルを解説します。このモデルでは各 AWS DeepLens デバイスの Watching (視聴中)、NotWatching (未視聴)、WatchingTooLong (長時間視聴) の状態を検出します。

  1. 1視聴ログが初めて送られると、対象の DeepLens デバイスの初期状態は Watching になります。Watching の状態になると、未視聴タイマー (60 秒) と長時間視聴タイマー (1 時間) が初期化され、カウントダウンされていきます。未視聴タイマーは視聴ログが送られるとリセットされ、再び 60 秒からカウントダウンが始まります。
  2. Watching 状態において、60 秒視聴ログがアップロードされないと、未視聴タイマーがタイムアウトし、NotWatching に状態遷移します。NotWatching の状態になると、長時間視聴タイマーがクリアされます。
  3. NotWatching 状態において、視聴ログが送られると、再び Watching 状態となります。ここで再び未視聴タイマーと長時間視聴タイマーが初期化されます。
  4. Watching 状態において、1 時間視聴ログが継続的にアップロードされると、長時間視聴タイマーがタイムアウトし、WatchingTooLong に状態遷移します。WatchingTooLong の状態になると、AWS IoT Events は Slack に通知する Lambda を実行します。
  5. Watching 状態において、60 秒視聴ログがアップロードされないと、未視聴タイマーがタイムアウトし、NotWatching に状態遷移します。

AWS IoT Events を使うと、このような状態管理とイベントの検出を行うアプリケーションを、コードを書くことなく構築することができます。更に詳しく知りたい方は AWS IoT Events の開発者ガイドを参照してください。

5-4. 動作確認

それでは動作確認してみましょう。長時間視聴の動作確認のため 1 時間 TV を視聴し続けるのも大変なので、ここでは CloudFormation の WatchingTooLongTimer を 120 (2 分) に変更したうえで動作確認します。


1. AWS DeepLens に顔を検知させます。

2. AWS IoT Events のコンソールの『探知機モデル』から再び『WatchingDetectorModel』を選択、『ディテクター』から deeplens_ で始まるキーを選択します。(表示されていない場合は、1 を実施してからリロードしてください)

img_deeplens-tv-watching_45

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

3. 『一般的な情報』の『状態』が『Watching』となっていることが確認できます。未視聴タイマー (notWatchingTimer) がタイムアウトする時間を確認します。

img_deeplens-tv-watching_46

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

4. AWS DeepLens から離れて、未視聴タイマーがタイムアウトする時間になるまで視聴ログがアップロードされない状態にします。

5. 3 の未視聴タイマーがタイムアウトする時間になったら 3 のページをリロードします。『一般的な情報』の『状態』が『NotWatching』となっていることが確認できます。

img_deeplens-tv-watching_47

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

6. AWS DeepLens デバイスに再び顔を検知させます。リロードすると再び『状態』が『Watching』となります。長時間視聴タイマー (watchingTooLongTimer) がタイムアウトする時間を確認します。

img_deeplens-tv-watching_48

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

7. AWS DeepLens デバイスに長時間視聴タイマーがタイムアウトする時間になるまで顔を検知させ続けます。

8. 6 の長時間視聴タイマーがタイムアウトする時間になったら 6 のページをリロードします。『一般的な情報』の『状態』が『WatchingTooLong』となり、Lambda が発火され Slack にメッセージが届くことが確認できます。

img_deeplens-tv-watching_49

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

img_deeplens-tv-watching_50

まとめ

いかがでしたでしょうか。
このアプリケーションにより、我が家は健全な TV 子守生活を開始することができました。

ただ、今回のやり方では TV がついていなくても TV の前にずっといると長時間視聴を注意してしまうし、顔検出を利用しているだけなので、TV の近くで遊んでいるだけでも「離れて見ようね」と注意されてしまうので、子供から「どうしてだめなのー ?」と言われてしまいます。

AWS DeepLens ではカスタムの機械学習モデルを配信することができますので、顔だけでなく実際に TV を見ていることを検出するモデルを利用するなど、様々な拡張が考えられます。ぜひ色々とチャレンジしてみてください。Amazon Polly で子供の名前を呼んだうえで注意するだけでもすごく興味を持ってくれましたので、そういった簡単なカスタマイズも良いと思います。

Happy Coding !

photo_sonoda_shuhei

筆者紹介

園田 修平
アマゾン ウェブ サービス ジャパン株式会社
シニアソリューションアーキテクト IoT スペシャリスト

ユーザー企業にてコンシューマープロダクト向けシステムの開発、運用を経験後、2017 年 7 月よりアマゾン ウェブ サービス ジャパン株式会社でソリューション アーキテクトとして活動。現在は IoT スペシャリストとして IoT システムを構築したいお客様に向け、アーキテクチャデザインやお客様とともにプロトタイピングをするなどの支援に従事している。

photo_fukui

福井 厚
アマゾン ウェブ サービス ジャパン株式会社
シニアソリューションアーキテクト
サーバーレススペシャリスト

PC メーカーでサポートエンジニアとして OS 及び言語担当、ソフトウェアハウスでデベロッパー、SI ベンダーで SE、アーキテクト、開発系コンサルティングファームでコンサルタントを経験後、2015 年 7 月よりアマゾン ウェブ サービス ジャパン株式会社でソリューション アーキテクトとして活動。現在は、サーバーレススペシャリストとして AWS におけるクラウドネイティブなアプリケーションの開発及び既存アプリケーションのモダナイゼーションの支援に従事している。

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

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

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

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

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