Добавление лиц в PersonGroup

Внимание

Доступ к службе "Распознавание лиц" ограничен на основе соответствия требованиям и критериев использования для реализации поддержки наших принципов ответственного ИИ. Служба "Распознавание лиц" доступна только для клиентов и партнеров, управляемых корпорацией Майкрософт. Используйте форму приема Распознавания лиц, чтобы подать заявку на доступ. Дополнительные сведения см. на странице с ограниченным доступом для лиц.

В этом руководстве показано, как добавить большое количество лиц и лиц к объекту PersonGroup . Та же стратегия также применяется к объектам LargePersonGroup, FaceList и LargeFaceList. Этот пример написан на C# и использует клиентская библиотека Azure AI Face .NET.

Инициализация

Следующий код объявляет несколько переменных и реализует вспомогательные функции для планирования запросов на добавление лиц:

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

Авторизация вызова API

Если вы используете клиентскую библиотеку службы "Распознавание лиц", ключ и конечная точка подписки передаются через конструктор класса FaceClient. Инструкции по созданию клиентского объекта Face см. в кратком руководстве .

Создание PersonGroup

Этот код создает PersonGroup с именем "MyPersonGroup" , чтобы сохранить людей. Время запроса ставится в очередь _timeStampQueue для обеспечения общей проверки.

const string personGroupId = "mypersongroupid";
const string personGroupName = "MyPersonGroup";
_timeStampQueue.Enqueue(DateTime.UtcNow);
await faceClient.LargePersonGroup.CreateAsync(personGroupId, personGroupName);

Создание данных людей для PersonGroup

Этот код создает пользователей одновременно и используется await WaitCallLimitPerSecondAsync() для предотвращения превышения ограничения частоты звонков.

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

Добавление лиц людей

Лица, добавляемые в данные разных людей, обрабатываются одновременно. Лица, добавляемые в данные одного человека, обрабатываются последовательно. Опять же, во избежание превышения предельной частоты запросов вызывается await WaitCallLimitPerSecondAsync().

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

Итоги

В этом руководстве вы узнали о процессе создания PersonGroup с большим числом людей и лиц. Несколько напоминаний:

  • Эта стратегия также применяется к FaceLists и LargePersonGroups.
  • Добавление или удаление лиц в разные списки лиц или лиц в LargePersonGroups обрабатываются одновременно.
  • Добавление или удаление лиц в один конкретный Список лиц или лиц в LargePersonGroup выполняется последовательно.

Следующие шаги

Далее вы узнаете, как использовать улучшенную структуру данных PersonDirectory для дополнительных операций с данными лиц.