Agregar caras a un objeto PersonGroup

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# mediante el uso de la biblioteca cliente de Face para .NET de Azure Cognitive Services.

Paso 1: 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);
    }
}

Paso 2: Autorización de la llamada API

Cuando usa una biblioteca cliente, debe pasar la clave de suscripción al constructor de la clase FaceClient. Por ejemplo:

private readonly IFaceClient faceClient = new FaceClient(
    new ApiKeyServiceClientCredentials("<SubscriptionKey>"),
    new System.Net.Http.DelegatingHandler[] { });

Para obtener la clave de suscripción, vaya a Azure Marketplace desde Azure Portal. Para más información, consulte Suscripciones.

Paso 3: Creación del elemento PersonGroup

Se crea un elemento 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);

Paso 4: Creación de las personas del objeto PersonGroup

Las personas se crean de forma simultánea y se aplica también await WaitCallLimitPerSecondAsync() para evitar que se supere el límite 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);
});

Paso 5: 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 FaceList y LargePersonGroup.
  • La incorporación y eliminación de caras a los distintos objetos FaceList o a las distintas personas de un objeto LargePersonGroup se procesan de manera simultánea.
  • La incorporación y eliminación de caras a un objeto FaceList específico o a una persona específica de un objeto LargePersonGroup se realizan de manera secuencial.
  • Para simplificar, en esta guía se omite cómo controlar una excepción potencial. Si quiere mejorar la solidez, aplique la directiva de reintentos correspondiente.

Se explicaron y mostraron las siguientes características:

Pasos siguientes

En esta guía ha aprendido a agregar datos de caras a un objeto PersonGroup. . A continuación, aprenda a usar la estructura de datos mejorada PersonDirectory para hacer más con los datos de la cara.