Partager 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# et utilise la bibliothèque de client .NET Visage d’Azure AI.

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

Autoriser l’appel d’API

Quand vous utilisez la bibliothèque de client Visage, la clé et le point de terminaison de l’abonnement sont transmis par le biais du constructeur de la classe FaceClient. Consultez le démarrage rapide pour obtenir des instructions sur la création d’un objet client Visage.

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);
await faceClient.LargePersonGroup.CreateAsync(personGroupId, personGroupName);

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.

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

    string personName = $"PersonName#{i}";
    persons[i] = await faceClient.PersonGroupPerson.CreateAsync(personGroupId, personName);
});

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 =>
{
    Guid personId = persons[i].PersonId;
    string personImageDir = @"/path/to/person/i/images";

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

        using (Stream stream = File.OpenRead(imagePath))
        {
            await faceClient.PersonGroupPerson.AddFaceFromStreamAsync(personGroupId, personId, stream);
        }
    }
});

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.