Sdílet prostřednictvím


Přidání tváří do skupiny PersonGroup

Upozornění

Přístup ke službě Rozpoznávání tváře je omezený na základě kritérií způsobilosti a použití, aby bylo možné podporovat naše zásady zodpovědné umělé inteligence. Služba Rozpoznávání tváře je dostupná jenom pro zákazníky a partnery spravované Microsoftem. Pro přístup použijte formulář pro příjem rozpoznávání tváře. Další informace najdete na stránce s omezeným přístupem k tváři.

Tato příručka ukazuje, jak přidat velký počet osob a tváří do objektu PersonGroup . Stejná strategie platí také pro objekty LargePersonGroup, FaceList a LargeFaceList . Tato ukázka je napsaná v jazyce C#.

Nastavení

Následující kód deklaruje několik proměnných a implementuje pomocnou funkci pro naplánování žádostí o přidání tváře:

  • PersonCount je celkový počet osob.
  • CallLimitPerSecond je maximální počet volání za sekundu podle úrovně předplatného.
  • _timeStampQueue je fronta zaznamenávající časová razítka požadavků.
  • await WaitCallLimitPerSecondAsync() čeká, dokud nebude platný k odeslání dalšího požadavku.
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);
    }
}

Vytvoření skupiny PersonGroup

Tento kód vytvoří skupinu PersonGroup pojmenovanou "MyPersonGroup" k uložení osob. Čas žádosti se zařadí do fronty _timeStampQueue, aby se zajistilo celkové ověření.

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

Vytvoření osob pro skupinu PersonGroup

Tento kód vytváří osoby souběžně a používá await WaitCallLimitPerSecondAsync() se k tomu, aby se zabránilo překročení limitu četnosti volání.

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

Přidání tváří osobám

Tváře přidané k různým osobám se zpracovávají souběžně. Tváře přidané pro jednu konkrétní osobu se zpracovávají postupně. Znovu se vyvolá, aby se zajistilo, await WaitCallLimitPerSecondAsync() že frekvence požadavků spadá do rozsahu omezení.

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

Shrnutí

V této příručce jste se seznámili s procesem vytvoření skupiny PersonGroup s velkým počtem osob a tváří. Klíčové body:

  • Tato strategie platí také pro FaceLists a LargePersonGroups.
  • Přidávání nebo odstraňování tváří v různých facelistech nebo osobách ve skupině LargePersonGroup se zpracovávají souběžně.
  • Přidávání nebo odstraňování tváří v jednom konkrétním seznamu FaceList nebo osobách ve skupině LargePersonGroup se provádí postupně.

Další krok

Dále se dozvíte, jak pomocí vylepšené datové struktury PersonDirectory dělat více s daty tváře.