Amazon Rekognition でコレクションを使って、写真からある顔を探し出す

Amazon Rekognition には、コレクションを扱う機能があります。

たとえば、セキュリティゲートで社員の顔によって、ゲートを開ける仕組みの場合、全会社員の顔を保存するためのコレクション機能を提供します。

まずは、コレクションを扱うメソッドのリファレンスです。

APIリファレンス

boto3 boto3.client関数

機能   デフォルトのセッションを使用して、低レベルのサービスクライアントを作成する
構文   boto3.client(クライアント名)
戻り値  サービスクライアントのオブジェクト

Rekognition  create_collectionメソッド

機能  該当リージョンに、コレクションを作成します。(コレクションに顔を追加するのは、IndexFacesメソッド)

構文

{
   "CollectionId": "string",
   "Tags": { 
      "string" : "string" 
   }
}

戻り値

{
   "CollectionArn": "string",
   "FaceModelVersion": "string",
   "StatusCode": number
}

構文説明

[CollectionId]	
	
	作成するコレクション ID
	タイプ: 文字列
	長さの制限: 最小長= 1   最大長=255 
	パターン: [a-zA-Z0-9_.\-]+
	指定は必須
	
[Tags]	
	
	コレクションにアタッチするタグのセット (キーと値のペア)
	タイプ: 文字列から文字列へのマッピング
	マップエントリ: 最小項目数= 0 最大数= 200 項目
	キー長制約: 最小長= 1 最大長= 128
	キーパターン:^(?!aws:)[\p{L}\p{Z}\p{N}_.:/=+\-@]*$
	値の長さの制限: 最小長= 0  最大長= 256
	値パターン:^([\p{L}\p{Z}\p{N}_.:/=+\-@]*)$
	指定は必須ではない

戻り値

[CollectionArn]	
	
	コレクションの Amazon リソースネーム (ARN)。リソースのアクセス許可を管理。
	タイプ: 文字列
	
[Type: String]	
	
	作成するコレクションに関連付けられている顔検出モデルのバージョン番号。
	タイプ: 文字列
	
[StatusCode]	
	
	操作の結果を示す HTTP ステータスコード。
	タイプ: 整数
	有効範囲: 最小値= 0

エラー内容

AccessDeniedException	
	
	アクションを実行する権限がありません。
	HTTP ステータスコード: 400
	
InternalServerError	
	
	Amazon Rekognition でサービスの問題が発生しました。もう一度やり直してください。
	HTTP ステータスコード: 500
	
InvalidParameterException	
	
	入力パラメータが制約に違反しています。API オペレーションを再度呼び出す前にパラメータを検証します。
	HTTP ステータスコード: 400
	
ProvisionedThroughputExceededException	
	
	お客様のスループット制限を超えたリクエストの数。この上限を引き上げる場合は、Amazon Rekognition までお問い合わせください。
	HTTP ステータスコード: 400
	
ResourceAlreadyExistsException	
	
	指定された ID の付いたリソースはすでに存在しています。
	HTTP ステータスコード: 400
	
ServiceEquotaExceedException	
	
	リソースサイズが制限文字数を超えています。詳細については、「Amazon Rekognition のガイドラインとクォータ」を参照してください。
	HTTP ステータスコード: 400
	
ThrottlingException	
	
	Amazon Rekognition は一時的にリクエストを処理できませんでした。もう一度やり直してください。
	HTTP ステータスコード: 500

Rekognition  index_facesメソッド

機能   画像内の顔をコレクションに登録して、検出されたすべての顔のメタデータ配列を返します。
    ・検出された顔の境界ボックスであるBoundingBox
    ・Confidence:境界ボックス内に顔が含まれている信頼度
    ・FaceId:検出され保存された顔ごとにサービスによって割り当てられます。
    ・ImageId:入力イメージのサービスによって割り当てられます。
    rekognition:IndexFaces アクションを実行するアクセス許可が必要です。

{
   "CollectionId": "string",
   "DetectionAttributes": [ "string" ],
   "ExternalImageId": "string",
   "Image": { 
      "Bytes": blob,
      "S3Object": { 
         "Bucket": "string",
         "Name": "string",
         "Version": "string"
      }
   },
   "MaxFaces": number,
   "QualityFilter": "string"
}

戻り値

{	
   "FaceModelVersion": "string",	
   "FaceRecords": [ 	
      { 	
         "Face": { 	
            "BoundingBox": { 	
               "Height": number,	
               "Left": number,	
               "Top": number,	
               "Width": number	
            },	
            "Confidence": number,	
            "ExternalImageId": "string",	
            "FaceId": "string",	
            "ImageId": "string"	
         },	
         "FaceDetail": { 	
            "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",	
   "UnindexedFaces": [ 	
      { 	
         "FaceDetail": { 	
            "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	
            }	
         },	
         "Reasons": [ "string" ]	
      }	
   ]	
}	

構文説明

リクエストは以下のデータを JSON 形式で受け入れます。	
	
[CollectionId]	
	
	入力イメージで検出された顔を追加する既存のコレクションの ID です。
	タイプ: 文字列
	長さの制限: 最小長= 1 最大長= 255
	パターン: [a-zA-Z0-9_.\-]+
	指定は必須
	
[DetectionAttributes]	
	
	返したい顔アトリビュートの配列です。
	デフォルト属性リストまたは全ての属性リストを返します。
	["DEFAULT"]指定の場合、BoundingBox,Confidence(信頼度),Pose(姿勢),Quality(品質), 
	Landmarks(目印)属性のサブセットを返します。
	["ALL"]指定の場合、全ての属性リストを返しますが、操作完了まで時間がかかります。
	両方を提供する場合、["ALL", "DEFAULT"]の場合、サービスは論理 AND 演算子を使用して、返す属性 (この場合はすべての属性) を
	決定します。
	タイプ: 文字列の配列
	有効な値: DEFAULT | ALL
	指定は必須ではない
	
[ExternalImageId]	
	
	イメージ内で検出されたすべての顔に割り当てる ID。
	タイプ: 文字列
	長さの制限: 最小長= 1 最大長= 255
	パターン: [a-zA-Z0-9_.\-:]+
	指定は必須ではない
	
[Image]	
	
	base64 でエンコードされたバイトまたは S3 オブジェクトの入力イメージ。
	AWS CLI を呼び出す場合、base64 でエンコードされたイメージバイトを渡すことはできません。
	AWSSDKを使用する場合、Bytesフィールドを使用して渡された画像バイトをbase64エンコードする必要がない場合があります。
	タイプ: Image オブジェクト
	指定は必須
	
[MaxFaces]	
	
	インデックスを作成する顔の最大数。 MaxFacesの値は1以上である必要があります。
	MaxFacesに大きな値を指定した場合でも、IndexFacesは画像内で検出された100個以下の顔を返します。
	IndexFacesがMaxFacesの値よりも多くの顔を検出した場合、品質が最も低い顔が最初に除外されます。
	 MaxFacesの値よりもまだ多くの顔がある場合、境界ボックスが最小の顔が除外されます。 (MaxFacesの値を満たすために必要な数まで)
	IndexFacesによって返される顔は、最大の面境界ボックスサイズから最小サイズの降順で並べ替えられます。
	タイプ: 整数
	有効範囲: 最小値= 1
	指定は必須ではない
	
[QualityFilter]	
	
	顔を識別するために実行されるフィルタリングの量の品質バーを指定するフィルター。
	フィルタリングされた顔にはインデックスが付けられません。 AUTOを指定すると、品質バーが選択されます。 
	LOW、MEDIUM、HIGHを指定すると、フィルタリングにより、選択した品質バーを満たさないすべての顔が削除されます。
	( デフォルト値はAUTO)
	品質バーは一般的使用例に基づいています。 低品質の検出される 例としては、顔と誤認されたオブジェクト、ぼやけすぎた顔、
	極端すぎて使用できないポーズの顔などがあります。
	NONEを指定すると、フィルタリングは実行されません。
	タイプ: 文字列
	有効な値: NONE | AUTO | LOW | MEDIUM | HIGH
	指定は必須ではない

戻り値

アクションが成功すると、サービスは HTTP 200 レスポンスを返します。	
サービスから以下のデータが JSON 形式で返されます。	
	
[FaceModelVersion]	
	
	入力コレクションに関連付けられている顔検出モデルのバージョン番号 (CollectionId)
	タイプ: 文字列
	
[FaceRecords]	
	
	検出されて、コレクションに追加した顔の配列。
	タイプ: の配列FaceRecordobjects
	
[OrientationCorrection]	
	
	コレクションがバージョン3.0以降の顔検出モデルに関連付けられている場合、OrientationCorrectionの値は常にnullであり、
	方向情報は返されません。
	コレクションがバージョン3.0以前の顔検出モデルに関連付けられている場合、以下が適用されます。
	①入力画像が.jpeg形式の場合、画像の向きを含む交換可能な画像ファイル形式(Exif)のメタデータが含まれている可能性があります。
	 Amazon Rekognitionは、この向き情報を使用して画像補正を実行します。
	 Exifメタデータの向き情報を使用して画像の向きを修正した後、バウンディングボックスの座標が変換されてオブジェクトの位置
          を表します。
	②.png形式の画像には、Exifメタデータが含まれていません。 OrientationCorrectionの値はnullです。
	 画像のExifメタデータに方向情報が含まれていない場合、Amazon Rekognitionは推定方向
	 (ROTATE_0、ROTATE_90、ROTATE_180、ROTATE_270)
	 を返します。
	Amazon Rekognitionは、画像の画像補正を実行しません。バウンディングボックスの座標は変換されず、画像が回転する前の
        オブジェクトの位置を表します。
	バウンディングボックスの情報がFaceRecords配列に返されます。 DescribeCollectionを呼び出すことで、顔検出モデルのバージョン
	を取得できます。
	タイプ: 文字列
	有効な値: ROTATE_0 | ROTATE_90 | ROTATE_180 | ROTATE_270
	
[UnindexedFaces]	
	
	画像で検出されたがインデックス付けされなかった顔の配列。
	品質フィルターがそれらを低品質として識別したか、MaxFaces要求パラメーターがそれらをフィルターで除外したため、
	それらは索引付けされませんでした。
	品質フィルターを使用するには、QualityFilter要求パラメーターを指定します。
	タイプ: UnindexedFaceobjectsの配列

エラー内容

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
	
ResourceNotFoundException	
	
	リクエストで指定されたリソースが見つかりません。
	HTTP ステータスコード: 400
	
serviceEquotaExceedException	
	
	リソースサイズが制限文字数を超えています。
	HTTP ステータスコード: 400
	
ThrottlingException	
	
	Amazon Rekognition は一時的にリクエストを処理できませんでした。もう一度やり直してください。
	HTTP ステータスコード: 500

Rekognition  list_collectionsメソッド

機能 アカウントのコレクションIDのリストを返します。
   結果が切り捨てられた場合、応答はNextTokenも提供します。
   これは後続の要求で使用して、コレクションIDの次のセットをフェッチできます。
   このオペレーションには rekognition:ListCollections アクションを実行するアクセス許可が必要です。

構文

{
   "MaxResults": number,
   "NextToken": "string"
}

戻り値

{
   "CollectionIds": [ "string" ],
   "FaceModelVersions": [ "string" ],
   "NextToken": "string"
}

構文説明

リクエストは以下のデータを JSON 形式で受け入れます。	
	
[MaxResults]	
	
	返されるコレクションID の最大数。
	タイプ: 整数
	有効範囲: 最小値=0 最大値=4096
	指定は必須ではない
	
[NextToken]	
	
	前の応答からのページ分割トークン。
	タイプ: 文字列
	長さの制限: 最大長=255
	指定は必須ではない

戻り値説明

アクションが成功すると、サービスは HTTP 200 レスポンスを返します。	
サービスから以下のデータが JSON 形式で返されます。	
	
[CollectionIds]	
	
	コレクションIDの配列。
	タイプ: 文字列の配列
	長さの制限: 最小長=1 最大長=255
	パターン: [a-zA-Z0-9_.\-]+
	
[FaceModelVersions]	
	
	配列CollectionIdsのコレクションに関連付けられている顔検出モデルのバージョン番号。
	たとえば、FaceModelVersions [2]の値は、CollectionId [2]のコレクションで使用される顔検出モデルのバージョン番号です。
	タイプ: 文字列の配列
	
[NextToken]	
	
	結果が切り捨てられた場合、応答はNextTokenを提供します。これは、後続の要求で使用して、
	コレクションIDの次のセットをフェッチできます。 
	タイプ: 文字列
	長さの制限: 最大長は 255 です。

エラー内容

AccessDeniedException	
	
	アクションを実行する権限がありません。
	HTTP ステータスコード: 400
	
InternalServerError	
	
	Amazon Rekognition でサービスの問題が発生しました。もう一度やり直してください。
	HTTP ステータスコード: 500
	
InvalidPaginationTokenException	
	
	リクエストのページ分割トークンが有効ではありません。
	HTTP ステータスコード: 400
	
InvalidParameterException	
	
	入力パラメータが制約に違反しています。API オペレーションを再度呼び出す前にパラメータを検証します。
	HTTP ステータスコード: 400
	
ProvisionedThroughputExceededException	
	
	お客様のスループット制限を超えたリクエストの数。この上限を引き上げる場合は、Amazon Rekognition までお問い合わせください。
	HTTP ステータスコード: 400
	
ResourceNotFoundException	
	
	リクエストで指定されたリソースが見つかりません。
	HTTP ステータスコード: 400
	
ThrottlingException	
	
	Amazon Rekognition は一時的にリクエストを処理できませんでした。もう一度やり直してください。
	HTTP ステータスコード: 500

Rekognition  list_facesメソッド

機能 指定したコレクション内の顔のメタデータを返します。このメタデータには、境界ボックス座標、信頼度
    (境界ボックス内に顔が含まれている信頼度)、faceID が含まれます。
   rekognition:ListFacesアクションを実行するアクセス許可が必要です。

構文

{
   "CollectionId": "string",
   "MaxResults": number,
   "NextToken": "string"
}

戻り値

{	
   "FaceModelVersion": "string",	
   "Faces": [ 	
      { 	
         "BoundingBox": { 	
            "Height": number,	
            "Left": number,	
            "Top": number,	
            "Width": number	
         },	
         "Confidence": number,	
         "ExternalImageId": "string",	
         "FaceId": "string",	
         "ImageId": "string"	
      }	
   ],	
   "NextToken": "string"	
}	

構文説明

リクエストは以下のデータを JSON 形式で受け入れます。	
	
[CollectionId]	
	
	顔を一覧表示するコレクションのID
	タイプ: 文字列
	長さの制限: 最小長=1 最大長=255
	パターン: [a-zA-Z0-9_.\-]+
	指定は必須
	
[MaxResults]	
	
	返される顔の最大数
	タイプ: 整数
	有効範囲: 最小値=0 最大値=4096
	指定は必須ではない
	
[NextToken]	
	
	取得するデータが多いため、以前のレスポンスが不完全だった場合、レスポンスにページネーショントークンを返します。
	次の顔一式を取得するには、このページ分割トークンを使用します。
	タイプ: 文字列
	長さの制限: 最大長=255
	指定は必須ではない

戻り値

アクションが成功すると、サービスは HTTP 200 レスポンスを返します。	
サービスから以下のデータが JSON 形式で返されます。	
	
[FaceModelVersion]	
	
	入力コレクションに関連付けられている顔検出モデルのバージョン番号 (CollectionId)
	タイプ: 文字列
	
[Faces]	
	
	Faceオブジェクトの配列
	タイプ:Faceobjectsの配列
	
[NextToken]	
	
	応答が切り捨てられた場合、Amazon Rekognition はこのトークンを返します。
	これは後続のリクエストで次の顔のセットを取得するために使用できます。
	タイプ: 文字列

エラー内容

AccessDeniedException	
	
	アクションを実行する権限がありません。
	HTTP ステータスコード: 400
	
InternalServerError	
	
	Amazon Rekognition でサービスの問題が発生しました。もう一度やり直してください。
	HTTP ステータスコード: 500
	
InvalidPaginationTokenException	
	
	リクエストのページ分割トークンが有効ではありません。
	HTTP ステータスコード: 400
	
InvalidParameterException	
	
	入力パラメータが制約に違反しています。API オペレーションを再度呼び出す前にパラメータを検証します。
	HTTP ステータスコード: 400
	
ProvisionedThroughputExceededException	
	
	お客様のスループット制限を超えたリクエストの数。この上限を引き上げる場合は、Amazon Rekognition までお問い合わせください。
	HTTP ステータスコード: 400
	
ResourceNotFoundException	
	
	リクエストで指定されたリソースが見つかりません。
	HTTP ステータスコード: 400
	
ThrottlingException	
	
	Amazon Rekognition は一時的にリクエストを処理できませんでした。もう一度やり直してください。
	HTTP ステータスコード: 500

Rekognition  search_facesメソッド

機能 指定された入力FaceIDについて、その顔が属するコレクション内で一致する顔を検索します。
   IndexFaces操作を使用してコレクションに顔を追加すると、FaceIDが得られます。
   この操作で、入力顔の特徴をコレクション内の顔と比較します。
   注意:SearchFacesByImage操作を使用して、顔にインデックスを付けずに顔を検索することもできます。
   操作応答は一致する顔の配列を返します。類似度スコアが最も高い順に並べられます。
   検出されるのは各顔の一致するメタデータの配列です。加えて応答には、各顔の一致する信頼値も含まれ、信頼度を示します。
   この操作には、rekognition:SearchFacesアクションを実行するためのパーミッションが必要です。

構文

{
   "CollectionId": "string",
   "FaceId": "string",
   "FaceMatchThreshold": number,
   "MaxFaces": number
}

戻り値

{	
   "FaceMatches": [ 	
      { 	
         "Face": { 	
            "BoundingBox": { 	
               "Height": number,	
               "Left": number,	
               "Top": number,	
               "Width": number	
            },	
            "Confidence": number,	
            "ExternalImageId": "string",	
            "FaceId": "string",	
            "ImageId": "string"	
         },	
         "Similarity": number	
      }	
   ],	
   "FaceModelVersion": "string",	
   "SearchedFaceId": "string"	
}	

構文の説明

リクエストは以下のデータを JSON 形式で受け入れます。	
	
[CollectionId]	
	
	顔が属するCollectionId
	タイプ: 文字列
	長さの制約:最小長=1 最大長=255
	パターン: [a-zA-Z0-9_.\-]+
	指定は必須
	
[FaceId]	
	
	コレクション内で一致するものを検索する顔のFaceId
	タイプ: 文字列
	パターン: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
	指定は必須
	
[FaceMatchThreshold]	
	
	返される顔一致の最小信頼度を指定するオプションの値。たとえば、一致の信頼度が70%未満の場合、返さない。デフォルト値は80%。
	タイプ: 浮動小数点
	有効範囲:最小長=0 最大長=100
	指定は必須ではない
	
[MaxFaces]	
	
	返される顔の最大数。この操作は、一致の信頼度が最も高い顔の最大数を返します。
	タイプ: 整数
	有効範囲:最小長=1 最大長=4096
	指定は必須ではない

戻り値の説明

アクションが成功すると、サービスは HTTP200レスポンスを返します。	
サービスから以下のデータがJSON形式で返されます。	
	
[FaceMatches]	
	
	入力顔に一致した顔の配列と、一致の信頼度です。
	タイプ: FaceMatchobjectsの配列
	
[FaceModelVersion]	
	
	入力コレクションに関連付けられている顔検出モデルのバージョン番号 (CollectionId)
	タイプ: 文字列
	
[SearchedFaceId]	
	
	コレクション内で一致を検索したFaceId
	タイプ: 文字列
	パターン: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}

エラーの内容

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

Rekognition  search_faces_by_imageメソッド

機能 特定の入力画像について、最初に画像内の最大の顔を検出し、次に指定されたコレクションで一致する顔を検索します。
   この操作では、入力した顔の特徴を指定されたコレクション内の顔と比較します。

   入力画像内のすべての顔を検索するには、最初にIndexFaces操作を呼び出してから、その後SearchFaces操作呼び出しで
   返されたFaceIDを使用します。
   また、DetectFaces操作を呼び出し、応答の境界ボックスを使用して顔の切り抜きを作成し、それをSearchFacesByImage操作
   に渡すこともできます。

構文

{
   "CollectionId": "string",
   "FaceMatchThreshold": number,
   "Image": { 
      "Bytes": blob,
      "S3Object": { 
         "Bucket": "string",
         "Name": "string",
         "Version": "string"
      }
   },
   "MaxFaces": number,
   "QualityFilter": "string"
}

戻り値

{
   "FaceMatches": [ 
      { 
         "Face": { 
            "BoundingBox": { 
               "Height": number,
               "Left": number,
               "Top": number,
               "Width": number
            },
            "Confidence": number,
            "ExternalImageId": "string",
            "FaceId": "string",
            "ImageId": "string"
         },
         "Similarity": number
      }
   ],
   "FaceModelVersion": "string",
   "SearchedFaceBoundingBox": { 
      "Height": number,
      "Left": number,
      "Top": number,
      "Width": number
   },
   "SearchedFaceConfidence": number
}

構文の説明

リクエストは以下のデータを JSON 形式で受け入れます。	
	
[CollectionId]	
	
	検索するコレクションの ID。
	タイプ: 文字列
	長さの制限: 最小長は 1 です。 最大長は 255 です。
	パターン: [a-zA-Z0-9_.\-]+
	指定は必須
	
[FaceMatchThreshold]	
	
	(任意)返される顔一致の最小信頼度を指定します。たとえば、一致の信頼度が 70% 未満の場合は、一致を返さない。
	デフォルト値は 80% です。
	タイプ: 浮動小数点
	有効範囲:最小長=0 最大長=100
	指定は必須ではない
	
[Image]	
	
	base64 でエンコードされたバイトまたは S3 オブジェクトとしての入力イメージ。
	AWS CLI を呼び出す場合、base64 でエンコードされたイメージのバイトを渡すことはサポートされていません。
	AWSSDKを使用する場合、Bytesフィールドを使用して渡された画像バイトをbase64エンコードする必要がない場合があります。
	タイプ: Image オブジェクト
	指定は必須
	
[MaxFaces]	
	
	返される顔の最大数。この操作は、一致の信頼度が最も高い顔の最大数を返します。
	タイプ: 整数
	有効範囲: 最小長= 1 最大長=4096 
	指定は必須ではない
	
[QualityFilter]	
	
	面を識別するために行われるフィルタの量を示す品質バーを指定するフィルタ。
	フィルタリングされた顔にはインデックスが付けられません。 AUTOを指定すると、品質バーが選択されます。 
	LOW、MEDIUM、HIGHを指定すると、フィルタリングにより、選択した品質バーを満たさないすべての顔が削除されます。
	品質バーは一般的使用例に基づいています。 低品質の検出される 例としては、顔と誤認されたオブジェクト、ぼやけすぎた顔、
	極端すぎて使用できないポーズの顔などがあります。
	NONEを指定すると、フィルタリングは実行されません。( デフォルト値はNONE)
	タイプ: 文字列
	有効な値: NONE | AUTO | LOW | MEDIUM | HIGH
	指定は必須ではない

戻り値の説明

アクションが成功すると、サービスは HTTP 200 レスポンスを返します。	
サービスから以下のデータが JSON 形式で返されます。	
	
[FaceMatches]	
	
	入力顔に一致する顔の配列と、一致の信頼度です。
	タイプ: FaceMatchobjectsの配列
	
[FaceModelVersion]	
	
	入力コレクションに関連付けられている顔検出モデルのバージョン番号 (CollectionId).
	タイプ: 文字列
	
[SearchedFaceBoundingBox]	
	
	Amazon Rekognition が検索に使用した、入力画像内の顔の周りのバウンディングボックス。
	タイプ: BoundingBox オブジェクト
	
[SearchedFaceConfidence]	
	
	信頼度のレベルsearchedFaceBoundingBoxには、面が含まれています。
	タイプ: 浮動小数点
	有効範囲: 最小値=0  最大値=100

エラー内容

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
	
ResourceNotFoundException	
	
	リクエストで指定されたリソースが見つかりません。
	HTTP ステータスコード: 400
	
ThrottlingException	
	
	Amazon Rekognition は一時的にリクエストを処理できませんでした。もう一度やり直してください。
	HTTP ステータスコード: 500

Rekognition  delete_collectionメソッド

機能 指定されたコレクション内のすべての顔を削除します。
   rekognition:DeleteCollectionアクションを実行するアクセス許可が必要です。

構文

{
   "CollectionId": "string"
}

戻り値

{
   "StatusCode": number
}

構文の説明

リクエストは以下のデータを JSON 形式で受け入れます。	
	
[CollectionId]	
	
	削除するCollectionId
	タイプ: 文字列
	長さの制約:最小長=1 最大長=255
	パターン: [a-zA-Z0-9_.\-]+
	指定は必須

戻り値の説明

アクションが成功すると、サービスは HTTP200レスポンスを返します。	
サービスから以下のデータが JSON 形式で返されます。	
	
[StatusCode]	
	
	操作の結果を示す HTTPステータスコード
	タイプ: 整数
	有効範囲: 最小値=0

エラーの内容

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

Rekognition  describe_collectionメソッド

機能 指定されたコレクションについて説明します。
   DescriptionCollectionを使用して、コレクションにインデックス付けされた顔の数や、
   コレクションが顔検出に使用したモデルのバージョンなどの情報を取得できます。

構文

{
   "CollectionId": "string"
}

戻り値

{
   "CollectionARN": "string",
   "CreationTimestamp": number,
   "FaceCount": number,
   "FaceModelVersion": "string"
}

戻り値

{
   "CollectionARN": "string",
   "CreationTimestamp": number,
   "FaceCount": number,
   "FaceModelVersion": "string"
}

構文の説明

CollectionId	
	
	説明するCollectionId
	タイプ: 文字列
	長さの制約:最小長=1 最大長255
	パターン: [a-zA-Z0-9_.\-]+
	指定は必須

戻り値説明

アクションが成功すると、サービスはHTTP200レスポンスを返します。	
サービスから以下のデータがJSON 形式で返されます。	
	
CollectionARN	
	
	コレクションのAmazonリソースネーム (ARN)
	タイプ: 文字列
	
CreationTimestamp	
	
	Unixエポック時間からコレクション作成までのミリ秒数。Unixエポック時間は、1970年1月1日木曜日の00:00:00協定世界時 (UTC) です。
	タイプ: タイムスタンプ
	
FaceCount	
	
	コレクションにインデックス付けされている面の数。
	顔をコレクションにインデックス付けするには、IndexFacesを使用します。
	タイプ: Long
	有効範囲: 最小値=0
	
FaceModelVersion	
	
	顔検出のためにコレクションで使用される顔モデルのバージョン
	タイプ: 文字列

エラー内容

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

①コレクションを作成して、イメージを登録するプログラム create_collection.py

import boto3
import json
import sys

if len(sys.argv) == 1:
    print('python', sys.argv[0], 'images...')
    exit()

rekognition = boto3.client('rekognition')
collection_id = 'MikolaboCollection'           # コレクションID

print('***** create_collection *****')
# コレクション生成
result = rekognition.create_collection(CollectionId=collection_id)
print(json.dumps(result, indent=4))

print('***** index_faces *****')
# 画像登録
for path in sys.argv[1:]:
    with open(path, 'rb') as file:
        result = rekognition.index_faces(
            CollectionId=collection_id,
            Image={'Bytes': file.read()})
        print(json.dumps(result, indent=4))

print('***** list_collections *****')
# コレクションの一覧
result = rekognition.list_collections()
print(json.dumps(result, indent=4))

print('***** list_faces *****')
# 登録した顔の一覧
result = rekognition.list_faces(CollectionId=collection_id)
print(json.dumps(result, indent=4))

miko1.jpg  と waka.jpg をコレクション(MikolaboCollection)に登録した。実行結果は以下の通り。

PS C:\Users\mikol\rekognition> python create_collection.py miko1.jpg waka.jpg
***** create_collection *****
{
    "StatusCode": 200,                    (MikolaboCollectionが作成された)
    "CollectionArn": "aws:rekognition:ap-northeast-1:999999999999:collection/MikolaboCollection",
    "FaceModelVersion": "5.0",
    "ResponseMetadata": {
        "RequestId": "8c7e76d5-dde9-4514-adcd-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Mon, 05 Jul 2021 10:50:24 GMT",
            "x-amzn-requestid": "8c7e76d5-dde9-4514-adcd-999999999999",
            "content-length": "135",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}
***** index_faces *****
{
    "FaceRecords": [                         (コレクションに追加された顔の配列)
        {
            "Face": {
                "FaceId": "571fc21a-b9f6-4e5f-a7d9-999999999999",    (FaceID)
                "BoundingBox": {                         (バウンディングボックス)
                    "Width": 0.12293902784585953,
                    "Height": 0.18985843658447266,
                    "Left": 0.5232448577880859,
                    "Top": 0.24486979842185974
                },
                "ImageId": "1afdd52c-b526-340e-80dc-999999999999",    (ImageId)
                "Confidence": 99.9969711303711                         (信頼度)
            },
            "FaceDetail": {                                      (顔の詳細情報)
                "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                         (信頼度)
            }
        }
    ],
    "FaceModelVersion": "5.0",                       (顔検出モデルのバージョン)
    "UnindexedFaces": [],              (コレクションに登録されなかった顔のリスト)
    "ResponseMetadata": {
        "RequestId": "bba5cb21-32b1-4b43-b654-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Mon, 05 Jul 2021 10:50:31 GMT",
            "x-amzn-requestid": "bba5cb21-32b1-4b43-b654-999999999999",
            "content-length": "1001",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}
{
    "FaceRecords": [
        {
            "Face": {
                "FaceId": "8b645eba-8a7c-4db2-8dda-999999999999",
                "BoundingBox": {
                    "Width": 0.1153644397854805,
                    "Height": 0.2091350555419922,
                    "Left": 0.45053282380104065,
                    "Top": 0.43447017669677734
                },
                "ImageId": "90181d2e-4b2a-30ac-a9ce-999999999999",
                "Confidence": 99.99845123291016
            },
            "FaceDetail": {
                "BoundingBox": {
                    "Width": 0.1153644397854805,
                    "Height": 0.2091350555419922,
                    "Left": 0.45053282380104065,
                    "Top": 0.43447017669677734
                },
                "Landmarks": [
                    {
                        "Type": "eyeLeft",
                        "X": 0.486361026763916,
                        "Y": 0.5192834138870239
                    },
                    {
                        "Type": "eyeRight",
                        "X": 0.5379962921142578,
                        "Y": 0.5120744109153748
                    },
                    {
                        "Type": "mouthLeft",
                        "X": 0.499908447265625,
                        "Y": 0.5988285541534424
                    },
                    {
                        "Type": "mouthRight",
                        "X": 0.5427884459495544,
                        "Y": 0.5926451683044434
                    },
                    {
                        "Type": "nose",
                        "X": 0.5222419500350952,
                        "Y": 0.5492557287216187
                    }
                ],
                "Pose": {
                    "Roll": -5.413140773773193,
                    "Yaw": 10.33845043182373,
                    "Pitch": 11.950385093688965
                },
                "Quality": {
                    "Brightness": 84.93568420410156,
                    "Sharpness": 92.22801208496094
                },
                "Confidence": 99.99845123291016
            }
        },
        {
            "Face": {      ※ 顔は1つのはずだが、2レコード目がある?
                "FaceId": "0c684abc-56c8-408f-b6da-999999999999",
                "BoundingBox": {
                    "Width": 0.015119628980755806,
                    "Height": 0.023440856486558914,
                    "Left": 0.94194495677948,
                    "Top": 0.08839347213506699
                },
                "ImageId": "90181d2e-4b2a-30ac-a9ce-999999999999",
                "Confidence": 95.8871078491211
            },
            "FaceDetail": {
                "BoundingBox": {
                    "Width": 0.015119628980755806,
                    "Height": 0.023440856486558914,
                    "Left": 0.94194495677948,
                    "Top": 0.08839347213506699
                },
                "Landmarks": [
                    {
                        "Type": "eyeLeft",
                        "X": 0.9467107653617859,
                        "Y": 0.09916931390762329
                    },
                    {
                        "Type": "eyeRight",
                        "X": 0.9521102905273438,
                        "Y": 0.09350795298814774
                    },
                    {
                        "Type": "mouthLeft",
                        "X": 0.9511984586715698,
                        "Y": 0.10547374188899994
                    },
                    {
                        "Type": "mouthRight",
                        "X": 0.9557285308837891,
                        "Y": 0.10072124004364014
                    },
                    {
                        "Type": "nose",
                        "X": 0.9520914554595947,
                        "Y": 0.09914874285459518
                    }
                ],
                "Pose": {
                    "Roll": -33.034950256347656,
                    "Yaw": 8.769628524780273,
                    "Pitch": 20.638227462768555
                },
                "Quality": {
                    "Brightness": 39.084388732910156,
                    "Sharpness": 7.589449882507324
                },
                "Confidence": 95.8871078491211
            }
        }
    ],
    "FaceModelVersion": "5.0",
    "UnindexedFaces": [],
    "ResponseMetadata": {
        "RequestId": "742123e4-cfba-42e2-8aed-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Mon, 05 Jul 2021 10:50:37 GMT",
            "x-amzn-requestid": "742123e4-cfba-42e2-8aed-999999999999",
            "content-length": "1935",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}
***** list_collections *****
{
    "CollectionIds": [
        "MikolaboCollection"                   (コレクションID:MikolaboCollection)
    ],
    "FaceModelVersions": [
        "5.0"                                  (顔検出モデルのバージョン)
    ],
    "ResponseMetadata": {
        "RequestId": "075758d0-5062-41f3-8ab7-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Mon, 05 Jul 2021 10:50:37 GMT",
            "x-amzn-requestid": "075758d0-5062-41f3-8ab7-999999999999",
            "content-length": "89",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}
***** list_faces *****
{
    "Faces": [                                                 (顔のリスト)
        {
            "FaceId": "0c684abc-56c8-408f-b6da-999999999999",   (FaceID)その1
            "BoundingBox": {                            (バウンディングボックス)
                "Width": 0.015119600109755993,
                "Height": 0.023440899327397346,
                "Left": 0.9419450163841248,
                "Top": 0.08839350193738937
            },
            "ImageId": "90181d2e-4b2a-30ac-a9ce-999999999999",   (ImageID)
            "Confidence": 95.88710021972656                       (信頼度)
        },
        {
            "FaceId": "571fc21a-b9f6-4e5f-a7d9-999999999999",     (FaceID)その2
            "BoundingBox": {                              (バウンディングボックス)
                "Width": 0.12293899804353714,
                "Height": 0.18985800445079803,
                "Left": 0.5232449769973755,
                "Top": 0.24487000703811646
            },
            "ImageId": "1afdd52c-b526-340e-80dc-999999999999",  (ImageID)
            "Confidence": 99.99700164794922                      (信頼度)
        },
        {
            "FaceId": "8b645eba-8a7c-4db2-8dda-999999999999",    (FaceID)その3
            "BoundingBox": {                              (バウンディングボックス)
                "Width": 0.11536400020122528,
                "Height": 0.2091349959373474,
                "Left": 0.450533002614975,
                "Top": 0.434469997882843
            },
            "ImageId": "90181d2e-4b2a-30ac-a9ce-999999999999",  (ImageID)
            "Confidence": 99.99849700927734                      (信頼度)
        }
    ],
    "FaceModelVersion": "5.0",
    "ResponseMetadata": {
        "RequestId": "65aaa5eb-d402-4c73-adf5-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Mon, 05 Jul 2021 10:50:38 GMT",
            "x-amzn-requestid": "65aaa5eb-d402-4c73-adf5-999999999999",
            "content-length": "799",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}

私の写真(miko1.jpg)  と 母親(waka.jpg)の写真を登録したのだが、母親の写真に登録する処理で、2レコード登録された形跡があったが、良くわからない。この後の画像検索処理の結果からしても、私と母の写真登録自体はできているようである。

次にコレクションに登録した画像データを、別で用意したイメージと比較し、コレクションに登録した顔が映っているか調べてみる。

②コレクションから、画像ファイルの顔が登録されているかサーチするプログラム search_faces_by_images.py

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')
collection_id = 'MikolaboCollection'

with open(sys.argv[1], 'rb') as file:
    print('***** search_faces_by_image *****')
    result = rekognition.search_faces_by_image(
        CollectionId=collection_id,
        Image={'Bytes': file.read()})
    print(json.dumps(result, indent=4))

image_in = Image.open(sys.argv[1])
w, h = image_in.size
image_out = Image.new('RGB', (w, h), (200, 200, 200))
if result['FaceMatches']:
    box = result['SearchedFaceBoundingBox']
    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))
    print('***** FaceMatches *****')
image_out.save('match_'+sys.argv[1])
image_out.show()

MikolaboCollectionコレクションに、5枚の写真をsearch_faces_by_imageメソッドを使って、コレクションにあるのか調べてみる。

まず、実行結果です。

PS C:\Users\mikol\rekognition> python search_faces_by_images.py collect1.JPG
***** search_faces_by_image ***** (1枚目の写真 colecction1.JPG)
{
    "SearchedFaceBoundingBox": {          (画像内の顔のバウンディングボックス)
        "Width": 0.17897191643714905,
        "Height": 0.12930431962013245,
        "Left": 0.38019120693206787,
        "Top": 0.4008188843727112
    },
    "SearchedFaceConfidence": 99.9972915649414,
    "FaceMatches": [ (画像内顔に一致したコレクション内バウンディングボックス)
        {
            "Similarity": 99.98970794677734,
            "Face": {
                "FaceId": "571fc21a-b9f6-4e5f-a7d9-999999999999", (FaceID)その1
                "BoundingBox": {                           (バウンディングボックス)
                    "Width": 0.12293899804353714,
                    "Height": 0.18985800445079803,
                    "Left": 0.5232449769973755,
                    "Top": 0.24487000703811646
                },
                "ImageId": "1afdd52c-b526-340e-80dc-999999999999", (ImageId)
                "Confidence": 99.99700164794922                     (信頼度)
            }
        }
    ],
    "FaceModelVersion": "5.0",
    "ResponseMetadata": {
        "RequestId": "fa6c370e-30b7-4aa5-8ee6-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Mon, 05 Jul 2021 12:14:11 GMT",
            "x-amzn-requestid": "fa6c370e-30b7-4aa5-8ee6-999999999999",
            "content-length": "516",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}
***** FaceMatches *****
PS C:\Users\mikol\rekognition> python search_faces_by_images.py collect2.JPG
***** search_faces_by_image ***** (2枚目の写真 colecction2.JPG)
{
    "SearchedFaceBoundingBox": {
        "Width": 0.10059048980474472,
        "Height": 0.15385732054710388,
        "Left": 0.29988566040992737,
        "Top": 0.37411487102508545
    },
    "SearchedFaceConfidence": 99.98789978027344,
    "FaceMatches": [  (画像内顔に一致したコレクション内バウンディングボックス)
        {
            "Similarity": 99.86080169677734,
            "Face": {
                "FaceId": "571fc21a-b9f6-4e5f-a7d9-999999999999", (FaceID)その1
                "BoundingBox": {                           (バウンディングボックス)
                    "Width": 0.12293899804353714,
                    "Height": 0.18985800445079803,
                    "Left": 0.5232449769973755,
                    "Top": 0.24487000703811646
                },
                "ImageId": "1afdd52c-b526-340e-80dc-999999999999", (ImageId)
                "Confidence": 99.99700164794922                      (信頼度)
            }
        }
    ],
    "FaceModelVersion": "5.0",
    "ResponseMetadata": {
        "RequestId": "fd8e3ced-3733-4eae-9473-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Mon, 05 Jul 2021 12:14:41 GMT",
            "x-amzn-requestid": "fd8e3ced-3733-4eae-9473-999999999999",
            "content-length": "518",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}
***** FaceMatches *****
PS C:\Users\mikol\rekognition> python search_faces_by_images.py collect3.JPG
***** search_faces_by_image ***** (3枚目の写真 colecction3.JPG)
{
    "SearchedFaceBoundingBox": {
        "Width": 0.684465765953064,
        "Height": 0.789303719997406,
        "Left": 0.17188462615013123,
        "Top": 0.10508763045072556
    },
    "SearchedFaceConfidence": 99.99497985839844,
    "FaceMatches": [],(画像内顔に一致したコレクション内バウンディングボックス無し)
    "FaceModelVersion": "5.0",
    "ResponseMetadata": {
        "RequestId": "af6685de-c193-45cc-b336-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Mon, 05 Jul 2021 12:15:01 GMT",
            "x-amzn-requestid": "af6685de-c193-45cc-b336-999999999999",
            "content-length": "220",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}
PS C:\Users\mikol\rekognition> python search_faces_by_images.py collect4.JPG
***** search_faces_by_image ***** (4枚目の写真 colecction4.JPG)
{
    "SearchedFaceBoundingBox": {
        "Width": 0.10848236083984375,
        "Height": 0.07557439059019089,
        "Left": 0.6823559999465942,
        "Top": 0.30518975853919983
    },
    "SearchedFaceConfidence": 99.99946594238281,
    "FaceMatches": [  (画像内顔に一致したコレクション内バウンディングボックス)
        {
            "Similarity": 99.9546890258789,
            "Face": {
                "FaceId": "571fc21a-b9f6-4e5f-a7d9-999999999999",  (FaceID)その1
                "BoundingBox": {                            (バウンディングボックス)
                    "Width": 0.12293899804353714,
                    "Height": 0.18985800445079803,
                    "Left": 0.5232449769973755,
                    "Top": 0.24487000703811646
                },
                "ImageId": "1afdd52c-b526-340e-80dc-999999999999", (ImageId)
                "Confidence": 99.99700164794922                      (信頼度)
            }
        }
    ],
    "FaceModelVersion": "5.0",
    "ResponseMetadata": {
        "RequestId": "10bf1b6e-2a0d-4cea-b24e-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Mon, 05 Jul 2021 12:15:35 GMT",
            "x-amzn-requestid": "10bf1b6e-2a0d-4cea-b24e-999999999999",
            "content-length": "516",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}
***** FaceMatches *****
PS C:\Users\mikol\rekognition> python search_faces_by_images.py collect5.JPG
***** search_faces_by_image ***** (5枚目の写真 colecction5.JPG)
{
    "SearchedFaceBoundingBox": {
        "Width": 0.12772728502750397,
        "Height": 0.13111555576324463,
        "Left": 0.6433197855949402,
        "Top": 0.4130447208881378
    },
    "SearchedFaceConfidence": 99.99877166748047,
    "FaceMatches": [],  (画像内顔に一致したコレクション内バウンディングボックス無し)
    "FaceModelVersion": "5.0",
    "ResponseMetadata": {
        "RequestId": "c1bda0fb-b8aa-4a7d-8603-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Mon, 05 Jul 2021 12:18:21 GMT",
            "x-amzn-requestid": "c1bda0fb-b8aa-4a7d-8603-999999999999",
            "content-length": "222",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}

下の画像イメージが、評価した写真(左側)とサーチ結果(右側)のイメージです。
サーチ結果には、顔を認識できた場合にその位置の画像だけ抜き出すようにしています。

1枚目の写真は私が背広着ているもので、正面から映しているノーマルなもので問題なく私であることを見抜いています。

2枚目の写真は私が剣道の稽古に行ったが、さぼっているときの1枚です。横を向いているので、正面から撮った登録した画像とは違いがあるんですが、見事に見抜いています。

3枚目の写真は遊びで不細工おちゃらけ写真で、連れていかれそうですが、さすがに私であるとは思わなかったようです。

これで見抜かれてもショックですが!

4枚目は、私と母親が一緒に撮ったときの1枚です。
コレクションには私と母親が登録されていて、写真には両方とも映っているのですが、処理結果を確認してみると私をサーチしているようです。(結果画像が変ですが)

これはサーチ対象で、映りが大きい方の顔を評価の対象としているからだと思われます。

使っているsearch_faces_by_imageメソッドの仕様によっているので、search_facesメソッドを使って、対象にする顔に絞った検索に実装することもできそうです。

私の母と妻が映っている1枚ですが、妻が若干大きく映り込んでいるので、妻をコレクションからサーチした結果、コレクションにはないよっと言っています。

これも、search_faces_by_imageメソッドの仕様によるところと思われます。

③コレクションを削除するプログラム  delete_collection.py

import boto3
import json
rekognition = boto3.client('rekognition')
collection_id = 'MikolaboCollection'
result = rekognition.delete_collection(CollectionId=collection_id)
print(json.dumps(result, indent=4))

コレクションを削除しました。

PS C:\Users\mikol\rekognition> python delete_collection.py
{
    "StatusCode": 200,
    "ResponseMetadata": {
        "RequestId": "10fcf2f4-531e-4d25-b2cc-999999999999",
        "HTTPStatusCode": 200,
        "HTTPHeaders": {
            "content-type": "application/x-amz-json-1.1",
            "date": "Mon, 05 Jul 2021 12:31:24 GMT",
            "x-amzn-requestid": "10fcf2f4-531e-4d25-b2cc-999999999999",
            "content-length": "18",
            "connection": "keep-alive"
        },
        "RetryAttempts": 0
    }
}

実行するとコレクションが削除されるので、またコレクションの再登録からサーチ処理を流せるようなります。

または、プログラム中のコレクション名を変更すれば、別のコレクションとしてサーチができます。