أضف الوجوه إلى PersonGroup

تنبيه

الوصول إلى خدمة Face محدود استنادا إلى معايير الأهلية والاستخدام من أجل دعم مبادئنا الذكاء الاصطناعي المسؤولة. تتوفر خدمة Face فقط للعملاء والشركاء المدارين من Microsoft. استخدم نموذج إدخال التعرف على الوجوه لتقديم طلب للوصول. لمزيد من المعلومات، راجع صفحة Face ذات الوصول المحدود.

يوضح هذا الدليل كيفية إضافة عدد كبير من الأشخاص والوجوه إلى كائن PersonGroup . تنطبق نفس الاستراتيجية أيضا على كائنات LargePersonGroup وFaceList وLargeFaceList. تمت كتابة هذه العينة بلغة C# وتستخدم مكتبة عميل Azure الذكاء الاصطناعي 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);
    }
}

تخويل استدعاء واجهة برمجة التطبيقات

عند استخدام مكتبة عميل Face، يُمرر المفتاح ونقطة نهاية الاشتراك خلال مُنشئ فئة 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.
  • تتم معالجة إضافة وجوه أو حذفها إلى FaceLists أو أشخاص مختلفين في LargePersonGroups بشكل متزامن.
  • تتم إضافة الوجوه أو حذفها إلى FaceList أو أشخاص معينين في LargePersonGroup بشكل تسلسلي.

الخطوات التالية

التالي، تعرف على كيفية استخدام بنية البيانات المحسّنة PersonDirectory للقيام بالمزيد مع بيانات وجهك.