將臉部新增至 PersonGroup
警告
臉部辨識服務存取受限於資格和使用準則,以支援我們的「負責任的 AI 原則」。 臉部辨識服務僅供 Microsoft 受管理的客戶和合作夥伴使用。 請使用臉部辨識受理表單以申請存取。 如需詳細資訊,請參閱臉部的有限存取權頁面。
本指南會示範如何將大量的人員和臉部新增至 PersonGroup 物件。 相同的策略也適用於 LargePersonGroup、FaceList 及 LargeFaceList 物件。 此範例以 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 的流程。 幾項提醒:
- 此策略也適用於 FaceLists 和 LargePersonGroups。
- 可同時處理對 LargePersonGroups 中的不同 FaceLists 或人員新增或刪除臉部。
- 可依序完成對 LargePersonGroup 中的一個特定 FaceList 或人員新增或刪除臉部。
下一步
接下來,了解如何使用增強的資料結構 PersonDirectory 來搭配臉部資料執行更多功能。