Gezichten toevoegen aan een PersonGroup
Let op
Toegang tot face-services is beperkt op basis van geschiktheids- en gebruikscriteria om onze verantwoorde AI-principes te ondersteunen. Face-service is alleen beschikbaar voor door Microsoft beheerde klanten en partners. Gebruik het intakeformulier voor gezichtsherkenning om toegang aan te vragen. Zie de pagina beperkte toegang van Face voor meer informatie.
Deze handleiding laat zien hoe u een groot aantal personen en gezichten toevoegt aan een PersonGroup-object . Dezelfde strategie is ook van toepassing op LargePersonGroup-, FaceList- en LargeFaceList-objecten . Dit voorbeeld is geschreven in C#.
Initialisatie
De volgende code declareert verschillende variabelen en implementeert een helperfunctie voor het plannen van aanvragen voor het toevoegen van gezichten:
PersonCount
is het totale aantal personen.CallLimitPerSecond
is het maximum aantal aanroepen per seconde op basis van de abonnementslaag._timeStampQueue
is een wachtrij om aanvraag tijdstempels vast te leggen.await WaitCallLimitPerSecondAsync()
wacht totdat de volgende aanvraag kan worden verzonden.
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);
}
}
De PersonGroup maken
Met deze code maakt u een PersonGroup met de naam "MyPersonGroup"
om de personen op te slaan. De aanvraagtijd wordt in de wachtrij _timeStampQueue
geplaatst om de algehele validatie te controleren.
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);
}
De personen maken voor de PersonGroup
Met deze code worden personen gelijktijdig gemaakt en gebruikt await WaitCallLimitPerSecondAsync()
om te voorkomen dat de aanroepsnelheidslimiet wordt overschreden.
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"]);
}
}
});
Gezichten voor de personen toevoegen
Gezichten die aan verschillende personen worden toegevoegd, worden gelijktijdig verwerkt. Gezichten die voor een specifieke persoon worden toegevoegd, worden opeenvolgend verwerkt. await WaitCallLimitPerSecondAsync()
wordt opnieuw aangeroepen om ervoor te zorgen dat de frequentie van de aanvraag binnen het bereik van de beperking ligt.
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);
}
}
}
});
Samenvatting
In deze handleiding hebt u het proces voor het maken van een PersonGroup met een groot aantal personen en gezichten geleerd. Verschillende herinneringen:
- Deze strategie is ook van toepassing op FaceLists en LargePersonGroups.
- Het toevoegen of verwijderen van gezichten aan verschillende FaceLists of personen in LargePersonGroups worden gelijktijdig verwerkt.
- Het toevoegen of verwijderen van gezichten aan één specifieke FaceList of personen in een LargePersonGroup wordt opeenvolgend uitgevoerd.
Volgende stappen
Leer vervolgens hoe u de verbeterde gegevensstructuur PersonDirectory gebruikt om meer te doen met uw gezichtsgegevens.