Amazon Rekognition による顔分析と動画分析

Amazon Rekognition では、機械学習の専門知識を必要とせずに、アプリケーションに画像およびビデオ分析を簡単に追加できます。
画像と動画の物体、人物、テキスト、シーン、活動を特定し、不適切なコンテンツを検出し、非常に正確な顔分析および顔検索機能を備えているので、さまざまなユーザー検証、人数のカウント、および公共安全のシーンで顔を検出、分析、比較できます。

【ラベル】

何千もの対象物体 (自転車、電話、ビルなど) とシーン (駐車場、ビーチ、都市など) を特定できます。動画を分析する際には、「小包の配達」や「サッカーの試合」など、特定のアクティビティも特定できます。

【カスタムラベル】

検出機能を拡張して、ビジネスに独自に役立つ画像から情報を抽出できます。ソーシャルメディアで会社のロゴを検索したり、店頭で商品を特定したり、アセンブリラインで機械部品を分類したり、ビデオでアニメーションキャラクターを検出したりできます。

【コンテンツの節度】

画像と動画アセット両方の不安全または不適切な可能性のあるコンテンツを特定し、お客様のニーズに基づいて許容したいものを正確にコントロールできる詳細なラベル付けを行います。

【テキスト検出】

写真や動画ではテキストが異なって表示される場合がありますが、歪んだり、ひずんだテキストを読み取って、店舗名、メディアで重なり合う強制字幕、道路標識、製品パッケージのテキストなどを正確に取得できます。

【顔検出と分析】

画像や動画に顔が表示されるタイミングを簡単に検出し、性別、年齢、目の大きさ、眼鏡、顔の毛など属性を取得できます。動画で顔の属性が時間と共にどう変化するか感情のタイムラインを作成することもできます。

【顔検索と検証】

高速で正確な顔検索機能で、顔画像の個人的なレポジトリを用いて写真やビデオ中の人物を特定できます。保存した顔画像を分析することにより、身元を確認することもできます。

【有名人の認識】

動画と画像ライブラリにある有名人を素早く特定し、動画や写真をカタログ化してマーケティング、広告、メディア産業でのユースケースに使えます。

【Personal Protective Equipment (PPE) の検出】

オンプレミスのカメラからの大規模画像を分析して、人物がフェイスカバー (マスク)、ハンドカバー (手袋)、ヘッドカバー (ヘルメット) など PPE を着用しているか、保護器具が、該当箇所を覆っているか自動検出します。

【動画セグメント検出】

サイレントブラックフレーム、クレジット、ショット境界、SMPTE カラーバーなど、動画の主要なセグメントを自動検出しますので、品質管理、広告挿入、コンテンツ準備のためのワークフローを合理化し、人的労力を節約し、アーカイブのモダナイゼーションをスケールできます。


Amazon Rekognition Image の料金

API を使用して画像を分析するたびに料金を請求します。単一の画像に対する複数の API の実行は、複数画像の処理としてカウントされます。
顔検索を有効にするには、検索できる顔メタデータのレポジトリを保存する必要があり、ストレージ料金は月ごとに課金され、1 か月未満の料金は日割りで計算されます。

無料利用枠  1 か月に 5000 枚の画像を分析し、1 か月に 1000 個の顔メタデータを保存できます。

東京リージョン

コストタイプ料金画像 1,000 枚あたりの料金
処理された 1 か月あたりの画像 100 万枚まで画像あたり 0.0013USD1.30USD
処理された 1 か月あたりの画像 101 万枚から 1,000 万枚まで画像あたり 0.001USD1.00USD
処理された 1 か月あたりの画像 1,001 万枚から 1 憶枚まで画像あたり 0.0008USD0.80USD
処理された 1 か月あたり画像が 1 億枚を超える画像あたり 0.0005USD0.50USD
料金

※ 1 枚または複数枚の画像を受け入れる API は、それぞれ処理された画像 1 枚分として計上されます。

Amazon Rekognition Video の料金

ビデオ内の同じセクションに複数の API 呼び出しを行った場合、各 API に対して個別に料金が発生し、S3 の保存ビデオや、Kinesis Video Streamsからライブストリーミングされたビデオの分析ができます。
顔検索を有効にするには、検索できる顔メタデータのレポジトリを保存する必要があり、ストレージ料金は月ごとに課金され、1 か月未満の料金は日割りで計算されます。

【東京リージョン】

保存されたビデオの分析

特徴料金
ラベル検出0.13USD/1 分
コンテンツのモデレーション0.13USD/1 分
テキスト検出0.13USD/1 分
顔検出0.13USD/1 分
有名人の認識0.13USD/1 分
顔検索0.13USD/1 分
人物の動線の検出0.13USD/1 分
保存されたビデオの分析

メディア分析

特徴料金
ショット検出0.065USD/1 分
ブラックフレーム、エンドクレジット、カラーバー (‘技術キュー’)検出0.065USD/1 分
メディア分析

ライブストリーミングビデオ分析

特徴料金
顔検索0.15USD/1 分
ライブストリーミングビデオ分析

※ 利用料金は月ごとに課金され、1 か月未満の料金は 1 分単位で按分して計算されます。

顔メタデータのストレージ1 か月あたり 0.00001 USD / 顔メタデータ
顔メタデータのストレージ

※ ストレージ料金は月ごとに課金され、1 か月未満の料金は日割りで計算されます。

無料利用枠  ひと月あたり 1,000 分の動画を分析できます。
       ラベル検出、コンテンツのモデレーション、顔検出、顔検索、有名人の認識、テキスト検出、人物の動線の検出
       が含まれます。

Amazon Rekognition カスタムラベルの料金

トレーニング時間

カスタムラベルを使用してカスタムモデルを構築する際には、トレーニング時間あたりの料金が発生します。
一般論で、モデルの 90% のトレーニングは 24 時間未満で終わります。
トレーニング時間が 72 時間を超えるモデルは自動的に終了されます。自動終了したトレーニングで請求されることはありません。

推論時間

カスタムモデルをトレーニングした各時間に対して、画像処理のコストがあります。
画像処理のために並行して複数のコンピューティングリソースを実行する場合があります。
請求時間数はトレーニングに費やす経過時間数より多い場合があります。

無料利用枠

無料利用枠は 3 か月間利用でき、1 カ月あたりトレーニング無料枠を 10時間、1 カ月あたり推論無料枠を 4 時間含みます。

料金表(東京リージョン)

特徴料金
推論4.00USD/時間
トレーニング1.37USD/時間
料金表(東京リージョン)

カスタムラベルのトレーニングと推論の使用は 1 分単位で課金されます。最低 1 分から課金されます。

APIリファレンス

boto3  boto3.client関数

機能  デフォルトのセッションを使用して、低レベルのサービスクライアントを作成する

構文  boto3.client(クライアント名)

戻り値 サービスクライアントのオブジェクト

Rekognition  detect_facesメソッド

機能  イメージ内の顔を大きい順に100 個まで検出し、検出した顔ごとのの詳細を返します。
    詳細には、顔のバウンディングボックス、信頼値 (バウンディングボックスに顔が含まれていること)、
    顔のランドマーク (目や口の座標など)、ひげの存在、サングラスなどの固定のアトリビュートセットが含まれます。

構文

{
   "Attributes": [ "string" ],
   "Image": { 
      "Bytes": blob,
      "S3Object": { 
         "Bucket": "string",
         "Name": "string",
         "Version": "string"
      }
   }
}

戻り値

{
   "FaceDetails": [ 
      { 
         "AgeRange": { 
            "High": number,
            "Low": number
         },
         "Beard": { 
            "Confidence": number,
            "Value": boolean
         },
         "BoundingBox": { 
            "Height": number,
            "Left": number,
            "Top": number,
            "Width": number
         },
         "Confidence": number,
         "Emotions": [ 
            { 
               "Confidence": number,
               "Type": "string"
            }
         ],
         "Eyeglasses": { 
            "Confidence": number,
            "Value": boolean
         },
         "EyesOpen": { 
            "Confidence": number,
            "Value": boolean
         },
         "Gender": { 
            "Confidence": number,
            "Value": "string"
         },
         "Landmarks": [ 
            { 
               "Type": "string",
               "X": number,
               "Y": number
            }
         ],
         "MouthOpen": { 
            "Confidence": number,
            "Value": boolean
         },
         "Mustache": { 
            "Confidence": number,
            "Value": boolean
         },
         "Pose": { 
            "Pitch": number,
            "Roll": number,
            "Yaw": number
         },
         "Quality": { 
            "Brightness": number,
            "Sharpness": number
         },
         "Smile": { 
            "Confidence": number,
            "Value": boolean
         },
         "Sunglasses": { 
            "Confidence": number,
            "Value": boolean
         }
      }
   ],
   "OrientationCorrection": "string"
}

構文説明

リクエストは以下のデータを JSON 形式で受け入れます。	
	
[Attributes]	
	
	デフォルト属性リストまたは全ての属性リストを返します。
	["DEFAULT"]指定の場合、BoundingBox,Confidence(信頼度),Pose(姿勢),Quality(品質), Landmarks(目印)
	["ALL"]指定の場合、、全ての属性リストを返しますが、操作完了まで時間がかかります。
	タイプ: 文字列の配列
	有効な値: DEFAULT | ALL
	指定は必須ではない
	
[Image]	
	{ 'Bytes’ : 画像データ }で手元のパソコンからAWSサーバへ直接アップロードします。上限サイズは5MB。
	{ 'S3Object'; 'Bucket' : バケット名, 'Name' : キー}とすると、S3へアップロード済みの画像データを処理できます。

戻り値説明

アクションが成功すると、サービスは HTTP 200 レスポンスを返します。	
サービスから以下のデータが JSON 形式で返されます。	
	
[FaceDetails]	
	
	配列にある顔の画像の詳細
	
方向補正	
	
	Amazon Rekognition は画像補正を実行しません。バウンディングボックスの座標は変換されず、
	イメージが回転される前のオブジェクトの位置を表します。

エラー内容

AccessDeniedException	
	
	アクションを実行する権限がありません。
	HTTP ステータスコード: 400
	
ImageTooLargeException	
	
	入力イメージサイズが制限文字数を超えています。あなたが呼び出す場合DetectProtectiveEquipmentの場合、
	イメージサイズまたは解像度が制限文字数を超えています。
	HTTP ステータスコード: 400
	
InternalServerError	
	
	Amazon Rekognition でサービスの問題が発生しました。もう一度やり直してください。
	HTTP ステータスコード: 500
	
InvalidImageFormatException	
	
	指定されたイメージ形式はサポートされていません。
	HTTP ステータスコード: 400
	
InvalidParameterException	
	
	入力パラメータが制約に違反しています。API オペレーションを再度呼び出す前にパラメータを検証します。
	HTTP ステータスコード: 400
	
InvalidS3ObjectException	
	
	Amazon Rekognition は、リクエストで指定された S3 オブジェクトにアクセスできません。
	HTTP ステータスコード:HTTP 400
	
ProvisionedThroughputExceededException	
	
	お客様のスループット制限を超えたリクエストの数。この上限を引き上げる場合は、Amazon Rekognition までお問い合わせください。
	HTTP ステータスコード:HTTP 400
	
ThrottlingException	
	
	Amazon Rekognition は一時的にリクエストを処理できませんでした。もう一度やり直してください。
	HTTP ステータスコード:HTTP 500

Rekognition  compare_facesメソッド

機能  ソースイメージ内に複数の顔がある場合、最大サイズの顔を検出して、その顔とターゲットイメージで検出された各顔を
    比較します。
    レスポンスとして、類似度スコアで降順に並べられた顔が一致した配列を返します。
    配列要素ごとに、バウンディングボックス、ランドマーク、ポーズの詳細(ピッチ、ロール、ヨー)、
    品質(明るさとシャープネス)、
    信頼度(バウンディングボックスに顔が含まれる信頼度)が提供されます。
    応答で類似度スコアを提供します。

構文

{
   "QualityFilter": "string",
   "SimilarityThreshold": number,
   "SourceImage": { 
      "Bytes": blob,
      "S3Object": { 
         "Bucket": "string",
         "Name": "string",
         "Version": "string"
      }
   },
   "TargetImage": { 
      "Bytes": blob,
      "S3Object": { 
         "Bucket": "string",
         "Name": "string",
         "Version": "string"
      }
   }
}

戻り値

{
   "FaceMatches": [ 
      { 
         "Face": { 
            "BoundingBox": { 
               "Height": number,
               "Left": number,
               "Top": number,
               "Width": number
            },
            "Confidence": number,
            "Landmarks": [ 
               { 
                  "Type": "string",
                  "X": number,
                  "Y": number
               }
            ],
            "Pose": { 
               "Pitch": number,
               "Roll": number,
               "Yaw": number
            },
            "Quality": { 
               "Brightness": number,
               "Sharpness": number
            }
         },
         "Similarity": number
      }
   ],
   "SourceImageFace": { 
      "BoundingBox": { 
         "Height": number,
         "Left": number,
         "Top": number,
         "Width": number
      },
      "Confidence": number
   },
   "SourceImageOrientationCorrection": "string",
   "TargetImageOrientationCorrection": "string",
   "UnmatchedFaces": [ 
      { 
         "BoundingBox": { 
            "Height": number,
            "Left": number,
            "Top": number,
            "Width": number
         },
         "Confidence": number,
         "Landmarks": [ 
            { 
               "Type": "string",
               "X": number,
               "Y": number
            }
         ],
         "Pose": { 
            "Pitch": number,
            "Roll": number,
            "Yaw": number
         },
         "Quality": { 
            "Brightness": number,
            "Sharpness": number
         }
      }
   ]
}

構文説明

リクエストは以下のデータを JSON 形式で受け入れます。	
	
[QualityFilter]	
	
	顔を識別するために行われるフィルタの量を示す品質バーを指定するフィルタです。フィルタされた顔は比較されません。
	AUTO指定すると、Amazon Rekognition が品質バーを選択します。
	LOW,MEDIUM,HIGHを指定すると、フィルタ処理によって、選択した品質バーに適合しないすべての顔が削除されます。
	品質バーは、さまざまな一般的なユースケースに基づいています。
	低品質の検出は、さまざまな理由で発生する可能性があります。
	たとえば、顔と誤認されるオブジェクト、ぼやけた顔、極端すぎるポーズの顔などがあります。
	NONE指定すると、フィルタリングは実行されません。デフォルト値はNONE。
	品質フィルタリングを使用するには、使用しているコレクションが、バージョン3以上の顔モデルに関連付けられている必要があります。
	タイプ: 文字列
	有効な値: NONE | AUTO | LOW | MEDIUM | HIGH
	指定は必須ではない
	
[SimilarityThreshold]	
	
	FaceMatches配列に含まれるために満たす必要がある顔一致の最小レベル信頼度
	タイプ: 浮動小数点
	有効範囲: 最小値=0 最大値=100。
	指定は必須
	
[SourceImage]	
	
	base64 でエンコードされたバイトまたはS3オブジェクトとしての入力イメージ
	AWS CLI を使用して Amazon Rekognition オペレーションを呼び出す場合、base64 でエンコードされたイメージのバイトを渡すことは
	サポートされていません。
	AWSSDKを使用してAmazonRekognitionを呼び出す場合は、Bytesフィールドを使用して渡された画像バイトをbase64エンコードする
	必要がない場合があります。
	タイプ: Imageオブジェクト
	指定は必須
	
[TargetImage]	
	
	base64 でエンコードされたバイトまたは S3 オブジェクトとしてのターゲットイメージ。
	AWS CLIを使用して Amazon Rekognitionオペレーションを呼び出す場合、base64でエンコードされたイメージのバイトを渡すことは
	サポートされていません。
	AWSSDKを使用してAmazonRekognitionを呼び出す場合は、Bytesフィールドを使用して渡された画像バイトをbase64エンコードする
	必要がない場合があります。
	タイプ: Imageオブジェクト
	指定は必須

戻り値説明

アクションが成功すると、サービスは HTTP 200 レスポンスを返します。	
サービスから以下のデータが JSON 形式で返されます。	
	
[FaceMatches]	
	
	ソースイメージの顔と一致するターゲットイメージ内の顔の配列です。
	各CompareFacesMatchオブジェクトは、バウンディングボックス、バウンディングボックスに顔が含まれている信頼レベル、
	バウンディングボックス内の顔とソースイメージ内の顔の類似度スコアを提供します。
	タイプ: CompareFacesMatchobjects配列
	
[SourceImageFace]	
	
	比較に使用されたソースイメージの顔です。
	タイプ: ComparedSourceImageFace オブジェクト
	
[SourceImageOrientationCorrection]	
	
	SourceImageOrientationCorrectionの値は常にnullです。
	入力画像が .jpeg 形式の場合、画像の向きを含む交換可能な画像ファイル形式 (Exif) メタデータが含まれている場合があります。
	Amazon Rekognition は、この方向情報を使用して画像補正を行います。
	Exifメタデータの方向情報を使用して画像の方向を修正した後、バウンディングボックスの座標が変換されてオブジェクトの位置
     を表します。 
	.png形式の画像には、Exifメタデータが含まれていません。
	Amazon Rekognitionは、画像Exifメタデータに方向情報がない.png形式の画像と.jpeg画像の画像補正を実行しません。
	バウンディングボックスの座標は変換されず、画像が回転する前のオブジェクトの位置を表します。
	タイプ: 文字列
	有効な値: ROTATE_0 | ROTATE_90 | ROTATE_180 | ROTATE_270
	
[TargetImageOrientationCorrection]	
	
	TargetImageOrientationCorrectionの値は常にnullです。
	入力画像が .jpeg 形式の場合、画像の向きを含む交換可能な画像ファイル形式 (Exif) メタデータが含まれている場合があります。
	Amazon Rekognition は、この方向情報を使用して画像補正を行います。
	Exifメタデータの方向情報を使用して画像の方向を修正した後、バウンディングボックスの座標が変換されてオブジェクトの位置
        を表します。
	.png形式の画像には、Exifメタデータが含まれていません。
	Amazon Rekognitionは、画像Exifメタデータに方向情報がない.png形式の画像と.jpeg画像の画像補正を実行しません。
	バウンディングボックスの座標は変換されず、画像が回転する前のオブジェクトの位置を表します。
	タイプ: 文字列
	有効な値: ROTATE_0 | ROTATE_90 | ROTATE_180 | ROTATE_270
	
[UnmatchedFaces]	
	
	ソースイメージの顔と一致しなかったターゲットイメージ内の顔の配列。
	タイプ: ComparedFaceオブジェクトの配列

エラー内容

AccessDeniedException	
	
	アクションを実行する権限がありません。
	HTTP ステータスコード: 400
	
ImageTooLargeException	
	
	入力画像サイズが許容限度を超えています。 DetectProtectiveEquipmentを呼び出している場合、画像のサイズまたは解像度が
        許容制限を超えています。
	HTTP ステータスコード: 400
	
InternalServerError	
	
	Amazon Rekognition でサービスの問題が発生しました。もう一度やり直してください。
	HTTP ステータスコード: 500
	
InvalidImageFormatException	
	
	指定されたイメージ形式はサポートされていません。
	HTTP ステータスコード: 400
	
InvalidParameterException	
	
	入力パラメータが制約に違反しています。API オペレーションを再度呼び出す前にパラメータを検証します。
	HTTP ステータスコード: 400
	
InvalidS3ObjectException	
	
	Amazon Rekognition は、リクエストで指定された S3 オブジェクトにアクセスできません。
	HTTP ステータスコード: 400
	
ProvisionedThroughputExceededException	
	
	お客様のスループット制限を超えたリクエストの数。この上限を引き上げる場合は、Amazon Rekognition までお問い合わせください。
	HTTP ステータスコード: 400
	
ThrottlingException	
	
	Amazon Rekognition は一時的にリクエストを処理できませんでした。もう一度やり直してください。
	HTTP ステータスコード: 500

①画像から顔を検出して、検出情報を表示するプログラム  detect_faces.py

import boto3
import json
import sys

if len(sys.argv) != 2:
    print('python', sys.argv[0], 'image')
    exit()

rekognition = boto3.client('rekognition')
with open(sys.argv[1], 'rb') as file:
    result = rekognition.detect_faces(Image={'Bytes': file.read()})
    print(json.dumps(result, indent=4))
私の顔をサンプルにした。
PS C:\Users\mikol\rekognition> python detect_faces.py miko1.jpg
{
    "FaceDetails": [         →検出した顔のリスト
        {
            "BoundingBox": {    →バウンディングボックス
                "Width": 0.12293902784585953,     →幅
                "Height": 0.18985843658447266,    →高さ
                "Left": 0.5232448577880859,      →左座標
                "Top": 0.24486979842185974       →上座標
            },
            "Landmarks": [
                {
                    "Type": "eyeLeft",         →左目
                    "X": 0.5619580745697021,      →横標高の座標
                    "Y": 0.3192358613014221       →縦方向の座標
                },
                {
                    "Type": "eyeRight",        →右目
                    "X": 0.6151727437973022,
                    "Y": 0.3179464638233185
                },
                {
                    "Type": "mouthLeft",        →口の左端
                    "X": 0.5670009851455688,
                    "Y": 0.39631175994873047
                },
                {
                    "Type": "mouthRight",       →口の右端
                    "X": 0.6113221645355225,
                    "Y": 0.39518293738365173
                },
                {
                    "Type": "nose",          →鼻
                    "X": 0.5890614986419678,
                    "Y": 0.35380586981773376
                }
            ],
            "Pose": {                   →姿勢
                "Roll": -0.43126580119132996,
                "Yaw": 1.5261589288711548,
                "Pitch": 12.219172477722168
            },
            "Quality": {                 →品質
                "Brightness": 81.4081039428711,   →輝度
                "Sharpness": 97.45164489746094    →シャープネス
            },
            "Confidence": 99.9969711303711       →信頼度
        }
    ],
    "ResponseMetadata": {
        "RequestId": "1e169e23-75ff-4419-9fb1-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Sun, 04 Jul 2021 07:08:32 GMT",
            "x-amzn-requestid": "1e169e23-75ff-4419-9fb1-999999999999",
            "content-length": "680",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}

[Roll]			回転軸上の面の回転を表す値です。	有効範囲: 最小値は-180 です。最大値は 180 です。
[Yaw (ヨーイング)]	ヨー軸上の面の回転を表す値です。	有効範囲: 最小値は-180 です。最大値は 180 です。
[Pitch (ピッチ)]	ピッチ軸上の面の回転を表す値です。	有効範囲: 最小値は-180 です。最大値は 180 です。

②検出した顔を抜き出すプログラム  show_faces.py

画像ライブラリ pillow をインストール

PS C:\Users\mikol\rekognition> pip install pillow
Defaulting to user installation because normal site-packages is not writeable
Collecting pillow
  Downloading Pillow-8.3.0-cp39-cp39-win_amd64.whl (2.3 MB)
     |████████████████████████████████| 2.3 MB 3.3 MB/s
Installing collected packages: pillow
Successfully installed pillow-8.3.0
WARNING: You are using pip version 21.1.2; however, version 21.1.3 is available.
You should consider upgrading via the 'c:\program files\python39\python.exe -m pip install --upgrade pip' command.
import boto3	
import json	
import sys	
from PIL import Image	
	
if len(sys.argv) != 2:	
    print('python', sys.argv[0], 'image')	
    exit()	
	
rekognition = boto3.client('rekognition') 	
with open(sys.argv[1], 'rb') as file:	
    result = rekognition.detect_faces(	
        Image={'Bytes': file.read()})	
    print(json.dumps(result, indent=4))	
	
image_in = Image.open(sys.argv[1])                     # 入力画像ファイルREAD	
w, h = image_in.size                          # 画像サイズ取得	
image_out = Image.new('RGB', (w, h), (200, 200, 200)) # 出力する画像ファイル生成	
for face in result['FaceDetails']:	
    box = face['BoundingBox']          # バウンディングボックス取得	
    left = int(box['Left']*w)       # 左座標計算	
    top = int(box['Top']*h)         # 上座標計算	
    right = left+int(box['Width']*w)    # 右座標計算	
    bottom = top+int(box['Height']*h)   # 下座標計算	
    image_out.paste(	
        image_in.crop((left, top, right, bottom)),     # 入力画像の顔部分を出力画像に貼り付け	
        (left, top))	
image_out.save('show_'+sys.argv[1])     # 出力画像をファイルに保存	
image_out.show()                 # 出力画像表示	

show_faces.py を実行

PS C:\Users\mikol\rekognition> python show_faces.py miko1.jpg
{
    "FaceDetails": [
        {
            "BoundingBox": {
                "Width": 0.12293902784585953,
                "Height": 0.18985843658447266,
                "Left": 0.5232448577880859,
                "Top": 0.24486979842185974
            },
            "Landmarks": [
                {
                    "Type": "eyeLeft",
                    "X": 0.5619580745697021,
                    "Y": 0.3192358613014221
                },
                {
                    "Type": "eyeRight",
                    "X": 0.6151727437973022,
                    "Y": 0.3179464638233185
                },
                {
                    "Type": "mouthLeft",
                    "X": 0.5670009851455688,
                    "Y": 0.39631175994873047
                },
                {
                    "Type": "mouthRight",
                    "X": 0.6113221645355225,
                    "Y": 0.39518293738365173
                },
                {
                    "Type": "nose",
                    "X": 0.5890614986419678,
                    "Y": 0.35380586981773376
                }
            ],
            "Pose": {
                "Roll": -0.43126580119132996,
                "Yaw": 1.5261589288711548,
                "Pitch": 12.219172477722168
            },
            "Quality": {
                "Brightness": 81.4081039428711,
                "Sharpness": 97.45164489746094
            },
            "Confidence": 99.9969711303711
        }
    ],
    "ResponseMetadata": {
        "RequestId": "6bc994ec-cc51-4d43-bd80-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Sun, 04 Jul 2021 07:40:05 GMT",
            "x-amzn-requestid": "6bc994ec-cc51-4d43-bd80-999999999999",
            "content-length": "680",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}

顔だけ抜き出した。

顔だけ抜き出した。

③同じ顔を探し出すプログラム  compare_faces.py

import boto3
import json
import sys
from PIL import Image

if len(sys.argv) != 3:
    print('python', sys.argv[0], 'source-image', 'target-image')
    exit()

rekognition = boto3.client('rekognition')
with open(sys.argv[1], 'rb') as source:
    with open(sys.argv[2], 'rb') as target:
# ソース画像をターゲット画像から探す
        result = rekognition.compare_faces(
            SourceImage={'Bytes': source.read()},
            TargetImage={'Bytes': target.read()})
        print(json.dumps(result, indent=4))     # 結果を表示

image_in = Image.open(sys.argv[2])
w, h = image_in.size
image_out = Image.new('RGB', (w, h), (200, 200, 200))
for face in result['FaceMatches']:               # 一致した顔を順番に処理
    box = face['Face']['BoundingBox']            # バウンディングボックス取得
    left = int(box['Left']*w)                # 座標計算
    top = int(box['Top']*h)
    right = left+int(box['Width']*w)
    bottom = top+int(box['Height']*h)
    image_out.paste(                       # 顔部分を貼り付け
        image_in.crop((left, top, right, bottom)),
        (left, top))
image_out.save('compare_'+sys.argv[2])
image_out.show()

画像miko1.jpg の私の顔を、画像miko2.jpg に同じ顔があるか探す。

miko2.jpg  私がオフィスにいるところを motioneye で表示している画像

先ほどの私の顔と、上記画像に同じ顔があるか検索

PS C:\Users\mikol\rekognition> python compare_faces.py miko1.jpg miko2.jpg
{
    "SourceImageFace": {
        "BoundingBox": {
            "Width": 0.12293902784585953,
            "Height": 0.18985843658447266,
            "Left": 0.5232448577880859,
            "Top": 0.24486979842185974
        },
        "Confidence": 99.9969711303711
    },
    "FaceMatches": [
        {
            "Similarity": 97.6093978881836,
            "Face": {
                "BoundingBox": {
                    "Width": 0.11569743603467941,
                    "Height": 0.2807336449623108,
                    "Left": 0.4832536578178406,
                    "Top": 0.6178990602493286
                },
                "Confidence": 99.99971008300781,
                "Landmarks": [
                    {
                        "Type": "eyeLeft",
                        "X": 0.5124771595001221,
                        "Y": 0.7249718904495239
                    },
                    {
                        "Type": "eyeRight",
                        "X": 0.5635684728622437,
                        "Y": 0.7268798351287842
                    },
                    {
                        "Type": "mouthLeft",
                        "X": 0.5144324898719788,
                        "Y": 0.8424032926559448
                    },
                    {
                        "Type": "mouthRight",
                        "X": 0.5568511486053467,
                        "Y": 0.8439299464225769
                    },
                    {
                        "Type": "nose",
                        "X": 0.5331652760505676,
                        "Y": 0.7812679409980774
                    }
                ],
                "Pose": {
                    "Roll": -0.2963113486766815,
                    "Yaw": -4.867407321929932,
                    "Pitch": 8.614628791809082
                },
                "Quality": {
                    "Brightness": 72.9045639038086,
                    "Sharpness": 92.22801208496094
                }
            }
        }
    ],
    "UnmatchedFaces": [],
    "ResponseMetadata": {
        "RequestId": "1f2963aa-ddfc-40f5-9207-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Sun, 04 Jul 2021 08:13:29 GMT",
            "x-amzn-requestid": "1f2963aa-ddfc-40f5-9207-999999999999",
            "content-length": "908",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}
比較の結果、miko2.jpg に、同じ顔があったので、compare_miko2.jpg が作成された。