Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Предостережение
Доступ к службе распознавания лиц ограничен на основе критериев соответствия и использования для поддержки наших принципов ответственного искусственного интеллекта. Служба "Распознавание лиц" доступна только для клиентов и партнеров, управляемых корпорацией Майкрософт. Используйте форму подачи заявки на распознавание лиц для получения доступа. Для получения дополнительной информации см. страницу Face limited access.
В этом руководстве показано, как добавить большое количество людей и лиц в объект PersonGroup . Та же стратегия применяется к объектам LargePersonGroup, FaceList и LargeFaceList . Примеры кода используют C#.
Setup
Следующий код объявляет несколько переменных и реализует вспомогательные функции для планирования запросов на добавление лиц:
-
PersonCount— общее количество людей. -
CallLimitPerSecond— максимальное количество вызовов в секунду в соответствии с категорией подписки. -
_timeStampQueue— очередь для записи меток времени запросов. -
await WaitCallLimitPerSecondAsync()ожидает, пока не станет возможно отправить следующий запрос.
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);
}
}
Создание PersonGroup
Этот код создает PersonGroup с именем "MyPersonGroup" , чтобы сохранить людей. Время запроса ставится в очередь в _timeStampQueue для обеспечения общей валидации.
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);
}
Создайте лиц для группы PersonGroup
Этот код создает пользователей одновременно и используется await WaitCallLimitPerSecondAsync() для предотвращения превышения ограничения частоты звонков.
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"]);
}
}
});
Добавьте лица людям
Лица, добавляемые к разным людям, обрабатываются одновременно. Лица, добавленные для одного конкретного человека, обрабатываются последовательно. Опять же, во избежание превышения предельной частоты запросов вызывается await WaitCallLimitPerSecondAsync().
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);
}
}
}
});
Сводка
В этом руководстве вы узнали процесс создания PersonGroup с большим количеством людей и лиц. Основные моменты:
- Эта стратегия применяется к FaceLists и LargePersonGroups.
- Добавление или удаление лиц в различных FaceLists или людей в LargePersonGroups обрабатывается одновременно.
- Добавление или удаление лиц в одном конкретном FaceList или лицах в LargePersonGroup выполняется последовательно.
Следующий шаг
Далее вы узнаете, как использовать улучшенную структуру данных PersonDirectory для дополнительных операций с данными лиц.