まえがき
こんにちは!mochiです。
先日、社内での成果物発表会を行いました。
そこで今回、私が作成したものをここでもアウトプットの意味も込めて共有させて頂きます。
AWSを使っての顔認識アーキテクチャ
私が今回チャレンジしたのは、人間の顔が写っている画像をS3バケットにアップロードすると、自動的に同じバケット内に分析結果JSONファイルが出力されるというものです。
しかし、それだけでは味気ないので分析結果をより視覚的に分かりやすくするため、静的WEBサイトによってJSON出力結果のGUI結果出力サイトも作成しました。
↓こんな感じ(S3による静的WEBサイトホスティング)
JSONファイルと元画像をこちらのサイトにアップロードすれば、JSONよりも視覚的に見やすく結果を確認することができます。
構築手順
このアーキテクチャの構築手順をご紹介します。
S3バケットの作成
AWSマネジメントコンソールより、画像とJSONの受け子となるS3バケットを一つ作成します。
リージョンは自分の住んでいる地域から一番近いものを選びます。(レイテンシ回避)
パブリックアクセスはブロックします。
Lambda関数の作成と設定
次にS3とRekognitionを中継するLambda関数を作成します。
ランタイムはPython3.12
コードは以下をデプロイします。
import json
import boto3
import urllib.parse
rekognition = boto3.client('rekognition')
s3 = boto3.client('s3')
def lambda_handler(event, context):
print("Event:", json.dumps(event)) # デバッグログ
try:
# イベントからS3バケット名と画像ファイル名を取得
record = event['Records'][0]
bucket = record['s3']['bucket']['name']
key = urllib.parse.unquote_plus(record['s3']['object']['key'])
# Rekognitionで顔認識
response = rekognition.detect_faces(
Image={'S3Object': {'Bucket': bucket, 'Name': key}},
Attributes=['ALL']
)
face_details = response['FaceDetails']
# 結果をS3に保存
result_key = f"{key}_result.json"
s3.put_object(
Bucket=bucket,
Key=result_key,
Body=json.dumps(face_details, indent=2),
ContentType='application/json'
)
return {
'statusCode': 200,
'body': f"顔分析完了。結果は {result_key} に保存されました。"
}
except Exception as e:
print(f"Error: {str(e)}")
raise e
コードで直接Rekognitionとのトリガー設定をできますので、マネコンからRekognitionを紐づけたりする必要はありません。
コードのデプロイが済んだら、IAMからLambdaの実行ロールを付与する必要があります。
ここでは『Amazons3fullaccess』『Amazonrekognitionfullaccess』をLambda関数に付与します。
AmazonRekognitionFullAccess
AmazonS3FullAccess
次にLambda関数にS3とのトリガー設定を行います。
マネジメントコンソールからLambdaを選択。
『トリガーを追加』を選択すると、ソースでS3を選べますので最初に作成したバケットを指定して紐付けます。
イベントタイプはPUTを選択。(ファイルアップロード)
プレフィックスやサフィックスはブランクでOKです。
動作テスト🚀(幼少期の私の画像をアップロードします)
S3バケットに人間の顔写真をアップロードすると、3秒後にはJSONが自動出力されました🚀
中身はこんな感じ↓
{
"BoundingBox": {
"Width": 0.2644006013870239,
"Height": 0.28838077187538147,
"Left": 0.3533176779747009,
"Top": 0.2317163646221161
},
"AgeRange": {
"Low": 0,
"High": 2
},
"Smile": {
"Value": true,
"Confidence": 98.43357849121094
},
"Eyeglasses": {
"Value": false,
"Confidence": 99.79071807861328
},
"Sunglasses": {
"Value": false,
"Confidence": 99.79888153076172
},
"Gender": {
"Value": "Female",
"Confidence": 66.87081909179688
},
"Beard": {
"Value": false,
"Confidence": 93.23551177978516
},
"Mustache": {
"Value": false,
"Confidence": 99.67396545410156
},
"EyesOpen": {
"Value": true,
"Confidence": 75.96437072753906
},
"MouthOpen": {
"Value": true,
"Confidence": 99.11840057373047
},
"Emotions": [
{
"Type": "HAPPY",
"Confidence": 99.67448425292969
},
{
"Type": "SURPRISED",
"Confidence": 0.14507770538330078
},
{
"Type": "CALM",
"Confidence": 0.00464320182800293
},
{
"Type": "CONFUSED",
"Confidence": 0.0037799279671162367
},
{
"Type": "FEAR",
"Confidence": 0.0004112720489501953
},
{
"Type": "SAD",
"Confidence": 0.0003039836883544922
},
{
"Type": "DISGUSTED",
"Confidence": 0.00019669532775878906
},
{
"Type": "ANGRY",
"Confidence": 0.00011920928955078125
}
],
こんな感じで、出力してくれますがJSONだと少し結果が視覚的に分かりにくいかと思います。
そこで最初にご紹介したS3静的WEBサイトでのRekognitionビューアにJSONと生画像をアップロードします。
↓
GUIでより分かりやすくRekognitionでの分析結果を見ることができます!
見事にHAPPY全振りしています😂
性別だけ、FemaleではないですがConfidence(確信度)がそこまで高くないので、赤ちゃんですし無理もないかと、、、
S3でのWEBサイトは、S3バケットをもう一つ作成して静的WEBサイトホスティングを有効にします。
そしてChatGPTにhtmlファイルとCSSで必要なファイルを作成してもらっただけです。
S3にそれらのファイルをアップロードするだけで、分析結果処理サイトとして成立します。
あとがき
今回、自社での成果物発表として顔分析アーキテクチャを作成しましたが、本当に楽しみながら構築することができました!組織が発表会を催すから参加するのではなく、自分からどんどんこういったものを作成してみて、成功すればそれを周りに自慢する!
失敗すれば、どこがダメだったのかを振り返って周りに相談する。
のようなサイクルを作っていければ、どんどんエンジニアとして成長していけるのかなと考えるきっかけにもなりました!
資格取得だけではなく、実際に触ってみる経験も増やしていきます🔥