Comparación de rostros en imágenes - Amazon Rekognition

Comparación de rostros en imágenes

Para comparar un rostro en la imagen de origen con cada rostro en la imagen de destino, utilice la operación CompareFaces.

Para especificar el nivel mínimo de confianza en la coincidencia que desea que se devuelva en la respuesta, utilice similarityThreshold en la solicitud. Para obtener más información, consulte CompareFaces.

Si proporciona una imagen de origen que contenga varios rostros, el servicio detecta el rostro mayor y lo usa para compararlo con cada rostro detectado en la imagen de destino.

Puede proporcionar las imágenes de origen y de destino como una matriz de bytes de imagen (bytes de imagen cifrados en base64) o especificar objetos de Amazon S3. En el ejemplo de AWS CLI, cargará dos imágenes JPEG en su bucket de Amazon S3 y especificará el nombre de clave del objeto. En los demás ejemplos, puede cargar dos archivos desde el sistema de archivos local e introducirlos como una matriz de bytes de imagen.

Para comparar rostros

  1. Si aún no lo ha hecho:

    1. Cree o actualice un usuario de IAM con los permisos AmazonRekognitionFullAccess y AmazonS3ReadOnlyAccess (solo el ejemplo de la AWS CLI). Para obtener más información, consulte Paso 1: Configurar una cuenta de AWS y crear un usuario de IAM.

    2. Instale y configure la AWS CLI y los AWS SDK. Para obtener más información, consulte Paso 2: Configurar la AWS CLI y los AWS SDK.

  2. Utilice el siguiente código de ejemplo para realizar llamadas a la operación CompareFaces.

    Java

    Este ejemplo muestra información sobre rostros coincidentes de las imágenes de origen y de destino que se cargan desde el sistema de archivos local.

    Reemplace los valores de sourceImage y targetImage por la ruta y el nombre de archivo de las imágenes de origen y de destino.

    //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"); } }
    AWS CLI

    Este ejemplo muestra la salida de JSON de la operación compare-faces de la AWS CLI.

    Sustituya bucket-name por el nombre del bucket de Amazon S3 que contiene las imágenes de origen y destino. Reemplace source.jpg y target.jpg por los nombres de archivo de las imágenes de origen y destino.

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

    Este ejemplo muestra información sobre rostros coincidentes de las imágenes de origen y de destino que se cargan desde el sistema de archivos local.

    Reemplace los valores de source_file y target_file por la ruta y el nombre de archivo de las imágenes de origen y de destino.

    #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

    Este ejemplo muestra información sobre rostros coincidentes de las imágenes de origen y de destino que se cargan desde el sistema de archivos local.

    Reemplace los valores de sourceImage y targetImage por la ruta y el nombre de archivo de las imágenes de origen y de destino.

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

    Este ejemplo muestra información sobre rostros coincidentes de las imágenes de origen y de destino que se cargan desde el sistema de archivos local.

    Reemplace los valores de photo_source y photo_target por la ruta y el nombre de archivo de las imágenes de origen y de destino.

    # 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

    Este ejemplo muestra información sobre rostros coincidentes de las imágenes de origen y de destino que se cargan desde el sistema de archivos local.

    Reemplace los valores de photo_source y photo_target por la ruta y el nombre de archivo de las imágenes de origen y de destino.

    //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 });

Solicitud de operación CompareFaces

La entrada de CompareFaces es una imagen. En este ejemplo, las imágenes de origen y destino se cargan desde el sistema de archivos local. El parámetro SimilarityThreshold de entrada especifica el mínimo de confianza que la comparación de rostros debe tener para incluirse en la respuesta. Para obtener más información, consulte Trabajar con imágenes.

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

Respuesta de la operación CompareFaces

En la respuesta, obtiene una matriz de coincidencias de rostros, información de rostros de origen, orientación de imagen de origen y de destino y una matriz de rostros sin coincidencias. Para cada rostro coincidente de la imagen de destino, la respuesta proporciona una puntuación de similitud (cuánto se parece el rostro al rostro de origen) y los metadatos del rostro. Los metadatos de los rostros incluye información como el cuadro delimitador de la cara coincidente y una matriz de referencias faciales. La matriz de caras sin correspondencia incluye metadatos de rostro.

En la siguiente respuesta de ejemplo, tenga en cuenta lo siguiente:

  • Información de coincidencia de rostros – El ejemplo muestra la coincidencia de rostro encontrada en la imagen de destino. Para esa coincidencia de rostro, proporciona un cuadro delimitador y un valor de confianza (el nivel de confianza que tiene Amazon Rekognition de que el cuadro delimitador contenga un rostro). La puntuación de similarity de 99.99 indica qué similitud guardan los rostros. La información de coincidencia de rostros incluye además una gama de ubicaciones de referencias.

    Si varios rostros coinciden, la matriz faceMatches incluye todas las coincidencias de rostros.

  • Información del rostro de origen – La respuesta incluye información sobre el rostro de la imagen de origen que se utilizó para la comparación, incluido el cuadro delimitador y el valor de confianza.

  • Información de coincidencia de rostro sin coincidencias – El ejemplo muestra un rostro que Amazon Rekognition ha encontrado en la imagen de destino que no coincidía con el rostro analizado en la imagen de origen. Para ese rostro, proporciona un cuadro delimitador y un valor de confianza que indica el nivel de confianza que tiene Amazon Rekognition de que el contorno contenga un rostro. La información de rostro incluye además una gama de ubicaciones de referencias.

    Si Amazon Rekognition encuentra varios rostros que no coinciden, la matriz UnmatchedFaces incluye todos los rostros que no coinciden.

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