Adicionar faces a um PersonGroup

Importante

O acesso ao serviço de Detecção Facial é limitado com base em critérios de qualificação e uso para dar suporte aos nossos princípios de IA responsável. O serviço de Detecção Facial só está disponível para clientes e parceiros gerenciados da Microsoft. Use o Formulário de admissão de reconhecimento facial para solicitar acesso. Para obter mais informações, consulte a página de acesso limitado por detecção facial.

Este guia demonstra como adicionar um grande número de pessoas e faces a um objeto PersonGroup. Essa mesma estratégia também se aplica aos objetos LargePersonGroup, FaceList e LargeFaceList. Esta amostra foi escrita em C# com a biblioteca de clientes .NET do serviço de Detecção Facial dos Serviços Cognitivos do Azure.

Etapa 1: inicialização

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

  • PersonCount é o número total de pessoas.
  • CallLimitPerSecond é o máximo de chamadas por segundo de acordo com o nível de assinatura.
  • _timeStampQueue é uma fila para registrar os carimbos de hora de solicitação.
  • await WaitCallLimitPerSecondAsync() aguarda até que seja válido enviar a próxima solicitação.
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);
    }
}

Etapa 2: autorizar a chamada à API

Ao usar uma biblioteca de clientes, transmita a chave ao construtor da classe FaceClient. Por exemplo:

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

Para obter a chave, acesse o Azure Marketplace no portal do Azure. Para saber mais, confira Assinaturas.

Etapa 3: criar o PersonGroup

Um PersonGroup denominado "MyPersonGroup" é criado para salvar as pessoas. O tempo da solicitação é enfileirado a _timeStampQueue para garantir a validação geral.

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

Etapa 4: criar as pessoas para o PersonGroup

As pessoas são criadas simultaneamente e await WaitCallLimitPerSecondAsync() também é aplicado para evitar exceder o limite de chamada.

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

Etapa 5: adicionar faces às pessoas

As faces adicionadas a pessoas diferentes são processadas simultaneamente. As faces adicionadas para uma pessoa específica são processados em sequência. Novamente, await WaitCallLimitPerSecondAsync() é invocado para garantir que a frequência de solicitação está dentro do escopo de limitação.

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

Resumo

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

  • Esta estratégia também se aplica a FaceLists e LargePersonGroups.
  • Adicionar ou excluir faces a pessoas ou FaceLists diferentes em LargePersonGroups são processados simultaneamente.
  • Adicionar ou excluir faces a uma pessoa ou FaceLists específicos em um LargePersonGroups são processados simultaneamente.
  • Para manter a simplicidade, omitimos neste guia como manipular uma exceção potencial. Se você quiser aumentar a robustez, aplique a política de repetição adequada.

Os seguintes recursos foram explicados e demonstrados:

Próximas etapas

Neste guia, você viu como adicionar dados de detecção facial a um PersonGroup. Em seguida, saiba como usar a estrutura de dados aprimorada PersonDirectory para fazer mais com seus dados de detecçao facial.