Quickstart: De Face-clientbibliotheek gebruiken
Ga aan de slag met gezichtsherkenning met behulp van de Face-clientbibliotheek voor .NET. Volg deze stappen om het pakket te installeren en de voorbeeldcode voor basistaken uit te proberen. De Face-service biedt u toegang tot geavanceerde algoritmen voor het detecteren en herkennen van menselijke gezichten in afbeeldingen.
Gebruik de Face-clientbibliotheek voor .NET voor het volgende:
Referentiedocumentatie | Broncode van bibliotheek | Pakket (NuGet) | Voorbeelden
Vereisten
- Azure-abonnement: Krijg een gratis abonnement
- De Visual Studio IDE of de huidige versie van .NET Core.
- Aan uw Azure-account moet Cognitive Services rol Inzender zijn toegewezen, zodat u akkoord kunt gaan met de verantwoordelijke AI-voorwaarden en een resource kunt maken. Neem contact op met uw beheerder om deze rol aan uw account toe te laten.
- Zodra u een Azure-abonnement hebt, maakt u een Face-resource in Azure Portal om uw sleutel en eindpunt op te halen. Nadat de app is geïmplementeerd, klikt u op Ga naar resource.
- U hebt de sleutel en het eindpunt nodig van de resource die u maakt, om de toepassing te verbinden met de Face-API. Later in de quickstart plakt u uw sleutel en eindpunt in de onderstaande code.
- U kunt de gratis prijscategorie (
F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.
Instellen
Een nieuwe C#-toepassing maken
Maak met behulp van Visual Studio een nieuwe .NET Core-toepassing.
De clientbibliotheek installeren
Nadat u een nieuw project hebt gemaakt, installeert u de clientbibliotheek door in Solution Explorer met de rechtermuisknop op de projectoplossing te klikken en NuGet-pakketten beheren te selecteren. Selecteer in de package manager die wordt geopend de optie Bladeren, schakel Prerelease opnemen in en zoek naar Microsoft.Azure.CognitiveServices.Vision.Face. Selecteer versie 2.7.0-preview.1 en vervolgens Installeren.
Tip
Wilt u het codebestand voor de quickstart in één keer weergeven? Die is te vinden op GitHub, waar de codevoorbeelden uit deze quickstart zich bevinden.
Open vanuit de projectmap het bestand program.cs en voeg de volgende using-instructies toe:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Azure.CognitiveServices.Vision.Face;
using Microsoft.Azure.CognitiveServices.Vision.Face.Models;
Maak in de klasse Programma van de toepassing variabelen voor de sleutel en het eindpunt van uw resource.
Belangrijk
Ga naar Azure Portal. Als de Face-resource die u hebt gemaakt in de sectie Vereisten is geïmplementeerd, klikt u op de knop Ga naar resource onder Volgende stappen. U vindt uw sleutel en eindpunt op de pagina Sleutel en eindpunt van de resource, onder Resourcebeheer.
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en plaats deze sleutel nooit in het openbaar. Overweeg om voor productie een veilige manier te gebruiken voor het opslaan en openen van uw referenties. Zie het artikel Cognitive Services Beveiliging voor meer informatie.
// From your Face subscription in the Azure portal, get your subscription key and endpoint.
const string SUBSCRIPTION_KEY = "PASTE_YOUR_FACE_SUBSCRIPTION_KEY_HERE";
const string ENDPOINT = "PASTE_YOUR_FACE_ENDPOINT_HERE";
Voeg in de Hoofdmethode van de toepassing aanroepen toe voor de methoden die in deze quickstart worden gebruikt. U gaat deze later implementeren.
// Authenticate.
IFaceClient client = Authenticate(ENDPOINT, SUBSCRIPTION_KEY);
// Detect - get features from faces.
DetectFaceExtract(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// Find Similar - find a similar face from a list of faces.
FindSimilar(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// Verify - compare two images if the same person or not.
Verify(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// Identify - recognize a face(s) in a person group (a person group is created in this example).
IdentifyInPersonGroup(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// LargePersonGroup - create, then get data.
LargePersonGroup(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// Group faces - automatically group similar faces.
Group(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// FaceList - create a face list, then get data
Objectmodel
De volgende klassen en interfaces verwerken enkele van de belangrijkste functies van de Face .NET-clientbibliotheek:
| Naam | Beschrijving |
|---|---|
| FaceClient | Deze klasse vertegenwoordigt uw autorisatie voor het gebruik van de Face-service. U hebt deze nodig voor alle Face-functies. U instantieert deze klasse met uw abonnementsgegevens en gebruikt deze om instanties van andere klassen te maken. |
| FaceOperations | Deze klasse verwerkt de basistaken voor detectie en herkenning die u met menselijke gezichten kunt uitvoeren. |
| DetectedFace | Deze klasse vertegenwoordigt alle gegevens die zijn gedetecteerd van één gezicht in een afbeelding. U kunt deze gebruiken om gedetailleerde informatie over het gezicht op te halen. |
| FaceListOperations | Deze klasse beheert de in de cloud opgeslagen FaceList-constructies, waarin een geassorteerde set gezichten wordt opgeslagen. |
| PersonGroupPersonExtensions | Deze klasse beheert de in de cloud opgeslagen Person-constructies, die een set gezichten opslaan die tot één persoon behoren. |
| PersonGroupOperations | Deze klasse beheert de in de cloud opgeslagen PersonGroup-constructies, die een set van verschillende Person-objecten opslaan. |
Codevoorbeelden
De onderstaande codefragmenten laten zien hoe u de volgende taken kunt uitvoeren met de Face-clientbibliotheek voor .NET:
- De client verifiëren
- Gezichten detecteren en analyseren
- Een gezicht identificeren
- Vergelijkbare gezichten zoeken
De client verifiëren
Instantieer in een nieuwe methode een client met uw eindpunt en sleutel. Maak een ApiKeyServiceClientCredentials -object met uw sleutel en maak hiermee en met uw eindpunt een FaceClient -object.
/*
* AUTHENTICATE
* Uses subscription key and region to create a client.
*/
public static IFaceClient Authenticate(string endpoint, string key)
{
return new FaceClient(new ApiKeyServiceClientCredentials(key)) { Endpoint = endpoint };
}
Helper-velden declareren
De volgende velden zijn vereist voor verschillende gezichtsbewerkingen die u later toevoegt. Definieer de volgende URL-tekenreeks in de hoofdmap van de klasse Programma. Deze URL verwijst naar een map met voorbeelden.
// Used for all examples.
// URL for the images.
const string IMAGE_BASE_URL = "https://csdx.blob.core.windows.net/resources/Face/Images/";
Definieer in de Main-methode tekenreeksen die verwijzen naar de verschillende typen herkenningsmodellen. Later kunt u opgeven welk herkenningsmodel u wilt gebruiken voor gezichtsdetectie. Zie Een herkenningsmodel opgeven voor meer informatie over deze opties.
// Recognition model 4 was released in 2021 February.
// It is recommended since its accuracy is improved
// on faces wearing masks compared with model 3,
// and its overall accuracy is improved compared
// with models 1 and 2.
const string RECOGNITION_MODEL4 = RecognitionModel.Recognition04;
Gezichten detecteren en analyseren
Gezichtsdetectie is vereist als eerste stap in alle andere scenario's. In deze sectie ziet u hoe u de gegevens van het extra gezichtskenmerk kunt retourneren. Als u alleen gezichten wilt detecteren voor gezichtsidentificatie of -verificatie, gaat u verder met de latere secties.
Gedetecteerde face-objecten ophalen
Maak een nieuwe methode voor het detecteren van gezichten. Met de DetectFaceExtract-methode worden drie van de afbeeldingen bij de opgegeven URL verwerkt en wordt een lijst met DetectedFace -objecten in het programmageheugen gemaakt. In de lijst met FaceAttributeType -waarden wordt aangegeven welke functies moeten worden geëxtraheerd.
/*
* DETECT FACES
* Detects features from faces and IDs them.
*/
public static async Task DetectFaceExtract(IFaceClient client, string url, string recognitionModel)
{
Console.WriteLine("========DETECT FACES========");
Console.WriteLine();
// Create a list of images
List<string> imageFileNames = new List<string>
{
"detection1.jpg", // single female with glasses
// "detection2.jpg", // (optional: single man)
// "detection3.jpg", // (optional: single male construction worker)
// "detection4.jpg", // (optional: 3 people at cafe, 1 is blurred)
"detection5.jpg", // family, woman child man
"detection6.jpg" // elderly couple, male female
};
foreach (var imageFileName in imageFileNames)
{
IList<DetectedFace> detectedFaces;
// Detect faces with all attributes from image url.
detectedFaces = await client.Face.DetectWithUrlAsync($"{url}{imageFileName}",
returnFaceAttributes: new List<FaceAttributeType> { FaceAttributeType.Accessories, FaceAttributeType.Age,
FaceAttributeType.Blur, FaceAttributeType.Emotion, FaceAttributeType.Exposure, FaceAttributeType.FacialHair,
FaceAttributeType.Gender, FaceAttributeType.Glasses, FaceAttributeType.Hair, FaceAttributeType.HeadPose,
FaceAttributeType.Makeup, FaceAttributeType.Noise, FaceAttributeType.Occlusion, FaceAttributeType.Smile },
// We specify detection model 1 because we are retrieving attributes.
detectionModel: DetectionModel.Detection01,
recognitionModel: recognitionModel);
Console.WriteLine($"{detectedFaces.Count} face(s) detected from image `{imageFileName}`.");
Tip
U kunt ook gezichten detecteren in een lokale afbeelding. Zie de IFaceOperations-methoden, bijvoorbeeld DetectWithStreamAsync.
Gedetecteerde gezichtsgegevens weergeven
De rest van de methode DetectFaceExtract parseert en drukt de kenmerkgegevens af voor elk gedetecteerd gezicht. Elk kenmerk moet afzonderlijk worden opgegeven in de oorspronkelijke gezichtsdetectie-API-aanroep (in de lijst FaceAttributeType ). De volgende code verwerkt elk kenmerk, maar u zult waarschijnlijk slechts één of enkele gebruiken.
// Parse and print all attributes of each detected face.
foreach (var face in detectedFaces)
{
Console.WriteLine($"Face attributes for {imageFileName}:");
// Get bounding box of the faces
Console.WriteLine($"Rectangle(Left/Top/Width/Height) : {face.FaceRectangle.Left} {face.FaceRectangle.Top} {face.FaceRectangle.Width} {face.FaceRectangle.Height}");
// Get accessories of the faces
List<Accessory> accessoriesList = (List<Accessory>)face.FaceAttributes.Accessories;
int count = face.FaceAttributes.Accessories.Count;
string accessory; string[] accessoryArray = new string[count];
if (count == 0) { accessory = "NoAccessories"; }
else
{
for (int i = 0; i < count; ++i) { accessoryArray[i] = accessoriesList[i].Type.ToString(); }
accessory = string.Join(",", accessoryArray);
}
Console.WriteLine($"Accessories : {accessory}");
// Get face other attributes
Console.WriteLine($"Age : {face.FaceAttributes.Age}");
Console.WriteLine($"Blur : {face.FaceAttributes.Blur.BlurLevel}");
// Get emotion on the face
string emotionType = string.Empty;
double emotionValue = 0.0;
Emotion emotion = face.FaceAttributes.Emotion;
if (emotion.Anger > emotionValue) { emotionValue = emotion.Anger; emotionType = "Anger"; }
if (emotion.Contempt > emotionValue) { emotionValue = emotion.Contempt; emotionType = "Contempt"; }
if (emotion.Disgust > emotionValue) { emotionValue = emotion.Disgust; emotionType = "Disgust"; }
if (emotion.Fear > emotionValue) { emotionValue = emotion.Fear; emotionType = "Fear"; }
if (emotion.Happiness > emotionValue) { emotionValue = emotion.Happiness; emotionType = "Happiness"; }
if (emotion.Neutral > emotionValue) { emotionValue = emotion.Neutral; emotionType = "Neutral"; }
if (emotion.Sadness > emotionValue) { emotionValue = emotion.Sadness; emotionType = "Sadness"; }
if (emotion.Surprise > emotionValue) { emotionType = "Surprise"; }
Console.WriteLine($"Emotion : {emotionType}");
// Get more face attributes
Console.WriteLine($"Exposure : {face.FaceAttributes.Exposure.ExposureLevel}");
Console.WriteLine($"FacialHair : {string.Format("{0}", face.FaceAttributes.FacialHair.Moustache + face.FaceAttributes.FacialHair.Beard + face.FaceAttributes.FacialHair.Sideburns > 0 ? "Yes" : "No")}");
Console.WriteLine($"Gender : {face.FaceAttributes.Gender}");
Console.WriteLine($"Glasses : {face.FaceAttributes.Glasses}");
// Get hair color
Hair hair = face.FaceAttributes.Hair;
string color = null;
if (hair.HairColor.Count == 0) { if (hair.Invisible) { color = "Invisible"; } else { color = "Bald"; } }
HairColorType returnColor = HairColorType.Unknown;
double maxConfidence = 0.0f;
foreach (HairColor hairColor in hair.HairColor)
{
if (hairColor.Confidence <= maxConfidence) { continue; }
maxConfidence = hairColor.Confidence; returnColor = hairColor.Color; color = returnColor.ToString();
}
Console.WriteLine($"Hair : {color}");
// Get more attributes
Console.WriteLine($"HeadPose : {string.Format("Pitch: {0}, Roll: {1}, Yaw: {2}", Math.Round(face.FaceAttributes.HeadPose.Pitch, 2), Math.Round(face.FaceAttributes.HeadPose.Roll, 2), Math.Round(face.FaceAttributes.HeadPose.Yaw, 2))}");
Console.WriteLine($"Makeup : {string.Format("{0}", (face.FaceAttributes.Makeup.EyeMakeup || face.FaceAttributes.Makeup.LipMakeup) ? "Yes" : "No")}");
Console.WriteLine($"Noise : {face.FaceAttributes.Noise.NoiseLevel}");
Console.WriteLine($"Occlusion : {string.Format("EyeOccluded: {0}", face.FaceAttributes.Occlusion.EyeOccluded ? "Yes" : "No")} " +
$" {string.Format("ForeheadOccluded: {0}", face.FaceAttributes.Occlusion.ForeheadOccluded ? "Yes" : "No")} {string.Format("MouthOccluded: {0}", face.FaceAttributes.Occlusion.MouthOccluded ? "Yes" : "No")}");
Console.WriteLine($"Smile : {face.FaceAttributes.Smile}");
Console.WriteLine();
}
}
}
Een gezicht identificeren
De bewerking Identificeren neemt een afbeelding van een persoon (of meerdere personen) en zoekt naar het opgeslagen persoonsobject dat is gekoppeld aan elk gezicht in de afbeelding (zoekopdracht voor gezichtsherkenning). Elk gedetecteerd gezicht wordt vergeleken met een PersonGroup, een database met verschillende Person-objecten waarvan de gezichtsgegevens bekend zijn. Als u de bewerking Identificeren wilt uitvoeren, moet u eerst een PersonGroup maken en trainen
Een PersonGroup maken
Met de volgende code wordt een PersonGroup gemaakt met zes verschillende Person-objecten. Het koppelt elke persoon aan een reeks voorbeeldafbeeldingen en wordt vervolgens getraind om elke persoon te herkennen aan de gezichtskenmerken. Person- en PersonGroup-objecten worden gebruikt bij de bewerkingen Verifiëren, Identificeren of Groeperen.
Declareer een tekenreeksvariabele in de hoofdmap van uw klasse om de id weer te geven van de PersonGroup die u maakt.
static string personGroupId = Guid.NewGuid().ToString();
Voeg in een nieuwe methode de volgende code toe. Met deze methode wordt de bewerking Identificeren uitgevoerd. Het eerste codeblok koppelt de namen van personen aan hun voorbeeldafbeeldingen.
public static async Task IdentifyInPersonGroup(IFaceClient client, string url, string recognitionModel)
{
Console.WriteLine("========IDENTIFY FACES========");
Console.WriteLine();
// Create a dictionary for all your images, grouping similar ones under the same key.
Dictionary<string, string[]> personDictionary =
new Dictionary<string, string[]>
{ { "Family1-Dad", new[] { "Family1-Dad1.jpg", "Family1-Dad2.jpg" } },
{ "Family1-Mom", new[] { "Family1-Mom1.jpg", "Family1-Mom2.jpg" } },
{ "Family1-Son", new[] { "Family1-Son1.jpg", "Family1-Son2.jpg" } },
{ "Family1-Daughter", new[] { "Family1-Daughter1.jpg", "Family1-Daughter2.jpg" } },
{ "Family2-Lady", new[] { "Family2-Lady1.jpg", "Family2-Lady2.jpg" } },
{ "Family2-Man", new[] { "Family2-Man1.jpg", "Family2-Man2.jpg" } }
};
// A group photo that includes some of the persons you seek to identify from your dictionary.
string sourceImageFileName = "identification1.jpg";
Met deze code wordt de variabele sourceImageFileName gedefinieerd. Deze variabele komt overeen met de bronafbeelding—de afbeelding die de personen bevat die moeten worden geïdentificeerd.
Voeg vervolgens de volgende code toe om een Person-object te maken voor elke persoon in de woordenlijst en voeg de gezichtsgegevens toe van de juiste afbeeldingen. Elk Person-object is gekoppeld aan dezelfde PersonGroup via de unieke id-reeks. Vergeet niet om de variabelen client, urlen RECOGNITION_MODEL1 in deze methode op te geven.
// Create a person group.
Console.WriteLine($"Create a person group ({personGroupId}).");
await client.PersonGroup.CreateAsync(personGroupId, personGroupId, recognitionModel: recognitionModel);
// The similar faces will be grouped into a single person group person.
foreach (var groupedFace in personDictionary.Keys)
{
// Limit TPS
await Task.Delay(250);
Person person = await client.PersonGroupPerson.CreateAsync(personGroupId: personGroupId, name: groupedFace);
Console.WriteLine($"Create a person group person '{groupedFace}'.");
// Add face to the person group person.
foreach (var similarImage in personDictionary[groupedFace])
{
Console.WriteLine($"Add face to the person group person({groupedFace}) from image `{similarImage}`");
PersistedFace face = await client.PersonGroupPerson.AddFaceFromUrlAsync(personGroupId, person.PersonId,
$"{url}{similarImage}", similarImage);
}
}
Tip
U kunt ook een PersonGroup maken op basis van lokale afbeeldingen. Zie de IPersonGroupPerson-methoden, bijvoorbeeld AddFaceFromStreamAsync.
De PersonGroup trainen
Zodra u de gezichtsgegevens van uw afbeeldingen hebt geëxtraheerd en deze in verschillende Person-objecten hebt gesorteerd, moet u de PersonGroup trainen om de visuele functies te identificeren die zijn gekoppeld aan elk van de Person-objecten. Met de volgende code wordt de asynchrone Train-methode aangeroepen en worden de resultaten gecontroleerd, en wordt de status naar de console afgedrukt.
// Start to train the person group.
Console.WriteLine();
Console.WriteLine($"Train person group {personGroupId}.");
await client.PersonGroup.TrainAsync(personGroupId);
// Wait until the training is completed.
while (true)
{
await Task.Delay(1000);
var trainingStatus = await client.PersonGroup.GetTrainingStatusAsync(personGroupId);
Console.WriteLine($"Training status: {trainingStatus.Status}.");
if (trainingStatus.Status == TrainingStatusType.Succeeded) { break; }
}
Console.WriteLine();
Tip
De Face-API wordt uitgevoerd op een set vooraf gebouwde modellen die van nature statisch zijn (de prestaties van het model worden niet slechter of beter tijdens het uitvoeren van de service). De resultaten die het model produceert, kunnen veranderen als de back-end van het model door Microsoft wordt gewijzigd zonder migratie naar een heel nieuwe modelversie. Als u wilt profiteren van een nieuwere versie van het model, kunt u PersonGroup opnieuw trainen, waarbij u het nieuwere model opgeeft als een parameter bij dezelfde inschrijvingsafbeeldingen.
Deze Person-groep en de bijbehorende Person-objecten zijn nu klaar om te worden gebruikt in de bewerkingen Verifiëren, Identificeren of Groeperen.
Gezichten identificeren
De volgende code neemt de bronafbeelding en maakt een lijst van alle gezichten die in de afbeelding zijn gedetecteerd. Dit zijn de gezichten die worden geïdentificeerd op basis van de PersonGroup.
List<Guid> sourceFaceIds = new List<Guid>();
// Detect faces from source image url.
List<DetectedFace> detectedFaces = await DetectFaceRecognize(client, $"{url}{sourceImageFileName}", recognitionModel);
// Add detected faceId to sourceFaceIds.
foreach (var detectedFace in detectedFaces) { sourceFaceIds.Add(detectedFace.FaceId.Value); }
In het volgende codefragment wordt de bewerking IdentifyAsync aangeroepen en worden de resultaten naar de console afgedrukt. Hier probeert de service elk gezicht van de bronafbeelding te koppelen aan een Person in de opgegeven PersonGroup. Hiermee wordt uw methode Identificeren uitgesloten.
// Identify the faces in a person group.
var identifyResults = await client.Face.IdentifyAsync(sourceFaceIds, personGroupId);
foreach (var identifyResult in identifyResults)
{
Person person = await client.PersonGroupPerson.GetAsync(personGroupId, identifyResult.Candidates[0].PersonId);
Console.WriteLine($"Person '{person.Name}' is identified for face in: {sourceImageFileName} - {identifyResult.FaceId}," +
$" confidence: {identifyResult.Candidates[0].Confidence}.");
}
Console.WriteLine();
}
Vergelijkbare gezichten zoeken
Met de volgende code wordt op basis van één gedetecteerd gezicht (bron) een reeks andere gezichten (doel) doorzocht om een overeenkomstig gezicht te vinden (gezichten zoeken op afbeelding). Wanneer er een overeenkomst wordt gevonden, wordt de id van het overeenkomende gezicht afgedrukt op de console.
Gezichten detecteren voor vergelijking
Definieer eerst een tweede gezichtsdetectiemethode. U moet gezichten in afbeeldingen detecteren voordat u ze kunt vergelijken en deze detectiemethode is geoptimaliseerd voor vergelijkingsbewerkingen. Er worden geen gedetailleerde gezichtskenmerken geëxtraheerd, zoals in de bovenstaande sectie, en er wordt een ander herkenningsmodel gebruikt.
private static async Task<List<DetectedFace>> DetectFaceRecognize(IFaceClient faceClient, string url, string recognition_model)
{
// Detect faces from image URL. Since only recognizing, use the recognition model 1.
// We use detection model 3 because we are not retrieving attributes.
IList<DetectedFace> detectedFaces = await faceClient.Face.DetectWithUrlAsync(url, recognitionModel: recognition_model, detectionModel: DetectionModel.Detection03);
Console.WriteLine($"{detectedFaces.Count} face(s) detected from image `{Path.GetFileName(url)}`");
return detectedFaces.ToList();
}
Overeenkomsten zoeken
De volgende methode detecteert gezichten in een set doelafbeeldingen en in één bronafbeelding. Vervolgens worden deze vergeleken en worden alle doelafbeeldingen gevonden die vergelijkbaar zijn met de bronafbeelding.
/*
* FIND SIMILAR
* This example will take an image and find a similar one to it in another image.
*/
public static async Task FindSimilar(IFaceClient client, string url, string recognition_model)
{
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";
IList<Guid?> targetFaceIds = new List<Guid?>();
foreach (var targetImageFileName in targetImageFileNames)
{
// Detect faces from target image url.
var faces = await DetectFaceRecognize(client, $"{url}{targetImageFileName}", recognition_model);
// Add detected faceId to list of GUIDs.
targetFaceIds.Add(faces[0].FaceId.Value);
}
// Detect faces from source image url.
IList<DetectedFace> detectedFaces = await DetectFaceRecognize(client, $"{url}{sourceImageFileName}", recognition_model);
Console.WriteLine();
// Find a similar face(s) in the list of IDs. Comapring only the first in list for testing purposes.
IList<SimilarFace> similarResults = await client.Face.FindSimilarAsync(detectedFaces[0].FaceId.Value, null, null, targetFaceIds);
Overeenkomsten afdrukken
Met de volgende code worden de overeenkomende resultaten op de console weergegeven:
foreach (var similarResult in similarResults)
{
Console.WriteLine($"Faces from {sourceImageFileName} & ID:{similarResult.FaceId} are similar with confidence: {similarResult.Confidence}.");
}
Console.WriteLine();
De toepassing uitvoeren
Voer de toepassing uit door boven in het IDE-venster op de knop Fouten opsporen te klikken.
Resources opschonen
Als u een Cognitive Services-abonnement wilt opschonen en verwijderen, kunt u de resource of resourcegroep verwijderen. Als u de resourcegroep verwijdert, worden ook alle bijbehorende resources verwijderd.
Als u in deze quickstart een PersonGroup hebt gemaakt en u deze wilt verwijderen, voert u de volgende code uit in uw programma:
// At end, delete person groups in both regions (since testing only)
Console.WriteLine("========DELETE PERSON GROUP========");
Console.WriteLine();
DeletePersonGroup(client, personGroupId).Wait();
Definieer de verwijderingsmethode met de volgende code:
/*
* DELETE PERSON GROUP
* After this entire example is executed, delete the person group in your Azure account,
* otherwise you cannot recreate one with the same name (if running example repeatedly).
*/
public static async Task DeletePersonGroup(IFaceClient client, String personGroupId)
{
await client.PersonGroup.DeleteAsync(personGroupId);
Console.WriteLine($"Deleted the person group {personGroupId}.");
}
Volgende stappen
In deze quickstart hebt u geleerd hoe u de Face-clientbibliotheek voor .NET gebruikt om eenvoudige gezichtsherkenningstaken uit te voeren. Hierna leert u meer over de verschillende modellen voor gezichtsdetectie en hoe u het juiste model voor uw use-case opgeeft.
- Wat is de Face-service?
- De broncode voor dit voorbeeld is te vinden op GitHub.
Ga aan de slag met gezichtsherkenning met behulp van de Face-clientbibliotheek voor Go. Volg deze stappen om het pakket te installeren en de voorbeeldcode voor basistaken uit te proberen. De Face-service biedt u toegang tot geavanceerde algoritmen voor het detecteren en herkennen van menselijke gezichten in afbeeldingen.
Gebruik de clientbibliotheek van de Face-service voor Go voor het volgende:
- Gezichten detecteren en analyseren
- Een gezicht identificeren
- Gezichten verifiëren
- Vergelijkbare gezichten zoeken
Referentiedocumentatie | Broncode bibliotheek | SDK download
Vereisten
- Nieuwste versie van Go
- Azure-abonnement: Krijg een gratis abonnement
- Aan uw Azure-account moet Cognitive Services rol Inzender zijn toegewezen, zodat u akkoord kunt gaan met de verantwoordelijke AI-voorwaarden en een resource kunt maken. Neem contact op met uw beheerder om deze rol aan uw account toe te laten.
- Zodra u een Azure-abonnement hebt, maakt u een Face-resource in Azure Portal om uw sleutel en eindpunt op te halen. Nadat de app is geïmplementeerd, klikt u op Ga naar resource.
- U hebt de sleutel en het eindpunt nodig van de resource die u maakt, om de toepassing te verbinden met de Face-API. Later in de quickstart plakt u uw sleutel en eindpunt in de onderstaande code.
- U kunt de gratis prijscategorie (
F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.
- Nadat u een sleutel en eindpunt hebt verkregen, gaat u omgevingsvariabelen maken voor de sleutel en het eindpunt, respectievelijk
FACE_SUBSCRIPTION_KEYenFACE_ENDPOINTgenaamd.
Instellen
Een Go-projectmap maken
Maak in een consolevenster (cmd, PowerShell, Terminal, Bash) een nieuwe werkruimte voor uw Go-project, genaamd my-app en navigeer er naartoe.
mkdir -p my-app/{src, bin, pkg}
cd my-app
Uw werkruimte bevat drie mappen:
- src: deze map bevat broncode en pakketten. Alle pakketten die zijn geïnstalleerd met de opdracht
go getbevinden zich in deze map. - pkg: deze map bevat de gecompileerde Go-pakketobjecten. Deze bestanden hebben allemaal een
.a-extensie. - bin: deze map bevat de binaire uitvoerbare bestanden die worden gemaakt wanneer u
go installuitvoert.
Tip
Zie de documentatie over de taal Go voor meer informatie over de structuur van een Go-werkruimte. Deze handleiding bevat informatie om $GOPATH en $GOROOT in te stellen.
De clientbibliotheek installeren voor Go
Installeer vervolgens de clientbibliotheek voor Go:
go get -u github.com/Azure/azure-sdk-for-go/tree/master/services/cognitiveservices/v1.0/face
of, als u dep gebruikt, binnen de uitvoer van de opslagplaats:
dep ensure -add https://github.com/Azure/azure-sdk-for-go/tree/master/services/cognitiveservices/v1.0/face
Een Go-toepassing maken
Maak vervolgens een bestand in de map src met de naam sample-app.go:
cd src
touch sample-app.go
Open sample-app.go in uw favoriete IDE of teksteditor. Voeg vervolgens de pakketnaam toe en importeer de volgende bibliotheken:
package main
import (
"encoding/json"
"container/list"
"context"
"fmt"
"github.com/Azure/azure-sdk-for-go/services/cognitiveservices/v1.0/face"
"github.com/Azure/go-autorest/autorest"
"github.com/satori/go.uuid"
"io"
"io/ioutil"
"log"
"os"
"path"
"strconv"
"strings"
"time"
)
Vervolgens begint u met het toevoegen van code voor het uitvoeren van verschillende Face-servicebewerkingen.
Objectmodel
De volgende klassen en interfaces verwerken enkele van de belangrijkste functies van de Face-service Go-clientbibliotheek.
| Naam | Beschrijving |
|---|---|
| BaseClient | Deze klasse vertegenwoordigt uw autorisatie voor het gebruik van de Face-service. U hebt deze nodig voor alle Face-functies. U instantieert deze klasse met uw abonnementsgegevens en gebruikt deze om instanties van andere klassen te maken. |
| Client | Deze klasse verwerkt de basistaken voor detectie en herkenning die u met menselijke gezichten kunt uitvoeren. |
| DetectedFace | Deze klasse vertegenwoordigt alle gegevens die zijn gedetecteerd van één gezicht in een afbeelding. U kunt deze gebruiken om gedetailleerde informatie over het gezicht op te halen. |
| ListClient | Deze klasse beheert de in de cloud opgeslagen FaceList-constructies, waarin een geassorteerde set gezichten wordt opgeslagen. |
| PersonGroupPersonClient | Deze klasse beheert de in de cloud opgeslagen Person-constructies, die een set gezichten opslaan die tot één persoon behoren. |
| PersonGroupClient | Deze klasse beheert de in de cloud opgeslagen PersonGroup-constructies, die een set van verschillende Person-objecten opslaan. |
| SnapshotClient | Deze klasse beheert de functionaliteit van de momentopname. U kunt deze gebruiken om al uw op de cloud gebaseerde gezichtsgegevens tijdelijk op te slaan en deze gegevens te migreren naar een nieuw Azure-abonnement. |
Codevoorbeelden
Deze codevoorbeelden laten zien hoe u basistaken kunt uitvoeren met de Face-service-clientbibliotheek voor Go:
- De client verifiëren
- Gezichten detecteren en analyseren
- Een gezicht identificeren
- Gezichten verifiëren
- Vergelijkbare gezichten zoeken
De client verifiëren
Notitie
In deze quickstart wordt ervan uitgegaan dat u omgevingsvariabelen hebt gemaakt voor uw Face-sleutel en -eindpunt, met de naam FACE_SUBSCRIPTION_KEY en FACE_ENDPOINT.
Maak een Main-functie en voeg de volgende code toe om een client te instantiëren met uw eindpunt en sleutel. Maak een CognitiveServicesAuthorizer -object met uw sleutel en gebruik het met uw eindpunt om een Client -object te maken. Deze code instantieert ook een contextobject, dat nodig is voor het maken van clientobjecten. Er wordt ook een externe locatie gedefinieerd waar een aantal van de voorbeeldafbeeldingen in deze quickstart worden gevonden.
func main() {
// A global context for use in all samples
faceContext := context.Background()
// Base url for the Verify and Large Face List examples
const imageBaseURL = "https://csdx.blob.core.windows.net/resources/Face/Images/"
/*
Authenticate
*/
subscriptionKey := "PASTE_YOUR_FACE_SUBSCRIPTION_KEY_HERE"
endpoint := "PASTE_YOUR_FACE_ENDPOINT_HERE"
// Client used for Detect Faces, Find Similar, and Verify examples.
client := face.NewClient(endpoint)
client.Authorizer = autorest.NewCognitiveServicesAuthorizer(subscriptionKey)
/*
END - Authenticate
*/
Gezichten detecteren en analyseren
Gezichtsdetectie is vereist als eerste stap in Gezichtsanalyse en Identiteitsverificatie. In deze sectie ziet u hoe u de extra gezichtskenmerkgegevens kunt retourneren. Als u alleen gezichten wilt detecteren voor gezichtsidentificatie of -verificatie, gaat u verder met de latere secties.
Voeg de volgende code in uw Main-methode toe. Met deze code wordt een externe voorbeeldafbeelding gedefinieerd en wordt aangegeven welke gezichtskenmerken moeten worden geëxtraheerd uit de afbeelding. Er wordt ook aangegeven welk AI-model moet worden gebruikt om gegevens op te halen uit de gedetecteerde gezichten. Zie Een herkenningsmodel opgeven voor meer informatie over deze opties. Ten slotte voert de methode DetectWithURL de gezichtsherkenning uit op de afbeelding en worden de resultaten opgeslagen in het programmageheugen.
// Detect a face in an image that contains a single face
singleFaceImageURL := "https://www.biography.com/.image/t_share/MTQ1MzAyNzYzOTgxNTE0NTEz/john-f-kennedy---mini-biography.jpg"
singleImageURL := face.ImageURL { URL: &singleFaceImageURL }
singleImageName := path.Base(singleFaceImageURL)
// Array types chosen for the attributes of Face
attributes := []face.AttributeType {"age", "emotion", "gender"}
returnFaceID := true
returnRecognitionModel := false
returnFaceLandmarks := false
// API call to detect faces in single-faced image, using recognition model 4
// We specify detection model 1 because we are retrieving attributes.
detectSingleFaces, dErr := client.DetectWithURL(faceContext, singleImageURL, &returnFaceID, &returnFaceLandmarks, attributes, face.Recognition04, &returnRecognitionModel, face.Detection01)
if dErr != nil { log.Fatal(dErr) }
// Dereference *[]DetectedFace, in order to loop through it.
dFaces := *detectSingleFaces.Value
Tip
U kunt ook gezichten detecteren in een lokale afbeelding. Zie de Client-methoden, bijvoorbeeld DetectWithStream.
Gedetecteerde gezichtsgegevens weergeven
In het volgende codeblok wordt het eerste element in de matrix van DetectedFace -objecten gebruikt en worden de kenmerken ervan naar de console afgedrukt. Als u een afbeelding met meerdere gezichten hebt gebruikt, moet u in plaats daarvan de matrix herhalen.
fmt.Println("Detected face in (" + singleImageName + ") with ID(s): ")
fmt.Println(dFaces[0].FaceID)
fmt.Println()
// Find/display the age and gender attributes
for _, dFace := range dFaces {
fmt.Println("Face attributes:")
fmt.Printf(" Age: %.0f", *dFace.FaceAttributes.Age)
fmt.Println("\n Gender: " + dFace.FaceAttributes.Gender)
}
// Get/display the emotion attribute
emotionStruct := *dFaces[0].FaceAttributes.Emotion
// Convert struct to a map
var emotionMap map[string]float64
result, _ := json.Marshal(emotionStruct)
json.Unmarshal(result, &emotionMap)
// Find the emotion with the highest score (confidence level). Range is 0.0 - 1.0.
var highest float64
emotion := ""
dScore := -1.0
for name, value := range emotionMap{
if (value > highest) {
emotion, dScore = name, value
highest = value
}
}
fmt.Println(" Emotion: " + emotion + " (score: " + strconv.FormatFloat(dScore, 'f', 3, 64) + ")")
Een gezicht identificeren
Bij de bewerking Identificeren wordt op basis van een afbeelding van een persoon (of meerdere personen) gezocht naar de identiteit van elk gezicht in de afbeelding (zoeken met gezichtsherkenning). Elk gedetecteerd gezicht wordt vergeleken met een PersonGroup, een database van verschillende Person-objecten waarvan de gezichtskenmerken bekend zijn.
Persoonsafbeeldingen krijgen
Als u dit scenario wilt doorlopen, moet u de volgende afbeeldingen opslaan in de hoofdmap van uw project: https://github.com/Azure-Samples/cognitive-services-sample-data-files/tree/master/Face/images.
Deze groep met afbeeldingen bevat drie sets enkele gezichtsafbeeldingen die overeenkomen met drie verschillende personen. Met de code worden drie PersonGroup Person-objecten gedefinieerd en gekoppeld aan afbeeldingsbestanden die beginnen met woman, man en child.
Een PersonGroup maken
Nadat u uw afbeeldingen hebt gedownload, voegt u de volgende code toe achter de Main-methode. Met deze code wordt een PersonGroupClient -object geverifieerd en vervolgens gebruikt om een nieuwe PersonGroup te definiëren.
// Get working directory
root, rootErr := os.Getwd()
if rootErr != nil { log.Fatal(rootErr) }
// Full path to images folder
imagePathRoot := path.Join(root+"\\images\\")
// Authenticate - Need a special person group client for your person group
personGroupClient := face.NewPersonGroupClient(endpoint)
personGroupClient.Authorizer = autorest.NewCognitiveServicesAuthorizer(subscriptionKey)
// Create the Person Group
// Create an empty Person Group. Person Group ID must be lower case, alphanumeric, and/or with '-', '_'.
personGroupID := "unique-person-group"
fmt.Println("Person group ID: " + personGroupID)
metadata := face.MetaDataContract { Name: &personGroupID }
// Create the person group
personGroupClient.Create(faceContext, personGroupID, metadata)
PersonGroup-personen maken
Het volgende codeblok verifieert een PersonGroupPersonClient en gebruikt deze om drie nieuwe PersonGroup Person-objecten te definiëren. Deze objecten vertegenwoordigen elk één persoon in de reeks afbeeldingen.
// Authenticate - Need a special person group person client for your person group person
personGroupPersonClient := face.NewPersonGroupPersonClient(endpoint)
personGroupPersonClient.Authorizer = autorest.NewCognitiveServicesAuthorizer(subscriptionKey)
// Create each person group person for each group of images (woman, man, child)
// Define woman friend
w := "Woman"
nameWoman := face.NameAndUserDataContract { Name: &w }
// Returns a Person type
womanPerson, wErr := personGroupPersonClient.Create(faceContext, personGroupID, nameWoman)
if wErr != nil { log.Fatal(wErr) }
fmt.Print("Woman person ID: ")
fmt.Println(womanPerson.PersonID)
// Define man friend
m := "Man"
nameMan := face.NameAndUserDataContract { Name: &m }
// Returns a Person type
manPerson, wErr := personGroupPersonClient.Create(faceContext, personGroupID, nameMan)
if wErr != nil { log.Fatal(wErr) }
fmt.Print("Man person ID: ")
fmt.Println(manPerson.PersonID)
// Define child friend
ch := "Child"
nameChild := face.NameAndUserDataContract { Name: &ch }
// Returns a Person type
childPerson, wErr := personGroupPersonClient.Create(faceContext, personGroupID, nameChild)
if wErr != nil { log.Fatal(wErr) }
fmt.Print("Child person ID: ")
fmt.Println(childPerson.PersonID)
Gezichten toewijzen aan personen
Met de volgende code worden de afbeeldingen gesorteerd op basis van het voorvoegsel, worden de gezichten gedetecteerd en worden de gezichten toegewezen aan elk PersonGroup Person-object, gebaseerd op de naam van het afbeeldingsbestand.
// Detect faces and register to correct person
// Lists to hold all their person images
womanImages := list.New()
manImages := list.New()
childImages := list.New()
// Collect the local images for each person, add them to their own person group person
images, fErr := ioutil.ReadDir(imagePathRoot)
if fErr != nil { log.Fatal(fErr)}
for _, f := range images {
path:= (imagePathRoot+f.Name())
if strings.HasPrefix(f.Name(), "w") {
var wfile io.ReadCloser
wfile, err:= os.Open(path)
if err != nil { log.Fatal(err) }
womanImages.PushBack(wfile)
personGroupPersonClient.AddFaceFromStream(faceContext, personGroupID, *womanPerson.PersonID, wfile, "", nil, face.Detection03)
}
if strings.HasPrefix(f.Name(), "m") {
var mfile io.ReadCloser
mfile, err:= os.Open(path)
if err != nil { log.Fatal(err) }
manImages.PushBack(mfile)
personGroupPersonClient.AddFaceFromStream(faceContext, personGroupID, *manPerson.PersonID, mfile, "", nil, face.Detection03)
}
if strings.HasPrefix(f.Name(), "ch") {
var chfile io.ReadCloser
chfile, err:= os.Open(path)
if err != nil { log.Fatal(err) }
childImages.PushBack(chfile)
personGroupPersonClient.AddFaceFromStream(faceContext, personGroupID, *childPerson.PersonID, chfile, "", nil, face.Detection03)
}
}
Tip
U kunt ook een PersonGroup maken op basis van externe afbeeldingen waarnaar met een URL wordt verwezen. Zie de PersonGroupPersonClient-methoden, bijvoorbeeld AddFaceFromURL.
De PersonGroup trainen
Zodra u gezichten hebt toegewezen, moet u de PersonGroup trainen zodat deze de visuele functies kan identificeren die zijn gekoppeld aan elk van de Person-objecten. Met de volgende code wordt de asynchrone Train-methode aangeroepen en worden de resultaten gecontroleerd, en wordt de status naar de console afgedrukt.
// Train the person group
personGroupClient.Train(faceContext, personGroupID)
// Wait for it to succeed in training
for {
trainingStatus, tErr := personGroupClient.GetTrainingStatus(faceContext, personGroupID)
if tErr != nil { log.Fatal(tErr) }
if trainingStatus.Status == "succeeded" {
fmt.Println("Training status:", trainingStatus.Status)
break
}
time.Sleep(2)
}
Tip
De Face-API wordt uitgevoerd op een set vooraf gebouwde modellen die van nature statisch zijn (de prestaties van het model worden niet slechter of beter tijdens het uitvoeren van de service). De resultaten die het model produceert, kunnen veranderen als de back-end van het model door Microsoft wordt gewijzigd zonder migratie naar een heel nieuwe modelversie. Als u wilt profiteren van een nieuwere versie van het model, kunt u PersonGroup opnieuw trainen, waarbij u het nieuwere model opgeeft als een parameter bij dezelfde inschrijvingsafbeeldingen.
Een testafbeelding ophalen
De volgende code zoekt in de hoofdmap van uw project naar een afbeelding test-image-person-group. jpg en laadt deze in het programmageheugen. U vindt deze afbeelding in dezelfde repo als de afbeeldingen die zijn gebruikt om de PersonGroup te maken: https://github.com/Azure-Samples/cognitive-services-sample-data-files/tree/master/Face/images .
personGroupTestImageName := "test-image-person-group.jpg"
// Use image path root from the one created in person group
personGroupTestImagePath := imagePathRoot
var personGroupTestImage io.ReadCloser
// Returns a ReaderCloser
personGroupTestImage, identErr:= os.Open(personGroupTestImagePath+personGroupTestImageName)
if identErr != nil { log.Fatal(identErr) }
Brongezichten in testafbeelding detecteren
In het volgende codeblok wordt normale gezichtsdetectie op de testafbeelding uitgevoerd om alle gezichten op te halen en op te slaan in een matrix.
// Detect faces in group test image, using recognition model 1 (default)
returnIdentifyFaceID := true
// Returns a ListDetectedFaces
// Recognition04 is not compatible.
// We specify detection model 3 because we are not retrieving attributes.
detectedTestImageFaces, dErr := client.DetectWithStream(faceContext, personGroupTestImage, &returnIdentifyFaceID, nil, nil, face.Recognition01, nil, face.Detection03)
if dErr != nil { log.Fatal(dErr) }
// Make list of face IDs from the detection.
length := len(*detectedTestImageFaces.Value)
testImageFaceIDs := make([]uuid.UUID, length)
// ListDetectedFace is a struct with a Value property that returns a *[]DetectedFace
for i, f := range *detectedTestImageFaces.Value {
testImageFaceIDs[i] = *f.FaceID
}
Gezichten identificeren op basis van de bronafbeelding
De methode Identificeren neemt de matrix van gedetecteerde gezichten en vergelijkt deze met de opgegeven PersonGroup (gedefinieerd en getraind in de eerdere sectie). Als een gedetecteerd gezicht overeenkomt met een Person in de groep, wordt het resultaat opgeslagen.
// Identify the faces in the test image with everyone in the person group as a query
identifyRequestBody := face.IdentifyRequest { FaceIds: &testImageFaceIDs, PersonGroupID: &personGroupID }
identifiedFaces, err := client.Identify(faceContext, identifyRequestBody)
if err != nil { log.Fatal(err) }
Met deze code worden gedetailleerde overeenkomende resultaten naar de console afgedrukt.
// Get the result which person(s) were identified
iFaces := *identifiedFaces.Value
for _, person := range iFaces {
fmt.Println("Person for face ID: " )
fmt.Print(person.FaceID)
fmt.Println(" is identified in " + personGroupTestImageName + ".")
}
Gezichten verifiëren
De bewerking Verifiëren neemt een gezichts-id en een andere gezichts-id of een Person-object en bepaalt of deze van dezelfde persoon zijn. Verificatie kan worden gebruikt om de gezichtsmatch te controleren die wordt geretourneerd door de bewerking Identificeren.
De volgende code detecteert gezichten in twee bronafbeeldingen en vergelijkt deze vervolgens met een gezicht dat is gedetecteerd in een doelafbeelding.
Testafbeeldingen ophalen
De volgende codeblokken declareren variabelen die verwijzen naar de bron- en doelafbeeldingen voor de verificatiebewerking.
// Create a slice list to hold the target photos of the same person
targetImageFileNames := make([]string, 2)
targetImageFileNames[0] = "Family1-Dad1.jpg"
targetImageFileNames[1] = "Family1-Dad2.jpg"
// The source photos contain this person, maybe
sourceImageFileName1 := "Family1-Dad3.jpg"
sourceImageFileName2 := "Family1-Son1.jpg"
Gezichten voor verificatie detecteren
De volgende code detecteert gezichten in de bron- en doelafbeeldingen en slaat ze op in variabelen.
// DetectWithURL parameters
urlSource1 := imageBaseURL + sourceImageFileName1
urlSource2 := imageBaseURL + sourceImageFileName2
url1 := face.ImageURL { URL: &urlSource1 }
url2 := face.ImageURL { URL: &urlSource2 }
returnFaceIDVerify := true
returnFaceLandmarksVerify := false
returnRecognitionModelVerify := false
// Detect face(s) from source image 1, returns a ListDetectedFace struct
// We specify detection model 3 because we are not retrieving attributes.
detectedVerifyFaces1, dErrV1 := client.DetectWithURL(faceContext, url1 , &returnFaceIDVerify, &returnFaceLandmarksVerify, nil, face.Recognition04, &returnRecognitionModelVerify, face.Detection03)
if dErrV1 != nil { log.Fatal(dErrV1) }
// Dereference the result, before getting the ID
dVFaceIds1 := *detectedVerifyFaces1.Value
// Get ID of the detected face
imageSource1Id := dVFaceIds1[0].FaceID
fmt.Println(fmt.Sprintf("%v face(s) detected from image: %v", len(dVFaceIds1), sourceImageFileName1))
// Detect face(s) from source image 2, returns a ListDetectedFace struct
// We specify detection model 3 because we are not retrieving attributes.
detectedVerifyFaces2, dErrV2 := client.DetectWithURL(faceContext, url2 , &returnFaceIDVerify, &returnFaceLandmarksVerify, nil, face.Recognition04, &returnRecognitionModelVerify, face.Detection03)
if dErrV2 != nil { log.Fatal(dErrV2) }
// Dereference the result, before getting the ID
dVFaceIds2 := *detectedVerifyFaces2.Value
// Get ID of the detected face
imageSource2Id := dVFaceIds2[0].FaceID
fmt.Println(fmt.Sprintf("%v face(s) detected from image: %v", len(dVFaceIds2), sourceImageFileName2))
// Detect faces from each target image url in list. DetectWithURL returns a VerifyResult with Value of list[DetectedFaces]
// Empty slice list for the target face IDs (UUIDs)
var detectedVerifyFacesIds [2]uuid.UUID
for i, imageFileName := range targetImageFileNames {
urlSource := imageBaseURL + imageFileName
url := face.ImageURL { URL: &urlSource}
// We specify detection model 3 because we are not retrieving attributes.
detectedVerifyFaces, dErrV := client.DetectWithURL(faceContext, url, &returnFaceIDVerify, &returnFaceLandmarksVerify, nil, face.Recognition04, &returnRecognitionModelVerify, face.Detection03)
if dErrV != nil { log.Fatal(dErrV) }
// Dereference *[]DetectedFace from Value in order to loop through it.
dVFaces := *detectedVerifyFaces.Value
// Add the returned face's face ID
detectedVerifyFacesIds[i] = *dVFaces[0].FaceID
fmt.Println(fmt.Sprintf("%v face(s) detected from image: %v", len(dVFaces), imageFileName))
}
Verificatieresultaten ophalen
De volgende code vergelijkt elk van de bronafbeeldingen met de doelafbeelding en drukt een bericht af dat aangeeft of ze van dezelfde persoon zijn.
// Verification example for faces of the same person. The higher the confidence, the more identical the faces in the images are.
// Since target faces are the same person, in this example, we can use the 1st ID in the detectedVerifyFacesIds list to compare.
verifyRequestBody1 := face.VerifyFaceToFaceRequest{ FaceID1: imageSource1Id, FaceID2: &detectedVerifyFacesIds[0] }
verifyResultSame, vErrSame := client.VerifyFaceToFace(faceContext, verifyRequestBody1)
if vErrSame != nil { log.Fatal(vErrSame) }
fmt.Println()
// Check if the faces are from the same person.
if (*verifyResultSame.IsIdentical) {
fmt.Println(fmt.Sprintf("Faces from %v & %v are of the same person, with confidence %v",
sourceImageFileName1, targetImageFileNames[0], strconv.FormatFloat(*verifyResultSame.Confidence, 'f', 3, 64)))
} else {
// Low confidence means they are more differant than same.
fmt.Println(fmt.Sprintf("Faces from %v & %v are of a different person, with confidence %v",
sourceImageFileName1, targetImageFileNames[0], strconv.FormatFloat(*verifyResultSame.Confidence, 'f', 3, 64)))
}
// Verification example for faces of different persons.
// Since target faces are same person, in this example, we can use the 1st ID in the detectedVerifyFacesIds list to compare.
verifyRequestBody2 := face.VerifyFaceToFaceRequest{ FaceID1: imageSource2Id, FaceID2: &detectedVerifyFacesIds[0] }
verifyResultDiff, vErrDiff := client.VerifyFaceToFace(faceContext, verifyRequestBody2)
if vErrDiff != nil { log.Fatal(vErrDiff) }
// Check if the faces are from the same person.
if (*verifyResultDiff.IsIdentical) {
fmt.Println(fmt.Sprintf("Faces from %v & %v are of the same person, with confidence %v",
sourceImageFileName2, targetImageFileNames[0], strconv.FormatFloat(*verifyResultDiff.Confidence, 'f', 3, 64)))
} else {
// Low confidence means they are more differant than same.
fmt.Println(fmt.Sprintf("Faces from %v & %v are of a different person, with confidence %v",
sourceImageFileName2, targetImageFileNames[0], strconv.FormatFloat(*verifyResultDiff.Confidence, 'f', 3, 64)))
}
Vergelijkbare gezichten zoeken
Met de volgende code wordt op basis van één gedetecteerd gezicht (bron) een reeks andere gezichten (doel) doorzocht om een overeenkomstig gezicht te vinden (gezichten zoeken op afbeelding). Wanneer er een overeenkomst wordt gevonden, wordt de id van het overeenkomende gezicht afgedrukt op de console.
Gezichten detecteren voor vergelijking
Sla eerst een verwijzing op naar het gezicht dat u hebt gedetecteerd in de sectie Detecteren en analyseren. Dit gezicht is de bron.
// Select an ID in single-faced image for comparison to faces detected in group image. Used in Find Similar.
firstImageFaceID := dFaces[0].FaceID
Voer vervolgens de volgende code in om een set gezichten in een andere afbeelding te detecteren. Deze gezichten zijn het doel.
// Detect the faces in an image that contains multiple faces
groupImageURL := "http://www.historyplace.com/kennedy/president-family-portrait-closeup.jpg"
groupImageName := path.Base(groupImageURL)
groupImage := face.ImageURL { URL: &groupImageURL }
// API call to detect faces in group image, using recognition model 4. This returns a ListDetectedFace struct.
// We specify detection model 3 because we are not retrieving attributes.
detectedGroupFaces, dgErr := client.DetectWithURL(faceContext, groupImage, &returnFaceID, &returnFaceLandmarks, nil, face.Recognition04, &returnRecognitionModel, face.Detection03)
if dgErr != nil { log.Fatal(dgErr) }
fmt.Println()
// Detect faces in the group image.
// Dereference *[]DetectedFace, in order to loop through it.
dFaces2 := *detectedGroupFaces.Value
// Make slice list of UUIDs
faceIDs := make([]uuid.UUID, len(dFaces2))
fmt.Print("Detected faces in (" + groupImageName + ") with ID(s):\n")
for i, face := range dFaces2 {
faceIDs[i] = *face.FaceID // Dereference DetectedFace.FaceID
fmt.Println(*face.FaceID)
}
Overeenkomsten zoeken
De volgende code maakt gebruik van de methode FindSimilar om alle doelgezichten te vinden die overeenkomen met het brongezicht.
// Add single-faced image ID to struct
findSimilarBody := face.FindSimilarRequest { FaceID: firstImageFaceID, FaceIds: &faceIDs }
// Get the list of similar faces found in the group image of previously detected faces
listSimilarFaces, sErr := client.FindSimilar(faceContext, findSimilarBody)
if sErr != nil { log.Fatal(sErr) }
// The *[]SimilarFace
simFaces := *listSimilarFaces.Value
Overeenkomsten afdrukken
Met de volgende code worden de overeenkomende resultaten op de console weergegeven.
// Print the details of the similar faces detected
fmt.Print("Similar faces found in (" + groupImageName + ") with ID(s):\n")
var sScore float64
for _, face := range simFaces {
fmt.Println(face.FaceID)
// Confidence of the found face with range 0.0 to 1.0.
sScore = *face.Confidence
fmt.Println("The similarity confidence: ", strconv.FormatFloat(sScore, 'f', 3, 64))
}
De toepassing uitvoeren
Voer uw gezichtsherkennings-app uit vanuit de toepassingsmap met de opdracht go run <app-name>.
go run sample-app.go
Resources opschonen
Als u een Cognitive Services-abonnement wilt opschonen en verwijderen, kunt u de resource of resourcegroep verwijderen. Als u de resourcegroep verwijdert, worden ook alle bijbehorende resources verwijderd.
Als u in deze quickstart een PersonGroup hebt gemaakt en u deze wilt verwijderen, roept u de volgende methode voor Verwijderen aan.
Volgende stappen
In deze quickstart hebt u geleerd hoe u de Face-clientbibliotheek voor Go gebruikt om basistaken voor gezichtsherkenning uit te voeren. Hierna leert u meer over de verschillende modellen voor gezichtsdetectie en hoe u het juiste model voor uw use-case opgeeft.
- Wat is de Face-service?
- De broncode voor dit voorbeeld is te vinden op GitHub.
Quickstart: Face-clientbibliotheek voor JavaScript
Ga aan de slag met gezichtsherkenning met behulp van de Face-clientbibliotheek voor JavaScript. Volg deze stappen om het pakket te installeren en de voorbeeldcode voor basistaken uit te proberen. De Face-service biedt u toegang tot geavanceerde algoritmen voor het detecteren en herkennen van menselijke gezichten in afbeeldingen.
Gebruik de Face-clientbibliotheek voor JavaScript voor het volgende:
Referentiedocumentatie | Bibliotheekbroncode | Pakket (npm) | Voorbeelden
Vereisten
- Azure-abonnement: Krijg een gratis abonnement
- De nieuwste versie van Node.js
- Aan uw Azure-account moet Cognitive Services rol Inzender zijn toegewezen, zodat u akkoord kunt gaan met de verantwoordelijke AI-voorwaarden en een resource kunt maken. Neem contact op met uw beheerder om deze rol aan uw account toe te laten.
- Zodra u uw Azure-abonnement hebt, maakt u een Face-resource in de Azure Portal om uw sleutel en eindpunt op te halen. Nadat de app is geïmplementeerd, klikt u op Ga naar resource.
- U hebt de sleutel en het eindpunt nodig van de resource die u maakt, om de toepassing te verbinden met de Face-API. Later in de quickstart plakt u uw sleutel en eindpunt in de onderstaande code.
- U kunt de gratis prijscategorie (
F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.
Instellen
Een nieuwe Node.js-toepassing maken
Maak in een consolevenster (zoals cmd, PowerShell of Bash) een nieuwe map voor de app, en navigeer naar deze map.
mkdir myapp && cd myapp
Voer de opdracht npm init uit om een knooppunttoepassing te maken met een package.json-bestand.
npm init
De clientbibliotheek installeren
Installeer als volgt de NPM-pakketten ms-rest-azure en azure-cognitiveservices-face:
npm install @azure/cognitiveservices-face @azure/ms-rest-js
Het package.json-bestand van uw app wordt bijgewerkt met de afhankelijkheden.
Maak een bestand met de naam index.js en importeer de volgende bibliotheken:
Tip
Wilt u het codebestand voor de quickstart in één keer weergeven? Die is te vinden op GitHub, waar de codevoorbeelden uit deze quickstart zich bevinden.
const msRest = require("@azure/ms-rest-js");
const Face = require("@azure/cognitiveservices-face");
const uuid = require("uuid/v4");
Maak variabelen voor het Azure-eindpunt en de Azure-sleutel voor uw resource.
Belangrijk
Ga naar Azure Portal. Als de Face-resource die u hebt gemaakt in de sectie Vereisten is geïmplementeerd, klikt u op de knop Ga naar resource onder Volgende stappen. U vindt uw sleutel en eindpunt op de pagina Sleutel en eindpunt van de resource, onder Resourcebeheer.
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en plaats deze sleutel nooit in het openbaar. Overweeg om voor productie een veilige manier te gebruiken voor het opslaan en openen van uw referenties. Zie het artikel Cognitive Services Beveiliging voor meer informatie.
key = "<paste-your-face-key-here>"
endpoint = "<paste-your-face-endpoint-here>"
Objectmodel
De volgende klassen en interfaces verwerken enkele van de belangrijkste functies van de Face .NET-clientbibliotheek:
| Naam | Beschrijving |
|---|---|
| FaceClient | Deze klasse vertegenwoordigt uw autorisatie voor het gebruik van de Face-service. U hebt deze nodig voor alle Face-functies. U instantieert deze klasse met uw abonnementsgegevens en gebruikt deze om instanties van andere klassen te maken. |
| Face | Deze klasse verwerkt de basistaken voor detectie en herkenning die u met menselijke gezichten kunt uitvoeren. |
| DetectedFace | Deze klasse vertegenwoordigt alle gegevens die zijn gedetecteerd van één gezicht in een afbeelding. U kunt deze gebruiken om gedetailleerde informatie over het gezicht op te halen. |
| FaceList | Deze klasse beheert de in de cloud opgeslagen FaceList-constructies, waarin een geassorteerde set gezichten wordt opgeslagen. |
| PersonGroupPerson | Deze klasse beheert de in de cloud opgeslagen Person-constructies, die een set gezichten opslaan die tot één persoon behoren. |
| PersonGroup | Deze klasse beheert de in de cloud opgeslagen PersonGroup-constructies, die een set van verschillende Person-objecten opslaan. |
Codevoorbeelden
De onderstaande codefragmenten laten zien hoe u de volgende taken kunt uitvoeren met de Face-clientbibliotheek voor .NET:
- De client verifiëren
- Gezichten detecteren en analyseren
- Een gezicht identificeren
- Vergelijkbare gezichten zoeken
Tip
Wilt u het codebestand voor de quickstart in één keer weergeven? Die is te vinden op GitHub, waar de codevoorbeelden uit deze quickstart zich bevinden.
De client verifiëren
Instantieer een client met uw eindpunt en sleutel. Maak een ApiKeyCredentials-object met uw sleutel en gebruik dit met uw eindpunt om een FaceClient-object te maken.
const credentials = new msRest.ApiKeyCredentials({ inHeader: { 'Ocp-Apim-Subscription-Key': key } });
const client = new Face.FaceClient(credentials, endpoint);
Globale waarden en helperfunctie declareer
De volgende globale waarden zijn nodig voor verschillende Face-bewerkingen die u later gaat toevoegen.
De URL wijst naar een map met voorbeeldafbeeldingen. De UUID dient als zowel de naam als de id voor de PersonGroup die u maakt.
const image_base_url = "https://csdx.blob.core.windows.net/resources/Face/Images/";
const person_group_id = uuid();
U gebruikt de volgende functie om te wachten tot de training van de PersonGroup is voltooid.
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
Gezichten detecteren en analyseren
Gezichtsdetectie is vereist als eerste stap in Gezichtsanalyse en Identiteitsverificatie. In deze sectie ziet u hoe u de extra gezichtskenmerkgegevens kunt retourneren. Als u alleen gezichten wilt detecteren voor gezichtsidentificatie of -verificatie, gaat u verder met de latere secties.
Gedetecteerde face-objecten ophalen
Maak een nieuwe methode voor het detecteren van gezichten. Met de DetectFaceExtract-methode worden drie van de afbeeldingen bij de opgegeven URL verwerkt en wordt een lijst met DetectedFace -objecten in het programmageheugen gemaakt. In de lijst met FaceAttributeType -waarden wordt aangegeven welke functies moeten worden geëxtraheerd.
Met DetectFaceExtract de methode worden vervolgens de kenmerkgegevens voor elk gedetecteerd gezicht geparseerd en afgedrukt. Elk kenmerk moet afzonderlijk worden opgegeven in de oorspronkelijke gezichtsdetectie-API-aanroep (in de lijst FaceAttributeType ). De volgende code verwerkt elk kenmerk, maar u zult waarschijnlijk slechts één of enkele gebruiken.
async function DetectFaceExtract() {
console.log("========DETECT FACES========");
console.log();
// Create a list of images
const image_file_names = [
"detection1.jpg", // single female with glasses
// "detection2.jpg", // (optional: single man)
// "detection3.jpg", // (optional: single male construction worker)
// "detection4.jpg", // (optional: 3 people at cafe, 1 is blurred)
"detection5.jpg", // family, woman child man
"detection6.jpg" // elderly couple, male female
];
// NOTE await does not work properly in for, forEach, and while loops. Use Array.map and Promise.all instead.
await Promise.all (image_file_names.map (async function (image_file_name) {
let detected_faces = await client.face.detectWithUrl(image_base_url + image_file_name,
{
returnFaceAttributes: ["Accessories","Age","Blur","Emotion","Exposure","FacialHair","Gender","Glasses","Hair","HeadPose","Makeup","Noise","Occlusion","Smile"],
// We specify detection model 1 because we are retrieving attributes.
detectionModel: "detection_01"
});
console.log (detected_faces.length + " face(s) detected from image " + image_file_name + ".");
console.log("Face attributes for face(s) in " + image_file_name + ":");
// Parse and print all attributes of each detected face.
detected_faces.forEach (async function (face) {
// Get the bounding box of the face
console.log("Bounding box:\n Left: " + face.faceRectangle.left + "\n Top: " + face.faceRectangle.top + "\n Width: " + face.faceRectangle.width + "\n Height: " + face.faceRectangle.height);
// Get the accessories of the face
let accessories = face.faceAttributes.accessories.join();
if (0 === accessories.length) {
console.log ("No accessories detected.");
}
else {
console.log ("Accessories: " + accessories);
}
// Get face other attributes
console.log("Age: " + face.faceAttributes.age);
console.log("Blur: " + face.faceAttributes.blur.blurLevel);
// Get emotion on the face
let emotions = "";
let emotion_threshold = 0.0;
if (face.faceAttributes.emotion.anger > emotion_threshold) { emotions += "anger, "; }
if (face.faceAttributes.emotion.contempt > emotion_threshold) { emotions += "contempt, "; }
if (face.faceAttributes.emotion.disgust > emotion_threshold) { emotions += "disgust, "; }
if (face.faceAttributes.emotion.fear > emotion_threshold) { emotions += "fear, "; }
if (face.faceAttributes.emotion.happiness > emotion_threshold) { emotions += "happiness, "; }
if (face.faceAttributes.emotion.neutral > emotion_threshold) { emotions += "neutral, "; }
if (face.faceAttributes.emotion.sadness > emotion_threshold) { emotions += "sadness, "; }
if (face.faceAttributes.emotion.surprise > emotion_threshold) { emotions += "surprise, "; }
if (emotions.length > 0) {
console.log ("Emotions: " + emotions.slice (0, -2));
}
else {
console.log ("No emotions detected.");
}
// Get more face attributes
console.log("Exposure: " + face.faceAttributes.exposure.exposureLevel);
if (face.faceAttributes.facialHair.moustache + face.faceAttributes.facialHair.beard + face.faceAttributes.facialHair.sideburns > 0) {
console.log("FacialHair: Yes");
}
else {
console.log("FacialHair: No");
}
console.log("Gender: " + face.faceAttributes.gender);
console.log("Glasses: " + face.faceAttributes.glasses);
// Get hair color
var color = "";
if (face.faceAttributes.hair.hairColor.length === 0) {
if (face.faceAttributes.hair.invisible) { color = "Invisible"; } else { color = "Bald"; }
}
else {
color = "Unknown";
var highest_confidence = 0.0;
face.faceAttributes.hair.hairColor.forEach (function (hair_color) {
if (hair_color.confidence > highest_confidence) {
highest_confidence = hair_color.confidence;
color = hair_color.color;
}
});
}
console.log("Hair: " + color);
// Get more attributes
console.log("Head pose:");
console.log(" Pitch: " + face.faceAttributes.headPose.pitch);
console.log(" Roll: " + face.faceAttributes.headPose.roll);
console.log(" Yaw: " + face.faceAttributes.headPose.yaw);
console.log("Makeup: " + ((face.faceAttributes.makeup.eyeMakeup || face.faceAttributes.makeup.lipMakeup) ? "Yes" : "No"));
console.log("Noise: " + face.faceAttributes.noise.noiseLevel);
console.log("Occlusion:");
console.log(" Eye occluded: " + (face.faceAttributes.occlusion.eyeOccluded ? "Yes" : "No"));
console.log(" Forehead occluded: " + (face.faceAttributes.occlusion.foreheadOccluded ? "Yes" : "No"));
console.log(" Mouth occluded: " + (face.faceAttributes.occlusion.mouthOccluded ? "Yes" : "No"));
console.log("Smile: " + face.faceAttributes.smile);
console.log();
});
}));
}
Tip
U kunt ook gezichten detecteren in een lokale afbeelding. Bekijk de Face-methoden, zoals DetectWithStreamAsync.
Een gezicht identificeren
De bewerking Identificeren neemt een afbeelding van een persoon (of meerdere personen) en zoekt naar het opgeslagen persoonsobject dat is gekoppeld aan elk gezicht in de afbeelding (zoekopdracht voor gezichtsherkenning). Elk gedetecteerd gezicht wordt vergeleken met een PersonGroup, een database van verschillende Person-objecten waarvan de gezichtskenmerken bekend zijn. Als u de bewerking Identificeren wilt uitvoeren, moet u eerst een PersonGroup maken en trainen.
Gezichten toevoegen aan PersonGroup
Maak de volgende functie om gezichten toe te voegen aan de PersonGroup.
async function AddFacesToPersonGroup(person_dictionary, person_group_id) {
console.log ("Adding faces to person group...");
// The similar faces will be grouped into a single person group person.
await Promise.all (Object.keys(person_dictionary).map (async function (key) {
const value = person_dictionary[key];
// Wait briefly so we do not exceed rate limits.
await sleep (1000);
let person = await client.personGroupPerson.create(person_group_id, { name : key });
console.log("Create a person group person: " + key + ".");
// Add faces to the person group person.
await Promise.all (value.map (async function (similar_image) {
console.log("Add face to the person group person: (" + key + ") from image: " + similar_image + ".");
await client.personGroupPerson.addFaceFromUrl(person_group_id, person.personId, image_base_url + similar_image);
}));
}));
console.log ("Done adding faces to person group.");
}
Wachten op training van PersonGroup
Maak de volgende helperfunctie om te wachten tot de PersonGroup is getraind.
async function WaitForPersonGroupTraining(person_group_id) {
// Wait so we do not exceed rate limits.
console.log ("Waiting 10 seconds...");
await sleep (10000);
let result = await client.personGroup.getTrainingStatus(person_group_id);
console.log("Training status: " + result.status + ".");
if (result.status !== "succeeded") {
await WaitForPersonGroupTraining(person_group_id);
}
}
Een PersonGroup maken
De volgende code:
- Hiermee maakt u een PersonGroup
- Voegt gezichten toe aan de PersonGroup door aan te
AddFacesToPersonGrouproepen, die u eerder hebt gedefinieerd. - Traint de PersonGroup.
- Identificeert de gezichten in de PersonGroup.
Deze PersonGroup en de bijbehorende Person-objecten zijn nu klaar om te worden gebruikt in de bewerkingen Verifiëren, Identificeren of Groeperen.
async function IdentifyInPersonGroup() {
console.log("========IDENTIFY FACES========");
console.log();
// Create a dictionary for all your images, grouping similar ones under the same key.
const person_dictionary = {
"Family1-Dad" : ["Family1-Dad1.jpg", "Family1-Dad2.jpg"],
"Family1-Mom" : ["Family1-Mom1.jpg", "Family1-Mom2.jpg"],
"Family1-Son" : ["Family1-Son1.jpg", "Family1-Son2.jpg"],
"Family1-Daughter" : ["Family1-Daughter1.jpg", "Family1-Daughter2.jpg"],
"Family2-Lady" : ["Family2-Lady1.jpg", "Family2-Lady2.jpg"],
"Family2-Man" : ["Family2-Man1.jpg", "Family2-Man2.jpg"]
};
// A group photo that includes some of the persons you seek to identify from your dictionary.
let source_image_file_name = "identification1.jpg";
// Create a person group.
console.log("Creating a person group with ID: " + person_group_id);
await client.personGroup.create(person_group_id, { name : person_group_id, recognitionModel : "recognition_04" });
await AddFacesToPersonGroup(person_dictionary, person_group_id);
// Start to train the person group.
console.log();
console.log("Training person group: " + person_group_id + ".");
await client.personGroup.train(person_group_id);
await WaitForPersonGroupTraining(person_group_id);
console.log();
// Detect faces from source image url.
let face_ids = (await DetectFaceRecognize(image_base_url + source_image_file_name)).map (face => face.faceId);
// Identify the faces in a person group.
let results = await client.face.identify(face_ids, { personGroupId : person_group_id});
await Promise.all (results.map (async function (result) {
let person = await client.personGroupPerson.get(person_group_id, result.candidates[0].personId);
console.log("Person: " + person.name + " is identified for face in: " + source_image_file_name + " with ID: " + result.faceId + ". Confidence: " + result.candidates[0].confidence + ".");
}));
console.log();
}
Tip
U kunt ook een PersonGroup maken op basis van lokale afbeeldingen. Zie de PersonGroupPerson-methoden, zoals AddFaceFromStream.
Vergelijkbare gezichten zoeken
Met de volgende code wordt op basis van één gedetecteerd gezicht (bron) een reeks andere gezichten (doel) doorzocht om een overeenkomstig gezicht te vinden (gezichten zoeken op afbeelding). Wanneer er een overeenkomst wordt gevonden, wordt de id van het overeenkomende gezicht afgedrukt op de console.
Gezichten detecteren voor vergelijking
Definieer eerst een tweede gezichtsdetectiemethode. U moet gezichten in afbeeldingen detecteren voordat u ze kunt vergelijken en deze detectiemethode is geoptimaliseerd voor vergelijkingsbewerkingen. Er worden geen gedetailleerde gezichtskenmerken geëxtraheerd, zoals in de bovenstaande sectie, en er wordt een ander herkenningsmodel gebruikt.
async function DetectFaceRecognize(url) {
// Detect faces from image URL. Since only recognizing, use the recognition model 4.
// We use detection model 3 because we are not retrieving attributes.
let detected_faces = await client.face.detectWithUrl(url,
{
detectionModel: "detection_03",
recognitionModel: "recognition_04"
});
return detected_faces;
}
Overeenkomsten zoeken
De volgende methode detecteert gezichten in een set doelafbeeldingen en in één bronafbeelding. Vervolgens worden deze vergeleken en worden alle doelafbeeldingen gevonden die vergelijkbaar zijn met de bronafbeelding. Ten slotte worden de overeenkomende gegevens naar de console afgedrukt.
async function FindSimilar() {
console.log("========FIND SIMILAR========");
console.log();
const source_image_file_name = "findsimilar.jpg";
const target_image_file_names = [
"Family1-Dad1.jpg",
"Family1-Daughter1.jpg",
"Family1-Mom1.jpg",
"Family1-Son1.jpg",
"Family2-Lady1.jpg",
"Family2-Man1.jpg",
"Family3-Lady1.jpg",
"Family3-Man1.jpg"
];
let target_face_ids = (await Promise.all (target_image_file_names.map (async function (target_image_file_name) {
// Detect faces from target image url.
var faces = await DetectFaceRecognize(image_base_url + target_image_file_name);
console.log(faces.length + " face(s) detected from image: " + target_image_file_name + ".");
return faces.map (function (face) { return face.faceId });;
}))).flat();
// Detect faces from source image url.
let detected_faces = await DetectFaceRecognize(image_base_url + source_image_file_name);
// Find a similar face(s) in the list of IDs. Comapring only the first in list for testing purposes.
let results = await client.face.findSimilar(detected_faces[0].faceId, { faceIds : target_face_ids });
results.forEach (function (result) {
console.log("Faces from: " + source_image_file_name + " and ID: " + result.faceId + " are similar with confidence: " + result.confidence + ".");
});
console.log();
}
Belangrijkste
Maak ten slotte de main functie en roep deze aan.
async function main() {
await DetectFaceExtract();
await FindSimilar();
await IdentifyInPersonGroup();
console.log ("Done.");
}
main();
De toepassing uitvoeren
Voer de toepassing uit met de opdracht node in uw quickstart-bestand.
node index.js
Resources opschonen
Als u een Cognitive Services-abonnement wilt opschonen en verwijderen, kunt u de resource of resourcegroep verwijderen. Als u de resourcegroep verwijdert, worden ook alle bijbehorende resources verwijderd.
Volgende stappen
In deze quickstart hebt u geleerd hoe u de Face-clientbibliotheek voor JavaScript gebruikt om basistaken voor gezichtsherkenning uit te voeren. Hierna leert u meer over de verschillende modellen voor gezichtsdetectie en hoe u het juiste model voor uw use-case opgeeft.
- Wat is de Face-service?
- De broncode voor dit voorbeeld is te vinden op GitHub.
Ga aan de slag met gezichtsherkenning met behulp van de Face-clientbibliotheek voor Python. Volg deze stappen om het pakket te installeren en de voorbeeldcode voor basistaken uit te proberen. De Face-service biedt u toegang tot geavanceerde algoritmen voor het detecteren en herkennen van menselijke gezichten in afbeeldingen.
Gebruik de Face-clientbibliotheek voor Python voor het volgende:
- Gezichten detecteren en analyseren
- Een gezicht identificeren
- Gezichten verifiëren
- Vergelijkbare gezichten zoeken
Referentiedocumentatie | Broncode bibliotheek | Package (PiPy) | Voorbeelden
Vereisten
- Azure-abonnement: Krijg een gratis abonnement
- Python 3.x
- Uw Python-installatie moet pip bevatten. U kunt controleren of pip is geïnstalleerd door uit te voeren
pip --versionop de opdrachtregel. Haal pip op door de nieuwste versie van Python te installeren.
- Uw Python-installatie moet pip bevatten. U kunt controleren of pip is geïnstalleerd door uit te voeren
- Aan uw Azure-account moet Cognitive Services rol Inzender zijn toegewezen, zodat u akkoord kunt gaan met de verantwoordelijke AI-voorwaarden en een resource kunt maken. Neem contact op met uw beheerder om deze rol aan uw account toe te laten.
- Zodra u een Azure-abonnement hebt, maakt u een Face-resource en maakt u een Face-resource in de Azure Portal om uw sleutel en eindpunt op te halen. Nadat de app is geïmplementeerd, klikt u op Ga naar resource.
- U hebt de sleutel en het eindpunt nodig van de resource die u maakt, om de toepassing te verbinden met de Face-API. Later in de quickstart plakt u uw sleutel en eindpunt in de onderstaande code.
- U kunt de gratis prijscategorie (
F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.
Instellen
De clientbibliotheek installeren
Na de installatie van Python kunt u de clientbibliotheek installeren met:
pip install --upgrade azure-cognitiveservices-vision-face
Een nieuwe Python-toepassing maken
Maak bijvoorbeeld een nieuw Python-script—quickstart-file.py. Open vervolgens het bestand in uw voorkeurseditor of IDE en importeer de volgende bibliotheken.
import asyncio
import io
import glob
import os
import sys
import time
import uuid
import requests
from urllib.parse import urlparse
from io import BytesIO
# To install this module, run:
# python -m pip install Pillow
from PIL import Image, ImageDraw
from azure.cognitiveservices.vision.face import FaceClient
from msrest.authentication import CognitiveServicesCredentials
from azure.cognitiveservices.vision.face.models import TrainingStatusType, Person
Tip
Wilt u het codebestand voor de quickstart in één keer weergeven? Die is te vinden op GitHub, waar de codevoorbeelden uit deze quickstart zich bevinden.
Maak dan variabelen voor het Azure-eindpunt en de Azure-sleutel voor uw resource.
# This key will serve all examples in this document.
KEY = "PASTE_YOUR_FACE_SUBSCRIPTION_KEY_HERE"
# This endpoint will be used in all examples in this quickstart.
ENDPOINT = "PASTE_YOUR_FACE_ENDPOINT_HERE"
Belangrijk
Ga naar Azure Portal. Als de Face-resource die u hebt gemaakt in de sectie Vereisten is geïmplementeerd, klikt u op de knop Ga naar resource onder Volgende stappen. U vindt uw sleutel en eindpunt op de pagina Sleutel en eindpunt van de resource, onder Resourcebeheer.
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en plaats deze sleutel nooit in het openbaar. Overweeg om voor productie een veilige manier te gebruiken voor het opslaan en openen van uw referenties. Bijvoorbeeld Azure Key Vault.
Objectmodel
De volgende klassen en interfaces verwerken enkele van de belangrijkste functies van de Face Python-clientbibliotheek:
| Naam | Beschrijving |
|---|---|
| FaceClient | Deze klasse vertegenwoordigt uw autorisatie voor het gebruik van de Face-service. U hebt deze nodig voor alle Face-functies. U instantieert deze klasse met uw abonnementsgegevens en gebruikt deze om instanties van andere klassen te maken. |
| FaceOperations | Deze klasse verwerkt de basistaken voor detectie en herkenning die u met menselijke gezichten kunt uitvoeren. |
| DetectedFace | Deze klasse vertegenwoordigt alle gegevens die zijn gedetecteerd van één gezicht in een afbeelding. U kunt deze gebruiken om gedetailleerde informatie over het gezicht op te halen. |
| FaceListOperations | Deze klasse beheert de in de cloud opgeslagen FaceList-constructies, waarin een geassorteerde set gezichten wordt opgeslagen. |
| PersonGroupPersonOperations | Deze klasse beheert de in de cloud opgeslagen Person-constructies, die een set gezichten opslaan die tot één persoon behoren. |
| PersonGroupOperations | Deze klasse beheert de in de cloud opgeslagen PersonGroup-constructies, die een set van verschillende Person-objecten opslaan. |
| ShapshotOperations | Deze klasse beheert de functionaliteit van de momentopname. U kunt deze gebruiken om al uw op de cloud gebaseerde gezichtsgegevens tijdelijk op te slaan en deze gegevens te migreren naar een nieuw Azure-abonnement. |
Codevoorbeelden
Deze codefragmenten laten zien hoe u de volgende taken kunt uitvoeren met de Face-clientbibliotheek voor Python:
- De client verifiëren
- Gezichten detecteren en analyseren
- Een gezicht identificeren
- Gezichten verifiëren
- Vergelijkbare gezichten zoeken
De client verifiëren
Instantieer een client met uw eindpunt en sleutel. Maak een CognitiveServicesCredentials-object met uw sleutel en gebruik het met uw eindpunt om een FaceClient-object te maken.
# Create an authenticated FaceClient.
face_client = FaceClient(ENDPOINT, CognitiveServicesCredentials(KEY))
Gezichten detecteren en analyseren
Gezichtsdetectie is vereist in Gezichtsanalyse en Identiteitsverificatie. In deze sectie ziet u hoe u de extra gezichtskenmerkgegevens kunt retourneren. Als u alleen gezichten wilt detecteren voor gezichtsidentificatie of -verificatie, gaat u verder met de latere secties.
De volgende code detecteert een gezicht in een externe afbeelding. Hiermee wordt de id van het gedetecteerde gezicht afgedrukt naar de console en wordt in het programmageheugen opgeslagen. Vervolgens worden de gezichten van een afbeelding met meerdere personen gedetecteerd en worden de bijbehorende id's ook naar de console afgedrukt. Door de parameters in de methode detect_with_url te wijzigen, kunt u verschillende gegevens retourneren met elk DetectedFace-object.
# Detect a face in an image that contains a single face
single_face_image_url = 'https://www.biography.com/.image/t_share/MTQ1MzAyNzYzOTgxNTE0NTEz/john-f-kennedy---mini-biography.jpg'
single_image_name = os.path.basename(single_face_image_url)
# We use detection model 3 to get better performance.
detected_faces = face_client.face.detect_with_url(url=single_face_image_url, detection_model='detection_03')
if not detected_faces:
raise Exception('No face detected from image {}'.format(single_image_name))
# Display the detected face ID in the first single-face image.
# Face IDs are used for comparison to faces (their IDs) detected in other images.
print('Detected face ID from', single_image_name, ':')
for face in detected_faces: print (face.face_id)
print()
# Save this ID for use in Find Similar
first_image_face_ID = detected_faces[0].face_id
Tip
U kunt ook gezichten detecteren in een lokale afbeelding. Zie de FaceOperations-methoden zoals detect_with_stream.
Gezichten weergeven en kaderen
Met de volgende code wordt de opgegeven afbeelding naar het scherm uitgevoerd en worden rechthoeken rond de vlakken getekend met behulp van de eigenschap DetectedFace.faceRectangle.
# Detect a face in an image that contains a single face
single_face_image_url = 'https://raw.githubusercontent.com/Microsoft/Cognitive-Face-Windows/master/Data/detection1.jpg'
single_image_name = os.path.basename(single_face_image_url)
# We use detection model 3 to get better performance.
detected_faces = face_client.face.detect_with_url(url=single_face_image_url, detection_model='detection_03')
if not detected_faces:
raise Exception('No face detected from image {}'.format(single_image_name))
# Convert width height to a point in a rectangle
def getRectangle(faceDictionary):
rect = faceDictionary.face_rectangle
left = rect.left
top = rect.top
right = left + rect.width
bottom = top + rect.height
return ((left, top), (right, bottom))
def drawFaceRectangles() :
# Download the image from the url
response = requests.get(single_face_image_url)
img = Image.open(BytesIO(response.content))
# For each face returned use the face rectangle and draw a red box.
print('Drawing rectangle around face... see popup for results.')
draw = ImageDraw.Draw(img)
for face in detected_faces:
draw.rectangle(getRectangle(face), outline='red')
# Display the image in the default image browser.
img.show()
# Uncomment this to show the face rectangles.
# drawFaceRectangles()

Een gezicht identificeren
Bij de bewerking Identificeren wordt op basis van een afbeelding van een persoon (of meerdere personen) gezocht naar de identiteit van elk gezicht in de afbeelding (zoeken met gezichtsherkenning). Elk gedetecteerd gezicht wordt vergeleken met een PersonGroup, een database van verschillende Person-objecten waarvan de gezichtskenmerken bekend zijn.
Een PersonGroup maken
Met de volgende code wordt een PersonGroup gemaakt met drie verschillende Person-objecten. Het koppelt elke persoon aan een reeks voorbeeldafbeeldingen en traint vervolgens om elke persoon te herkennen.
Als u dit scenario wilt doorlopen, moet u de volgende afbeeldingen opslaan in de hoofdmap van uw project: https://github.com/Azure-Samples/cognitive-services-sample-data-files/tree/master/Face/images.
Deze groep met afbeeldingen bevat drie sets gezichtsafbeeldingen die overeenkomen met drie verschillende personen. Met de code worden drie Person-objecten gedefinieerd en gekoppeld aan afbeeldingsbestanden die beginnen met woman, manen child.
Nadat u uw afbeeldingen hebt ingesteld, definieert u een label bovenaan het script voor het PersonGroup-object dat u maakt.
# Used in the Person Group Operations and Delete Person Group examples.
# You can call list_person_groups to print a list of preexisting PersonGroups.
# SOURCE_PERSON_GROUP_ID should be all lowercase and alphanumeric. For example, 'mygroupname' (dashes are OK).
PERSON_GROUP_ID = str(uuid.uuid4()) # assign a random ID (or name it anything)
# Used for the Delete Person Group example.
TARGET_PERSON_GROUP_ID = str(uuid.uuid4()) # assign a random ID (or name it anything)
Voeg onderaan uw script de volgende code toe. Met deze code maakt u een PersonGroup en drie Person-objecten.
'''
Create the PersonGroup
'''
# Create empty Person Group. Person Group ID must be lower case, alphanumeric, and/or with '-', '_'.
print('Person group:', PERSON_GROUP_ID)
face_client.person_group.create(person_group_id=PERSON_GROUP_ID, name=PERSON_GROUP_ID)
# Define woman friend
woman = face_client.person_group_person.create(PERSON_GROUP_ID, "Woman")
# Define man friend
man = face_client.person_group_person.create(PERSON_GROUP_ID, "Man")
# Define child friend
child = face_client.person_group_person.create(PERSON_GROUP_ID, "Child")
Gezichten toewijzen aan personen
Met de volgende code worden uw afbeeldingen gesorteerd op basis van het voorvoegsel, worden de gezichten gedetecteerd en worden de gezichten toegewezen aan elk Person-object.
'''
Detect faces and register to correct person
'''
# Find all jpeg images of friends in working directory
woman_images = [file for file in glob.glob('*.jpg') if file.startswith("w")]
man_images = [file for file in glob.glob('*.jpg') if file.startswith("m")]
child_images = [file for file in glob.glob('*.jpg') if file.startswith("ch")]
# Add to a woman person
for image in woman_images:
w = open(image, 'r+b')
face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, woman.person_id, w)
# Add to a man person
for image in man_images:
m = open(image, 'r+b')
face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, man.person_id, m)
# Add to a child person
for image in child_images:
ch = open(image, 'r+b')
face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, child.person_id, ch)
Tip
U kunt ook een PersonGroup maken op basis van externe afbeeldingen waarnaar met een URL wordt verwezen. Zie de PersonGroupPersonOperations-methoden zoals add_face_from_url.
De PersonGroup trainen
Zodra u gezichten hebt toegewezen, moet u de PersonGroup trainen zodat deze de visuele functies kan identificeren die zijn gekoppeld aan elk van de Person-objecten. Met de volgende code wordt de asynchrone Train-methode aangeroepen en worden de resultaten gecontroleerd, en wordt de status naar de console afgedrukt.
'''
Train PersonGroup
'''
print()
print('Training the person group...')
# Train the person group
face_client.person_group.train(PERSON_GROUP_ID)
while (True):
training_status = face_client.person_group.get_training_status(PERSON_GROUP_ID)
print("Training status: {}.".format(training_status.status))
print()
if (training_status.status is TrainingStatusType.succeeded):
break
elif (training_status.status is TrainingStatusType.failed):
face_client.person_group.delete(person_group_id=PERSON_GROUP_ID)
sys.exit('Training the person group has failed.')
time.sleep(5)
Tip
De Face-API wordt uitgevoerd op een set vooraf gebouwde modellen die van nature statisch zijn (de prestaties van het model worden niet slechter of beter tijdens het uitvoeren van de service). De resultaten die het model produceert, kunnen veranderen als de back-end van het model door Microsoft wordt gewijzigd zonder migratie naar een heel nieuwe modelversie. Als u wilt profiteren van een nieuwere versie van het model, kunt u PersonGroup opnieuw trainen, waarbij u het nieuwere model opgeeft als een parameter bij dezelfde inschrijvingsafbeeldingen.
Een testafbeelding ophalen
De volgende code zoekt in de hoofdmap van uw project naar een afbeelding test-image-person-group. jpg en detecteert de gezichten in de afbeelding. U kunt deze afbeelding vinden met de afbeeldingen die worden gebruikt voor PersonGroup-beheer: https://github.com/Azure-Samples/cognitive-services-sample-data-files/tree/master/Face/images.
'''
Identify a face against a defined PersonGroup
'''
# Group image for testing against
test_image_array = glob.glob('test-image-person-group.jpg')
image = open(test_image_array[0], 'r+b')
print('Pausing for 60 seconds to avoid triggering rate limit on free account...')
time.sleep (60)
# Detect faces
face_ids = []
# We use detection model 3 to get better performance.
faces = face_client.face.detect_with_stream(image, detection_model='detection_03')
for face in faces:
face_ids.append(face.face_id)
Geïdentificeerde gezichts-ID's voor uitvoer
De methode Identificeren gebruikt een matrix met gedetecteerde gezichten en vergelijkt deze met een PersonGroup. Als een gedetecteerd gezicht overeenkomt met een Person, wordt het resultaat opgeslagen. Met deze code worden gedetailleerde overeenkomende resultaten naar de console afgedrukt.
# Identify faces
results = face_client.face.identify(face_ids, PERSON_GROUP_ID)
print('Identifying faces in {}'.format(os.path.basename(image.name)))
if not results:
print('No person identified in the person group for faces from {}.'.format(os.path.basename(image.name)))
for person in results:
if len(person.candidates) > 0:
print('Person for face ID {} is identified in {} with a confidence of {}.'.format(person.face_id, os.path.basename(image.name), person.candidates[0].confidence)) # Get topmost confidence score
else:
print('No person identified for face ID {} in {}.'.format(person.face_id, os.path.basename(image.name)))
Gezichten verifiëren
De bewerking Verifiëren neemt een gezichts-id en een andere gezichts-id of een Person-object en bepaalt of deze van dezelfde persoon zijn. Verificatie kan worden gebruikt om de gezichtsmatch te controleren die wordt geretourneerd door de bewerking Identificeren.
De volgende code detecteert gezichten in twee bronafbeeldingen en vergelijkt deze vervolgens met een gezicht dat is gedetecteerd in een doelafbeelding.
Testafbeeldingen ophalen
De volgende codeblokken declareren variabelen die verwijzen naar de bron- en doelafbeeldingen voor de verificatiebewerking.
# Base url for the Verify and Facelist/Large Facelist operations
IMAGE_BASE_URL = 'https://csdx.blob.core.windows.net/resources/Face/Images/'
# Create a list to hold the target photos of the same person
target_image_file_names = ['Family1-Dad1.jpg', 'Family1-Dad2.jpg']
# The source photos contain this person
source_image_file_name1 = 'Family1-Dad3.jpg'
source_image_file_name2 = 'Family1-Son1.jpg'
Gezichten voor verificatie detecteren
De volgende code detecteert gezichten in de bron- en doelafbeeldingen en slaat ze op in variabelen.
# Detect face(s) from source image 1, returns a list[DetectedFaces]
# We use detection model 3 to get better performance.
detected_faces1 = face_client.face.detect_with_url(IMAGE_BASE_URL + source_image_file_name1, detection_model='detection_03')
# Add the returned face's face ID
source_image1_id = detected_faces1[0].face_id
print('{} face(s) detected from image {}.'.format(len(detected_faces1), source_image_file_name1))
# Detect face(s) from source image 2, returns a list[DetectedFaces]
detected_faces2 = face_client.face.detect_with_url(IMAGE_BASE_URL + source_image_file_name2, detection_model='detection_03')
# Add the returned face's face ID
source_image2_id = detected_faces2[0].face_id
print('{} face(s) detected from image {}.'.format(len(detected_faces2), source_image_file_name2))
# List for the target face IDs (uuids)
detected_faces_ids = []
# Detect faces from target image url list, returns a list[DetectedFaces]
for image_file_name in target_image_file_names:
# We use detection model 3 to get better performance.
detected_faces = face_client.face.detect_with_url(IMAGE_BASE_URL + image_file_name, detection_model='detection_03')
# Add the returned face's face ID
detected_faces_ids.append(detected_faces[0].face_id)
print('{} face(s) detected from image {}.'.format(len(detected_faces), image_file_name))
Verificatieresultaten ophalen
De volgende code vergelijkt elk van de bronafbeeldingen met de doelafbeelding en drukt een bericht af dat aangeeft of ze van dezelfde persoon zijn.
# Verification example for faces of the same person. The higher the confidence, the more identical the faces in the images are.
# Since target faces are the same person, in this example, we can use the 1st ID in the detected_faces_ids list to compare.
verify_result_same = face_client.face.verify_face_to_face(source_image1_id, detected_faces_ids[0])
print('Faces from {} & {} are of the same person, with confidence: {}'
.format(source_image_file_name1, target_image_file_names[0], verify_result_same.confidence)
if verify_result_same.is_identical
else 'Faces from {} & {} are of a different person, with confidence: {}'
.format(source_image_file_name1, target_image_file_names[0], verify_result_same.confidence))
# Verification example for faces of different persons.
# Since target faces are same person, in this example, we can use the 1st ID in the detected_faces_ids list to compare.
verify_result_diff = face_client.face.verify_face_to_face(source_image2_id, detected_faces_ids[0])
print('Faces from {} & {} are of the same person, with confidence: {}'
.format(source_image_file_name2, target_image_file_names[0], verify_result_diff.confidence)
if verify_result_diff.is_identical
else 'Faces from {} & {} are of a different person, with confidence: {}'
.format(source_image_file_name2, target_image_file_names[0], verify_result_diff.confidence))
Vergelijkbare gezichten zoeken
Met de volgende code wordt op basis van één gedetecteerd gezicht (bron) een reeks andere gezichten (doel) doorzocht om een overeenkomstig gezicht te vinden (gezichten zoeken op afbeelding). Wanneer er een overeenkomst wordt gevonden, wordt de id van het overeenkomende gezicht afgedrukt op de console.
Overeenkomsten zoeken
Voer eerst de code uit in de bovenstaande sectie ( Gezichten detecteren enanalyseren)om een verwijzing naar één gezicht op te slaan. Voer vervolgens de volgende code uit om verwijzingen naar verschillende gezichten in een groepsafbeelding te krijgen.
# Detect the faces in an image that contains multiple faces
# Each detected face gets assigned a new ID
multi_face_image_url = "http://www.historyplace.com/kennedy/president-family-portrait-closeup.jpg"
multi_image_name = os.path.basename(multi_face_image_url)
# We use detection model 3 to get better performance.
detected_faces2 = face_client.face.detect_with_url(url=multi_face_image_url, detection_model='detection_03')
Voeg daarna het volgende codeblok toe om exemplaren van het eerste gezicht in de groep te zoeken. Raadpleeg de methode find_similar voor meer informatie over hoe u dit gedrag kunt wijzigen.
# Search through faces detected in group image for the single face from first image.
# First, create a list of the face IDs found in the second image.
second_image_face_IDs = list(map(lambda x: x.face_id, detected_faces2))
# Next, find similar face IDs like the one detected in the first image.
similar_faces = face_client.face.find_similar(face_id=first_image_face_ID, face_ids=second_image_face_IDs)
if not similar_faces:
print('No similar faces found in', multi_image_name, '.')
Overeenkomsten afdrukken
Met de volgende code worden de overeenkomende resultaten op de console weergegeven:
# Print the details of the similar faces detected
else:
print('Similar faces found in', multi_image_name + ':')
for face in similar_faces:
first_image_face_ID = face.face_id
# The similar face IDs of the single face image and the group image do not need to match,
# they are only used for identification purposes in each image.
# The similar faces are matched using the Cognitive Services algorithm in find_similar().
face_info = next(x for x in detected_faces2 if x.face_id == first_image_face_ID)
if face_info:
print(' Face ID: ', first_image_face_ID)
print(' Face rectangle:')
print(' Left: ', str(face_info.face_rectangle.left))
print(' Top: ', str(face_info.face_rectangle.top))
print(' Width: ', str(face_info.face_rectangle.width))
print(' Height: ', str(face_info.face_rectangle.height))
De toepassing uitvoeren
Voer uw gezichtsherkennings-app uit vanuit de toepassingsmap met de opdracht python.
python quickstart-file.py
Resources opschonen
Als u een Cognitive Services-abonnement wilt opschonen en verwijderen, kunt u de resource of resourcegroep verwijderen. Als u de resourcegroep verwijdert, worden ook alle bijbehorende resources verwijderd.
Als u in deze quickstart een PersonGroup hebt gemaakt en u deze wilt verwijderen, voert u de volgende code uit in uw script:
# Delete the main person group.
face_client.person_group.delete(person_group_id=PERSON_GROUP_ID)
print("Deleted the person group {} from the source location.".format(PERSON_GROUP_ID))
print()
Volgende stappen
In deze quickstart hebt u geleerd hoe u de Face-clientbibliotheek voor Python gebruikt om basistaken voor gezichtsherkenning uit te voeren. Hierna leert u meer over de verschillende modellen voor gezichtsdetectie en hoe u het juiste model voor uw use-case opgeeft.
- Wat is de Face-service?
- De broncode voor dit voorbeeld is te vinden op GitHub.
Aan de slag met gezichtsherkenning met behulp van de Face-REST API. De Face-service biedt u toegang tot geavanceerde algoritmen voor het detecteren en herkennen van menselijke gezichten in afbeeldingen.
Gebruik de Face-REST API voor het volgende:
Notitie
In deze quickstart wordt gebruik gemaakt van cURL-opdrachten om de REST API aan te roepen. U kunt de REST API ook aanroepen met behulp van een programmeertaal. Bekijk de GitHub-voorbeeldbestanden voor voorbeelden in C#, Python, Java, JavaScript en Go.
Vereisten
- Azure-abonnement: Krijg een gratis abonnement
- Aan uw Azure-account moet Cognitive Services rol Inzender zijn toegewezen, zodat u akkoord kunt gaan met de verantwoordelijke AI-voorwaarden en een resource kunt maken. Neem contact op met uw beheerder om deze rol aan uw account toe te laten.
- Zodra u een Azure-abonnement hebt, maakt u een Face-resource in Azure Portal om uw sleutel en eindpunt op te halen. Nadat de app is geïmplementeerd, klikt u op Ga naar resource.
- U hebt de sleutel en het eindpunt nodig van de resource die u maakt om de toepassing te verbinden met de Face-API. Later in de quickstart plakt u uw sleutel en eindpunt in de onderstaande code.
- U kunt de gratis prijscategorie (
F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.
- PowerShell versie 6.0+of een vergelijkbare opdrachtregeltoepassing.
Gezichten detecteren en analyseren
U gebruikt een opdracht zoals de volgende om de Face-API aan te roepen en kenmerkgegevens voor gezichten op te halen uit een afbeelding. Kopieer eerst de code in een teksteditor—u moet wijzigingen aanbrengen in bepaalde gedeelten van de opdracht voordat u deze kunt uitvoeren.
curl -H "Ocp-Apim-Subscription-Key: TODO_INSERT_YOUR_FACE_SUBSCRIPTION_KEY_HERE" "TODO_INSERT_YOUR_FACE_ENDPOINT_HERE/face/v1.0/detect?detectionModel=detection_03&returnFaceId=true&returnFaceLandmarks=false" -H "Content-Type: application/json" --data-ascii "{\"url\":\"https://upload.wikimedia.org/wikipedia/commons/c/c3/RH_Louise_Lillian_Gish.jpg\"}"
Breng de volgende wijzigingen aan:
- Wijs
Ocp-Apim-Subscription-Keytoe aan de geldige Face-abonnementssleutel. - Wijzig het eerste deel van deze URL, zodat deze overeenkomt met het eindpunt dat bij uw abonnementssleutel hoort.
Notitie
Nieuwe resources die zijn gemaakt na 1 juli 2019, hebben aangepaste subdomeinnamen. Zie Aangepaste subdomeinnamen voor Cognitive Services voor meer informatie en een volledige lijst met regionale eindpunten.
- Wijzig eventueel de URL in de hoofdtekst van de aanvraag om naar een andere afbeelding te verwijzen.
Nadat u de wijzigingen hebt aangebracht, opent u een opdrachtprompt en voert u de nieuwe opdracht in.
De resultaten bekijken
De gegevens over het gezicht worden nu in het consolevenster weergegeven als JSON-gegevens. Bijvoorbeeld:
[
{
"faceId": "49d55c17-e018-4a42-ba7b-8cbbdfae7c6f",
"faceRectangle": {
"top": 131,
"left": 177,
"width": 162,
"height": 162
}
}
]
Gezichtskenmerken ophalen
Als u gezichtskenmerken wilt extraheren, roept u de detectie-API opnieuw aan, maar stelt u detectionModel in op detection_01. Voeg queryparameter returnFaceAttributes ook toe. De opdracht zou er nu als volgt uit moeten zien. Voeg net als eerder uw Face-abonnementssleutel en eindpunt toe.
curl -H "Ocp-Apim-Subscription-Key: TODO_INSERT_YOUR_FACE_SUBSCRIPTION_KEY_HERE" "TODO_INSERT_YOUR_FACE_ENDPOINT_HERE/face/v1.0/detect?detectionModel=detection_01&returnFaceId=true&returnFaceLandmarks=false&returnFaceAttributes=age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise" -H "Content-Type: application/json" --data-ascii "{\"url\":\"https://upload.wikimedia.org/wikipedia/commons/c/c3/RH_Louise_Lillian_Gish.jpg\"}"
De resultaten bekijken
De geretourneerde gezichtsgegevens bevatten nu gezichtskenmerken. Bijvoorbeeld:
[
{
"faceId": "49d55c17-e018-4a42-ba7b-8cbbdfae7c6f",
"faceRectangle": {
"top": 131,
"left": 177,
"width": 162,
"height": 162
},
"faceAttributes": {
"smile": 0,
"headPose": {
"pitch": 0,
"roll": 0.1,
"yaw": -32.9
},
"gender": "female",
"age": 22.9,
"facialHair": {
"moustache": 0,
"beard": 0,
"sideburns": 0
},
"glasses": "NoGlasses",
"emotion": {
"anger": 0,
"contempt": 0,
"disgust": 0,
"fear": 0,
"happiness": 0,
"neutral": 0.986,
"sadness": 0.009,
"surprise": 0.005
},
"blur": {
"blurLevel": "low",
"value": 0.06
},
"exposure": {
"exposureLevel": "goodExposure",
"value": 0.67
},
"noise": {
"noiseLevel": "low",
"value": 0
},
"makeup": {
"eyeMakeup": true,
"lipMakeup": true
},
"accessories": [],
"occlusion": {
"foreheadOccluded": false,
"eyeOccluded": false,
"mouthOccluded": false
},
"hair": {
"bald": 0,
"invisible": false,
"hairColor": [
{
"color": "brown",
"confidence": 1
},
{
"color": "black",
"confidence": 0.87
},
{
"color": "other",
"confidence": 0.51
},
{
"color": "blond",
"confidence": 0.08
},
{
"color": "red",
"confidence": 0.08
},
{
"color": "gray",
"confidence": 0.02
}
]
}
}
}
]
Vergelijkbare gezichten zoeken
Met deze bewerking wordt op basis van één gedetecteerd gezicht (bron) een reeks andere gezichten (doel) doorzocht om een overeenkomstig gezicht te vinden (gezichten zoeken op afbeelding). Wanneer er een overeenkomst wordt gevonden, wordt de id van het overeenkomende gezicht afgedrukt op de console.
Gezichten detecteren voor vergelijking
Eerst moet u gezichten in afbeeldingen detecteren voordat u ze kunt vergelijken. Voer deze opdracht uit zoals u hebt gedaan in de sectie Detecteren en analyseren. Deze detectiemethode is geoptimaliseerd voor vergelijkingsbewerkingen. Er worden geen gedetailleerde gezichtskenmerken geëxtraheerd, zoals in de bovenstaande sectie, en er wordt een ander detectiemodel gebruikt.
curl -H "Ocp-Apim-Subscription-Key: TODO_INSERT_YOUR_FACE_SUBSCRIPTION_KEY_HERE" "TODO_INSERT_YOUR_FACE_ENDPOINT_HERE/face/v1.0/detect?detectionModel=detection_03&returnFaceId=true&returnFaceLandmarks=false" -H "Content-Type: application/json" --data-ascii "{\"url\":\"https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Dad1.jpg\"}"
Zoek de waarde "faceId" in het JSON-antwoord en sla deze op een tijdelijke locatie op. Roep vervolgens de bovenstaande opdracht opnieuw aan voor de andere afbeeldings-URL's en sla ook die gezichts-id's op. U gebruikt deze id's als de doelgroep van gezichten waarmee een vergelijkbaar gezicht moet worden gevonden.
https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Daughter1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Mom1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Son1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family2-Lady1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family2-Man1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family3-Lady1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family3-Man1.jpg
Ten slotte detecteert u één brongezicht dat u gebruikt voor het vergelijken en slaat u de id ervan op. Bewaar deze id gescheiden van de andere.
https://csdx.blob.core.windows.net/resources/Face/Images/findsimilar.jpg
Overeenkomsten zoeken
Kopieer de volgende opdracht naar een teksteditor.
curl -v -X POST "https://westus.api.cognitive.microsoft.com/face/v1.0/findsimilars" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{body}"
Breng vervolgens de volgende wijzigingen aan:
- Wijs
Ocp-Apim-Subscription-Keytoe aan de geldige Face-abonnementssleutel. - Wijzig het eerste deel van deze URL, zodat deze overeenkomt met het eindpunt dat bij uw abonnementssleutel hoort.
Gebruik de volgende JSON-inhoud voor de waarde body:
{
"faceId": "",
"faceIds": [],
"maxNumOfCandidatesReturned": 10,
"mode": "matchPerson"
}
- Gebruik de brongezicht-id voor
"faceId". - Plak de andere gezichts-id's als termen in de matrix
"faceIds".
De resultaten bekijken
U ontvangt een JSON-antwoord met een lijst met id's van de gezichten die overeenkomen met uw het gezicht uit de query.
[
{
"persistedFaceId" : "015839fb-fbd9-4f79-ace9-7675fc2f1dd9",
"confidence" : 0.82
},
...
]
Resources opschonen
Als u een Cognitive Services-abonnement wilt opschonen en verwijderen, kunt u de resource of resourcegroep verwijderen. Als u de resourcegroep verwijdert, worden ook alle bijbehorende resources verwijderd.
Volgende stappen
In deze quickstart hebt u geleerd hoe u de Face-REST API gebruikt om eenvoudige gezichtsherkenningstaken uit te voeren. Hierna leert u meer over de verschillende modellen voor gezichtsdetectie en hoe u het juiste model voor uw use-case opgeeft.