Edited at

Actcast α の顔認識機能で取得した画像をS3に保存する


Actcast α の画像認識機能で取得した画像をS3に保存する


はじめに

2019年7月31日にActcast β版がリリースされ、α版の設定データが削除されました。最新版のActcast WriterでActcast エージェントのインストールとデバイスの再登録が必要になります。

2018年12月、Idein株式会社から高度なセンシング技術を利用したIoTシステムを安価に構築・運用できるプラットフォームサービスActcastのα版がリリースされました。

Raspberry Piを使って手軽に画像認識が試せるので、 Face Tracking という Act 試してみました。(Actとは)


準備するもの


前提条件



  • Getting Started with Actcast (α版) に従い、 Actcast へのサインアップとデバイスの登録が完了していること。(Githubのアカウントが必要)

  • AWSにアカウントがあり、LamdaがS3にアクセスするためのロールが設定されていること。

  • Node.jsのモジュールをAWS Lambdaにデプロイする環境が整っていること。


参考情報


処理の流れ

actcast001.png

Face Trackingで撮影された画像はBase64形式で出力されるため、バイナリ変換を行いS3に保存します。


Actcastのセットアップ


Actの作成

New Act ->Demo の順にクリック。

actcast002.png

Face Trackingをクリック。

actcast003.png

Act Nameには、任意の名称を入力します。初期値はFace Trackingとなっているので、とくに変更がなければこのままとします。

displayにチェックを入れ、Create New ActをクリックしActを作成します。

actcast004.png

Go to Device Listをクリックしてデバイス一覧に進みます。

actcast005.png

デバイス一覧からActcastがインストールされたデバイス(Raspberry Pi)を選択し、Actionsをクリック。ポップアップウィンドウ内のInstall "Face Tracking"を選択すると、Face Trackingがインストールされます。

actcast006.png


動作確認


ディスプレイが接続されている場合

Face Trackingのセットアップを行った際にdisplayを有効にしていれば、ディスプレイに映像が映し出されているはずです。自分の顔にカメラを向けると、顔を認識し四角の枠が顔を追跡します。


ディスプレイが接続されていない場合

カメラモジュールで撮影した画像を設定画面上で確認するTake Photo機能で確認します。Devicesをクリックしてデバイス一覧を表示し、デバイス名の右端にある>をクリック。

actcast007.png

Act Settingsにあるカメラアイコンをクリックし、Take Photoをクリックすることで顔認識に成功した際の画像が表示されます。

撮影した画像はShow Photoで参照することができます。

actcast008.png


AWS環境のセットアップ


IAMユーザのアクセス権限のセットアップ

AWSにLambda関数をデプロイするために、IAMユーザにアクセス権限を割り当てます。

AWSコンソールでIAMのページを開きIAMユーザを選択します。アクセス権限タブのインラインポリシーの追加をクリック。

actcast009.png

ビジュアルエディタタブを選択し、

* サービス : Lambdaを選択します。

* アクション :

* 読み込みグループ : GetFunction

* 書き込みグループ : UpdateFunctionCode ,UpdateFunctionConfiguration

* リソース : 指定をチェック

* 任意のリソースタイプ = functionの右にあるすべてをチェック。

actcast010.png

ポリシーの確認をクリックし、名前に任意の名称をつけます。ここでは、Lambda-Update-Policyとしています。


Lambda関数のIAMロールのセットアップ

Lambda関数にAWS S3とAWS CloudWatchの読み込み/書き込みの権限を付与します。

AWSコンソールでIAMの画面を開き、ロール画面を開きます。

信頼されたエンティティの種類を選択で、AWSサービスを選択し続いてLambdaを選択し次のステップ: アクセス権限をクリック。

actcast011.png

AWSLambdaExecuteを選択し、次のステップ:タグをクリック。

actcast012.png

タグは任意に設定し次のステップ:確認をクリック。


  • ロール名 : 任意の名称をつけます。 ここでは、lambda-s3-execution-roleとしています。

ロールの作成をクリックします。


S3のバケット作成

Actcastで取得した画像を保存するS3バケットを作成します。

AWSコンソールからS3のページを開きバケットを作成するをクリック。

バケット名を入力し、リージョンを選択します。


  • バケット名 : 任意の名称をつけます。

  • リージョン : us-east-1

以降、Lambdaもus-east-1を使用します。

actcast013.png


Lambdaのセットアップ

Face Trackingで取得したBase64形式のデータをバイナリデータに変換するLambda関数を作成します。

AWSコンソールからLambdaのページを開き、関数の作成をクリック。

一から作成をクリックします。


  • 名前 : 任意の名前を入力します。ここでは、actcast-decode-base64とします。

  • ランタイム : Node.js 8.10

  • ロール : 既存のロールを選択

  • 既存のロール : lambda-s3-execution-role
    actcast014.png


Lambda関数のデプロイ

下記構成でnpm run deployを実行し、デプロイします。

.

├── index.js
└── package.json


index.js


'use strict';

const aws = require('aws-sdk');
const s3 = new aws.S3();
const https = require('https');
const fs = require('fs');
const querystring = require('querystring');

exports.handler = function (event, context, callback) {

// add logging level
console.log = console.log.bind(null, '[LOG]');
console.info = console.info.bind(null, '[INFO]');
console.warn = console.warn.bind(null, '[WARN]');
console.error = console.error.bind(null, '[ERROR]');

// variables
const response = {}

// check event
console.log(event);

// get JSON body from actcast
const body = JSON.parse(event.body);
const fase = body.face;
const timestamp = body.timestamp;

// decode
const decode = new Buffer.from(fase, 'base64');

// save data in s3
const params = {
// 作成したバケット名
Bucket: 'hogehoge',
// S3にアップロードされるファイル名のサフィックス
Key: timestamp + '-face.png',
ContentType: 'image/png',
Body: decode
};

s3.putObject(params, function (err, data) {
if (err) {
console.error(err);
console.error('image upload failed');

// create response
response.statusCode = 400
response.body = JSON.stringify({
message: 'fail.'
})
callback(null, response);

} else {
console.log('image upload success');

// create response
response.statusCode = 200
response.body = JSON.stringify({
message: 'image has been uploaded to S3'
})

callback(null, response);
}
});
};



package.json

{

"name": "actcast-decode-base64",
"version": "1.0.0",
"description": "decode base64",
"main": "index.js",
"scripts": {
# Lambda関数のarnを指定。 profileaws credentialsで設定した値。
"deploy": "aws lambda update-function-code --function-name arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:actcast-decode-base64 --zip-file fileb://Lambda-Deployment.zip --profile lambda",
"predeploy": "zip -r Lambda-Deployment.zip * -x *.zip *.json *.log"
},
"dependencies": {
"aws-sdk": "latest"
},
"devDependencies": {
"run-local-lambda": "^1.1.1"
}
}


API Gatewayのセットアップ


APIを作成

API Gatewayを作成します。AWSコンソールからAPI Gatewayを開きAPIの作成をクリック。

actcast015.png

API名はわかりやすいものを適当に入力し、APIの作成をクリック。ここでは、actcastとしました。

actcast016.png


リソースを作成

アクションメニューからリソースの作成をクリック。

actcast017-0.png

リソース名を入力するとリソースパスが自動的に表示されます。このパスがAPIのURIとなります。ここでは、FaceTrackingとしました。

入力したらリソースの作成をクリック。

actcast017.png


メソッドの作成

作成したリソースを選択し、アクションメニューからメソッドの作成をクリック。

続けて、メソッド選択のメニューからPOSTをクリック。

actcast018.png

POSTメソッドを作成するとAPI Gatewayと紐付けるLambda関数を選択する画面となります。選択、入力して保存をクリック。

結合タイプ: Lambda関数

Lambdaプロキシ統合の使用: チェック

Lambdaリージョン : Lambda関数を作成したリージョン。ここでは、us-east-1

Lambda関数 : 作成したLambda関数。ここでは、actcast-decode-base64

actcast019.png

権限付与のダイアログが表示されるので、OKをクリック。

actcast020.png


APIのデプロイ

作成したリソースを選択し、アクションメニューからAPIのデプロイをクリック。

actcast021.png

ここでは新規にステージを作成し、そこにデプロイします。

ステージ名に任意のステージ名を入力しデプロイをクリック。ここで入力したステージ名はAPIのURIに含まれます。

actcast022.png

デプロイが完了すると、APIのエンドポイントURLが作成されます。

actcast023.png


Actcastのセットアップ2


Castの作成

FaceTrackingのCastsからMake New Castをクリック。

actcast024.png

Cast Nameには任意の名称を入力します。Target Devicesは、このCastを動作させるデバイスを選択します。

入力・選択後、Configure Actionをクリック。

actcast025.png

Select ServiceWebhookをクリック。

actcast026.png

最後に、Actcastから接続するエンドポイントURLや送信するjsonの内容を設定します。

URL : API Gatewayで作成したエンドポイントURL。

Method : POST

Headers: Content-Type application/json

Body :

{

"face": "{{ data.face }}",

"timestamp":{{ data.timestamp }}

}

{{ data.face }}はカメラで撮影した画像をBase64エンコードした値、{{ data.timestamp }} は撮影日時(unixtime)です。

actcast027.png


顔認識

Raspberry Piを起動すると、画面にカメラモジュールで撮影された画像が映し出されます。

FaceTrackingが顔を認識すると、四角の枠で追跡されます。

顔を認識すると、枠内の画像がS3上の指定したバケットに保存されます。


サンプル画像

(顔画像なので、モザイク処理しました。)

カメラが傾いていたので、左に90度傾いた画像になっています。

顔を認識してから撮影されるまでタイムラグがあるため、撮影された画像には背景しか写っていないということも割とありました。

人間の顔のほかにも猫の顔も認識したので、ペットの観察にも使えるかも知れません。

1550938446_374289-face.png