ترحيل بيانات الوجه إلى اشتراك Face مختلف
يوضح لك هذا الدليل كيفية نقل بيانات الوجه، مثل كائن PersonGroup المحفوظ مع الوجوه، إلى اشتراك Azure Cognitive Services Face مختلف. لنقل البيانات، يمكنك استخدام ميزة اللقطة. وبهذه الطريقة يمكنك تجنب الاضطرار إلى إنشاء كائن PersonGroup أو FaceList وتدريبه بشكل متكرر عند نقل عملياتك أو توسيعها. على سبيل المثال ، ربما قمت بإنشاء كائن PersonGroup باستخدام اشتراك مجاني وتريد الآن ترحيله إلى اشتراكك المدفوع. أو قد تحتاج إلى مزامنة بيانات الوجه عبر الاشتراكات في مناطق مختلفة لعملية مؤسسة كبيرة.
تنطبق استراتيجية الترحيل نفسها هذه أيضا على كائنات LargePersonGroup و LargeFaceList. إذا لم تكن على دراية بالمفاهيم الواردة في هذا الدليل، فراجع تعريفاتها في دليل مفاهيم التعرف على الوجه . يستخدم هذا الدليل مكتبة عميل Face .NET مع C #.
تحذير
قد تنقل ميزة اللقطة بياناتك خارج المنطقة الجغرافية التي حددتها في الأصل. قد تنتقل البيانات إلى مناطق غرب الولايات المتحدة وأوروبا الغربية وجنوب شرق آسيا.
المتطلبات الأساسية
تحتاج إلى العناصر التالية:
- مفتاحا اشتراك في Face، أحدهما يحتوي على البيانات الموجودة والآخر للترحيل إليه. للاشتراك في خدمة Face والحصول على مفتاحك، اتبع الإرشادات الواردة في إنشاء حساب خدمات معرفية.
- سلسلة معرف اشتراك Face التي تتوافق مع الاشتراك المستهدف. للعثور عليه، حدد نظرة عامة في مدخل Azure.
- أي نسخة من Visual Studio 2015 أو 2017.
إنشاء مشروع Visual Studio
يستخدم هذا الدليل تطبيقا بسيطا لوحدة التحكم لتشغيل ترحيل بيانات الوجه. للحصول على تنفيذ كامل، راجع نموذج لقطة الوجه على GitHub.
- في Visual Studio، أنشئ مشروعا جديدا لتطبيق وحدة التحكم .NET Framework. قم بتسميته FaceApiSnapshotSample.
- احصل على باقات NuGet المطلوبة. انقر بزر الماوس الأيمن فوق مشروعك في مستكشف الحلول، وحدد إدارة حزم NuGet. حدد علامة التبويب استعراض ، وحدد تضمين الإصدار التجريبي. ابحث عن الحزمة التالية وقم بتثبيتها:
إنشاء عملاء الوجوه
في الطريقة الرئيسية في البرنامج.cs، قم بإنشاء مثيلين FaceClient للاشتراكات المصدر والهدف. يستخدم هذا المثال اشتراك Face في منطقة شرق آسيا كمصدر واشتراك غرب الولايات المتحدة كهدف. يوضح هذا المثال كيفية ترحيل البيانات من منطقة Azure إلى أخرى.
ملاحظة
الموارد الجديدة التي تم إنشاؤها بعد 1 يوليو 2019 ستستخدم أسماء النطاقات الفرعية المخصصة. لمزيد من المعلومات وقائمة كاملة بنقاط الانتهاء الإقليمية، راجع أسماء النطاقات الفرعية المخصصة للخدمات المعرفية.
var FaceClientEastAsia = new FaceClient(new ApiKeyServiceClientCredentials("<East Asia Subscription Key>"))
{
Endpoint = "https://southeastasia.api.cognitive.microsoft.com/>"
};
var FaceClientWestUS = new FaceClient(new ApiKeyServiceClientCredentials("<West US Subscription Key>"))
{
Endpoint = "https://westus.api.cognitive.microsoft.com/"
};
املأ قيم مفاتيح الاشتراك وعناوين URL لنقاط النهاية للاشتراكات المصدر والهدف.
إعداد مجموعة أشخاص للترحيل
تحتاج إلى معرف PersonGroup في اشتراكك المصدر لترحيله إلى الاشتراك المستهدف. استخدم الأسلوب PersonGroupOperationsExtensions.ListAsync لاسترداد قائمة بكائنات PersonGroup. ثم احصل على الخاصية PersonGroup.PersonGroupId. تبدو هذه العملية مختلفة استنادا إلى كائنات PersonGroup لديك. في هذا الدليل، يتم تخزين معرف PersonGroup المصدر في personGroupId.
ملاحظة
يقوم نموذج التعليمة البرمجية بإنشاء PersonGroup جديد وتدريبه على الترحيل. في معظم الحالات ، يجب أن يكون لديك بالفعل PersonGroup لاستخدامه.
التقط لقطة لمجموعة أشخاص
اللقطة عبارة عن تخزين مؤقت عن بعد لأنواع معينة من بيانات الوجه. وهو يعمل كنوع من الحافظة لنسخ البيانات من اشتراك إلى آخر. أولا ، يمكنك التقاط لقطة للبيانات الموجودة في الاشتراك المصدر. ثم تقوم بتطبيقه على كائن بيانات جديد في الاشتراك المستهدف.
استخدم مثيل FaceClient الخاص باشتراك المصدر لالتقاط لقطة من PersonGroup. استخدم TakeAsync مع معرف PersonGroup ومعرف الاشتراك المستهدف. إذا كان لديك اشتراكات مستهدفة متعددة، فأضفها كإدخالات صفيف في المعلمة الثالثة.
var takeSnapshotResult = await FaceClientEastAsia.Snapshot.TakeAsync(
SnapshotObjectType.PersonGroup,
personGroupId,
new[] { "<Azure West US Subscription ID>" /* Put other IDs here, if multiple target subscriptions wanted */ });
ملاحظة
لا تؤدي عملية التقاط اللقطات وتطبيقها إلى تعطيل أي مكالمات منتظمة إلى المصدر أو مجموعات الأشخاص أو FaceLists المستهدفة. لا تقم بإجراء مكالمات متزامنة تغير الكائن المصدر، مثل مكالمات إدارة FaceList أو مكالمة قطار PersonGroup ، على سبيل المثال. قد يتم تشغيل عملية اللقطة قبل أو بعد هذه العمليات أو قد تواجه أخطاء.
استرداد معرف اللقطة
الطريقة المستخدمة لالتقاط لقطات غير متزامنة ، لذلك يجب عليك الانتظار حتى اكتمالها. لا يمكن إلغاء عمليات اللقطة. في هذه التعليمة البرمجية، تراقب الطريقة المكالمة غير المتزامنة WaitForOperation . يتحقق من الحالة كل 100 مللي ثانية. بعد انتهاء العملية، استرجع معرف عملية عن طريق تحليل الحقل OperationLocation .
var takeOperationId = Guid.Parse(takeSnapshotResult.OperationLocation.Split('/')[2]);
var operationStatus = await WaitForOperation(FaceClientEastAsia, takeOperationId);
تبدو القيمة النموذجية OperationLocation كما يلي:
"/operations/a63a3bdd-a1db-4d05-87b8-dbad6850062a"
طريقة المساعد WaitForOperation هنا:
/// <summary>
/// Waits for the take/apply operation to complete and returns the final operation status.
/// </summary>
/// <returns>The final operation status.</returns>
private static async Task<OperationStatus> WaitForOperation(IFaceClient client, Guid operationId)
{
OperationStatus operationStatus = null;
do
{
if (operationStatus != null)
{
Thread.Sleep(TimeSpan.FromMilliseconds(100));
}
// Get the status of the operation.
operationStatus = await client.Snapshot.GetOperationStatusAsync(operationId);
Console.WriteLine($"Operation Status: {operationStatus.Status}");
}
while (operationStatus.Status != OperationStatusType.Succeeded
&& operationStatus.Status != OperationStatusType.Failed);
return operationStatus;
}
بعد ظهور Succeededحالة العملية، احصل على معرف اللقطة عن طريق تحليل ResourceLocation حقل مثيل OperationStatus الذي تم إرجاعه.
var snapshotId = Guid.Parse(operationStatus.ResourceLocation.Split('/')[2]);
تبدو القيمة النموذجية resourceLocation كما يلي:
"/snapshots/e58b3f08-1e8b-4165-81df-aa9858f233dc"
تطبيق لقطة على اشتراك مستهدف
بعد ذلك، قم بإنشاء PersonGroup الجديد في الاشتراك المستهدف باستخدام معرف تم إنشاؤه عشوائيا. ثم استخدم مثيل FaceClient الخاص بالاشتراك المستهدف لتطبيق اللقطة على PersonGroup هذا. مرر في معرف اللقطة ومعرف PersonGroup الجديد.
var newPersonGroupId = Guid.NewGuid().ToString();
var applySnapshotResult = await FaceClientWestUS.Snapshot.ApplyAsync(snapshotId, newPersonGroupId);
ملاحظة
كائن لقطة صالح لمدة 48 ساعة فقط. التقط لقطة فقط إذا كنت تنوي استخدامها لترحيل البيانات بعد فترة وجيزة.
يقوم طلب تطبيق لقطة بإرجاع معرف عملية آخر. للحصول على هذا المعرف، قم بتحليل OperationLocation حقل مثيل applySnapshotResult الذي تم إرجاعه.
var applyOperationId = Guid.Parse(applySnapshotResult.OperationLocation.Split('/')[2]);
عملية تطبيق اللقطة غير متزامنة أيضا ، لذا استخدمها WaitForOperation مرة أخرى لانتظار انتهائها.
operationStatus = await WaitForOperation(FaceClientWestUS, applyOperationId);
اختبار ترحيل البيانات
بعد تطبيق اللقطة، يملأ PersonGroup الجديد في الاشتراك المستهدف ببيانات الوجه الأصلية. بشكل افتراضي ، يتم نسخ نتائج التدريب أيضا. مجموعة PersonGroup الجديدة جاهزة لمكالمات تحديد الوجه دون الحاجة إلى إعادة التدريب.
لاختبار ترحيل البيانات، قم بتشغيل العمليات التالية ومقارنة النتائج التي تتم طباعتها إلى وحدة التحكم:
await DisplayPersonGroup(FaceClientEastAsia, personGroupId);
await IdentifyInPersonGroup(FaceClientEastAsia, personGroupId);
await DisplayPersonGroup(FaceClientWestUS, newPersonGroupId);
// No need to retrain the PersonGroup before identification,
// training results are copied by snapshot as well.
await IdentifyInPersonGroup(FaceClientWestUS, newPersonGroupId);
استخدم طرق المساعد التالية:
private static async Task DisplayPersonGroup(IFaceClient client, string personGroupId)
{
var personGroup = await client.PersonGroup.GetAsync(personGroupId);
Console.WriteLine("PersonGroup:");
Console.WriteLine(JsonConvert.SerializeObject(personGroup));
// List persons.
var persons = await client.PersonGroupPerson.ListAsync(personGroupId);
foreach (var person in persons)
{
Console.WriteLine(JsonConvert.SerializeObject(person));
}
Console.WriteLine();
}
private static async Task IdentifyInPersonGroup(IFaceClient client, string personGroupId)
{
using (var fileStream = new FileStream("data\\PersonGroup\\Daughter\\Daughter1.jpg", FileMode.Open, FileAccess.Read))
{
var detectedFaces = await client.Face.DetectWithStreamAsync(fileStream);
var result = await client.Face.IdentifyAsync(detectedFaces.Select(face => face.FaceId.Value).ToList(), personGroupId);
Console.WriteLine("Test identify against PersonGroup");
Console.WriteLine(JsonConvert.SerializeObject(result));
Console.WriteLine();
}
}
يمكنك الآن استخدام PersonGroup الجديد في الاشتراك المستهدف.
لتحديث PersonGroup الهدف مرة أخرى في المستقبل، قم بإنشاء PersonGroup جديد لتلقي اللقطة. للقيام بذلك، اتبع الخطوات الواردة في هذا الدليل. يمكن أن يكون لكائن PersonGroup واحد لقطة مطبقة عليه مرة واحدة فقط.
تنظيف الموارد
بعد الانتهاء من ترحيل بيانات الوجه، احذف كائن اللقطة يدويا.
await FaceClientEastAsia.Snapshot.DeleteAsync(snapshotId);
الخطوات التالية
بعد ذلك، راجع الوثائق المرجعية لواجهة برمجة التطبيقات ذات الصلة، أو استكشف نموذجا لتطبيق يستخدم ميزة اللقطة، أو اتبع دليلا إرشاديا لبدء استخدام عمليات واجهة برمجة التطبيقات الأخرى المذكورة هنا: