はじめに
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度傾いた画像になっています。
顔を認識してから撮影されるまでタイムラグがあるため、撮影された画像には背景しか写っていないということも割とありました。
人間の顔のほかにも猫の顔も認識したので、ペットの観察にも使えるかも知れません。