共用方式為


將臉部新增至 PersonGroup

警告

臉部辨識服務存取受限於資格和使用準則,以支援我們的「負責任的 AI 原則」。 臉部辨識服務僅供 Microsoft 受管理的客戶和合作夥伴使用。 請使用臉部辨識受理表單以申請存取。 如需詳細資訊,請參閱臉部的有限存取權頁面。

本指南會示範如何將大量的人員和臉部新增至 PersonGroup 物件。 相同的策略也適用於 LargePersonGroupFaceListLargeFaceList 物件。 此範例以 C# 語言撰寫。

初始化

下列程式碼會宣告數個變數,並實作協助程式函式來排程臉部新增要求:

  • 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

此程式碼會建立名為 "MyPersonGroup"PersonGroup 來儲存人員。 要求時間已排入 _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 建立人員

此程式碼會同時建立 Persons,並使用 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 的流程。 幾項提醒:

  • 此策略也適用於 FaceListsLargePersonGroups
  • 可同時處理對 LargePersonGroups 中的不同 FaceLists 或人員新增或刪除臉部。
  • 可依序完成對 LargePersonGroup 中的一個特定 FaceList 或人員新增或刪除臉部。

下一步

接下來,了解如何使用增強的資料結構 PersonDirectory 來搭配臉部資料執行更多功能。