Lägga till ansikten i en PersonGroup

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# med hjälp Azure Cognitive Services .NET-klientbiblioteket för ansikts- och ansiktsdata.

Steg 1: Initiering

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

  • 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 det är giltigt 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);
    }
}

Steg 2: Auktorisera API-anrop

När du använder ett klientbibliotek måste du skicka din prenumerationsnyckel till konstruktorn för klassen FaceClient. Exempel:

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

Hämta prenumerationsnyckeln genom att gå till Azure Marketplace från Azure Portal. Mer information finns i Prenumerationer.

Steg 3: Skapa PersonGroup

En PersonGroup med namnet ”MyPersonGroup” skapas 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);
await faceClient.LargePersonGroup.CreateAsync(personGroupId, personGroupName);

Steg 4: Skapa personerna för PersonGroup

Personer skapas samtidigt och tillämpas även await WaitCallLimitPerSecondAsync() för att undvika att anropsgränsen överskrids.

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

Steg 5: Lägg till ansikten till personerna

Ansikten som läggs till olika personer bearbetas samtidigt. Ansikten som läggs till för en viss person bearbetas sekventiellt. Anropas await WaitCallLimitPerSecondAsync() återigen för att säkerställa att frekvensen för begäran ligger inom begränsningens omfattning.

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

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 FaceLists eller personer i LargePersonGroups bearbetas samtidigt.
  • Att lägga till eller ta bort ansikten till en specifik FaceList eller person i en LargePersonGroup görs sekventiellt.
  • För enkelhetens skull utelämnas hur du hanterar ett potentiellt undantag i den här guiden. Om du vill förbättra robustheten använder du rätt återförsöksprincip.

Följande funktioner har förklarats och demonstrerats:

Nästa steg

I den här guiden har du lärt dig hur du lägger till ansiktsdata i en PersonGroup. Härnäst får du lära dig hur du använder den förbättrade datastrukturen PersonDirectory för att göra mer med dina ansiktsdata.