Comparação de faces em imagens - Amazon Rekognition

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Comparação de faces em imagens

Para comparar uma face na imagem de origem com cada face na imagem de destino, use a operação CompareFaces .

Para especificar o nível de confiança mínimo na correspondência desejada na resposta retornada, use similarityThreshold na solicitação. Para obter mais informações, consulte CompareFaces .

Se você fornecer uma imagem de origem que contém várias faces, o serviço detectará a maior e a usará na comparação com cada face detectada na imagem de destino.

Você pode fornecer as imagens de origem e destino como uma matriz de bytes de imagem (bytes de imagem codificados em base64) ou especificar objetos do Amazon S3. NoAWS CLIExemplo, você carrega duas imagens JPEG no bucket do Amazon S3 e especifica o nome da chave do objeto. Nos outros exemplos, você carrega dois arquivos do sistema de arquivos local e os insere como matrizes de bytes de imagens.

nota

CompareFaces usa algoritmos de aprendizado de máquina, que são probabilísticos. Um falso negativo é uma previsão incorreta de que um rosto na imagem de destino tem uma pontuação de confiança de baixa semelhança quando comparado com o rosto na imagem de origem. Para reduzir a probabilidade de falsos negativos, recomendamos que você compare a imagem de destino com várias imagens de origem. Se você planeja usarCompareFacespara tomar uma decisão que impacte os direitos, a privacidade ou o acesso de um indivíduo aos serviços, recomendamos que você transmita o resultado a um ser humano para análise e validação adicional antes de tomar medidas.

Para comparar faces

  1. Se ainda não tiver feito isso:

    1. Crie ou atualize um usuário do IAM comAmazonRekognitionFullAccesseAmazonS3ReadOnlyAccess(AWS CLIsomente exemplo) permissões. Para obter mais informações, consulte Etapa 1: Configurar uma conta da AWS e criar um usuário do IAM.

    2. Instale e configure a AWS CLI e os SDKs da AWS. Para obter mais informações, consulte Etapa 2: Configurar aAWS CLIeAWSSDKs da.

  2. Use o código de exemplo a seguir para chamar a operação CompareFaces.

    Java

    Este exemplo exibe informações sobre faces correspondentes em imagens de origem e destino carregadas do sistema de arquivos local.

    Substitua os valores de sourceImage e targetImage pelo caminho e pelo nome de arquivo das imagens de origem e 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"); } }
    Java V2

    Esse código é capturado segundo oAWSExemplos do SDK da documentação do repositório GitHub. Veja o exemplo completoAqui.

    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

    Esse exemplo exibe a saída JSON da operação da AWS CLI compare-faces.

    Substituirbucket-namepelo nome do bucket do Amazon S3 que contém as imagens de origem e destino. Substitua source.jpg e target.jpg pelos nomes de arquivo das imagens de origem e 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 exemplo exibe informações sobre faces correspondentes em imagens de origem e destino carregadas do sistema de arquivos local.

    Substitua os valores de source_file e target_file pelo caminho e pelo nome de arquivo das imagens de origem e 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 exemplo exibe informações sobre faces correspondentes em imagens de origem e destino carregadas do sistema de arquivos local.

    Substitua os valores de sourceImage e targetImage pelo caminho e pelo nome de arquivo das imagens de origem e 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 exemplo exibe informações sobre faces correspondentes em imagens de origem e destino carregadas do sistema de arquivos local.

    Substitua os valores de photo_source e photo_target pelo caminho e pelo nome de arquivo das imagens de origem e 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 exemplo exibe informações sobre faces correspondentes em imagens de origem e destino carregadas do sistema de arquivos local.

    Substitua os valores de photo_source e photo_target pelo caminho e pelo nome de arquivo das imagens de origem e 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 });

Solicitação da operação CompareFaces

A entrada de CompareFaces é uma imagem. Neste exemplo, as imagens de origem e destino carregadas do sistema de arquivos local. O parâmetro de entrada SimilarityThreshold especifica o mínimo de confiança que comparou faces que precisa corresponder para ser incluído na resposta. Para obter mais informações, consulte Como trabalhar com imagens.

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

Resposta da operação CompareFaces

Na resposta, você obtém uma matriz de correspondências de faces, informações sobre a face de origem, a orientação da imagem de origem e de destino e uma matriz de faces não correspondidas. Para cada face correspondente na imagem de destino, a resposta fornece uma pontuação de semelhança (a semelhança da face com a face de origem) e metadados da face. Os metadados da face incluem informações, como a caixa delimitadora da face correspondente em uma matriz de pontos de referência faciais. A matriz de faces não correspondentes inclui os metadados das faces.

Na resposta de exemplo a seguir, observe o seguinte:

  • Informações de correspondência facial— O exemplo mostra que uma correspondência de face foi encontrada na imagem de destino. Para essa correspondência de faces, ele fornece uma caixa delimitadora e um valor de confiança (o nível de confiança que o Amazon Rekognition tem de que a caixa delimitadora contém uma face). A pontuação similarity de 99,99 indica a semelhança das faces. As informações de correspondência de faces também incluem uma matriz de locais de pontos de referência.

    Se várias faces corresponderem, a matriz de faceMatches incluirá todas as correspondências de faces.

  • Informações da face de origem – a resposta inclui informações sobre a face da imagem de origem que foi usada na comparação incluindo a caixa delimitadora e o valor de confiança.

  • Informações de correspondência de rosto incomparáveis— o exemplo mostra uma face que o Amazon Rekognition encontrou na imagem de destino que não correspondeu à face analisada na imagem de origem. Para essa face, ele fornece uma caixa delimitadora e um valor de confiança que indica o nível de confiança que o Amazon Rekognition tem de que a caixa delimitadora contém uma face. As informações de faces também incluem uma matriz de locais de pontos de referência.

    Se o Amazon Rekognition encontrar várias faces que não correspondem, aUnmatchedFacesO array do inclui todas as faces que não correspondem.

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