はじめに
2019年7月31日にActcast β版がリリースされ、α版の設定データが削除されました。最新版のActcast WriterでActcast エージェントのインストールとデバイスの再登録が必要になります。
2018年12月、Idein株式会社から高度なセンシング技術を利用したIoTシステムを安価に構築・運用できるプラットフォームサービスActcastのα版がリリースされました。
Raspberry Piを使って手軽に画像認識が試せるので、 Face Tracking という Act 試してみました。(Actとは)
準備するもの
- RaspberryPi 3 model B+
- アイ・オー・データ機器 UD-RP3BP Raspberry Pi メインボード(Bluetooth、Wi-Fi対応モデル) Raspberry Pi 3 Model B+
- ドキュメントによると、Raspberry Pi 1 Model B, 1 Model B+, 2 Model B, 3 Model B, 3 Model B+, Zero W, Zero WHが推奨されています。
- 公式カメラモジュール
- microSDカード (4GBから32GB)
- Actcast エージェントのインストールには、4GBあれば足ります。
- サンディスク microSDHCメモリーカード 16GB Class10 UHS-I SDSDQUL-016G-J35A
- HDMI接続のディスプレイ
- もしくは、Raspberry Pi 3 Model Bに Quimat 3.5インチタッチスクリーン HDMIモニタTFT LCDディスプレイ を接続のようなRaspberry Pi用ディスプレイ
前提条件
- Getting Started with Actcast (α版) に従い、 Actcast へのサインアップとデバイスの登録が完了していること。(GitHubのアカウントが必要)
- AWSにアカウントがあり、LamdaがS3にアクセスするためのロールが設定されていること。
- Node.jsのモジュールをAWS Lambdaにデプロイする環境が整っていること。
参考情報
- API Gateway の Lambda プロキシ統合をセットアップする
- [Node.js] Base64エンコードされたファイルデータをデコードして、S3にputObjectする
- API Gateway の Lambda プロキシ統合でバイナリデータをレスポンスする(Python3.6)
- Lambda+API Gatewayで画像を返す時に気をつけるべきx個のこと
- API Gateway+Lambdaでバイナリデータを処理
- 文字列を変換する オンラインBase64でデコーダ
- AWS SDK for JavaScriptでS3でファイル操作
- Node.jsドキュメントからbase64エンコーディングをおさらい
- 今年のうちに対応したい、Node.jsのBufferに潜む危険性
- AWSによるサーバーレスアーキテクチャ
処理の流れ
Face Trackingで撮影された画像はBase64形式で出力されるため、バイナリ変換を行いS3に保存します。
Actcastのセットアップ
Actの作成
New Act ->Demo の順にクリック。

Face Trackingをクリック。

Act Nameには、任意の名称を入力します。初期値はFace Trackingとなっているので、とくに変更がなければこのままとします。
displayにチェックを入れ、Create New ActをクリックしActを作成します。

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

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

動作確認
ディスプレイが接続されている場合
Face Trackingのセットアップを行った際にdisplayを有効にしていれば、ディスプレイに映像が映し出されているはずです。自分の顔にカメラを向けると、顔を認識し四角の枠が顔を追跡します。
ディスプレイが接続されていない場合
カメラモジュールで撮影した画像を設定画面上で確認するTake Photo機能で確認します。Devicesをクリックしてデバイス一覧を表示し、デバイス名の右端にある>をクリック。

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

AWS環境のセットアップ
IAMユーザのアクセス権限のセットアップ
AWSにLambda関数をデプロイするために、IAMユーザにアクセス権限を割り当てます。
AWSコンソールでIAMのページを開きIAMユーザを選択します。アクセス権限タブのインラインポリシーの追加をクリック。

ビジュアルエディタタブを選択し、
- サービス :
Lambdaを選択します。 - アクション :
- 読み込みグループ :
GetFunction - 書き込みグループ :
UpdateFunctionCode,UpdateFunctionConfiguration
- 読み込みグループ :
- リソース :
指定をチェック -
任意のリソースタイプ = functionの右にあるすべてをチェック。

ポリシーの確認をクリックし、名前に任意の名称をつけます。ここでは、Lambda-Update-Policyとしています。
Lambda関数のIAMロールのセットアップ
Lambda関数にAWS S3とAWS CloudWatchの読み込み/書き込みの権限を付与します。
AWSコンソールでIAMの画面を開き、ロール画面を開きます。
信頼されたエンティティの種類を選択で、AWSサービスを選択し続いてLambdaを選択し次のステップ: アクセス権限をクリック。
AWSLambdaExecuteを選択し、次のステップ:タグをクリック。

タグは任意に設定し次のステップ:確認をクリック。
- ロール名 : 任意の名称をつけます。 ここでは、
lambda-s3-execution-roleとしています。
ロールの作成をクリックします。
S3のバケット作成
Actcastで取得した画像を保存するS3バケットを作成します。
AWSコンソールからS3のページを開きバケットを作成するをクリック。
バケット名を入力し、リージョンを選択します。
- バケット名 : 任意の名称をつけます。
- リージョン :
us-east-1
以降、Lambdaもus-east-1を使用します。
Lambdaのセットアップ
Face Trackingで取得したBase64形式のデータをバイナリデータに変換するLambda関数を作成します。
AWSコンソールからLambdaのページを開き、関数の作成をクリック。
一から作成をクリックします。
- 名前 : 任意の名前を入力します。ここでは、actcast-decode-base64とします。
- ランタイム :
Node.js 8.10 - ロール :
既存のロールを選択 - 既存のロール :
lambda-s3-execution-role
Lambda関数のデプロイ
下記構成でnpm run deployを実行し、デプロイします。
.
├── index.js
└── package.json
'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);
}
});
};
{
"name": "actcast-decode-base64",
"version": "1.0.0",
"description": "decode base64",
"main": "index.js",
"scripts": {
# Lambda関数のarnを指定。 profileはaws 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の作成をクリック。

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

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

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

POSTメソッドを作成するとAPI Gatewayと紐付けるLambda関数を選択する画面となります。選択、入力して保存をクリック。
結合タイプ: Lambda関数
Lambdaプロキシ統合の使用: チェック
Lambdaリージョン : Lambda関数を作成したリージョン。ここでは、us-east-1
Lambda関数 : 作成したLambda関数。ここでは、actcast-decode-base64
APIのデプロイ
作成したリソースを選択し、アクションメニューからAPIのデプロイをクリック。

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

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

Actcastのセットアップ2
Castの作成
FaceTrackingのCastsからMake New Castをクリック。

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

最後に、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)です。

顔認識
Raspberry Piを起動すると、画面にカメラモジュールで撮影された画像が映し出されます。
FaceTrackingが顔を認識すると、四角の枠で追跡されます。
顔を認識すると、枠内の画像がS3上の指定したバケットに保存されます。
サンプル画像
(顔画像なので、モザイク処理しました。)
カメラが傾いていたので、左に90度傾いた画像になっています。
顔を認識してから撮影されるまでタイムラグがあるため、撮影された画像には背景しか写っていないということも割とありました。
人間の顔のほかにも猫の顔も認識したので、ペットの観察にも使えるかも知れません。







