PersonGroup에 얼굴 추가

주의

Face 서비스 액세스는 책임 있는 AI 원칙을 지원하기 위해 자격 및 사용 기준에 따라 제한됩니다. Face 서비스는 Microsoft 관리 고객 및 파트너만 사용할 수 있습니다. 얼굴 인식 접수 양식을 사용하여 액세스를 적용합니다. 자세한 내용은 얼굴 제한 액세스 페이지를 참조하세요.

이 가이드에서는 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 호출 권한 부여

Face 클라이언트 라이브러리를 사용하면 키 및 구독 엔드포인트가 FaceClient 클래스의 생성자를 통해 전달됩니다. Face 클라이언트 개체를 만드는 방법에 대한 지침은 빠른 시작을 참조하세요.

PersonGroup 만들기

이 코드는 사용자를 저장하기 위해 명명된 "MyPersonGroup" PersonGroup을 만듭니다. 전체 유효성을 검사하기 위해 요청 시간이 _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의 다른 FaceList 또는 사용자에 얼굴을 추가하거나 삭제하는 작업은 동시에 처리 됩니다.
  • LargePersonGroup의 특정 FaceList 또는 사용자에게 얼굴을 추가하거나 삭제하는 작업은 순차적으로 수행됩니다.

다음 단계

다음으로, 향상된 데이터 구조인 PersonDirectory를 사용하여 얼굴 데이터로 더 많은 작업을 수행하는 방법을 알아봅니다.