Dela via


Lägga till ansikten i en PersonGroup

Varning

Åtkomsten till ansiktstjänsten är begränsad baserat på berättigande- och användningskriterier för att stödja våra principer för ansvarsfull AI. Ansiktstjänsten är endast tillgänglig för Microsofts hanterade kunder och partner. Använd formuläret ansiktsigenkänning för att ansöka om åtkomst. Mer information finns på sidan ansiktsbegränsade åtkomst .

Den här guiden visar hur du lägger till ett stort antal personer och ansikten i ett PersonGroup-objekt . Samma strategi gäller även för LargePersonGroup-, FaceList- och LargeFaceList-objekt . Det här exemplet är skrivet i C#.

Initiering

Följande kod deklarerar flera variabler och implementerar en hjälpfunktion för att schemalägga begäranden om ansiktstillägg :

  • PersonCount är det totala antalet personer.
  • CallLimitPerSecond är det maximala antalet anrop per sekund enligt prenumerationsnivån.
  • _timeStampQueue är en kö för att registrera tidstämplar.
  • await WaitCallLimitPerSecondAsync() väntar tills den är giltig för att skicka nästa begäran.
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);
    }
}

Skapa PersonGroup

Den här koden skapar en PersonGroup med namnet "MyPersonGroup" för att spara personerna. Tiden för begäran står i kö till _timeStampQueue för att säkerställa den övergripande verifieringen.

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

Skapa personerna för PersonGroup

Den här koden skapar Personer samtidigt och använder await WaitCallLimitPerSecondAsync() för att undvika att överskrida anropsfrekvensgränsen.

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

Lägg till ansikten till personerna

Ansikten som läggs till i olika personer bearbetas samtidigt. Ansikten som läggs till för en specifik person bearbetas sekventiellt. Återigen await WaitCallLimitPerSecondAsync() anropas för att säkerställa att begärandefrekvensen ligger inom begränsningens omfång.

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

Sammanfattning

I den här guiden har du lärt dig hur du skapar en PersonGroup med ett stort antal personer och ansikten. Flera påminnelser:

  • Den här strategin gäller även för FaceLists och LargePersonGroups.
  • Att lägga till eller ta bort ansikten till olika ansiktslistor eller personer i LargePersonGroups bearbetas samtidigt.
  • Att lägga till eller ta bort ansikten till en specifik ansiktslista eller personer i en LargePersonGroup görs sekventiellt.

Nästa steg

Lär dig sedan hur du använder den förbättrade datastrukturen PersonDirectory för att göra mer med dina ansiktsdata.