関数の実装
いよいよコードを実装します。ここでは作業環境にMacを利用する前提で説明します。
まず,FaceDetectProject
として作っておきましょう。
プロジェクトとなるフォルダを作っておく
$ mkdir FaceDetectProject
Face APIを利用するモジュールの導入
Functionsには,Net::Azure::CognitiveService::Face
CPANモジュールの導入には,cpanm
を使います。プロジェクトフォルダ直下でcpanm
を使い,
CPANモジュールをプロジェクトに導入する
$ cpanm -n -L local Net::Azure::CognitiveServices::Face
関数名フォルダの作成
関数名フォルダの名称はそのまま関数名となりますので,InspectFace
という名称で関数名フォルダを作ります。
関数名フォルダを作る
$ mkdir InspectFace
ここから先は,
function.jsonの作成
トリガとバインディングの設定をするために,function.
を作成します。InspectFace
はHTTPリクエストを受けてHTTPレスポンスを返す関数ですので,function.
と同じです。
run.shの作成
関数本体となるrun.
は次の内容です。
run.
perl task.pl > $res
Functionsから起動されたときにtask.
を起動し,res
で指定されたファイルにレスポンスデータを出力させる役割を担います。
Perlプログラムの作成
関数本体から呼び出されるtask.
を作ります。
task.
use strict;
use warnings;
use lib "../local/lib/perl5";
use Net::Azure::CognitiveServices::Face;
use JSON 'encode_json';
# (1)長い名前なので変数に入れて短くする
my $cog = 'Net::Azure::CognitiveServices::Face';
# (2)環境変数から,Face APIの設定値を取得する
$cog->endpoint($ENV{FACEAPI_URL});
$cog->access_key($ENV{FACEAPI_KEY});
# (3)HTTPクエリパラメータimageを取得する
my $image_url = $ENV{REQ_QUERY_IMAGE};
# (4)デフォルトのレスポンスを定義する
my $res = {
status => 400,
headers => {'Content-Type' => 'application/json'},
body => {
message => 'parameter "image" is required',
}
};
# (5)画像URLが指定されている場合のみ顔認識を試みる
if ($image_url) {
# (6)Face APIクライアントを使って顔認識を行う
my $faceapi = $cog->Face;
my $result = $faceapi->detect(
$image_url,
returnFaceAttributes => ['age', 'gender']
);
# (7)認識した顔情報から年齢と性別を抽出する
my @faces = ();
if ($result->[0]) {
@faces = map { $_->{faceAttributes} } @$result;
}
# (8)レスポンスデータを上書きする
$res = {
status => 200,
headers => {
'Content-Type' => 'application/json'
},
body => {
faces => [@faces]
}
};
}
# (9)レスポンスを返す
print encode_json($res);
冒頭のuse
文では,Net::Azure::CognitiveService::Face
モジュールを利用するので,$cog
にモジュール名を代入し,JSON
モジュールをuse
していますが,
(2)では,Net::Azure::CognitiveService::Face
に対し,
(3)では,image
を取得しています。
(4)ではデフォルトのレスポンスを定義しています。もしクエリパラメータimage
が指定されていない場合,
(6)でFace APIに顔認識のリクエストを行い,@faces
に格納します。顔が認識されなかった場合は何もしません。
(8)でレスポンスデータを正常系のものに上書きしています。このとき,@faces
を配列リファレンスに展開します。
そして(9)でレスポンスデータをJSONに変換して,print
で出力しています。run.
ではtask.
の出力内容をそのまま環境変数resで指定されているファイルにリダイレクトしており,