Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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を指定 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の作成をクリック。
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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away