イメージ内の顔の比較 - Amazon Rekognition

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

イメージ内の顔の比較

ソースイメージ内の顔とターゲットイメージ内の各顔を比較するには、CompareFaces オペレーションを使用します。

レスポンスで返す一致の最小信頼度を指定するには、リクエストの similarityThreshold を使用します。詳細については、「CompareFaces」を参照してください。

複数の顔を含むソースイメージを指定した場合、サービスでは最大サイズの顔を検出して、この顔とターゲットイメージで検出した各顔を比較します。

ソースイメージおよびターゲットイメージとして、イメージのバイト配列 (base64 エンコードされたイメージのバイト) を指定するか、Amazon S3 オブジェクトを指定できます。左AWS CLIの例では、2 つの JPEG イメージを Amazon S3 バケットにアップロードし、オブジェクトのキー名を指定します。他の例では、2 つのファイルをローカルファイルシステムからロードし、これらをイメージのバイト配列として入力します。

注記

CompareFacesは、確率的である機械学習アルゴリズムを使用します。偽陰性とは、ターゲット画像の顔がソース画像の顔と比較して類似度信頼度スコアが低いという誤った予測です。偽陰性の可能性を減らすために、ターゲット画像を複数のソース画像と比較することをお勧めします。使用する予定の場合はCompareFacesが個人の権利、プライバシー、またはサービスへのアクセスに影響する決定を下す場合は、アクションを実行する前に、その結果を人間に渡して確認し、さらに検証することをお勧めします。

顔を比較するには

  1. まだ実行していない場合:

    1. IAM ユーザーを作成または更新するAmazonRekognitionFullAccessおよびAmazonS3ReadOnlyAccess(AWS CLI例のみ) アクセス許可。詳細については、「ステップ 1: AWS アカウントをセットアップして IAM ユーザーを作成する」を参照してください。

    2. AWS CLI と AWS SDK をインストールして設定します。詳細については、「ステップ 2: をセットアップするAWS CLIおよびAWSSDK」を参照してください。

  2. 次のコード例を使用して、CompareFaces オペレーションを呼び出します。

    Java

    この例では、ローカルファイルシステムからロードしたソースイメージとターゲットイメージ間で一致する顔の情報を表示します。

    sourceImagetargetImage の値は、ソースイメージとターゲットイメージのパスとファイル名に置き換えます。

    //Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. //PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.) package aws.example.rekognition.image; import com.amazonaws.services.rekognition.AmazonRekognition; import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder; import com.amazonaws.services.rekognition.model.Image; import com.amazonaws.services.rekognition.model.BoundingBox; import com.amazonaws.services.rekognition.model.CompareFacesMatch; import com.amazonaws.services.rekognition.model.CompareFacesRequest; import com.amazonaws.services.rekognition.model.CompareFacesResult; import com.amazonaws.services.rekognition.model.ComparedFace; import java.util.List; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.nio.ByteBuffer; import com.amazonaws.util.IOUtils; public class CompareFaces { public static void main(String[] args) throws Exception{ Float similarityThreshold = 70F; String sourceImage = "source.jpg"; String targetImage = "target.jpg"; ByteBuffer sourceImageBytes=null; ByteBuffer targetImageBytes=null; AmazonRekognition rekognitionClient = AmazonRekognitionClientBuilder.defaultClient(); //Load source and target images and create input parameters try (InputStream inputStream = new FileInputStream(new File(sourceImage))) { sourceImageBytes = ByteBuffer.wrap(IOUtils.toByteArray(inputStream)); } catch(Exception e) { System.out.println("Failed to load source image " + sourceImage); System.exit(1); } try (InputStream inputStream = new FileInputStream(new File(targetImage))) { targetImageBytes = ByteBuffer.wrap(IOUtils.toByteArray(inputStream)); } catch(Exception e) { System.out.println("Failed to load target images: " + targetImage); System.exit(1); } Image source=new Image() .withBytes(sourceImageBytes); Image target=new Image() .withBytes(targetImageBytes); CompareFacesRequest request = new CompareFacesRequest() .withSourceImage(source) .withTargetImage(target) .withSimilarityThreshold(similarityThreshold); // Call operation CompareFacesResult compareFacesResult=rekognitionClient.compareFaces(request); // Display results List <CompareFacesMatch> faceDetails = compareFacesResult.getFaceMatches(); for (CompareFacesMatch match: faceDetails){ ComparedFace face= match.getFace(); BoundingBox position = face.getBoundingBox(); System.out.println("Face at " + position.getLeft().toString() + " " + position.getTop() + " matches with " + match.getSimilarity().toString() + "% confidence."); } List<ComparedFace> uncompared = compareFacesResult.getUnmatchedFaces(); System.out.println("There was " + uncompared.size() + " face(s) that did not match"); } }
    Java V2

    このコードはAWSドキュメンテーション SDK 例 GitHub リポジトリ。完全な例を参照してくださいここ:

    public static void compareTwoFaces(RekognitionClient rekClient, Float similarityThreshold, String sourceImage, String targetImage) { try { InputStream sourceStream = new FileInputStream(sourceImage); InputStream tarStream = new FileInputStream(targetImage); SdkBytes sourceBytes = SdkBytes.fromInputStream(sourceStream); SdkBytes targetBytes = SdkBytes.fromInputStream(tarStream); // Create an Image object for the source image. Image souImage = Image.builder() .bytes(sourceBytes) .build(); Image tarImage = Image.builder() .bytes(targetBytes) .build(); CompareFacesRequest facesRequest = CompareFacesRequest.builder() .sourceImage(souImage) .targetImage(tarImage) .similarityThreshold(similarityThreshold) .build(); // Compare the two images. CompareFacesResponse compareFacesResult = rekClient.compareFaces(facesRequest); List<CompareFacesMatch> faceDetails = compareFacesResult.faceMatches(); for (CompareFacesMatch match: faceDetails){ ComparedFace face= match.face(); BoundingBox position = face.boundingBox(); System.out.println("Face at " + position.left().toString() + " " + position.top() + " matches with " + face.confidence().toString() + "% confidence."); } List<ComparedFace> uncompared = compareFacesResult.unmatchedFaces(); System.out.println("There was " + uncompared.size() + " face(s) that did not match"); System.out.println("Source image rotation: " + compareFacesResult.sourceImageOrientationCorrection()); System.out.println("target image rotation: " + compareFacesResult.targetImageOrientationCorrection()); } catch(RekognitionException | FileNotFoundException e) { System.out.println("Failed to load source image " + sourceImage); System.exit(1); } }
    AWS CLI

    この例では、compare-faces AWS CLI オペレーションの JSON 出力を表示します。

    置換bucket-nameは、ソースイメージとターゲットイメージが含まれている Amazon S3 バケットの名前に置き換えます。source.jpgtarget.jpg は、ソースイメージとターゲットイメージのファイル名に置き換えます。

    aws rekognition compare-faces \ --source-image '{"S3Object":{"Bucket":"bucket-name","Name":"source.jpg"}}' \ --target-image '{"S3Object":{"Bucket":"bucket-name","Name":"target.jpg"}}'
    Python

    この例では、ローカルファイルシステムからロードしたソースイメージとターゲットイメージ間で一致する顔の情報を表示します。

    source_filetarget_file の値は、ソースイメージとターゲットイメージのパスとファイル名に置き換えます。

    #Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. #PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.) import boto3 def compare_faces(sourceFile, targetFile): client=boto3.client('rekognition') imageSource=open(sourceFile,'rb') imageTarget=open(targetFile,'rb') response=client.compare_faces(SimilarityThreshold=80, SourceImage={'Bytes': imageSource.read()}, TargetImage={'Bytes': imageTarget.read()}) for faceMatch in response['FaceMatches']: position = faceMatch['Face']['BoundingBox'] similarity = str(faceMatch['Similarity']) print('The face at ' + str(position['Left']) + ' ' + str(position['Top']) + ' matches with ' + similarity + '% confidence') imageSource.close() imageTarget.close() return len(response['FaceMatches']) def main(): source_file='source' target_file='target' face_matches=compare_faces(source_file, target_file) print("Face matches: " + str(face_matches)) if __name__ == "__main__": main()
    .NET

    この例では、ローカルファイルシステムからロードしたソースイメージとターゲットイメージ間で一致する顔の情報を表示します。

    sourceImagetargetImage の値は、ソースイメージとターゲットイメージのパスとファイル名に置き換えます。

    //Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. //PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.) using System; using System.IO; using Amazon.Rekognition; using Amazon.Rekognition.Model; public class CompareFaces { public static void Example() { float similarityThreshold = 70F; String sourceImage = "source.jpg"; String targetImage = "target.jpg"; AmazonRekognitionClient rekognitionClient = new AmazonRekognitionClient(); Amazon.Rekognition.Model.Image imageSource = new Amazon.Rekognition.Model.Image(); try { using (FileStream fs = new FileStream(sourceImage, FileMode.Open, FileAccess.Read)) { byte[] data = new byte[fs.Length]; fs.Read(data, 0, (int)fs.Length); imageSource.Bytes = new MemoryStream(data); } } catch (Exception) { Console.WriteLine("Failed to load source image: " + sourceImage); return; } Amazon.Rekognition.Model.Image imageTarget = new Amazon.Rekognition.Model.Image(); try { using (FileStream fs = new FileStream(targetImage, FileMode.Open, FileAccess.Read)) { byte[] data = new byte[fs.Length]; data = new byte[fs.Length]; fs.Read(data, 0, (int)fs.Length); imageTarget.Bytes = new MemoryStream(data); } } catch (Exception) { Console.WriteLine("Failed to load target image: " + targetImage); return; } CompareFacesRequest compareFacesRequest = new CompareFacesRequest() { SourceImage = imageSource, TargetImage = imageTarget, SimilarityThreshold = similarityThreshold }; // Call operation CompareFacesResponse compareFacesResponse = rekognitionClient.CompareFaces(compareFacesRequest); // Display results foreach(CompareFacesMatch match in compareFacesResponse.FaceMatches) { ComparedFace face = match.Face; BoundingBox position = face.BoundingBox; Console.WriteLine("Face at " + position.Left + " " + position.Top + " matches with " + match.Similarity + "% confidence."); } Console.WriteLine("There was " + compareFacesResponse.UnmatchedFaces.Count + " face(s) that did not match"); } }
    Ruby

    この例では、ローカルファイルシステムからロードしたソースイメージとターゲットイメージ間で一致する顔の情報を表示します。

    photo_sourcephoto_target の値は、ソースイメージとターゲットイメージのパスとファイル名に置き換えます。

    # Add to your Gemfile # gem 'aws-sdk-rekognition' require 'aws-sdk-rekognition' credentials = Aws::Credentials.new( ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'] ) bucket = 'bucket' # the bucketname without s3:// photo_source = 'source.jpg' photo_target = 'target.jpg' client = Aws::Rekognition::Client.new credentials: credentials attrs = { source_image: { s3_object: { bucket: bucket, name: photo_source }, }, target_image: { s3_object: { bucket: bucket, name: photo_target }, }, similarity_threshold: 70 } response = client.compare_faces attrs response.face_matches.each do |face_match| position = face_match.face.bounding_box similarity = face_match.similarity puts "The face at: #{position.left}, #{position.top} matches with #{similarity} % confidence" end
    Node.js

    この例では、ローカルファイルシステムからロードしたソースイメージとターゲットイメージ間で一致する顔の情報を表示します。

    photo_sourcephoto_target の値は、ソースイメージとターゲットイメージのパスとファイル名に置き換えます。

    //Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. //PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.) const AWS = require('aws-sdk') const bucket = 'bucket' // the bucketname without s3:// const photo_source = 'source.jpg' const photo_target = 'target.jpg' const config = new AWS.Config({ accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, region: process.env.AWS_REGION }) const client = new AWS.Rekognition(); const params = { SourceImage: { S3Object: { Bucket: bucket, Name: photo_source }, }, TargetImage: { S3Object: { Bucket: bucket, Name: photo_target }, }, SimilarityThreshold: 70 } client.compareFaces(params, function(err, response) { if (err) { console.log(err, err.stack); // an error occurred } else { response.FaceMatches.forEach(data => { let position = data.Face.BoundingBox let similarity = data.Similarity console.log(`The face at: ${position.Left}, ${position.Top} matches with ${similarity} % confidence`) }) // for response.faceDetails } // if });

CompareFaces オペレーションのリクエスト

CompareFaces への入力はイメージです。次の例では、ソースイメージとターゲットイメージをローカルファイルシステムからロードします。SimilarityThreshold 入力パラメータで指定した最小限の信頼度以上で一致した顔の比較結果がレスポンスで返されます。詳細については、「イメージの操作」を参照してください。

{ "SourceImage": { "Bytes": "/9j/4AAQSk2Q==..." }, "TargetImage": { "Bytes": "/9j/4O1Q==..." }, "SimilarityThreshold": 70 }

CompareFaces オペレーションのレスポンス

レスポンスでは、一致した顔の配列、ソースの顔の情報、ソースイメージとターゲットイメージの向き、および一致しない顔の配列が返されます。ターゲットイメージの一致した顔ごとに、類似度スコア (ソースの顔と類似している度合い) と顔のメタデータがレスポンスで返されます。顔のメタデータには、一致した顔の境界ボックスや顔のランドマークの配列などの情報が含まれます。一致しない顔の配列には、顔のメタデータが含まれます。

次のレスポンス例では、以下の点に注意してください。

  • フェースマッチ情報— 例は、ターゲットイメージ内で一致する顔が 1 つ検出されたことを示しています。顔の一致では、境界ボックスと信頼値 (境界ボックス内に顔が含まれていることを示す Amazon REKognition の信頼度) が返されます。similarity スコアの 99.99 は、顔の類似度を示します。顔の一致情報には、ランドマークの位置の配列も含まれます。

    複数の顔が一致すると、すべての一致する顔が faceMatches 配列に含まれます。

  • ソースの顔情報 – レスポンスには、比較に使用されたソースイメージ内の顔に関する情報 (および境界ボックスと信頼値) が含まれます。

  • 一致しない面の一致情報この例では、ターゲットイメージ内で Amazon Rekognition が検出した 1 つの顔が、ソースイメージで分析した顔と一致しませんでした。顔について、境界ボックスと信頼値 (境界ボックス内に顔が含まれていることを示す Amazon REKognition の信頼度) が返されます。顔の情報には、ランドマークの位置の配列も含まれます。

    Amazon Rekognition で複数の一致しない顔が検出されると、UnmatchedFaces配列には、一致しない顔がすべて含まれます。

{ "FaceMatches": [{ "Face": { "BoundingBox": { "Width": 0.5521978139877319, "Top": 0.1203877404332161, "Left": 0.23626373708248138, "Height": 0.3126954436302185 }, "Confidence": 99.98751068115234, "Pose": { "Yaw": -82.36799621582031, "Roll": -62.13221740722656, "Pitch": 0.8652129173278809 }, "Quality": { "Sharpness": 99.99880981445312, "Brightness": 54.49755096435547 }, "Landmarks": [{ "Y": 0.2996366024017334, "X": 0.41685718297958374, "Type": "eyeLeft" }, { "Y": 0.2658946216106415, "X": 0.4414493441581726, "Type": "eyeRight" }, { "Y": 0.3465650677680969, "X": 0.48636093735694885, "Type": "nose" }, { "Y": 0.30935320258140564, "X": 0.6251809000968933, "Type": "mouthLeft" }, { "Y": 0.26942989230155945, "X": 0.6454493403434753, "Type": "mouthRight" } ] }, "Similarity": 100.0 }], "SourceImageOrientationCorrection": "ROTATE_90", "TargetImageOrientationCorrection": "ROTATE_90", "UnmatchedFaces": [{ "BoundingBox": { "Width": 0.4890109896659851, "Top": 0.6566604375839233, "Left": 0.10989011079072952, "Height": 0.278298944234848 }, "Confidence": 99.99992370605469, "Pose": { "Yaw": 51.51519012451172, "Roll": -110.32493591308594, "Pitch": -2.322134017944336 }, "Quality": { "Sharpness": 99.99671173095703, "Brightness": 57.23163986206055 }, "Landmarks": [{ "Y": 0.8288310766220093, "X": 0.3133862614631653, "Type": "eyeLeft" }, { "Y": 0.7632885575294495, "X": 0.28091415762901306, "Type": "eyeRight" }, { "Y": 0.7417283654212952, "X": 0.3631140887737274, "Type": "nose" }, { "Y": 0.8081989884376526, "X": 0.48565614223480225, "Type": "mouthLeft" }, { "Y": 0.7548204660415649, "X": 0.46090251207351685, "Type": "mouthRight" } ] }], "SourceImageFace": { "BoundingBox": { "Width": 0.5521978139877319, "Top": 0.1203877404332161, "Left": 0.23626373708248138, "Height": 0.3126954436302185 }, "Confidence": 99.98751068115234 } }