Condividi tramite


Individuare visi simili

Attenzione

L'accesso al servizio Viso è limitato in base ai criteri di idoneità e utilizzo al fine di supportare i nostri principi di intelligenza artificiale responsabile. Il servizio Viso è disponibile solo per i clienti e i partner gestiti da Microsoft. Usare il modulo di acquisizione riconoscimento volto per richiedere l'accesso. Per altre informazioni, vedere la pagina Accesso limitato dalla funzione Viso.

L'operazione di ricerca di visi simili confronta un viso di destinazione con un set di visi candidati e individua un set più piccolo di visi simili a quello di destinazione. Questo è utile per eseguire una ricerca di volti per immagine.

Questa guida spiega come usare la funzionalità di ricerca di visi simili nei SDK di varie lingue. Il codice di esempio seguente presuppone che un oggetto client Viso sia già stato autenticato. Per informazioni dettagliate su come eseguire questa operazione, seguire un'istruzione di avvio rapido.

Rilevare visi per il confronto

Prima di poter eseguire il confronto, è necessario rilevare i visi nelle immagini. In questa guida, come origine verrà usata l'immagine remota seguente, denominata findsimilar.jpg:

Foto di un uomo che sorride.

Questa guida usa immagini remote a cui si accede tramite URL. Salvare un riferimento alla stringa dell'URL di base. Tutte le immagini a cui si accede in questa guida si trovano in tale percorso URL.

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

Il seguente metodo di rilevamento dei volti è ottimizzato per le operazioni di confronto. Non estrae gli attributi dettagliati del viso e usa un modello di riconoscimento ottimizzato.

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

Il codice seguente usa il metodo precedente per ottenere i dati dei visi da una serie di immagini.

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();

Trovare e stampare corrispondenze

In questa guida, il viso rilevato nell'immagine Family1-Dad1.jpg deve essere restituito come viso simile al viso dell'immagine di origine.

Foto di un uomo che sorride; si tratta della stessa persona dell'immagine precedente.

Il codice seguente chiama l'API di ricerca di visi simili nell'elenco salvato di visi.

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

Il codice seguente visualizza i dettagli delle corrispondenze nella console:

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

Passaggio successivo

In questa guida si è appreso come chiamare l'API di ricerca di visi simili per eseguire una ricerca viso in base alla somiglianza in un gruppo più ampio di visi. Successivamente verranno descritti i diversi modelli di riconoscimento disponibili per le operazioni di confronto dei volti.