Giter Site home page Giter Site logo

aws-rekognition-sandbox's Introduction

aws-rekognition-sandbox

ci Coverage Status cd

Amazon Rekognitionで出来る事を調査する為の検証用プロジェクト

Getting Started

AWS Lambda + Goで実装しています。

デプロイには serverless framework を利用しています。

AWSクレデンシャルの設定

名前付きプロファイル を利用しています。

このプロジェクトで利用しているプロファイル名は nekochans-dev です。

環境変数の設定

direnv 等を利用して環境変数を設定します。

export DEPLOY_STAGE=デプロイステージを設定、デフォルトは dev
export REGION=AWSのリージョンを指定、例えば ap-northeast-1 等
export TRIGGER_BUCKET_NAME=Lambda関数実行のトリガーとなるS3バケット名を指定

デプロイ

  1. npm ci を実行(初回のみでOK)
  2. make deploy を実行

Lambda関数の仕様

imageRecognition

Amazon Rekognitionで取得出来るラベルをそのまま返すAPIです。

例えば test/images/abyssinian-cat.jpg を解析したい場合は以下のように実行します。

# MacOS上からzshシェルを用いて実行しています
echo '{"image" : "'"$( base64 ./test/images/abyssinian-cat.jpg)"'", "imageExtension": ".jpg"}' | \
curl -v -X POST -H "Content-Type: application/json" -d @- https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/images/recognition | jq

下記のようなレスポンスが返ってきます。

{
  "labels": [
    {
      "Confidence": 98.68521118164062,
      "Instances": [
        {
          "BoundingBox": {
            "Height": 0.8715125322341919,
            "Left": 0.01610049419105053,
            "Top": 0.0782160758972168,
            "Width": 0.9815520644187927
          },
          "Confidence": 98.68521118164062
        }
      ],
      "Name": "Cat",
      "Parents": [
        {
          "Name": "Pet"
        },
        {
          "Name": "Mammal"
        },
        {
          "Name": "Animal"
        }
      ]
    },
    {
      "Confidence": 98.68521118164062,
      "Instances": [],
      "Name": "Pet",
      "Parents": [
        {
          "Name": "Animal"
        }
      ]
    },
    {
      "Confidence": 98.68521118164062,
      "Instances": [],
      "Name": "Mammal",
      "Parents": [
        {
          "Name": "Animal"
        }
      ]
    },
    {
      "Confidence": 98.68521118164062,
      "Instances": [],
      "Name": "Animal",
      "Parents": []
    },
    {
      "Confidence": 95.80082702636719,
      "Instances": [],
      "Name": "Abyssinian",
      "Parents": [
        {
          "Name": "Cat"
        },
        {
          "Name": "Pet"
        },
        {
          "Name": "Mammal"
        },
        {
          "Name": "Animal"
        }
      ]
    }
  ]
}

.jpg, .jpeg, .png, .webp 以外の画像は受け付けていません。

detectFaces

Amazon Rekognition イメージ内の顔の検出API で取得出来るラベルをそのまま返すAPIです。

以下のようにリクエストを行います。

# MacOS上からzshシェルを用いて実行しています
echo '{"image" : "'"$( base64 ./test/images/manx-cat.jpg)"'"}' | \
curl -v -X POST -H "Content-Type: application/json" -d @- https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/images/faces | jq

下記のようなレスポンスが返ってきます。

{
  "detectFacesOutput": {
    "FaceDetails": [
      {
        "AgeRange": null,
        "Beard": null,
        "BoundingBox": {
          "Height": 0.29183787,
          "Left": 0.07472489,
          "Top": 0.2709639,
          "Width": 0.5417548
        },
        "Confidence": 66.72364,
        "Emotions": null,
        "Eyeglasses": null,
        "EyesOpen": null,
        "Gender": null,
        "Landmarks": [
          {
            "Type": "eyeLeft",
            "X": 0.30981517,
            "Y": 0.33770314
          },
          {
            "Type": "eyeRight",
            "X": 0.50000805,
            "Y": 0.33927107
          },
          {
            "Type": "mouthLeft",
            "X": 0.30706555,
            "Y": 0.50413615
          },
          {
            "Type": "mouthRight",
            "X": 0.46517605,
            "Y": 0.5042505
          },
          {
            "Type": "nose",
            "X": 0.47034857,
            "Y": 0.42010358
          }
        ],
        "MouthOpen": null,
        "Mustache": null,
        "Pose": {
          "Pitch": 12.441085,
          "Roll": 9.164827,
          "Yaw": 6.8097568
        },
        "Quality": {
          "Brightness": 95.53643,
          "Sharpness": 92.22801
        },
        "Smile": null,
        "Sunglasses": null
      },
      {
        "AgeRange": null,
        "Beard": null,
        "BoundingBox": {
          "Height": 0.2223244,
          "Left": 0.7428785,
          "Top": 0.74860626,
          "Width": 0.3278522
        },
        "Confidence": 66.78572,
        "Emotions": null,
        "Eyeglasses": null,
        "EyesOpen": null,
        "Gender": null,
        "Landmarks": [
          {
            "Type": "eyeLeft",
            "X": 0.86015856,
            "Y": 0.7967467
          },
          {
            "Type": "eyeRight",
            "X": 0.91044015,
            "Y": 0.82621884
          },
          {
            "Type": "mouthLeft",
            "X": 0.7535296,
            "Y": 0.8594641
          },
          {
            "Type": "mouthRight",
            "X": 0.7945388,
            "Y": 0.8837279
          },
          {
            "Type": "nose",
            "X": 0.81529987,
            "Y": 0.8392649
          }
        ],
        "MouthOpen": null,
        "Mustache": null,
        "Pose": {
          "Pitch": 9.174266,
          "Roll": 60.05953,
          "Yaw": 24.53278
        },
        "Quality": {
          "Brightness": 85.71859,
          "Sharpness": 4.374837
        },
        "Smile": null,
        "Sunglasses": null
      }
    ],
    "OrientationCorrection": "",
    "ResultMetadata": {}
  }
}

人の顔がはっきり写っている場合は、信頼度(Confidence)はかなり高めに出ます。(99%以上が多かったです)

しかし動物の顔を検出する事もあります。(その場合は信頼度(Confidence)は低めになります。)

isAcceptableCatImage

TRIGGER_BUCKET_NAME で指定したS3バケットの tmp/ フォルダにファイルがアップロードされた場合に起動します。

画像が🐱の画像かどうかを判定し、🐱画像だった場合は TRIGGER_BUCKET_NAMEcat-images/ フォルダに移動させます。

imageRecognition をコールすると TRIGGER_BUCKET_NAME で指定したS3バケットの tmp/ フォルダに画像が入るので、それで動作確認が可能です。

ちなみに本プロジェクトでは活用していませんが、以下のように内部処理で🐱の種類(マンチカン、スコティッシュフォールドとか)を画像の解析結果から判定しています。

これらをDB等に保存しておけば、画像検索の要素として使えるかもしれません。

  • test/images/abyssinian-cat.jpgの場合は以下のようになる

{"isAcceptableCatImage": true, "typesOfCats": ["Abyssinian"]}

  • test/images/manx-cat.jpg の場合は以下のようになる

{"isAcceptableCatImage": true, "typesOfCats": ["Manx"]}

テストコードの作成

テストコードは aws-sdk-go-v2 をモックに置き換える形で実装します。

下記のようにモックを生成します。(GoのDockerコンテナの中で実行します)

mockgen -source=infrastructure/rekognition_client.go -destination mock/rekognition_client.go -package mock

こちらのコマンドは mock/rekognition_client.go を生成した時のものです。

他にもモックが必要な物があればこちらと同じようにモック化します。

モックを生成する際は以下のルールに従って生成します。

  • package名は mock
  • mock/ ディレクトリに配置する

Makefilegenerate-mock が定義されています。

make generate-mock を実行するとテストに必要なモックが全て作成されるようになっています。

必要なモックが増えた場合は Makefile の修正も行う必要があります。

aws-rekognition-sandbox's People

Contributors

keitakn avatar

Watchers

James Cloos avatar  avatar

aws-rekognition-sandbox's Issues

テストコードを作成する

Doneの定義

  • テストコードが作成されている事

補足情報

AWS SDKの部分はMockに置き換える必要がある

CI/CDの設定を追加する

Doneの定義

  • PR作成時にテストが実行されるようになっている事
  • mainブランチへのマージタイミングでデプロイが実施されるようになっている事

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.