Condividi tramite


Aggiungere visi a un oggetto PersonGroup

Attenzione

L'accesso al servizio Viso è limitato in base ai criteri di idoneità e utilizzo al fine di supportare i nostri principi di intelligenza artificiale responsabile. Il servizio Viso è disponibile solo per i clienti e i partner gestiti da Microsoft. Usare il modulo di acquisizione riconoscimento volto per richiedere l'accesso. Per altre informazioni, vedere la pagina Accesso limitato alla funzione Viso.

Questa guida descrive la procedura per aggiungere un numero elevato di persone e visi a un oggetto PersonGroup. Questa stessa strategia si applica anche agli oggetti LargePersonGroup, FaceList e LargeFaceList. Questo esempio è scritto in C#.

Inizializzazione

Il codice seguente dichiara più variabili e implementa una funzione helper per pianificare le richieste di aggiunta di visi:

  • PersonCount è il numero totale di persone.
  • CallLimitPerSecond è il numero massimo di chiamate al secondo in base al livello di sottoscrizione.
  • _timeStampQueue è una coda per registrare i timestamp delle richieste.
  • await WaitCallLimitPerSecondAsync() attende che sia possibile inviare la richiesta successiva.
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);
    }
}

Creare il PersonGroup

Questo codice crea un oggetto PersonGroup denominato "MyPersonGroup" per salvare le persone. L'ora della richiesta viene accodata in _timeStampQueue per garantire la convalida generale.

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

Creare le persone per l'oggetto PersonGroup

Questo codice crea persone contemporaneamente e usa await WaitCallLimitPerSecondAsync() per evitare di superare il limite di frequenza delle chiamate.

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

Aggiungere i visi per le persone

I visi aggiunti a più persone vengono elaborati contemporaneamente. I visi aggiunti a una persona specifica vengono elaborati in sequenza. Anche in questo caso, viene richiamato il parametro await WaitCallLimitPerSecondAsync() per assicurarsi che la frequenza delle richieste rientri nei limiti previsti.

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

Riepilogo

In questa guida si è appreso il processo di creazione di un oggetto PersonGroup con un numero elevato di persone e visi. Alcuni promemoria:

  • La stessa strategia si applica anche agli oggetti FaceList e LargePersonGroup.
  • L'aggiunta o l'eliminazione di visi da più oggetti FaceList o di persone da oggetti LargePersonGroup viene elaborata contemporaneamente.
  • L'aggiunta o l'eliminazione di visi da uno specifico oggetto FaceList o di una persona da un oggetto LargePersonGroup viene elaborata in sequenza.

Passaggi successivi

Informazioni su come usare la struttura dei dati avanzata PersonDirectory per eseguire altre operazioni con i dati sui visi.