Partilhar via


Adicionar rostos a um PersonGroup

Atenção

O acesso ao serviço presencial é limitado com base em critérios de elegibilidade e uso, a fim de apoiar nossos princípios de IA responsável. O serviço Face só está disponível para clientes e parceiros geridos pela Microsoft. Use o formulário de admissão de Reconhecimento Facial para solicitar acesso. Para obter mais informações, consulte a página Acesso limitado Face.

Este guia demonstra como adicionar um grande número de pessoas e rostos a um objeto PersonGroup . A mesma estratégia também se aplica aos objetos LargePersonGroup, FaceList e LargeFaceList . Este exemplo é escrito em C#.

Inicialização

O código a seguir declara várias variáveis e implementa uma função auxiliar para agendar as solicitações de adição facial:

  • PersonCount é o número total de pessoas.
  • CallLimitPerSecond é o número máximo de chamadas por segundo de acordo com o escalão de subscrição.
  • _timeStampQueue é uma Fila para registrar os carimbo de data/hora dos pedidos.
  • await WaitCallLimitPerSecondAsync() aguarda até que seja válido enviar o próximo pedido.
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);
    }
}

Criar o PersonGroup

Esse código cria um PersonGroup nomeado "MyPersonGroup" para salvar as pessoas. A hora do pedido é colocada em fila em _timeStampQueue para garantir a validação geral.

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

Criar as pessoas para o PersonGroup

Este código cria Pessoas simultaneamente e usa await WaitCallLimitPerSecondAsync() para evitar exceder o limite de taxa de chamada.

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

Adicionar rostos às pessoas

Rostos adicionados a pessoas diferentes são processados simultaneamente. Os rostos adicionados para uma pessoa específica são processados sequencialmente. Mais uma vez, await WaitCallLimitPerSecondAsync() é invocado para garantir que a frequência do pedido está dentro do âmbito de limitação.

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

Resumo

Neste guia, você aprendeu o processo de criação de um PersonGroup com um grande número de pessoas e rostos. Alguns lembretes:

  • Esta estratégia também se aplica a FaceLists e LargePersonGroups.
  • Adicionar ou excluir rostos a diferentes FaceLists ou pessoas em LargePersonGroups são processados simultaneamente.
  • Adicionar ou excluir rostos a uma FaceList específica ou pessoas em um LargePersonGroup é feito sequencialmente.

Próximos passos

Em seguida, saiba como usar a estrutura de dados aprimorada PersonDirectory para fazer mais com seus dados faciais.