Dodawanie twarzy do grupy persongroup
Uwaga
Dostęp do usługi rozpoznawania twarzy jest ograniczony na podstawie kryteriów kwalifikowalności i użycia w celu obsługi naszych zasad odpowiedzialnej sztucznej inteligencji. Usługa rozpoznawania twarzy jest dostępna tylko dla klientów i partnerów zarządzanych przez firmę Microsoft. Użyj formularza do wprowadzania rozpoznawania twarzy, aby ubiegać się o dostęp. Aby uzyskać więcej informacji, zobacz stronę Dostęp ograniczony do twarzy.
W tym przewodniku pokazano, jak dodać dużą liczbę osób i twarzy do obiektu PersonGroup . Ta sama strategia dotyczy również obiektów LargePersonGroup, FaceList i LargeFaceList . Ten przykład został napisany w języku C#.
Inicjowanie
Poniższy kod deklaruje kilka zmiennych i implementuje funkcję pomocnika w celu zaplanowania żądań dodawania twarzy:
PersonCount
jest łączną liczbą osób.CallLimitPerSecond
jest maksymalną liczbą wywołań na sekundę, zgodnie z warstwą subskrypcji._timeStampQueue
jest kolejką do rejestrowania znaczników czasu żądań.await WaitCallLimitPerSecondAsync()
czeka, aż będzie ono prawidłowe, aby wysłać następne żądanie.
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);
}
}
Tworzenie elementu PersonGroup
Ten kod tworzy grupę PersonGroup o nazwie "MyPersonGroup"
w celu zapisania osób. Czas żądania jest umieszczany w kolejce _timeStampQueue
w celu zapewnienia ogólnej walidacji.
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);
}
Tworzenie osób dla obiektu PersonGroup
Ten kod tworzy osoby współbieżnie i używa metody await WaitCallLimitPerSecondAsync()
, aby uniknąć przekroczenia limitu liczby wywołań.
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"]);
}
}
});
Dodawanie twarzy do osób
Twarze dodane do różnych osób są przetwarzane współbieżnie. Twarze dodane dla jednej konkretnej osoby są przetwarzane sekwencyjnie. Ponownie jest wywoływana, aby upewnić się, await WaitCallLimitPerSecondAsync()
że częstotliwość żądań mieści się w zakresie ograniczeń.
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);
}
}
}
});
Podsumowanie
W tym przewodniku przedstawiono proces tworzenia obiektu PersonGroup z dużą liczbą osób i twarzy. Kilka przypomnień:
- Ta strategia dotyczy również grup FaceLists i LargePersonGroups.
- Dodawanie lub usuwanie twarzy na różnych listach FaceList lub osobach w grupach LargePersonGroups są przetwarzane współbieżnie.
- Dodawanie lub usuwanie twarzy do jednej określonej listy FaceList lub osób w grupie LargePersonGroup odbywa się sekwencyjnie.
Następne kroki
Następnie dowiedz się, jak używać rozszerzonej struktury danych PersonDirectory , aby zrobić więcej z danymi twarzy.