0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWSを使って人間の顔認識アーキテクチャ構築

Posted at

まえがき

こんにちは!mochiです。
先日、社内での成果物発表会を行いました。
そこで今回、私が作成したものをここでもアウトプットの意味も込めて共有させて頂きます。

AWSを使っての顔認識アーキテクチャ

私が今回チャレンジしたのは、人間の顔が写っている画像をS3バケットにアップロードすると、自動的に同じバケット内に分析結果JSONファイルが出力されるというものです。
834D8E9F-1FB6-44B3-AE90-D23F86D5A5FD.png

しかし、それだけでは味気ないので分析結果をより視覚的に分かりやすくするため、静的WEBサイトによってJSON出力結果のGUI結果出力サイトも作成しました。
↓こんな感じ(S3による静的WEBサイトホスティング)
スクリーンショット 2025-08-31 10.39.12.png
JSONファイルと元画像をこちらのサイトにアップロードすれば、JSONよりも視覚的に見やすく結果を確認することができます。

構築手順

このアーキテクチャの構築手順をご紹介します。

S3バケットの作成

AWSマネジメントコンソールより、画像とJSONの受け子となるS3バケットを一つ作成します。
リージョンは自分の住んでいる地域から一番近いものを選びます。(レイテンシ回避)
パブリックアクセスはブロックします。

Lambda関数の作成と設定

次にS3とRekognitionを中継するLambda関数を作成します。
ランタイムはPython3.12
コードは以下をデプロイします。

python
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関数に付与します。

nginx
AmazonRekognitionFullAccess
AmazonS3FullAccess

次にLambda関数にS3とのトリガー設定を行います。
マネジメントコンソールからLambdaを選択。
『トリガーを追加』を選択すると、ソースでS3を選べますので最初に作成したバケットを指定して紐付けます。
イベントタイプはPUTを選択。(ファイルアップロード)
プレフィックスやサフィックスはブランクでOKです。

動作テスト🚀(幼少期の私の画像をアップロードします)

2025-08-23 19.37の画像.jpg
S3バケットに人間の顔写真をアップロードすると、3秒後にはJSONが自動出力されました🚀
中身はこんな感じ↓

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と生画像をアップロードします。

スクリーンショット 2025-08-31 12.11.45.png
GUIでより分かりやすくRekognitionでの分析結果を見ることができます!
見事にHAPPY全振りしています😂
性別だけ、FemaleではないですがConfidence(確信度)がそこまで高くないので、赤ちゃんですし無理もないかと、、、

S3でのWEBサイトは、S3バケットをもう一つ作成して静的WEBサイトホスティングを有効にします。
そしてChatGPTにhtmlファイルとCSSで必要なファイルを作成してもらっただけです。
S3にそれらのファイルをアップロードするだけで、分析結果処理サイトとして成立します。

あとがき

今回、自社での成果物発表として顔分析アーキテクチャを作成しましたが、本当に楽しみながら構築することができました!組織が発表会を催すから参加するのではなく、自分からどんどんこういったものを作成してみて、成功すればそれを周りに自慢する!
失敗すれば、どこがダメだったのかを振り返って周りに相談する。
のようなサイクルを作っていければ、どんどんエンジニアとして成長していけるのかなと考えるきっかけにもなりました!
資格取得だけではなく、実際に触ってみる経験も増やしていきます🔥

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?