Partage via


Ajouter des visages à un objet PersonGroup

Attention

L’accès au service visage est limité en fonction des critères d’éligibilité et d’utilisation afin de prendre en charge nos principes d’IA responsable. Le service visage est disponible uniquement pour les clients et partenaires gérés par Microsoft. Utilisez le Formulaire d’admission de la reconnaissance faciale pour demander l’accès. Pour plus d’informations, consultez la page Accès limité visage.

Ce guide explique comment ajouter un grand nombre de personnes et de visages à un objet PersonGroup. Cette stratégie s'applique également aux objets LargePersonGroup, FaceList et LargeFaceList. Cet exemple est écrit en C#.

Initialisation

Le code suivant déclare plusieurs variables et implémente une fonction d'assistance pour planifier les requêtes ajout de visage :

  • PersonCount correspond au nombre total de personnes.
  • CallLimitPerSecond correspond au nombre maximal d’appels par seconde en fonction du niveau d’abonnement.
  • _timeStampQueue est une file d'attente qui permet d’enregistrer les horodatages des requêtes.
  • await WaitCallLimitPerSecondAsync() attend qu'elle soit valide pour envoyer la requête suivante.
const int PersonCount = 10000;
const int CallLimitPerSecond = 10;
static Queue<DateTime> _timeStampQueue = new Queue<DateTime>(CallLimitPerSecond);

static async Task WaitCallLimitPerSecondAsync()
{
    Monitor.Enter(_timeStampQueue);
    try
    {
        if (_timeStampQueue.Count >= CallLimitPerSecond)
        {
            TimeSpan timeInterval = DateTime.UtcNow - _timeStampQueue.Peek();
            if (timeInterval < TimeSpan.FromSeconds(1))
            {
                await Task.Delay(TimeSpan.FromSeconds(1) - timeInterval);
            }
            _timeStampQueue.Dequeue();
        }
        _timeStampQueue.Enqueue(DateTime.UtcNow);
    }
    finally
    {
        Monitor.Exit(_timeStampQueue);
    }
}

Créer PersonGroup

Ce code crée un PersonGroup nommé "MyPersonGroup" pour enregistrer les personnes. L’heure de la requête est empilée dans _timeStampQueue pour garantir la validation globale.

const string personGroupId = "mypersongroupid";
const string personGroupName = "MyPersonGroup";
_timeStampQueue.Enqueue(DateTime.UtcNow);
using (var content = new ByteArrayContent(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new Dictionary<string, object> { ["name"] = personGroupName, ["recognitionModel"] = "recognition_04" }))))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    await httpClient.PutAsync($"{ENDPOINT}/face/v1.0/persongroups/{personGroupId}", content);
}

Créer les personnes pour l'objet PersonGroup

Ce code crée des Personnes simultanément et utilise await WaitCallLimitPerSecondAsync() pour éviter de dépasser la limite de débit d’appel.

string?[] persons = new string?[PersonCount];
Parallel.For(0, PersonCount, async i =>
{
    await WaitCallLimitPerSecondAsync();

    string personName = $"PersonName#{i}";
    using (var content = new ByteArrayContent(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new Dictionary<string, object> { ["name"] = personName }))))
    {
        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        using (var response = await httpClient.PostAsync($"{ENDPOINT}/face/v1.0/persongroups/{personGroupId}/persons", content))
        {
            string contentString = await response.Content.ReadAsStringAsync();
            persons[i] = (string?)(JsonConvert.DeserializeObject<Dictionary<string, object>>(contentString)?["personId"]);
        }
    }
});

Ajouter des visages aux personnes

Les visages ajoutés à différentes personnes sont traités simultanément. Les visages ajoutés à une personne spécifique sont traités de manière séquentielle. Là encore, await WaitCallLimitPerSecondAsync() est appelé afin de garantir que la fréquence de requêtes se situe dans le cadre de la limitation.

Parallel.For(0, PersonCount, async i =>
{
    string personImageDir = @"/path/to/person/i/images";

    foreach (string imagePath in Directory.GetFiles(personImageDir, "*.jpg"))
    {
        await WaitCallLimitPerSecondAsync();

        using (Stream stream = File.OpenRead(imagePath))
        {
            using (var content = new StreamContent(stream))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                await httpClient.PostAsync($"{ENDPOINT}/face/v1.0/persongroups/{personGroupId}/persons/{persons[i]}/persistedfaces?detectionModel=detection_03", content);
            }
        }
    }
});

Résumé

Dans ce guide, vous avez appris à créer un objet PersonGroup avec un nombre important de personnes et de visages. Plusieurs rappels :

  • Cette stratégie s'applique également aux objets FaceLists et LargePersonGroups.
  • L’ajout et la suppression des visages dans différentes FaceLists ou des personnes dans différents LargePersonGroups sont traités simultanément.
  • L'ajout et la suppression de visages dans une FaceList donnée ou de personne dans un LargePersonGroup s'effectuent de façon séquentielle.

Étapes suivantes

Ensuite, découvrez comment utiliser la structure de données améliorée PersonDirectory pour tirer parti de vos données de visage.