Agregar caras a un objeto PersonGroup

Precaución

El acceso al servicio Face está limitado en función de los criterios de idoneidad y uso para apoyar nuestros principios de inteligencia artificial responsable. El servicio Face solo está disponible para clientes y asociados administrados por Microsoft. Use el formulario de admisión de reconocimiento facial para solicitar acceso. Para obtener más información, consulte la página Acceso limitado de Face.

En esta guía se muestra cómo agregar una gran cantidad de personas y caras a un objeto PersonGroup. La misma estrategia se aplica también a los objetos LargePersonGroup, FaceList y LargeFaceList. Este ejemplo se escribe en C# y usa la biblioteca cliente de .NET de Face de Azure AI.

Inicialización

El código siguiente declara varias variables e implementa una función auxiliar para programar las solicitudes para agregar caras:

  • PersonCount es el número total de personas.
  • CallLimitPerSecond es el número máximo de llamadas por segundo según el nivel de suscripción.
  • _timeStampQueue es una cola para registrar las marcas de tiempo de solicitud.
  • await WaitCallLimitPerSecondAsync() espera hasta que se valide para enviar la solicitud siguiente.
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);
    }
}

Autorización de la llamada a la API

Cuando usa la biblioteca cliente de Face, la clave de suscripción y el punto de conexión de la suscripción se pasan a través del constructor de la clase FaceClient. Consulte Inicio rápido para obtener instrucciones sobre cómo crear un objeto de cliente de Face.

Creación del elemento PersonGroup

Este código crea un PersonGroup denominado "MyPersonGroup" para guardar las personas. El tiempo de solicitud se pone en cola en _timeStampQueue para garantizar la validación general.

const string personGroupId = "mypersongroupid";
const string personGroupName = "MyPersonGroup";
_timeStampQueue.Enqueue(DateTime.UtcNow);
await faceClient.LargePersonGroup.CreateAsync(personGroupId, personGroupName);

Creación de las personas del objeto PersonGroup

Este código crea Persons simultáneamente y usa await WaitCallLimitPerSecondAsync() para evitar superar el límite de frecuencia de llamadas.

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

Adición de caras a las personas

Las caras que se agregan a las distintas personas se procesan de manera simultánea. Las caras que se agregan a una persona específica se procesan de manera secuencial. Una vez más, se invoca await WaitCallLimitPerSecondAsync() para garantizar que la frecuencia de solicitud está dentro del ámbito de limitación.

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

Resumen

En esta guía, conoció el proceso de creación de un objeto PersonGroup con un gran número de personas y caras. Varios recordatorios:

  • Esta estrategia se aplica también a los objetos FaceLists y LargePersonGroups.
  • La incorporación y eliminación de caras a los distintos objetos FaceList o a las distintas personas de un objeto LargePersonGroups se procesan de manera simultánea.
  • La incorporación y eliminación de caras a un objeto FaceList específico o a personas específicas de un objeto LargePersonGroup se realiza de manera secuencial.

Pasos siguientes

A continuación, aprenda a usar la estructura de datos mejorada PersonDirectory para hacer más con los datos de la cara.