chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

Node.jsからAmazon Rekognition (detectFaces)を呼び出してみる

課題:JSまたはNode.jsからRekognision APIを呼び出して動作確認する
アプローチ:AWSのサンプルコード(Node.js版)をベースに少し改変してUbuntu環境で動かす
結果:動くには動いた
問題点:(1)ソースコードをビルドしているのか、起動までえらく時間がかかる、(2)メソッドは多分非同期なのだが、非同期で動くコードをNode-REDの中にどうやって組み込めばいいのかちょっと分からず(応答を待ってフローを流す??)

詳細:
npmコマンドを用いて、Node.js用にAWS SDK をインストールする

npm install aws-sdk

サンプルコードを参考に短く試作。コードは以下

#!/usr/bin/nodejs

// Load the SDK
const AWS = require('aws-sdk');   // should be let ??

const REGION = 'us-east-1';
const BUCKET =  <buket-name>                 //  eg  'rekognition-bucket'
const PHOTO = <phoeo-file>                      //  eg   'face001.jpg'
const PROFILENAME = 'default';

const credentials = new AWS.SharedIniFileCredentials({profile: PROFILENAME});
AWS.config.credentials = credentials;
AWS.config.update({region:REGION});

//console.log('creating class'); 
const client = new AWS.Rekognition();
const params = {
    Image: { S3Object: { Bucket: BUCKET, Name: PHOTO }},
    Attributes: ['ALL']
}

console.log('calling method'); 
client.detectFaces(params, (err, response) => {
    if (err) {
        console.log(err, err.stack); // an error occurred
    } else {
        console.log(`Detected faces for: ${PHOTO}`);
        response.FaceDetails.forEach(data => {
           const low  = data.AgeRange.Low;
           const high = data.AgeRange.High;
           console.log(`The detected face is between ${low} and ${high} years old`)
    });
  }
});
console.log('fin'); 

補足:credentialsは /home/<user_name>/.aws/credentialsに配置。JSは実装に自信ないので、無難にdefautとした
file: ~/.aws/credentials

[default]
aws_access_key_id=AK*******************SS
aws_secret_access_key=s8******************Z7
region = us-east-1
output = json

[rekognition]
aws_access_key_id=AK************SS
aws_secret_access_key=s8*************Z7
region = us-east-1
output = json

(書いてはいるが、region, outputは不要と思う)
実行結果は以下

$ ./rekognition.js
calling method
fin
(node:329) NOTE: We are formalizing our plans to enter AWS SDK for JavaScript (v2) into maintenance mode in 2023.

Please migrate your code to use AWS SDK for JavaScript (v3).
For more information, check the migration guide at https://a.co/7PzMCcy
Detected faces for: face001.jpg
The detected face is between 52 and 60 years old

試作して分かった事(問題点)

  1. メソッドが呼び出されるまでにえらく時間がかかる
  2. detectFacesは非同期で呼び出される思われる(そう考える理由は、メソッド開始、終了がlog出力された後に、解析結果がlog出力されるから)。非同期で動くスクリプトとNode-REDのフローをどうくっつけるのか分からない。非同期で呼ばれるメソッドの中に、フローを流すメソッドを入れておく??

■補足
Nodeをどうやって作成するかの解説記事。
はじめてのノード開発 : Node-RED日本ユーザ会
当たり前だが、JSの世界は基本非同期なので、、ノードが呼び出されるためのhook(?)や、次ノードに流すためのsendが提供されているようだった。ざっと読む限り、まぁそういう実装になりますね・・・という感じではあるが・・
ひとまず、サンプル通りに試作ノードを作って動かしてから、上記スクリプトをはめ込むか・・

■参考URL
Detecting faces in an image - Amazon Rekognition
File: README — AWS SDK for JavaScript