Udostępnij za pośrednictwem


Wyszukiwanie podobnych twarzy

Uwaga

Dostęp do usługi rozpoznawania twarzy jest ograniczony na podstawie kryteriów kwalifikowalności i użycia w celu obsługi naszych zasad odpowiedzialnej sztucznej inteligencji. Usługa rozpoznawania twarzy jest dostępna tylko dla klientów i partnerów zarządzanych przez firmę Microsoft. Użyj formularza zgłoszeniowego rozpoznawania twarzy, aby ubiegać się o dostęp. Aby uzyskać więcej informacji, zobacz stronę Ograniczonego dostępu.

Operacja Znajdź podobne wykonuje dopasowywanie twarzy między twarzą docelową a zestawem twarzy kandydatów, wyszukując mniejszy zestaw twarzy, które wyglądają podobnie do twarzy docelowej. Jest to przydatne w przypadku wyszukiwania twarzy według obrazu.

W tym przewodniku pokazano, jak używać funkcji Znajdź podobne w różnych zestawach SDK języka. Poniższy przykładowy kod zakłada, że obiekt klienta rozpoznawania twarzy został już uwierzytelniony. Aby uzyskać szczegółowe informacje na temat tego, jak to zrobić, postępuj zgodnie z przewodnikiem Szybki start.

Wykrywanie twarzy na potrzeby porównania

Aby można było je porównać, musisz wykryć twarze na obrazach. W tym przewodniku jako źródło zostanie użyty następujący obraz zdalny o nazwie findsimilar.jpg:

Zdjęcie mężczyzny, który uśmiecha się.

W tym przewodniku używane są obrazy zdalne, do których uzyskuje się dostęp za pomocą adresu URL. Zapisz odwołanie do podstawowego ciągu adresu URL. Wszystkie obrazy dostępne w tym przewodniku znajdują się w tej ścieżce adresu URL.

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

Poniższa metoda wykrywania twarzy jest zoptymalizowana pod kątem operacji porównania. Nie wyodrębnia szczegółowych atrybutów twarzy i używa zoptymalizowanego modelu rozpoznawania.

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

Poniższy kod używa powyższej metody do pobierania danych twarzy z serii obrazów.

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

Znajdowanie i drukowanie dopasowań

W tym przewodniku twarz wykryta na obrazie Family1-Dad1.jpg powinna zostać zwrócona jako twarz podobna do twarzy obrazu źródłowego.

Zdjęcie mężczyzny, który się uśmiecha; jest to ta sama osoba co poprzedni obraz.

Poniższy kod wywołuje API "Find Similar" na zapisanej liście twarzy.

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

Poniższy kod wyświetla szczegóły dopasowania na konsoli.

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

Następny krok

W tym przewodniku przedstawiono sposób wywoływania interfejsu API znajdź podobne w celu wyszukiwania twarzy według podobieństwa w większej grupie twarzy. Następnie dowiedz się więcej o różnych modelach rozpoznawania dostępnych dla operacji porównania twarzy.