Vergleichen von Gesichtern in Bildern - Amazon Rekognition

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Vergleichen von Gesichtern in Bildern

Mit Rekognition können Sie mithilfe der Operation Gesichter zwischen zwei Bildern vergleichen. CompareFaces Diese Funktion ist nützlich für Anwendungen wie die Identitätsprüfung oder den Abgleich von Fotos.

CompareFaces vergleicht ein Gesicht im Quellbild mit jedem Gesicht im Zielbild. Bilder werden entweder CompareFaces wie folgt übergeben:

  • Eine Base64-kodierte Darstellung eines Bildes.

  • Amazon S3 S3-Objekte.

Vergleich von Gesichtserkennung und Gesichtserkennung

Der Gesichtsvergleich unterscheidet sich von der Gesichtserkennung. Die Gesichtserkennung (die verwendet DetectFaces) identifiziert nur das Vorhandensein und die Position von Gesichtern in einem Bild oder Video. Im Gegensatz dazu wird beim Gesichtsvergleich ein erkanntes Gesicht in einem Quellbild mit Gesichtern in einem Zielbild verglichen, um Übereinstimmungen zu finden.

Schwellenwerte für Ähnlichkeiten

Verwenden Sie den similarityThreshold Parameter, um das Mindestkonfidenzniveau für Übereinstimmungen zu definieren, die in die Antwort aufgenommen werden sollen. Standardmäßig werden in der Antwort nur Gesichter mit einem Ähnlichkeitswert von mehr als oder gleich 80% zurückgegeben.

Anmerkung

CompareFacesverwendet Algorithmen für maschinelles Lernen, die probabilistisch sind. Ein falsches Negativ ist eine falsche Vorhersage, dass ein Gesicht im Zielbild im Vergleich zum Gesicht im Quellbild einen niedrigen Ähnlichkeitswert aufweist. Um die Wahrscheinlichkeit falsch negativer Bilder zu verringern, empfehlen wir, das Zielbild mit mehreren Quellbildern zu vergleichen. Wenn Sie CompareFaces nutzen möchten, um eine Entscheidung zu treffen, die sich auf die Rechte, den Datenschutz oder den Zugang zu Diensten einer Person auswirkt, empfehlen wir Ihnen, das Ergebnis zur weiteren Überprüfung und Bestätigung an einen Mitarbeiter weiterzuleiten, bevor Sie Maßnahmen ergreifen.

Die folgenden Codebeispiele zeigen, wie die CompareFaces Operationen für verschiedene AWS SDKs verwendet werden. In dem AWS CLI Beispiel laden Sie zwei JPEG-Bilder in Ihren Amazon S3 S3-Bucket hoch und geben den Objektschlüsselnamen an. In den anderen Beispielen laden Sie zwei Dateien aus dem lokalen Dateisystem hoch und geben sie als Bild-Byte-Arrays ein.

So vergleichen Sie Gesichter
  1. Wenn Sie dies noch nicht getan haben:

    1. Erstellen oder aktualisieren Sie einen Benutzer mit AmazonRekognitionFullAccess und AmazonS3ReadOnlyAccess (nur AWS CLI Beispiel) Berechtigungen. Weitere Informationen finden Sie unter Schritt 1: Einrichten eines AWS-Kontos und Erstellen eines Benutzers.

    2. Installieren und konfigurieren Sie die AWS CLI und die AWS SDKs. Weitere Informationen finden Sie unter Schritt 2: Richten Sie die AWS CLI und AWS SDKs ein.

  2. Verwenden Sie den folgenden Beispiel-Code zum Aufrufen der CompareFaces-Operation.

    Java

    Dieses Beispiel zeigt Informationen über die übereinstimmenden Gesichter in Quell- und Zielbildern an, die aus dem lokalen Dateisystem geladen werden.

    Ersetzen Sie die Werte von sourceImage und targetImage durch den Pfad und Dateinamen der Quell- und Zielbilder.

    //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

    Dieser Code stammt aus dem AWS Documentation SDK Examples GitHub Repository. Das vollständige Beispiel finden Sie hier.

    import java.util.List; import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.rekognition.RekognitionClient; import software.amazon.awssdk.services.rekognition.model.RekognitionException; import software.amazon.awssdk.services.rekognition.model.Image; import software.amazon.awssdk.services.rekognition.model.BoundingBox; import software.amazon.awssdk.services.rekognition.model.CompareFacesMatch; import software.amazon.awssdk.services.rekognition.model.CompareFacesRequest; import software.amazon.awssdk.services.rekognition.model.CompareFacesResponse; import software.amazon.awssdk.services.rekognition.model.ComparedFace; import software.amazon.awssdk.core.SdkBytes; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; // snippet-end:[rekognition.java2.detect_faces.import] /** * Before running this Java V2 code example, set up your development environment, including your credentials. * * For more information, see the following documentation topic: * * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html */ public class CompareFaces { public static void main(String[] args) { final String usage = "\n" + "Usage: " + " <pathSource> <pathTarget>\n\n" + "Where:\n" + " pathSource - The path to the source image (for example, C:\\AWS\\pic1.png). \n " + " pathTarget - The path to the target image (for example, C:\\AWS\\pic2.png). \n\n"; if (args.length != 2) { System.out.println(usage); System.exit(1); } Float similarityThreshold = 70F; String sourceImage = args[0]; String targetImage = args[1]; Region region = Region.US_EAST_1; RekognitionClient rekClient = RekognitionClient.builder() .region(region) .credentialsProvider(ProfileCredentialsProvider.create("profile-name")) .build(); compareTwoFaces(rekClient, similarityThreshold, sourceImage, targetImage); rekClient.close(); } // snippet-start:[rekognition.java2.compare_faces.main] 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); } } // snippet-end:[rekognition.java2.compare_faces.main] }
    AWS CLI

    In diesem Beispiel wird die JSON-Ausgabe der compare-faces AWS CLI Operation angezeigt.

    Ersetzen Sie bucket-name durch den Namen des Amazon-S3-Buckets, der die Quell- und Zielbilder enthält. Ersetzen Sie source.jpg und target.jpg durch die Dateinamen für die Quell- und Zielbilder.

    aws rekognition compare-faces --target-image \ "{"S3Object":{"Bucket":"bucket-name","Name":"image-name"}}" \ --source-image "{"S3Object":{"Bucket":"bucket-name","Name":"image-name"}}" --profile profile-name

    Wenn Sie auf einem Windows-Gerät auf die CLI zugreifen, verwenden Sie doppelte Anführungszeichen anstelle von einfachen Anführungszeichen und maskieren Sie die inneren doppelten Anführungszeichen durch einen Backslash (d. h. \), um eventuell auftretende Parserfehler zu beheben. Sehen Sie sich zum Beispiel Folgendes an:

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

    Dieses Beispiel zeigt Informationen über die übereinstimmenden Gesichter in Quell- und Zielbildern an, die aus dem lokalen Dateisystem geladen werden.

    Ersetzen Sie die Werte von source_file und target_file durch den Pfad und Dateinamen der Quell- und Zielbilder. Ersetzen Sie den Wert von profile_name in der Zeile, die die Rekognition-Sitzung erstellt, durch den Namen Ihres Entwicklerprofils.

    # 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): session = boto3.Session(profile_name='profile-name') client = session.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-file-name' target_file = 'target-file-name' face_matches = compare_faces(source_file, target_file) print("Face matches: " + str(face_matches)) if __name__ == "__main__": main()
    .NET

    Dieses Beispiel zeigt Informationen über die übereinstimmenden Gesichter in Quell- und Zielbildern an, die aus dem lokalen Dateisystem geladen werden.

    Ersetzen Sie die Werte von sourceImage und targetImage durch den Pfad und Dateinamen der Quell- und Zielbilder.

    //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

    Dieses Beispiel zeigt Informationen über die übereinstimmenden Gesichter in Quell- und Zielbildern an, die aus dem lokalen Dateisystem geladen werden.

    Ersetzen Sie die Werte von photo_source und photo_target durch den Pfad und Dateinamen der Quell- und Zielbilder.

    # 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

    Dieses Beispiel zeigt Informationen über die übereinstimmenden Gesichter in Quell- und Zielbildern an, die aus dem lokalen Dateisystem geladen werden.

    Ersetzen Sie die Werte von photo_source und photo_target durch den Pfad und Dateinamen der Quell- und Zielbilder. Ersetzen Sie den Wert von profile_name in der Zeile, die die Rekognition-Sitzung erstellt, durch den Namen Ihres Entwicklerprofils.

    // Load the SDK var AWS = require('aws-sdk'); const bucket = 'bucket-name' // the bucket name without s3:// const photo_source = 'photo-source-name' // path and the name of file const photo_target = 'photo-target-name' var credentials = new AWS.SharedIniFileCredentials({profile: 'profile-name'}); AWS.config.credentials = credentials; AWS.config.update({region:'region-name'}); 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 Operationsanforderung

Die Eingabe in CompareFaces ist ein Bild. In diesem Beispiel werden die Quell- und Zielbilder aus dem lokalen Dateisystem geladen. Der SimilarityThreshold-Eingabeparameter gibt den minimalen Zuverlässigkeitswert an, dem verglichene Gesichter entsprechen müssen, um in die Antwort aufgenommen zu werden. Weitere Informationen finden Sie unter Arbeiten mit Bildern.

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

CompareFaces Antwort auf die Operation

Die Antwort enthält:

  • Eine Reihe von Übereinstimmungen mit Gesichtern: Eine Liste übereinstimmender Gesichter mit Ähnlichkeitswerten und Metadaten für jedes passende Gesicht. Wenn mehrere Gesichter übereinstimmen, wird faceMatches

    Das Array umfasst alle übereinstimmenden Gesichter.

  • Details zur Übereinstimmung von Gesichtern: Jedes übereinstimmende Gesicht bietet außerdem einen Begrenzungsrahmen, einen Konfidenzwert, die Position von Wahrzeichen und eine Ähnlichkeitsbewertung.

  • Eine Liste nicht übereinstimmender Gesichter: Die Antwort umfasst auch Gesichter aus dem Zielbild, die nicht mit dem Gesicht auf dem Quellbild übereinstimmen. Beinhaltet einen Begrenzungsrahmen für jedes Gesicht, das nicht zugeordnet wurde.

  • Informationen zum Quellgesicht: Enthält Informationen über das Gesicht aus dem Quellbild, das für den Vergleich verwendet wurde, einschließlich des Begrenzungsrahmens und des Konfidenzwerts.

Das Beispiel zeigt, dass im Zielbild eine Gesichtsübereinstimmung gefunden wurde. Für diese Gesichtsübereinstimmung liefert sie einen Begrenzungsrahmen und einen Zuverlässigkeitswert (das Maß an Vertrauen, das Amazon Rekognition hat, dass der Begrenzungsrahmen ein Gesicht enthält). Der Ähnlichkeitswert von 99,99 gibt an, wie ähnlich sich die Gesichter sind. Das Beispiel zeigt auch ein Gesicht, das Amazon Rekognition im Zielbild gefunden hat und das nicht mit dem Gesicht übereinstimmt, das im Quellbild analysiert wurde.

{ "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 } }