Compartir a través de


Búsqueda de caras similares

Precaución

El acceso al servicio Face está limitado en función de los criterios de idoneidad y uso para apoyar nuestros principios de inteligencia artificial responsable. El servicio Face solo está disponible para clientes y asociados administrados por Microsoft. Use el formulario de admisión de reconocimiento facial para solicitar acceso. Para obtener más información, consulte la página Acceso limitado de Face.

La operación de búsqueda de similares realiza una coincidencia facial entre una cara objetivo y un conjunto de caras candidatas, y busca un conjunto más reducido de caras parecidas a la cara objetivo. Esto resulta útil para realizar una búsqueda de caras por imagen.

En esta guía se muestra cómo usar la característica Buscar similar en los distintos SDK de lenguaje. En el código de ejemplo siguiente se supone que ya ha autenticado un objeto de cliente de Face. Para más información sobre cómo hacerlo, siga un inicio rápido.

Detección de caras para la comparación

Tendrá que detectar caras en imágenes para poder compararlas. En esta guía, la imagen remota siguiente, denominada findsimilar.jpg, se usará como origen:

Foto de un hombre que sonríe.

En esta guía se usan imágenes remotas a las que accede la dirección URL. Guarde una referencia a la siguiente cadena de dirección URL. Todas las imágenes a las que se accede en esta guía se encuentran en esta ruta de URL.

string baseUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/Face/images/";

El método de detección de caras siguiente está optimizado para las operaciones de comparación. No extrae atributos de cara detallados y usa un modelo de reconocimiento optimizado.

private static async Task<List<FaceDetectionResult>> DetectFaceRecognize(FaceClient faceClient, string url)
{
    // Detect faces from image URL.
    var response = await faceClient.DetectAsync(new Uri(url), FaceDetectionModel.Detection03, FaceRecognitionModel.Recognition04, true, [FaceAttributeType.QualityForRecognition]);
    IReadOnlyList<FaceDetectionResult> detectedFaces = response.Value;
    List<FaceDetectionResult> sufficientQualityFaces = new List<FaceDetectionResult>();
    foreach (FaceDetectionResult detectedFace in detectedFaces)
    {
        QualityForRecognition? faceQualityForRecognition = detectedFace.FaceAttributes.QualityForRecognition;
        if (faceQualityForRecognition.HasValue && (faceQualityForRecognition.Value != QualityForRecognition.Low))
        {
            sufficientQualityFaces.Add(detectedFace);
        }
    }
    Console.WriteLine($"{detectedFaces.Count} face(s) with {sufficientQualityFaces.Count} having sufficient quality for recognition detected from image `{Path.GetFileName(url)}`");

    return sufficientQualityFaces;
}

En el código siguiente se usa el método anterior para obtener datos de caras de una serie de imágenes.

Console.WriteLine("========FIND SIMILAR========");
Console.WriteLine();

List<string> targetImageFileNames = new List<string>
                    {
                        "Family1-Dad1.jpg",
                        "Family1-Daughter1.jpg",
                        "Family1-Mom1.jpg",
                        "Family1-Son1.jpg",
                        "Family2-Lady1.jpg",
                        "Family2-Man1.jpg",
                        "Family3-Lady1.jpg",
                        "Family3-Man1.jpg"
                    };

string sourceImageFileName = "findsimilar.jpg";
List<Guid> targetFaceIds = new List<Guid>();
foreach (string targetImageFileName in targetImageFileNames)
{
    // Detect faces from target image url.
    List<FaceDetectionResult> faces = await DetectFaceRecognize(client, $"{baseUrl}{targetImageFileName}");
    // Add detected faceId to list of GUIDs.
    targetFaceIds.Add(faces[0].FaceId.Value);
}

// Detect faces from source image url.
List<FaceDetectionResult> detectedFaces = await DetectFaceRecognize(client, $"{baseUrl}{sourceImageFileName}");
Console.WriteLine();

Búsqueda e impresión de las coincidencias

En esta guía, la cara detectada en la imagen Family1-Dad1.jpg se debe devolver como la que es similar a la cara de la imagen de origen.

Foto de un hombre que sonríe; se trata de la misma persona que la imagen anterior.

En el código siguiente se llama a Find Similar API en la lista de caras guardada.

// Find a similar face(s) in the list of IDs. Comapring only the first in list for testing purposes.
var response = await client.FindSimilarAsync(detectedFaces[0].FaceId.Value, targetFaceIds);
List<FaceFindSimilarResult> similarResults = response.Value.ToList();

El siguiente código imprime los detalles coincidentes en la consola:

foreach (FaceFindSimilarResult similarResult in similarResults)
{
    Console.WriteLine($"Faces from {sourceImageFileName} & ID:{similarResult.FaceId} are similar with confidence: {similarResult.Confidence}.");
}
Console.WriteLine();

Paso siguiente

En esta guía, ha aprendido a llamar a Find Similar API para realizar una búsqueda facial por similitud en un grupo de caras mayor. A continuación, obtenga más información sobre los diferentes modelos de reconocimiento disponibles para las operaciones de comparación de caras.