Adicionar faces a um PersonGroup
Cuidado
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 Acesso limitado facial.
Este guia demonstra como adicionar um grande número de pessoas e rostos a um objeto PersonGroup. Essa mesma estratégia também se aplica aos objetos LargePersonGroup, FaceList e LargeFaceList. Esta amostra é escrita em C#.
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 rosto:
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);
}
}
Criar o PersonGroup
Esse código cria um PersonGroup chamado "MyPersonGroup"
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);
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
Esse código cria Persons 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 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 =>
{
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 faces. Vários lembretes:
- Esta estratégia também se aplica a FaceLists e LargePersonGroups.
- A adição ou exclusão de rostos em diferentes pessoas ou FaceLists nos LargePersonGroups são processadas simultaneamente.
- A adição ou exclusão rostos de uma pessoa ou FaceLists específicos em um LargePersonGroups são processadas simultaneamente.
Próximas etapas
Em seguida, saiba como usar a estrutura de dados aprimorada PersonDirectory para fazer mais com seus dados de detecçao facial.