Compartir a través de


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. Esta muestra está escrita en C#.

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

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

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.

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

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

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.