التشغيل السريع: استخدم مكتبة العميل من خلال خاصية Face.

ابدأ بالتعرف على الوجه باستخدام مكتبة عميل Face لـ ‎.NET. اتبع هذه الخطوات لتثبيت الحزمة وتجربة نموذج تعليمات البرمجة للمهام الأساسية. توفر لك خدمة Face إمكانية الوصول إلى الخوارزميات المتقدمة للكشف عن الوجوه البشرية والتعرف عليها في الصور.

استخدام مكتبة عميل Face لـ ‎.NET لما يلي:

وثائق المراجع | كود مصدر المكتبة | الحزمة (NuGet) | العينات

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا
  • إصدار Visual Studio IDE أو الإصدار الحالي من .NET Core.
  • يجب أن يكون لحساب Azure دور مساهم في الخدمات المعرفية تم تعيينه لكي توافق على شروط الذكاء الاصطناعي المسؤولة وإنشاء مورد. للحصول على هذا الدور المعين لحسابك، اتبع الخطوات الواردة في وثائق تعيين الأدوار ، أو اتصل بالمسؤول.
  • بمجرد أن يكون لديك اشتراك Azure، قم بإنشاء مورد Face في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. بعد نشره، انقر فوق "Go to resource" .
    • ستحتاج إلى المفتاح ونقطة النهاية من المورد الذي تنشئه لتوصيل التطبيق بواجهة برمجة تطبيقات Face. ستلصق المفتاح ونقطة النهاية في التعليمات البرمجية أدناه لاحقًا في البدء السريع.
    • يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

الإعداد

إنشاء تطبيق C# جديد

باستخدام Visual Studio، قم بإنشاء تطبيق .NET Core جديد.

تثبيت مكتبة العميل

بمجرد إنشاء مشروع جديد، ثبّت مكتبة العميل بالنقر بزر الماوس الأيمن فوق حل المشروع في مستكشف الحلول وتحديد Manage NuGet Packages. في مدير الحزم الذي يفتح، حدد Browse، وحدد Include prerelease، وابحث عن Microsoft.Azure.CognitiveServices.Vision.Face. حدد الإصدار 2.7.0-preview.1، ثم قم بتثبيت.

تلميح

هل تريد عرض ملف التعليمات البرمجية للتشغيل السريع بالكامل مرةً واحدة؟ يمكنك العثور عليه على GitHub، والذي يحتوي على أمثلة التعليمات البرمجية في هذا البدء السريع.

من دليل المشروع، افتح الملف program.cs ثم أضف التوجيهات using التالية:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

using Microsoft.Azure.CognitiveServices.Vision.Face;
using Microsoft.Azure.CognitiveServices.Vision.Face.Models;

في الفئة Program للتطبيق، أنشئ متغيرات لمفتاح المورد ونقطة النهاية.

هام

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

هام

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

// From your Face subscription in the Azure portal, get your subscription key and endpoint.
const string SUBSCRIPTION_KEY = "PASTE_YOUR_FACE_SUBSCRIPTION_KEY_HERE";
const string ENDPOINT = "PASTE_YOUR_FACE_ENDPOINT_HERE";

في الأسلوب الرئيسي للتطبيق، أضف الاستدعاءات للأساليب المستخدمة في هذا البدء السريع. وستُنفذ ذلك لاحقًا.

// Authenticate.
IFaceClient client = Authenticate(ENDPOINT, SUBSCRIPTION_KEY);

// Detect - get features from faces.
DetectFaceExtract(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// Find Similar - find a similar face from a list of faces.
FindSimilar(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// Verify - compare two images if the same person or not.
Verify(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();

// Identify - recognize a face(s) in a person group (a person group is created in this example).
IdentifyInPersonGroup(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// LargePersonGroup - create, then get data.
LargePersonGroup(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// Group faces - automatically group similar faces.
Group(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// FaceList - create a face list, then get data

نموذج الكائن

تتعامل الفئات والواجهات التالية مع بعض الميزات الرئيسية لمكتبة عميل Face .NET:

الاسم الوصف
FaceClient تمثل هذه الفئة التخويل الخاص بك لاستخدام خدمة Face، وتحتاج إليها لجميع وظائف Face. تقوم بإنشاء مثيل لها بمعلومات اشتراكك، وتستخدمها لإنتاج مثيلات الفئات الأخرى.
FaceOperations تعالج هذه الفئة مهام الكشف والتعرف الأساسية التي يمكنك القيام بها مع الوجوه البشرية.
DetectedFace تمثل هذه الفئة جميع البيانات التي تم اكتشافها من وجه واحد في صورة. يمكنك استخدامها لاسترداد معلومات مفصلة عن الوجه.
FaceListOperations تدير هذه الفئة بنيات FaceList المخزنة على السحابة، والتي تخزن مجموعة متنوعة من الوجوه.
PersonGroupPersonExtensions تدير هذه الفئة بنيات Person المخزنة على السحابة، والتي تخزن مجموعة من الوجوه التي تنتمي إلى شخص واحد.
PersonGroupOperations تدير هذه الفئة بنيات PersonGroup المخزنة في السحابة، والتي تخزن مجموعة من كائنات Person المتنوعة.

أمثلة التعليمات البرمجية

توضح لك قصاصات التعليمات البرمجية الواردة أدناه كيفية تنفيذ المهام التالية باستخدام مكتبة عميل Face من أجل ‎.NET:

مصادقة العميل

في طريقة جديدة، أنشئ مثيلاً لعميل باستخدام نقطة النهاية والمفتاح الخاصين بك. أنشئ كائن ApiKeyServiceClientCredentials باستخدام مفتاحك، واستخدامه مع نقطة النهاية لإنشاء كائن FaceClient .

/*
 *	AUTHENTICATE
 *	Uses subscription key and region to create a client.
 */
public static IFaceClient Authenticate(string endpoint, string key)
{
    return new FaceClient(new ApiKeyServiceClientCredentials(key)) { Endpoint = endpoint };
}

إعلان الحقول المساعدة

الحقول التالية مطلوبة للعديد من عمليات Face التي ستقوم بإضافتها لاحقًا. في جذر الفئة Program، قم بتعريف سلسلة URL التالية. يشير عنوان URL هذا إلى مجلد يحتوي على عينة من الصور.

// Used for all examples.
// URL for the images.
const string IMAGE_BASE_URL = "https://csdx.blob.core.windows.net/resources/Face/Images/";

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

// Recognition model 4 was released in 2021 February.
// It is recommended since its accuracy is improved
// on faces wearing masks compared with model 3,
// and its overall accuracy is improved compared
// with models 1 and 2.
const string RECOGNITION_MODEL4 = RecognitionModel.Recognition04;

الكشف عن الوجوه وتحليلها

يلزم الكشف عن الوجه كخطوة أولى في جميع السيناريوهات الأخرى. يوضح هذا القسم كيفية إرجاع بيانات سمة الوجه الإضافية. إذا كنت ترغب فقط في اكتشاف الوجوه للتعرف على الوجه أو التحقق منه، فانتقل إلى الأقسام الأحدث.

الحصول على كائنات الوجه المكتشفة

أنشئ أسلوبًا جديدًا للكشف عن الوجوه. يعالج الأسلوب DetectFaceExtract ثلاث صور في عنوان URL المحدد ويقوم بإنشاء قائمة بكائنات DetectedFace في ذاكرة البرنامج. تحدد قائمة القيم FaceAttributeType الميزات التي سيتم استخراجها.

/* 
 * DETECT FACES
 * Detects features from faces and IDs them.
 */
public static async Task DetectFaceExtract(IFaceClient client, string url, string recognitionModel)
{
    Console.WriteLine("========DETECT FACES========");
    Console.WriteLine();

    // Create a list of images
    List<string> imageFileNames = new List<string>
                    {
                        "detection1.jpg",    // single female with glasses
                        // "detection2.jpg", // (optional: single man)
                        // "detection3.jpg", // (optional: single male construction worker)
                        // "detection4.jpg", // (optional: 3 people at cafe, 1 is blurred)
                        "detection5.jpg",    // family, woman child man
                        "detection6.jpg"     // elderly couple, male female
                    };

    foreach (var imageFileName in imageFileNames)
    {
        IList<DetectedFace> detectedFaces;

        // Detect faces with all attributes from image url.
        detectedFaces = await client.Face.DetectWithUrlAsync($"{url}{imageFileName}",
                returnFaceAttributes: new List<FaceAttributeType> { FaceAttributeType.Accessories, FaceAttributeType.Age,
                FaceAttributeType.Blur, FaceAttributeType.Emotion, FaceAttributeType.Exposure, FaceAttributeType.FacialHair,
                FaceAttributeType.Glasses, FaceAttributeType.Hair, FaceAttributeType.HeadPose,
                FaceAttributeType.Makeup, FaceAttributeType.Noise, FaceAttributeType.Occlusion, FaceAttributeType.Smile, 
                FaceAttributeType.Smile, FaceAttributeType.QualityForRecognition },
                // We specify detection model 1 because we are retrieving attributes.
                detectionModel: DetectionModel.Detection01,
                recognitionModel: recognitionModel);

        Console.WriteLine($"{detectedFaces.Count} face(s) detected from image `{imageFileName}`.");

تعالج التعليمات البرمجية أعلاه الصور البعيدة التالية:

Photo of a woman smilingPhoto of a man, woman, and babyPhoto of an older man and woman

تلميح

كما يمكنك اكتشاف الوجوه في صورة محلية. راجع أساليب IFaceOperations مثل DetectWithStreamAsync.

عرض بيانات الوجه المكتشفة

تقوم بقية الأسلوب DetectFaceExtract بتحليل وطباعة بيانات السمة لكل وجه تم اكتشافه. يجب تحديد كل سمة بشكلٍ منفصل في استدعاء واجهة برمجة التطبيقات للكشف عن الوجه الأصلي (في القائمة FaceAttributeType ). تعالج التعليمات البرمجية التالية كل سمة، ولكن من المحتمل أنك ستحتاج فقط إلى استخدام واحدة أو عدد قليل.

        // Parse and print all attributes of each detected face.
        foreach (var face in detectedFaces)
        {
            Console.WriteLine($"Face attributes for {imageFileName}:");

            // Get bounding box of the faces
            Console.WriteLine($"Rectangle(Left/Top/Width/Height) : {face.FaceRectangle.Left} {face.FaceRectangle.Top} {face.FaceRectangle.Width} {face.FaceRectangle.Height}");

            // Get accessories of the faces
            List<Accessory> accessoriesList = (List<Accessory>)face.FaceAttributes.Accessories;
            int count = face.FaceAttributes.Accessories.Count;
            string accessory; string[] accessoryArray = new string[count];
            if (count == 0) { accessory = "NoAccessories"; }
            else
            {
                for (int i = 0; i < count; ++i) { accessoryArray[i] = accessoriesList[i].Type.ToString(); }
                accessory = string.Join(",", accessoryArray);
            }
            Console.WriteLine($"Accessories : {accessory}");

            // Get face other attributes
            Console.WriteLine($"Age : {face.FaceAttributes.Age}");
            Console.WriteLine($"Blur : {face.FaceAttributes.Blur.BlurLevel}");

            // Get emotion on the face
            string emotionType = string.Empty;
            double emotionValue = 0.0;
            Emotion emotion = face.FaceAttributes.Emotion;
            if (emotion.Anger > emotionValue) { emotionValue = emotion.Anger; emotionType = "Anger"; }
            if (emotion.Contempt > emotionValue) { emotionValue = emotion.Contempt; emotionType = "Contempt"; }
            if (emotion.Disgust > emotionValue) { emotionValue = emotion.Disgust; emotionType = "Disgust"; }
            if (emotion.Fear > emotionValue) { emotionValue = emotion.Fear; emotionType = "Fear"; }
            if (emotion.Happiness > emotionValue) { emotionValue = emotion.Happiness; emotionType = "Happiness"; }
            if (emotion.Neutral > emotionValue) { emotionValue = emotion.Neutral; emotionType = "Neutral"; }
            if (emotion.Sadness > emotionValue) { emotionValue = emotion.Sadness; emotionType = "Sadness"; }
            if (emotion.Surprise > emotionValue) { emotionType = "Surprise"; }
            Console.WriteLine($"Emotion : {emotionType}");

            // Get more face attributes
            Console.WriteLine($"Exposure : {face.FaceAttributes.Exposure.ExposureLevel}");
            Console.WriteLine($"FacialHair : {string.Format("{0}", face.FaceAttributes.FacialHair.Moustache + face.FaceAttributes.FacialHair.Beard + face.FaceAttributes.FacialHair.Sideburns > 0 ? "Yes" : "No")}");
            Console.WriteLine($"Glasses : {face.FaceAttributes.Glasses}");

            // Get hair color
            Hair hair = face.FaceAttributes.Hair;
            string color = null;
            if (hair.HairColor.Count == 0) { if (hair.Invisible) { color = "Invisible"; } else { color = "Bald"; } }
            HairColorType returnColor = HairColorType.Unknown;
            double maxConfidence = 0.0f;
            foreach (HairColor hairColor in hair.HairColor)
            {
                if (hairColor.Confidence <= maxConfidence) { continue; }
                maxConfidence = hairColor.Confidence; returnColor = hairColor.Color; color = returnColor.ToString();
            }
            Console.WriteLine($"Hair : {color}");

            // Get more attributes
            Console.WriteLine($"HeadPose : {string.Format("Pitch: {0}, Roll: {1}, Yaw: {2}", Math.Round(face.FaceAttributes.HeadPose.Pitch, 2), Math.Round(face.FaceAttributes.HeadPose.Roll, 2), Math.Round(face.FaceAttributes.HeadPose.Yaw, 2))}");
            Console.WriteLine($"Makeup : {string.Format("{0}", (face.FaceAttributes.Makeup.EyeMakeup || face.FaceAttributes.Makeup.LipMakeup) ? "Yes" : "No")}");
            Console.WriteLine($"Noise : {face.FaceAttributes.Noise.NoiseLevel}");
            Console.WriteLine($"Occlusion : {string.Format("EyeOccluded: {0}", face.FaceAttributes.Occlusion.EyeOccluded ? "Yes" : "No")} " +
                $" {string.Format("ForeheadOccluded: {0}", face.FaceAttributes.Occlusion.ForeheadOccluded ? "Yes" : "No")}   {string.Format("MouthOccluded: {0}", face.FaceAttributes.Occlusion.MouthOccluded ? "Yes" : "No")}");
            Console.WriteLine($"Smile : {face.FaceAttributes.Smile}");
            
            // Get quality for recognition attribute
            Console.WriteLine($"QualityForRecognition : {face.FaceAttributes.QualityForRecognition}");
            Console.WriteLine();
        }
    }
}

السمة "QualityForRecognition" هي مؤشر على جودة الصورة الإجمالية فيما يتعلق بما إذا كانت الصورة المستخدمة في الكشف ذات جودة كافية لمحاولة التعرف على الوجه. للاستفادة من سمة الجودة، يحتاج المستخدمون إلى تعيين إصدار النموذج عن طريق تعيين معلمة detectionModel إلى detection_01 أو detection_03، ومعلمة recognitionModel recognition_03 أو recognition_04، وتضمين السمة QualityForRecognition في الطلب كما هو موضح في المثال أعلاه.

التعرف على الوجه

تلتقط عملية Identify صورة شخص (أو عدة أشخاص) وتبحث للعثور على كائن الشخص المخزن المرتبط بكل وجه في الصورة (البحث بالتعرف على الوجه). وتقارن كل وجه تم اكتشافه بـ PersonGroup، وهي قاعدة بيانات لكائنات Person المختلفة التي تعرف بيانات وجههم. للقيام بعملية «Identify»، تحتاج أولاً إلى إنشاء PersonGroup والتدريب عليه

إنشاء PersonGroup

تنشئ التعليمات البرمجية التالية PersonGroup باستخدام ستة كائنات Person مختلفة. فهي تربط كل Person بمجموعة من الصور العينة، ثم تتدرب على التعرف على كل شخص بحسب سمات وجهه. يتم استخدام كائنات Person وPersonGroup في العمليات «Verify»، و«Identify»، و«Group».

أعلن عن متغير سلسلة في جذر الفئة لتمثيل معرف PersonGroup الذي ستنشئه.

static string personGroupId = Guid.NewGuid().ToString();

في أسلوب جديد، أضف التعليمات البرمجية التالية. ستقوم هذه الطريقة بتنفيذ العملية «Identify». تربط الكتلة الأولى من التعليمات البرمجية أسماء الأشخاص بصور العينة الخاصة بهم.

public static async Task IdentifyInPersonGroup(IFaceClient client, string url, string recognitionModel)
{
    Console.WriteLine("========IDENTIFY FACES========");
    Console.WriteLine();

    // Create a dictionary for all your images, grouping similar ones under the same key.
    Dictionary<string, string[]> personDictionary =
        new Dictionary<string, string[]>
            { { "Family1-Dad", new[] { "Family1-Dad1.jpg", "Family1-Dad2.jpg" } },
              { "Family1-Mom", new[] { "Family1-Mom1.jpg", "Family1-Mom2.jpg" } },
              { "Family1-Son", new[] { "Family1-Son1.jpg", "Family1-Son2.jpg" } },
              { "Family1-Daughter", new[] { "Family1-Daughter1.jpg", "Family1-Daughter2.jpg" } },
              { "Family2-Lady", new[] { "Family2-Lady1.jpg", "Family2-Lady2.jpg" } },
              { "Family2-Man", new[] { "Family2-Man1.jpg", "Family2-Man2.jpg" } }
            };
    // A group photo that includes some of the persons you seek to identify from your dictionary.
    string sourceImageFileName = "identification1.jpg";

لاحظ أن هذا الرمز يعرف sourceImageFileName متغيرًا. يتوافق هذا المتغير مع الصورة المصدر - الصورة التي تحتوي على أشخاص لتحديدهم.

بعد ذلك، أضف التعليمات البرمجية التالية لإنشاء كائن Person لكل شخص في القاموس وأضف بيانات الوجه من الصور المناسبة. يقترن كل كائن Person مع كائن PersonGroup نفسه من خلال سلسلة المعرف الفريدة. تذكر تمرير المتغيرات client، وurl، وRECOGNITION_MODEL1 إلى هذا الأسلوب.

// Create a person group. 
Console.WriteLine($"Create a person group ({personGroupId}).");
await client.PersonGroup.CreateAsync(personGroupId, personGroupId, recognitionModel: recognitionModel);
// The similar faces will be grouped into a single person group person.
foreach (var groupedFace in personDictionary.Keys)
{
    // Limit TPS
    await Task.Delay(250);
    Person person = await client.PersonGroupPerson.CreateAsync(personGroupId: personGroupId, name: groupedFace);
    Console.WriteLine($"Create a person group person '{groupedFace}'.");

    // Add face to the person group person.
    foreach (var similarImage in personDictionary[groupedFace])
    {
        Console.WriteLine($"Check whether image is of sufficient quality for recognition");
        IList<DetectedFace> detectedFaces = await client.Face.DetectWithUrlAsync($"{url}{similarImage}", 
            recognitionModel: recognition_model, 
            detectionModel: DetectionModel.Detection03,
            returnFaceAttributes: new List<FaceAttributeType> { FaceAttributeType.QualityForRecognition });
        bool sufficientQuality = true;
        foreach (var face in detectedFaces)
        {
            var faceQualityForRecognition = face.FaceAttributes.QualityForRecognition;
            //  Only "high" quality images are recommended for person enrollment
            if (faceQualityForRecognition.HasValue && (faceQualityForRecognition.Value != QualityForRecognition.High)){
                sufficientQuality = false;
                break;
            }
        }

        if (!sufficientQuality){
            continue;
        }


        Console.WriteLine($"Add face to the person group person({groupedFace}) from image `{similarImage}`");
        PersistedFace face = await client.PersonGroupPerson.AddFaceFromUrlAsync(personGroupId, person.PersonId,
            $"{url}{similarImage}", similarImage);
    }
}

تلميح

يمكنك أيضًا إنشاء PersonGroup من الصور المحلية. راجع أساليب IPersonGroupPerson مثل AddFaceFromStreamAsync.

تدريب PersonGroup

بمجرد استخراج بيانات الوجه من الصور الخاصة بك وفرزها إلى كائنات Person مختلفة، يجب تدريب PersonGroup على تحديد الميزات المرئية المرتبطة بكل كائن من كائنات Person الخاصة به. تستدعي التعليمات البرمجية التالية أسلوب التدريب غير المتزامن، وتستقصي النتائج وتنشر الحالة إلى وحدة التحكم.

// Start to train the person group.
Console.WriteLine();
Console.WriteLine($"Train person group {personGroupId}.");
await client.PersonGroup.TrainAsync(personGroupId);

// Wait until the training is completed.
while (true)
{
    await Task.Delay(1000);
    var trainingStatus = await client.PersonGroup.GetTrainingStatusAsync(personGroupId);
    Console.WriteLine($"Training status: {trainingStatus.Status}.");
    if (trainingStatus.Status == TrainingStatusType.Succeeded) { break; }
}
Console.WriteLine();

تلميح

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

أصبحت مجموعة Person هذه وكائنات Person المرتبطة بها جاهزة الآن للاستخدام في العمليات «Verify»، و«Identify»، و«Group».

التعرف على الوجوه

تأخذ التعليمات البرمجية التالية صورة المصدر وتنشئ قائمة بجميع الوجوه التي تم اكتشافها في الصورة. هذه هي الوجوه التي سيتم تحديدها مقابل PersonGroup.

List<Guid> sourceFaceIds = new List<Guid>();
// Detect faces from source image url.
List<DetectedFace> detectedFaces = await DetectFaceRecognize(client, $"{url}{sourceImageFileName}", recognitionModel);

// Add detected faceId to sourceFaceIds.
foreach (var detectedFace in detectedFaces) { sourceFaceIds.Add(detectedFace.FaceId.Value); }

تستدعي قصاصة التعليمات البرمجية التالية العملية IdentifyAsync وتنشر النتائج إلى وحدة التحكم. هنا، تحاول الخدمة مطابقة كل وجه من صورة المصدر إلى Person في PersonGroup المحددة. يؤدي هذا إلى إغلاق أسلوب «Identify» لديك.

    // Identify the faces in a person group. 
    var identifyResults = await client.Face.IdentifyAsync(sourceFaceIds, personGroupId);

    foreach (var identifyResult in identifyResults)
    {
        Person person = await client.PersonGroupPerson.GetAsync(personGroupId, identifyResult.Candidates[0].PersonId);
        Console.WriteLine($"Person '{person.Name}' is identified for face in: {sourceImageFileName} - {identifyResult.FaceId}," +
            $" confidence: {identifyResult.Candidates[0].Confidence}.");
    }
    Console.WriteLine();
}

العثور على وجوه مشابهة

تأخذ التعليمات البرمجية التالية وجهًا واحدًا تم اكتشافه (المصدر) وتقوم بالبحث عن مجموعة من الوجوه الأخرى (الهدف) للعثور على الوجوه المطابقة (البحث عن الوجه عن طريق الصورة). عندما تعثر على تطابق، فإنها تنشر معرف الوجه المطابق إلى وحدة التحكم.

الكشف عن الوجوه للمقارنة

أولاً، حدد أسلوبًا ثانيًا للكشف عن الوجه. تحتاج إلى الكشف عن الوجوه في الصور قبل أن تتمكن من مقارنتها، وقد تم تحسين طريقة الكشف هذه لأجل عمليات المقارنة. لا يستخرج سمات الوجه التفصيلية كما في القسم أعلاه، ويستخدم نموذجًا مختلفًا للتعرف.

private static async Task<List<DetectedFace>> DetectFaceRecognize(IFaceClient faceClient, string url, string recognition_model)
{
    // Detect faces from image URL. Since only recognizing, use the recognition model 1.
    // We use detection model 3 because we are not retrieving attributes.
    IList<DetectedFace> detectedFaces = await faceClient.Face.DetectWithUrlAsync(url, recognitionModel: recognition_model, detectionModel: DetectionModel.Detection03, FaceAttributes: new List<FaceAttributeType> { FaceAttributeType.QualityForRecognition });
    List<DetectedFace> sufficientQualityFaces = new List<DetectedFace>();
    foreach (DetectedFace detectedFace in detectedFaces){
        var faceQualityForRecognition = detectedFace.FaceAttributes.QualityForRecognition;
        if (faceQualityForRecognition.HasValue && (faceQualityForRecognition.Value >= QualityForRecognition.Medium)){
            sufficientQualityFaces.Add(detectedFace);
        }
    }
    Console.WriteLine($"{detectedFaces.Count} face(s) with {sufficientQualityFaces.Count} having sufficient quality for recognition detected from image `{Path.GetFileName(url)}`");

    return sufficientQualityFaces.ToList();
}

البحث عن المطابقات

يكتشف الأسلوب التالي الوجوه في مجموعة من الصور المستهدفة وفي صورة مصدر واحد. ثم يقارنها ويجد كل الصور المستهدفة المشابهة للصورة المصدر.

// Find a similar face(s) in the list of IDs. Comapring only the first in list for testing purposes.
IList<SimilarFace> similarResults = await client.Face.FindSimilarAsync(detectedFaces[0].FaceId.Value, null, null, targetFaceIds);

في هذا البرنامج، سيتم استخدام الصورة البعيدة التالية كمصدر:

Photo of a man smiling

تنشر التعليمات البرمجية التالية تفاصيل المطابقة إلى وحدة التحكم:

foreach (var similarResult in similarResults)
{
    Console.WriteLine($"Faces from {sourceImageFileName} & ID:{similarResult.FaceId} are similar with confidence: {similarResult.Confidence}.");
}
Console.WriteLine();

في هذا البرنامج، يجب إرجاع الوجه المكتشف في هذه الصورة كوجه مشابه لوجه الصورة المصدر.

Photo of a man smiling; this is the same person as the previous image

شغّل التطبيق

قم بتشغيل التطبيق بنقر الزر Debug أعلى نافذة IDE.

تنظيف الموارد

إذا كنت تريد تنظيف وإلغاء اشتراك الخدمات المعرفية، يمكنك حذف المورد أو مجموعة الموارد. يؤدي حذف مجموعة الموارد إلى حذف أية موارد أخرى مقترنة بها أيضًا.

إذا قمت بإنشاء PersonGroup في هذا البدء السريع وتريد حذفه، فقم بتشغيل التعليمات البرمجية التالية في برنامجك:

// At end, delete person groups in both regions (since testing only)
Console.WriteLine("========DELETE PERSON GROUP========");
Console.WriteLine();
DeletePersonGroup(client, personGroupId).Wait();

قم بتعريف أسلوب الحذف من خلال التعليمات البرمجية التالية:

/*
 * DELETE PERSON GROUP
 * After this entire example is executed, delete the person group in your Azure account,
 * otherwise you cannot recreate one with the same name (if running example repeatedly).
 */
public static async Task DeletePersonGroup(IFaceClient client, String personGroupId)
{
    await client.PersonGroup.DeleteAsync(personGroupId);
    Console.WriteLine($"Deleted the person group {personGroupId}.");
}

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

في هذا البدء السريع، تعلمت كيفية استخدام مكتبة عميل Face لـ ‎.NET للقيام بمهام التعرف على الوجه الأساسية. بعد ذلك، ستتمكن من التعرف على نماذج كشف الوجه المختلفة وكيفية تحديد النموذج المناسب لحالة الاستخدام.

التشغيل السريع: مكتبة عميل Face لـ JavaScript

ابدأ بالتعرف على الوجه باستخدام مكتبة عميل Face لـ JavaScript. اتبع هذه الخطوات لتثبيت الحزمة وتجربة نموذج تعليمات البرمجة للمهام الأساسية. توفر لك خدمة Face إمكانية الوصول إلى الخوارزميات المتقدمة للكشف عن الوجوه البشرية والتعرف عليها في الصور.

استخدام مكتبة عميل Face لـ JavaScript من أجل:

الوثائق المرجعية | التعليمات البرمجية لمصدر المكتبة | الحزمة (npm) | النماذج

المتطلبات الأساسية

  • اشتراك Azure - أنشئ اشتراكاً مجاناً
  • أحدث نسخة من Node.js.
  • يجب أن يكون لحساب Azure دور مساهم في الخدمات المعرفية تم تعيينه لكي توافق على شروط الذكاء الاصطناعي المسؤولة وإنشاء مورد. للحصول على هذا الدور المعين لحسابك، اتبع الخطوات الواردة في وثائق تعيين الأدوار ، أو اتصل بالمسؤول.
  • بمجرد اشتراكك في Azure، أنشئ مورد Face في مدخل Azure للحصول على المفتاح ونقطة النهاية. بعد نشره، انقر فوق "Go to resource" .
    • ستحتاج إلى المفتاح ونقطة النهاية من المورد الذي تنشئه لتوصيل التطبيق بواجهة برمجة تطبيقات Face. ستلصق المفتاح ونقطة النهاية في التعليمات البرمجية أدناه لاحقًا في البدء السريع.
    • يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

الإعداد

إنشاء تطبيق Node.js جديد

في نافذة وحدة التحكم (مثل cmd، أو PowerShell، أو Bash)، أنشئ دليلاً جديدًا لتطبيقك، وانتقل إليه.

mkdir myapp && cd myapp

شغل npm initالأمر لإنشاء تطبيق node باستخدام ملف package.json.

npm init

تثبيت مكتبة العميل

تثبيت حزم NPM ms-rest-azure وazure-cognitiveservices-face:

npm install @azure/cognitiveservices-face @azure/ms-rest-js

تحديث ملف تطبيقك package.json باستخدام التبعيات.

أنشئ ملفاً جديداً باسم index.js ومن ثم استورد المكتبات التالية:

تلميح

هل تريد عرض ملف التعليمات البرمجية للتشغيل السريع بالكامل مرةً واحدة؟ يُمكن العثور على GitHub، والذي يحتوي على أمثلة التعليمات البرمجية في التشغيل السريع.

const msRest = require("@azure/ms-rest-js");
const Face = require("@azure/cognitiveservices-face");
const uuid = require("uuid/v4");

أنشئ متغيرات لنقطة نهاية Azure لموردك والمفتاح.

هام

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

هام

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

key = "<paste-your-face-key-here>"
endpoint = "<paste-your-face-endpoint-here>"

نموذج الكائن

تتعامل الفئات والواجهات التالية مع بعض الميزات الرئيسية لمكتبة عميل Face .NET:

الاسم الوصف
FaceClient تمثل هذه الفئة التخويل الخاص بك لاستخدام خدمة Face، وتحتاج إليها لجميع وظائف Face. تقوم بإنشاء مثيل لها بمعلومات اشتراكك، وتستخدمها لإنتاج مثيلات الفئات الأخرى.
وجه تعالج هذه الفئة مهام الكشف والتعرف الأساسية التي يمكنك القيام بها مع الوجوه البشرية.
DetectedFace تمثل هذه الفئة جميع البيانات التي تم اكتشافها من وجه واحد في صورة. يمكنك استخدامه لاسترداد معلومات مفصلة عن الوجه.
FaceList تدير هذه الفئة بنيات FaceList المخزنة على السحابة، والتي تخزن مجموعة متنوعة من الوجوه.
PersonGroupPerson تدير هذه الفئة بنيات الشخص المخزنة على السحابة، والتي تخزن مجموعة من الوجوه التي تنتمي إلى شخص واحد.
PersonGroup تدير هذه الفئة بنيات PersonGroup المخزنة في مجموعة النظراء، والتي تخزن مجموعة من كائنات الأشخاص المتنوعة.

أمثلة التعليمات البرمجية

توضح لك قصاصات التعليمات البرمجية الواردة أدناه كيفية تنفيذ المهام التالية باستخدام مكتبة عميل Face من أجل ‎.NET:

تلميح

هل تريد عرض ملف التعليمات البرمجية للتشغيل السريع بالكامل مرةً واحدة؟ يُمكن العثور على GitHub، والذي يحتوي على أمثلة التعليمات البرمجية في التشغيل السريع.

مصادقة العميل

إنشاء مثيل لعميل باستخدام نقطة النهاية والمفتاح. أنشئ كائن ApiKeyCredentials باستخدام مفتاحك، واستخدامه مع نقطة النهاية لإنشاء كائن FaceClient .

const credentials = new msRest.ApiKeyCredentials({ inHeader: { 'Ocp-Apim-Subscription-Key': key } });
const client = new Face.FaceClient(credentials, endpoint);

إعلان القيم العالمية والدالة المساعدة

القيم العمومية التالية مطلوبة للعديد من عمليات Face التي ستقوم بإضافتها لاحقاً.

يشير عنوان URL إلى مجلد يحتوي على عينة من الصور. سوف يعمل UUID كاسم ومعرف لمجموعة الأشخاص التي ستقوم بإنشائها.

const image_base_url = "https://csdx.blob.core.windows.net/resources/Face/Images/";
const person_group_id = uuid();

يمكنك استخدام الوظيفة التالية لانتظار اكتمال تدريب PersonGroup.

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

الكشف عن الوجوه وتحليلها

ينبغي اكتشاف الوجه كخطوة أولى في تحليل Face والتحقق من الهوية. يوضح هذا القسم كيفية إرجاع بيانات سمة الوجه الإضافية. إذا كنت ترغب فقط في اكتشاف الوجوه للتعرف على الوجه أو التحقق منه، فانتقل إلى الأقسام الأحدث.

الحصول على كائنات الوجه المكتشفة

أنشئ أسلوبًا جديدًا للكشف عن الوجوه. يعالج الأسلوب DetectFaceExtract ثلاث صور في عنوان URL المحدد ويقوم بإنشاء قائمة بكائنات DetectedFace في ذاكرة البرنامج. تحدد قائمة قيم FaceAttributeType الميزات التي سيتم استخراجها.

تقوم الطريقة DetectFaceExtract بعد ذلك بتحليل وطباعة بيانات السمة لكل وجه تم اكتشافه. يجب تحديد كل سمة بشكلٍ منفصل في استدعاء API للكشف عن الوجه الأصلي (في القائمة FaceAttributeType). تعالج التعليمات البرمجية التالية كل سمة، ولكن من المحتمل أنك ستحتاج فقط إلى استخدام واحدة أو عدد قليل.

السمة "QualityForRecognition" هي مؤشر على جودة الصورة الإجمالية فيما يتعلق بما إذا كانت الصورة المستخدمة في الكشف ذات جودة كافية لمحاولة التعرف على الوجه. للاستفادة من سمة الجودة، يحتاج المستخدمون إلى تعيين إصدار النموذج عن طريق تعيين معلمة detectionModel إلى detection_01 أو detection_03، ومعلمة recognitionModel recognition_03 أو recognition_04، وتضمين السمة QualityForRecognition في الطلب كما هو موضح في المثال أعلاه.

async function DetectFaceExtract() {
    console.log("========DETECT FACES========");
    console.log();

    // Create a list of images
    const image_file_names = [
        "detection1.jpg",    // single female with glasses
        // "detection2.jpg", // (optional: single man)
        // "detection3.jpg", // (optional: single male construction worker)
        // "detection4.jpg", // (optional: 3 people at cafe, 1 is blurred)
        "detection5.jpg",    // family, woman child man
        "detection6.jpg"     // elderly couple, male female
    ];

// NOTE await does not work properly in for, forEach, and while loops. Use Array.map and Promise.all instead.
    await Promise.all (image_file_names.map (async function (image_file_name) {
        let detected_faces = await client.face.detectWithUrl(image_base_url + image_file_name,
            {
                returnFaceAttributes: ["Accessories","Age","Blur","Emotion","Exposure","FacialHair","Glasses","Hair","HeadPose","Makeup","Noise","Occlusion","Smile","QualityForRecognition"],
                // We specify detection model 1 because we are retrieving attributes.
                detectionModel: "detection_01",
                recognitionModel: "recognition_03"
            });
        console.log (detected_faces.length + " face(s) detected from image " + image_file_name + ".");
        console.log("Face attributes for face(s) in " + image_file_name + ":");

// Parse and print all attributes of each detected face.
        detected_faces.forEach (async function (face) {
            // Get the bounding box of the face
            console.log("Bounding box:\n  Left: " + face.faceRectangle.left + "\n  Top: " + face.faceRectangle.top + "\n  Width: " + face.faceRectangle.width + "\n  Height: " + face.faceRectangle.height);

            // Get the accessories of the face
            let accessories = face.faceAttributes.accessories.join();
            if (0 === accessories.length) {
                console.log ("No accessories detected.");
            }
            else {
                console.log ("Accessories: " + accessories);
            }

            // Get face other attributes
            console.log("Age: " + face.faceAttributes.age);
            console.log("Blur: " + face.faceAttributes.blur.blurLevel);

            // Get emotion on the face
            let emotions = "";
            let emotion_threshold = 0.0;
            if (face.faceAttributes.emotion.anger > emotion_threshold) { emotions += "anger, "; }
            if (face.faceAttributes.emotion.contempt > emotion_threshold) { emotions += "contempt, "; }
            if (face.faceAttributes.emotion.disgust > emotion_threshold) { emotions +=  "disgust, "; }
            if (face.faceAttributes.emotion.fear > emotion_threshold) { emotions +=  "fear, "; }
            if (face.faceAttributes.emotion.happiness > emotion_threshold) { emotions +=  "happiness, "; }
            if (face.faceAttributes.emotion.neutral > emotion_threshold) { emotions +=  "neutral, "; }
            if (face.faceAttributes.emotion.sadness > emotion_threshold) { emotions +=  "sadness, "; }
            if (face.faceAttributes.emotion.surprise > emotion_threshold) { emotions +=  "surprise, "; }
            if (emotions.length > 0) {
                console.log ("Emotions: " + emotions.slice (0, -2));
            }
            else {
                console.log ("No emotions detected.");
            }
            
            // Get more face attributes
            console.log("Exposure: " + face.faceAttributes.exposure.exposureLevel);
            if (face.faceAttributes.facialHair.moustache + face.faceAttributes.facialHair.beard + face.faceAttributes.facialHair.sideburns > 0) {
                console.log("FacialHair: Yes");
            }
            else {
                console.log("FacialHair: No");
            }
            console.log("Glasses: " + face.faceAttributes.glasses);

            // Get hair color
            var color = "";
            if (face.faceAttributes.hair.hairColor.length === 0) {
                if (face.faceAttributes.hair.invisible) { color = "Invisible"; } else { color = "Bald"; }
            }
            else {
                color = "Unknown";
                var highest_confidence = 0.0;
                face.faceAttributes.hair.hairColor.forEach (function (hair_color) {
                    if (hair_color.confidence > highest_confidence) {
                        highest_confidence = hair_color.confidence;
                        color = hair_color.color;
                    }
                });
            }
            console.log("Hair: " + color);

            // Get more attributes
            console.log("Head pose:");
            console.log("  Pitch: " + face.faceAttributes.headPose.pitch);
            console.log("  Roll: " + face.faceAttributes.headPose.roll);
            console.log("  Yaw: " + face.faceAttributes.headPose.yaw);
 
            console.log("Makeup: " + ((face.faceAttributes.makeup.eyeMakeup || face.faceAttributes.makeup.lipMakeup) ? "Yes" : "No"));
            console.log("Noise: " + face.faceAttributes.noise.noiseLevel);

            console.log("Occlusion:");
            console.log("  Eye occluded: " + (face.faceAttributes.occlusion.eyeOccluded ? "Yes" : "No"));
            console.log("  Forehead occluded: " + (face.faceAttributes.occlusion.foreheadOccluded ? "Yes" : "No"));
            console.log("  Mouth occluded: " + (face.faceAttributes.occlusion.mouthOccluded ? "Yes" : "No"));

            console.log("Smile: " + face.faceAttributes.smile);

            console.log("QualityForRecognition: " + face.faceAttributes.qualityForRecognition)
            console.log();
        });
    }));
}

تعالج التعليمات البرمجية أعلاه الصور البعيدة التالية:

Photo of a woman smilingPhoto of a man, woman, and babyPhoto of an older man and woman

تلميح

كما يمكنك اكتشاف الوجوه في صورة محلية. راجع أساليب Face مثل DetectWithStreamAsync.

التعرف على الوجه

تلتقط عملية التحديد صورة شخص (أو عدة أشخاص) وتبحث للعثور على كائن الشخص المخزن المرتبط بكل وجه في الصورة (بحث التعرف على الوجه). وتقارن كل وجه تم اكتشافه بـ PersonGroup، وهي قاعدة بيانات لكائنات الشخص المختلفة التي تعرف ملامح وجههم. للقيام بعملية تحديد، تحتاج أولاً إلى إنشاء PersonGroup والتدريب عليه.

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

إنشاء الدالة التالية لإضافة وجوه إلى PersonGroup.

async function AddFacesToPersonGroup(person_dictionary, person_group_id) {
    console.log ("Adding faces to person group...");
    // The similar faces will be grouped into a single person group person.
    
    await Promise.all (Object.keys(person_dictionary).map (async function (key) {
        const value = person_dictionary[key];

        // Wait briefly so we do not exceed rate limits.
        await sleep (1000);

        let person = await client.personGroupPerson.create(person_group_id, { name : key });
        console.log("Create a person group person: " + key + ".");

        // Add faces to the person group person.
        await Promise.all (value.map (async function (similar_image) {
            // Check if the image is of sufficent quality for recognition.
            let sufficientQuality = true;
            let detected_faces = await client.face.detectWithUrl(image_base_url + similar_image,
                {
                    returnFaceAttributes: ["QualityForRecognition"],
                    detectionModel: "detection_03",
                    recognitionModel: "recognition_03"
                });
            detected_faces.forEach(detected_face => {
                if (detected_face.faceAttributes.qualityForRecognition != 'high'){
                    sufficientQuality = false;
                }
            });

            // Quality is sufficent, add to group.
            if (sufficientQuality){
                console.log("Add face to the person group person: (" + key + ") from image: " + similar_image + ".");
                await client.personGroupPerson.addFaceFromUrl(person_group_id, person.personId, image_base_url + similar_image);
            }
        }));
    }));

    console.log ("Done adding faces to person group.");
}

انتظر تدريب PersonGroup

أنشئ الدالة المساعدة التالية لانتظار اكتمال تدريب PersonGroup.

async function WaitForPersonGroupTraining(person_group_id) {
    // Wait so we do not exceed rate limits.
    console.log ("Waiting 10 seconds...");
    await sleep (10000);
    let result = await client.personGroup.getTrainingStatus(person_group_id);
    console.log("Training status: " + result.status + ".");
    if (result.status !== "succeeded") {
        await WaitForPersonGroupTraining(person_group_id);
    }
}

إنشاء PersonGroup

التعليمات البرمجية التالية:

  • إنشاء PersonGroup
  • إضافة وجوه إلى PersonGroup عن طريق استدعاء AddFacesToPersonGroup، الذي قمت بتعريفه مسبقاً.
  • تدريب PersonGroup.
  • تحديد الوجوه في PersonGroup.

إن هذه PersonGroup وكائنات الشخص المرتبطة بها جاهزة الآن للاستخدام في عمليات التحقق أو التحديد أو المجموعة.

async function IdentifyInPersonGroup() {
    console.log("========IDENTIFY FACES========");
    console.log();

// Create a dictionary for all your images, grouping similar ones under the same key.
    const person_dictionary = {
        "Family1-Dad" : ["Family1-Dad1.jpg", "Family1-Dad2.jpg"],
        "Family1-Mom" : ["Family1-Mom1.jpg", "Family1-Mom2.jpg"],
        "Family1-Son" : ["Family1-Son1.jpg", "Family1-Son2.jpg"],
        "Family1-Daughter" : ["Family1-Daughter1.jpg", "Family1-Daughter2.jpg"],
        "Family2-Lady" : ["Family2-Lady1.jpg", "Family2-Lady2.jpg"],
        "Family2-Man" : ["Family2-Man1.jpg", "Family2-Man2.jpg"]
    };

    // A group photo that includes some of the persons you seek to identify from your dictionary.
    let source_image_file_name = "identification1.jpg";

    // Create a person group. 
    console.log("Creating a person group with ID: " + person_group_id);
    await client.personGroup.create(person_group_id, { name : person_group_id, recognitionModel : "recognition_04" });

    await AddFacesToPersonGroup(person_dictionary, person_group_id);

    // Start to train the person group.
    console.log();
    console.log("Training person group: " + person_group_id + ".");
    await client.personGroup.train(person_group_id);

    await WaitForPersonGroupTraining(person_group_id);
    console.log();

    // Detect faces from source image url and only take those with sufficient quality for recognition.
    let face_ids = (await DetectFaceRecognize(image_base_url + source_image_file_name)).map (face => face.faceId);
    // Identify the faces in a person group.
    let results = await client.face.identify(face_ids, { personGroupId : person_group_id});
    await Promise.all (results.map (async function (result) {
        let person = await client.personGroupPerson.get(person_group_id, result.candidates[0].personId);
        console.log("Person: " + person.name + " is identified for face in: " + source_image_file_name + " with ID: " + result.faceId + ". Confidence: " + result.candidates[0].confidence + ".");
    }));
    console.log();
}

تلميح

يمكنك أيضاً إنشاء PersonGroup من الصور المحلية. راجع أساليب PersonGroupPerson مثل AddFaceFromStream.

العثور على وجوه متشابهة

تأخذ التعليمات البرمجية التالية وجهًا واحدًا تم اكتشافه (المصدر) وتقوم بالبحث عن مجموعة من الوجوه الأخرى (الهدف) للعثور على الوجوه المطابقة (البحث عن الوجه عن طريق الصورة). عندما تعثر على تطابق، فإنها تنشر معرف الوجه المطابق إلى وحدة التحكم.

الكشف عن الوجوه للمقارنة

أولاً، حدد أسلوبًا ثانيًا للكشف عن الوجه. تحتاج إلى الكشف عن الوجوه في الصور قبل أن تتمكن من مقارنتها، وقد تم تحسين طريقة الكشف هذه لأجل عمليات المقارنة. لا يستخرج سمات الوجه التفصيلية كما في القسم أعلاه، ويستخدم نموذجًا مختلفًا للتعرف.

async function DetectFaceRecognize(url) {
    // Detect faces from image URL. Since only recognizing, use the recognition model 4.
    // We use detection model 3 because we are only retrieving the qualityForRecognition attribute.
    // Result faces with quality for recognition lower than "medium" are filtered out.
    let detected_faces = await client.face.detectWithUrl(url,
        {
            detectionModel: "detection_03",
            recognitionModel: "recognition_04",
            returnFaceAttributes: ["QualityForRecognition"]
        });
    return detected_faces.filter(face => face.faceAttributes.qualityForRecognition == 'high' || face.faceAttributes.qualityForRecognition == 'medium');
}

البحث عن المطابقات

يكتشف الأسلوب التالي الوجوه في مجموعة من الصور المستهدفة وفي صورة مصدر واحد. ثم يقارنها ويجد كل الصور المستهدفة المشابهة للصورة المصدر. أخيرًا، يقوم بطباعة تفاصيل التطابق إلى وحدة التحكم.

// Find a similar face(s) in the list of IDs. Comapring only the first in list for testing purposes.
let results = await client.face.findSimilar(detected_faces[0].faceId, { faceIds : target_face_ids });
results.forEach (function (result) {
    console.log("Faces from: " + source_image_file_name + " and ID: " + result.faceId + " are similar with confidence: " + result.confidence + ".");
});
console.log();

في هذا البرنامج، سيتم استخدام الصورة البعيدة التالية كمصدر:

Photo of a man smiling

يجب إرجاع الوجه المكتشف في هذه الصورة كوجه مشابه لوجه الصورة المصدر.

Photo of a man smiling; this is the same person as the previous image

رئيسي

في النهاية، أنشئ دالة main وأطلق عليها اسماً.

async function main() {
    await DetectFaceExtract();
    await FindSimilar();
    await IdentifyInPersonGroup();
    console.log ("Done.");
}
main();

شغّل التطبيق

شغّل التطبيق باستخدام الأمر node المُتاح على ملف التشغيل السريع.

node index.js

تنظيف الموارد

إذا كنت تريد تنظيف وإلغاء اشتراك الخدمات المعرفية، يمكنك حذف المورد أو مجموعة الموارد. يؤدي حذف مجموعة الموارد إلى حذف أية موارد أخرى مقترنة بها أيضًا.

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

في هذا التشغيل السريع، تعلمت كيفية استخدام مكتبة عميل Face لـ JavaScript للقيام بمهام التعرف على الوجه الأساسية. بعد ذلك، تعرفت على نماذج كشف الوجه المختلفة وكيفية تحديد النموذج المناسب لحالة الاستخدام.

ابدأ بالتعرف على الوجه باستخدام مكتبة عميل Face لـ Python. اتبع هذه الخطوات لتثبيت الحزمة وتجربة نموذج تعليمات البرمجة للمهام الأساسية. توفر لك خدمة Face إمكانية الوصول إلى الخوارزميات المتقدمة للكشف عن الوجوه البشرية والتعرف عليها في الصور.

استخدام مكتبة عميل Face لـ Python لما يلي:

⁩الوثائق المرجعية⁧⁩⁧ | ⁩⁧⁩كود مصدر المكتبة⁧⁩⁧ | ⁩⁧⁩حزمة (PiPy)⁧⁩⁧ | ⁩⁧⁩عينات⁧

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا
  • ⁩Python 3.x⁧
    • يجب أن يتضمن تثبيت Python خاصتك pip. يمكنك التحقق مما إذا كانت لديك نقطة مثبتة عن طريق تشغيل pip --version على سطر الأوامر. الحصول على نقطة عن طريق تثبيت أحدث إصدار من Python.
  • يجب أن يكون لحساب Azure دور مساهم في الخدمات المعرفية تم تعيينه لكي توافق على شروط الذكاء الاصطناعي المسؤولة وإنشاء مورد. للحصول على هذا الدور المعين لحسابك، اتبع الخطوات الواردة في وثائق تعيين الأدوار ، أو اتصل بالمسؤول.
  • بمجرد أن يكون لديك اشتراك Azure، قم بإنشاء مورد Face في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. بعد نشره، انقر فوق "Go to resource" .
    • ستحتاج إلى المفتاح ونقطة النهاية من المورد الذي تنشئه لتوصيل التطبيق بواجهة برمجة تطبيقات Face. ستلصق المفتاح ونقطة النهاية في التعليمات البرمجية أدناه لاحقًا في البدء السريع.
    • يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

الإعداد

تثبيت مكتبة العميل

بعد تثبيت Python، يمكنك تثبيت مكتبة العميل عن طريق:

pip install --upgrade azure-cognitiveservices-vision-face

إنشاء تطبيق Python جديد

إنشاء برنامج نصي Python جديد — quickstart-file.py، على سبيل المثال. ثم افتحه في المحرر المفضل لديك أو IDE واستورد المكتبات التالية.

import asyncio
import io
import glob
import os
import sys
import time
import uuid
import requests
from urllib.parse import urlparse
from io import BytesIO
# To install this module, run:
# python -m pip install Pillow
from PIL import Image, ImageDraw
from azure.cognitiveservices.vision.face import FaceClient
from msrest.authentication import CognitiveServicesCredentials
from azure.cognitiveservices.vision.face.models import TrainingStatusType, Person, QualityForRecognition

تلميح

هل تريد عرض ملف التعليمات البرمجية للتشغيل السريع بالكامل مرةً واحدة؟ يمكنك العثور عليه على GitHub، والذي يحتوي على أمثلة الرمز في بدء التشغيل السريع هذا.

ثم قم بإنشاء متغيرات نقطة النهاية لموردك ومفتاحك Azure .

# This key will serve all examples in this document.
KEY = "PASTE_YOUR_FACE_SUBSCRIPTION_KEY_HERE"

# This endpoint will be used in all examples in this quickstart.
ENDPOINT = "PASTE_YOUR_FACE_ENDPOINT_HERE"

هام

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

هام

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

طراز الكائن

تتعامل الفئات والواجهات التالية مع بعض الميزات الرئيسية لمكتبة عميل Face Python.

الاسم الوصف
FaceClient تمثل هذه الفئة التخويل الخاص بك لاستخدام خدمة Face، وتحتاج إليها لجميع وظائف Face. تقوم بإنشاء مثيل لها بمعلومات اشتراكك، وتستخدمها لإنتاج مثيلات الفئات الأخرى.
FaceOperations تعالج هذه الفئة مهام الكشف والتعرف الأساسية التي يمكنك القيام بها مع الوجوه البشرية.
DetectedFace تمثل هذه الفئة جميع البيانات التي تم اكتشافها من وجه واحد في صورة. يمكنك استخدامها لاسترداد معلومات مفصلة عن الوجه.
FaceListOperations تدير هذه الفئة بنيات ⁧⁩FaceList⁧⁩ المخزنة في السحابة، والتي تخزن مجموعة متنوعة من الوجوه.
⁩PersonGroupPersonOperations⁧ تدير هذه الفئة بنيات ⁧⁩⁩Person⁦⁩ المخزنة في السحابة، والتي تخزن مجموعة من الوجوه التي تنتمي إلى شخص واحد.
PersonGroupOperations تدير هذه الفئة بنيات ⁧⁩PersonGroup⁧⁩ المخزنة في مجموعة النظراء، والتي تخزن مجموعة من كائنات ⁧⁩الأشخاص⁧⁩ المتنوعة.
⁩ShapshotOperations⁧ هذه الفئة تدير وظيفة اللقطة، والتي يمكنك استخدامها لحفظ جميع بيانات الوجه المستندة إلى مجموعة النظراء مؤقتًا، وترحيل تلك البيانات إلى اشتراك Azure جديد.

أمثلة على التعليمات البرمجية

توضح لك قصاصات التعليمات البرمجية هذه كيفية تنفيذ المهام التالية باستخدام مكتبة عميل Face لـ Python:

مصادقة العميل

أنشئ مثيلاً لعميل باستخدام نقطة النهاية والمفتاح. أنشئ كائن ⁧⁩CognitiveServicesCredentials⁧⁩ باستخدام مفتاحك، واستخدمه مع نقطة النهاية لإنشاء كائن ⁧⁩FaceClient⁧⁩.

# Create an authenticated FaceClient.
face_client = FaceClient(ENDPOINT, CognitiveServicesCredentials(KEY))

اكتشاف وتحليل الوجوه

مطلوب الكشف عن الوجه في تحليل Face والتحقق من الهوية. يوضح هذا القسم كيفية إرجاع بيانات سمة الوجه الإضافية. إذا كنت ترغب فقط في اكتشاف الوجوه للتعرف على الوجه أو التحقق منه، فانتقل إلى الأقسام الأحدث.

التعليمات البرمجية التالية تكشف عن وجه في صورة بعيدة. يقوم بطباعة معرف الوجه المكتشف إلى وحدة التحكم ويخزنه أيضًا في ذاكرة البرنامج. ثم يكتشف الوجوه في صورة مع أشخاص متعددين ويطبع معرفاتهم إلى وحدة التحكم أيضًا. بتغيير المعلمات في أسلوب ⁧⁩detect_with_url⁧⁩، يمكنك إرجاع معلومات مختلفة مع كل كائن ⁧⁩DetectedFace⁧⁩.

السمة "QualityForRecognition" هي مؤشر على جودة الصورة الإجمالية فيما يتعلق بما إذا كانت الصورة المستخدمة في الكشف ذات جودة كافية لمحاولة التعرف على الوجه. للاستفادة من سمة الجودة، يحتاج المستخدمون إلى تعيين إصدار النموذج عن طريق تعيين معلمة detectionModel إلى detection_01 أو detection_03، ومعلمة recognitionModel recognition_03 أو recognition_04، وتضمين السمة QualityForRecognition في الطلب كما هو موضح في المثال أعلاه.

# Detect a face in an image that contains a single face
single_face_image_url = 'https://www.biography.com/.image/t_share/MTQ1MzAyNzYzOTgxNTE0NTEz/john-f-kennedy---mini-biography.jpg'
single_image_name = os.path.basename(single_face_image_url)
# We use detection model 3 to get better performance.
detected_faces = face_client.face.detect_with_url(url=single_face_image_url, detection_model='detection_03')
if not detected_faces:
    raise Exception('No face detected from image {}'.format(single_image_name))

# Display the detected face ID in the first single-face image.
# Face IDs are used for comparison to faces (their IDs) detected in other images.
print('Detected face ID from', single_image_name, ':')
for face in detected_faces: print (face.face_id)
print()

# Save this ID for use in Find Similar
first_image_face_ID = detected_faces[0].face_id

تلميح

كما يمكنك اكتشاف الوجوه في صورة محلية. راجع أساليب ⁧⁩FaceOperations⁧⁩ مثل ⁧⁩detect_with_stream⁧⁩.

عرض وإطارات الوجوه

التعليمات البرمجية التالية تخرج الصورة المعطاة إلى الشاشة ثم ترسم مستطيلات حول الوجوه باستخدام خاصية DetectedFace.faceRectangle.

# Detect a face in an image that contains a single face
single_face_image_url = 'https://raw.githubusercontent.com/Microsoft/Cognitive-Face-Windows/master/Data/detection1.jpg'
single_image_name = os.path.basename(single_face_image_url)
# We use detection model 3 to get better performance.
detected_faces = face_client.face.detect_with_url(url=single_face_image_url, detection_model='detection_03')
if not detected_faces:
    raise Exception('No face detected from image {}'.format(single_image_name))

# Convert width height to a point in a rectangle
def getRectangle(faceDictionary):
    rect = faceDictionary.face_rectangle
    left = rect.left
    top = rect.top
    right = left + rect.width
    bottom = top + rect.height
    
    return ((left, top), (right, bottom))

def drawFaceRectangles() :
# Download the image from the url
    response = requests.get(single_face_image_url)
    img = Image.open(BytesIO(response.content))

# For each face returned use the face rectangle and draw a red box.
    print('Drawing rectangle around face... see popup for results.')
    draw = ImageDraw.Draw(img)
    for face in detected_faces:
        draw.rectangle(getRectangle(face), outline='red')

# Display the image in the default image browser.
    img.show()

# Uncomment this to show the face rectangles.
#    drawFaceRectangles()

A young woman with a red rectangle drawn around the face

التعرف على الوجه

عملية التعرف تلتقط صورة لشخص (أو عدة أشخاص) وتبحث للتعرف على كل وجه في الصورة (البحث للتعرف على الوجه). وتقارن كل وجه تم اكتشافه بـ ⁧⁩PersonGroup⁧⁩، وهي قاعدة بيانات لكائنات ⁧⁩Person⁩ المختلفة التي تعرف ملامح وجههم.

إنشاء PersonGroup

تقوم التعليمات البرمجية التالية بإنشاء ⁧⁩PersonGroup⁧⁩ باستخدام ثلاث كائنات ⁧⁩Person⁩ مختلفة. فهي تربط كل ⁧⁩Person⁩ بمجموعة من الصور المثل، ثم يتدرب على التعرف على كل شخص.

للتنقل خلال هذا السيناريو، تحتاج إلى حفظ الصور التالية إلى الدليل الجذر لمشروعك: ⁧ https://github.com/Azure-Samples/cognitive-services-sample-data-files/tree/master/Face/images ⁩.

تحتوي مجموعة الصور هذه على ثلاث مجموعات من صور الوجه المقابلة لثلاثة أشخاص مختلفين. ستقوم التعليمة البرمجية بتعريف ثلاثة كائنات ⁧⁩Person⁩ وربطها بملفات الصور التي تبدأ بـ ⁧woman⁩ و⁧man⁩ و⁧child⁩.

بمجرد إعداد الصور، حدد تسمية أعلى البرنامج النصي لكائن ⁧⁩PersonGroup⁧⁩ الذي ستقوم بإنشائه.

# Used in the Person Group Operations and Delete Person Group examples.
# You can call list_person_groups to print a list of preexisting PersonGroups.
# SOURCE_PERSON_GROUP_ID should be all lowercase and alphanumeric. For example, 'mygroupname' (dashes are OK).
PERSON_GROUP_ID = str(uuid.uuid4()) # assign a random ID (or name it anything)

# Used for the Delete Person Group example.
TARGET_PERSON_GROUP_ID = str(uuid.uuid4()) # assign a random ID (or name it anything)

ثم أضف التعليمات البرمجية التالية إلى أسفل برنامجك النصي. ينشئ هذا الرمز ⁧⁩PersonGroup⁧⁩ وكائنات ⁧⁩Person⁩ الثلاثة.

'''
Create the PersonGroup
'''
# Create empty Person Group. Person Group ID must be lower case, alphanumeric, and/or with '-', '_'.
print('Person group:', PERSON_GROUP_ID)
face_client.person_group.create(person_group_id=PERSON_GROUP_ID, name=PERSON_GROUP_ID)

# Define woman friend
woman = face_client.person_group_person.create(PERSON_GROUP_ID, "Woman")
# Define man friend
man = face_client.person_group_person.create(PERSON_GROUP_ID, "Man")
# Define child friend
child = face_client.person_group_person.create(PERSON_GROUP_ID, "Child")

تعيين الوجوه للأشخاص

تقوم التعليمات البرمجية التالية بفرز الصور حسب بادئتها، واكتشاف الوجوه، وتعيين الوجوه لكل كائن ⁧⁩Person⁩.

'''
Detect faces and register to correct person
'''
# Find all jpeg images of friends in working directory
woman_images = [file for file in glob.glob('*.jpg') if file.startswith("w")]
man_images = [file for file in glob.glob('*.jpg') if file.startswith("m")]
child_images = [file for file in glob.glob('*.jpg') if file.startswith("ch")]

# Add to a woman person
for image in woman_images:
    w = open(image, 'r+b')
    # Check if the image is of sufficent quality for recognition.
    sufficientQuality = True
    detected_faces = face_client.face.detect_with_url(url=single_face_image_url, detection_model='detection_03', recognition_model='recognition_04', return_face_attributes=['qualityForRecognition'])
    for face in detected_faces:
        if face.face_attributes.quality_for_recognition != QualityForRecognition.high:
            sufficientQuality = False
            break
    if not sufficientQuality: continue
    face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, woman.person_id, w)

# Add to a man person
for image in man_images:
    m = open(image, 'r+b')
    # Check if the image is of sufficent quality for recognition.
    sufficientQuality = True
    detected_faces = face_client.face.detect_with_url(url=single_face_image_url, detection_model='detection_03', recognition_model='recognition_04', return_face_attributes=['qualityForRecognition'])
    for face in detected_faces:
        if face.face_attributes.quality_for_recognition != QualityForRecognition.high:
            sufficientQuality = False
            break
    if not sufficientQuality: continue
    face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, man.person_id, m)

# Add to a child person
for image in child_images:
    ch = open(image, 'r+b')
    # Check if the image is of sufficent quality for recognition.
    sufficientQuality = True
    detected_faces = face_client.face.detect_with_url(url=single_face_image_url, detection_model='detection_03', recognition_model='recognition_04', return_face_attributes=['qualityForRecognition'])
    for face in detected_faces:
        if face.face_attributes.quality_for_recognition != QualityForRecognition.high:
            sufficientQuality = False
            break
    if not sufficientQuality: continue
    face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, child.person_id, ch)

تلميح

كما يمكنك إنشاء ⁧⁩PersonGroup⁧⁩ من الصور البعيدة المشار إليها بواسطة عنوان URL. راجع أساليب ⁧⁩الأشخاص المشاركين في العمليات⁧⁩ مثل ⁧⁩add_face_from_url⁧⁩.

تدريب PersonGroup

بمجرد تعيين الوجوه، يجب تدريب ⁧⁩PersonGroup⁧⁩ بحيث يمكنه التعرف على المعالم المرئية المقترنة بكل كائن ⁧⁩Person⁩ الخاصة بها. التعليمات البرمجية التالية تستدعي أسلوب ⁧⁩التدريب⁧⁩ غير المتزامن وتستقصي النتيجة وتطبق الحالة إلى وحدة التحكم.

'''
Train PersonGroup
'''
print()
print('Training the person group...')
# Train the person group
face_client.person_group.train(PERSON_GROUP_ID)

while (True):
    training_status = face_client.person_group.get_training_status(PERSON_GROUP_ID)
    print("Training status: {}.".format(training_status.status))
    print()
    if (training_status.status is TrainingStatusType.succeeded):
        break
    elif (training_status.status is TrainingStatusType.failed):
        face_client.person_group.delete(person_group_id=PERSON_GROUP_ID)
        sys.exit('Training the person group has failed.')
    time.sleep(5)

تلميح

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

الحصول على صورة اختبار

التعليمة البرمجية التالية تبحث في جذر مشروعك عن ⁧⁩ test-image-person-group.jpg⁧⁩ ويكتشف الوجوه في الصورة. يمكنك العثور على هذه الصورة مع الصور المستخدمة لإدارة ⁧⁩PersonGroup:⁧⁩⁧ https://github.com/Azure-Samples/cognitive-services-sample-data-files/tree/master/Face/images ⁩.

'''
Identify a face against a defined PersonGroup
'''
# Group image for testing against
test_image_array = glob.glob('test-image-person-group.jpg')
image = open(test_image_array[0], 'r+b')

print('Pausing for 60 seconds to avoid triggering rate limit on free account...')
time.sleep (60)

# Detect faces
face_ids = []
# We use detection model 3 to get better performance, recognition model 4 to support quality for recognition attribute.
faces = face_client.face.detect_with_stream(image, detection_model='detection_03', recognition_model='recognition_04', return_face_attributes=['qualityForRecognition'])
for face in faces:
    # Only take the face if it is of sufficient quality.
    if face.face_attributes.quality_for_recognition == QualityForRecognition.high or face.face_attributes.quality_for_recognition == QualityForRecognition.medium:
        face_ids.append(face.face_id)

إخراج معرفات الوجه المتعرف عليه

يأخذ أسلوب ⁧⁩التعريف⁧⁩ صفيفًا من الوجوه المكتشفة ويقارنها بـ ⁧⁩PersonGroup⁧⁩. إذا كان يمكن أن يتطابق مع وجه مكتشف عن ⁧⁩Person⁩، فإنه يحفظ النتيجة. يطبع هذا الرمز نتائج مطابقة مفصلة لوحدة التحكم.

# Identify faces
results = face_client.face.identify(face_ids, PERSON_GROUP_ID)
print('Identifying faces in {}'.format(os.path.basename(image.name)))
if not results:
    print('No person identified in the person group for faces from {}.'.format(os.path.basename(image.name)))
for person in results:
    if len(person.candidates) > 0:
        print('Person for face ID {} is identified in {} with a confidence of {}.'.format(person.face_id, os.path.basename(image.name), person.candidates[0].confidence)) # Get topmost confidence score
    else:
        print('No person identified for face ID {} in {}.'.format(person.face_id, os.path.basename(image.name)))

التحقق من الوجوه

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

التعليمات البرمجية التالية تكشف عن الوجوه في صورتين مصدر، ثم يتحقق منها مقابل وجه تم الكشف عنه من صورة هدف.

الحصول على صور الاختبار

تقوم كتل التعليمات البرمجية التالية بتعريف المتغيرات التي تشير إلى المصدر والصور الهدف لعملية التحقق.

# Base url for the Verify and Facelist/Large Facelist operations
IMAGE_BASE_URL = 'https://csdx.blob.core.windows.net/resources/Face/Images/'
# Create a list to hold the target photos of the same person
target_image_file_names = ['Family1-Dad1.jpg', 'Family1-Dad2.jpg']
# The source photos contain this person
source_image_file_name1 = 'Family1-Dad3.jpg'
source_image_file_name2 = 'Family1-Son1.jpg'

الكشف عن الوجوه للتحقق

التعليمات البرمجية التالية تكشف عن الوجوه في المصدر والصور الهدف وحفظها إلى المتغيرات.

# Detect face(s) from source image 1, returns a list[DetectedFaces]
# We use detection model 3 to get better performance.
detected_faces1 = face_client.face.detect_with_url(IMAGE_BASE_URL + source_image_file_name1, detection_model='detection_03')
# Add the returned face's face ID
source_image1_id = detected_faces1[0].face_id
print('{} face(s) detected from image {}.'.format(len(detected_faces1), source_image_file_name1))

# Detect face(s) from source image 2, returns a list[DetectedFaces]
detected_faces2 = face_client.face.detect_with_url(IMAGE_BASE_URL + source_image_file_name2, detection_model='detection_03')
# Add the returned face's face ID
source_image2_id = detected_faces2[0].face_id
print('{} face(s) detected from image {}.'.format(len(detected_faces2), source_image_file_name2))

# List for the target face IDs (uuids)
detected_faces_ids = []
# Detect faces from target image url list, returns a list[DetectedFaces]
for image_file_name in target_image_file_names:
    # We use detection model 3 to get better performance.
    detected_faces = face_client.face.detect_with_url(IMAGE_BASE_URL + image_file_name, detection_model='detection_03')
    # Add the returned face's face ID
    detected_faces_ids.append(detected_faces[0].face_id)
    print('{} face(s) detected from image {}.'.format(len(detected_faces), image_file_name))

الحصول على نتائج التحقق

التعليمات البرمجية التالية تقارن كلاً من الصور المصدر إلى الصورة الهدف ثم طباعة رسالة تشير إلى ما إذا كانت تنتمي إلى نفس الشخص.

# Verification example for faces of the same person. The higher the confidence, the more identical the faces in the images are.
# Since target faces are the same person, in this example, we can use the 1st ID in the detected_faces_ids list to compare.
verify_result_same = face_client.face.verify_face_to_face(source_image1_id, detected_faces_ids[0])
print('Faces from {} & {} are of the same person, with confidence: {}'
    .format(source_image_file_name1, target_image_file_names[0], verify_result_same.confidence)
    if verify_result_same.is_identical
    else 'Faces from {} & {} are of a different person, with confidence: {}'
        .format(source_image_file_name1, target_image_file_names[0], verify_result_same.confidence))

# Verification example for faces of different persons.
# Since target faces are same person, in this example, we can use the 1st ID in the detected_faces_ids list to compare.
verify_result_diff = face_client.face.verify_face_to_face(source_image2_id, detected_faces_ids[0])
print('Faces from {} & {} are of the same person, with confidence: {}'
    .format(source_image_file_name2, target_image_file_names[0], verify_result_diff.confidence)
    if verify_result_diff.is_identical
    else 'Faces from {} & {} are of a different person, with confidence: {}'
        .format(source_image_file_name2, target_image_file_names[0], verify_result_diff.confidence))

العثور على وجوه متشابهة

تأخذ التعليمات البرمجية التالية وجهًا واحدًا تم اكتشافه (المصدر) وتقوم بالبحث عن مجموعة من الوجوه الأخرى (الهدف) للعثور على الوجوه المطابقة (البحث عن الوجه عن طريق الصورة). عند العثور على تطابق، فإنها تطبع معرف الوجه المطابق لوحدة التحكم.

البحث عن المطابقات

أولاً، قم بتشغيل التعليمات البرمجية في القسم أعلاه (⁧⁩كشف وتحليل الوجوه⁧⁩) لحفظ مرجع إلى وجه واحد. ثم قم بتشغيل التعليمات البرمجية التالية للحصول على مراجع إلى عدة وجوه في صورة مجموعة.

# Detect the faces in an image that contains multiple faces
# Each detected face gets assigned a new ID
multi_face_image_url = "http://www.historyplace.com/kennedy/president-family-portrait-closeup.jpg"
multi_image_name = os.path.basename(multi_face_image_url)
# We use detection model 3 to get better performance.
detected_faces2 = face_client.face.detect_with_url(url=multi_face_image_url, detection_model='detection_03')

ثم أضف كتلة التعليمات البرمجية التالية للبحث عن مثيلات الوجه الأول في المجموعة. راجع أسلوب ⁧⁩find_similar⁧⁩ لمعرفة كيفية تعديل هذا السلوك.

# Search through faces detected in group image for the single face from first image.
# First, create a list of the face IDs found in the second image.
second_image_face_IDs = list(map(lambda x: x.face_id, detected_faces2))
# Next, find similar face IDs like the one detected in the first image.
similar_faces = face_client.face.find_similar(face_id=first_image_face_ID, face_ids=second_image_face_IDs)
if not similar_faces:
    print('No similar faces found in', multi_image_name, '.')

استخدم التعليمات البرمجية التالية لطباعة تفاصيل المطابقة إلى وحدة التحكم.

# Print the details of the similar faces detected
else:
    print('Similar faces found in', multi_image_name + ':')
    for face in similar_faces:
        first_image_face_ID = face.face_id
        # The similar face IDs of the single face image and the group image do not need to match, 
        # they are only used for identification purposes in each image.
        # The similar faces are matched using the Cognitive Services algorithm in find_similar().
        face_info = next(x for x in detected_faces2 if x.face_id == first_image_face_ID)
        if face_info:
            print('  Face ID: ', first_image_face_ID)
            print('  Face rectangle:')
            print('    Left: ', str(face_info.face_rectangle.left))
            print('    Top: ', str(face_info.face_rectangle.top))
            print('    Width: ', str(face_info.face_rectangle.width))
            print('    Height: ', str(face_info.face_rectangle.height))

شغّل التطبيق

قم بتشغيل التطبيق التعرف على الوجه الخاص بك من دليل التطبيق باستخدام الأمرpython.

python quickstart-file.py

تنظيف الموارد

إذا كنت تريد تنظيف وإلغاء اشتراك الخدمات المعرفية، يمكنك حذف المورد أو مجموعة الموارد. يؤدي حذف مجموعة الموارد إلى حذف أية موارد أخرى مقترنة بها أيضًا.

إذا قمت بإنشاء ⁧⁩PersonGroup⁧⁩ في هذا التشغيل السريع وتريد حذفه، فقم بتشغيل التعليمات البرمجية التالية في برنامج النصي:

# Delete the main person group.
face_client.person_group.delete(person_group_id=PERSON_GROUP_ID)
print("Deleted the person group {} from the source location.".format(PERSON_GROUP_ID))
print()

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

في هذا التشغيل السريع، تعلمت كيفية استخدام مكتبة عميل Face لـ Python للقيام بمهام التعرف على الوجه الأساسية. بعد ذلك، تعرفت على نماذج كشف الوجه المختلفة وكيفية تحديد الطراز المناسب لحالة الاستخدام.

ابدأ بالتعرف على الوجه باستخدام Face REST API. توفر لك خدمة Face إمكانية الوصول إلى الخوارزميات المتقدمة للكشف عن الوجوه البشرية والتعرف عليها في الصور.

استخدم Face REST API من أجل:

ملاحظة

يستخدم بداية سريعة هذا أوامر cURL لاستدعاء واجهة برمجة تطبيقات REST. يمكنك أيضاً استدعاء REST API باستخدام لغة برمجة. راجع نماذج GitHub للحصول على أمثلة في C#‎ وPython و Java وJavaScript وGo.

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا
  • يجب أن يكون لحساب Azure دور مساهم في الخدمات المعرفية تم تعيينه لكي توافق على شروط الذكاء الاصطناعي المسؤولة وإنشاء مورد. للحصول على هذا الدور المعين إلى حسابك، اتبع الخطوات الواردة في وثائق تعيين الأدوار ، أو اتصل بالمسؤول.
  • بمجرد حصولك على اشتراك Azure، قم بإنشاء مورد Face في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. بعد انتشاره، انقر فوق "Go to resource" .
    • ستحتاج إلى المفتاح ونقطة النهاية من المورد الذي تنشئه لتوصيل التطبيق بواجهة برمجة تطبيقات Face. سوف تقوم بلصق المفتاح ونقطة النهاية في التعليمات البرمجية أدناه لاحقاً في التشغيل السريع.
    • يمكنك استخدام مستوى التسعير الحر (⁧F0⁩) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.
  • الإصدار 6.0+ من PowerShell، أو تطبيق سطر أوامر مشابهة.

الكشف عن الوجوه وتحليلها

يمكنك استخدام أمر مثل ما يلي للاتصال بواجهة برمجة تطبيقات Face والحصول على بيانات سمات الوجه من صورة. أولا، انسخ التعليمات البرمجية إلى محرر نص - ستحتاج إلى إجراء تغييرات على أجزاء معينة من الأمر قبل أن تتمكن من تشغيله.

curl -H "Ocp-Apim-Subscription-Key: TODO_INSERT_YOUR_FACE_SUBSCRIPTION_KEY_HERE" "TODO_INSERT_YOUR_FACE_ENDPOINT_HERE/face/v1.0/detect?detectionModel=detection_03&returnFaceId=true&returnFaceLandmarks=false&returnFaceAttributes=qualityForRecognition" -H "Content-Type: application/json" --data-ascii "{\"url\":\"https://upload.wikimedia.org/wikipedia/commons/c/c3/RH_Louise_Lillian_Gish.jpg\"}"

قم بإجراء التغييرات التالية:

  1. عيّن Ocp-Apim-Subscription-Key لمفتاح اشتراك Face صالح.
  2. غيّر الجزء الأول من عنوان URL للاستعلام لمطابقة نقطة النهاية التي تتوافق مع مفتاح اشتراكك.

    ملاحظة

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

  3. غيّر عنوان URL في نص الطلب للإشارة إلى صورة مختلفة بشكلٍ اختياري.

بمجرد إجراء التغييرات، افتح موجه الأوامر وأدخل الأمر الجديد. ستعالج التعليمات البرمجية الصورة البعيدة التالية.

An older man and woman

فحص النتائج

يجب أن تشاهد معلومات الوجه المعروضة كبيانات JSON في نافذة وحدة التحكم. على سبيل المثال:

[
  {
    "faceId": "49d55c17-e018-4a42-ba7b-8cbbdfae7c6f",
    "faceRectangle": {
      "top": 131,
      "left": 177,
      "width": 162,
      "height": 162
    }
  }
]  

الحصول على سمات الوجه

لاستخراج سمات الوجه، اتصل بواجهة برمجة تطبيقات الكشف مرة أخرى، ولكن عيّن detectionModel إلى detection_01. أضف معلمة استعلام returnFaceAttributes أيضاً. يجب أن يبدو الأمر الآن كما يلي. كما كان الحال من قبل، أدخل مفتاح الاشتراك في Face ونقطة النهاية.

curl -H "Ocp-Apim-Subscription-Key: TODO_INSERT_YOUR_FACE_SUBSCRIPTION_KEY_HERE" "TODO_INSERT_YOUR_FACE_ENDPOINT_HERE/face/v1.0/detect?detectionModel=detection_01&returnFaceId=true&returnFaceLandmarks=false&returnFaceAttributes=age,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise,qualityForRecognition" -H "Content-Type: application/json" --data-ascii "{\"url\":\"https://upload.wikimedia.org/wikipedia/commons/c/c3/RH_Louise_Lillian_Gish.jpg\"}"

فحص النتائج

تتضمن معلومات الوجه التي تم إرجاعها الآن سمات الوجه. على سبيل المثال:

[
  {
    "faceId": "49d55c17-e018-4a42-ba7b-8cbbdfae7c6f",
    "faceRectangle": {
      "top": 131,
      "left": 177,
      "width": 162,
      "height": 162
    },
    "faceAttributes": {
      "smile": 0,
      "headPose": {
        "pitch": 0,
        "roll": 0.1,
        "yaw": -32.9
      },
      "glasses": "NoGlasses",
      "emotion": {
        "anger": 0,
        "contempt": 0,
        "disgust": 0,
        "fear": 0,
        "happiness": 0,
        "neutral": 0.986,
        "sadness": 0.009,
        "surprise": 0.005
      },
      "blur": {
        "blurLevel": "low",
        "value": 0.06
      },
      "exposure": {
        "exposureLevel": "goodExposure",
        "value": 0.67
      },
      "noise": {
        "noiseLevel": "low",
        "value": 0
      },
      "makeup": {
        "eyeMakeup": true,
        "lipMakeup": true
      },
      "accessories": [],
      "occlusion": {
        "foreheadOccluded": false,
        "eyeOccluded": false,
        "mouthOccluded": false
      },
      "hair": {
        "bald": 0,
        "invisible": false,
        "hairColor": [
          {
            "color": "brown",
            "confidence": 1
          },
          {
            "color": "black",
            "confidence": 0.87
          },
          {
            "color": "other",
            "confidence": 0.51
          },
          {
            "color": "blond",
            "confidence": 0.08
          },
          {
            "color": "red",
            "confidence": 0.08
          },
          {
            "color": "gray",
            "confidence": 0.02
          }
        ]
      }
    }
  }
]

العثور على وجوه متشابهة

تلتقط هذه العملية وجهاً واحداً تم اكتشافه (المصدر) وتقوم بالبحث عن مجموعة من الوجوه الأخرى (الهدف) للعثور على الوجوه المتطابقة (البحث عن الوجه بالصورة). عند العثور على تطابق، فإنها تطبع معرف الوجه المطابق لوحدة التحكم.

الكشف عن الوجوه للمقارنة

أولاً، تحتاج إلى الكشف عن الوجوه في الصور قبل أن تتمكن من مقارنتها. قم بتشغيل هذا الأمر كما فعلت في القسم الكشف والتحليل. تم تحسين أسلوب التعرف هذا لعمليات المقارنة. فهو لا يستخرج سمات الوجه التفصيلية كما في القسم أعلاه، ويستخدم نموذجاً مختلفاً للتعرف.

curl -H "Ocp-Apim-Subscription-Key: TODO_INSERT_YOUR_FACE_SUBSCRIPTION_KEY_HERE" "TODO_INSERT_YOUR_FACE_ENDPOINT_HERE/face/v1.0/detect?detectionModel=detection_03&returnFaceId=true&returnFaceLandmarks=false" -H "Content-Type: application/json" --data-ascii "{\"url\":\"https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Dad1.jpg\"}"

ابحث عن القيمة "faceId" في استجابة JSON واحفظها في موقع مؤقت. ثم، استدعِ الأمر أعلاه مرة أخرى لعناوين URL للصور الأخرى، وحفظ معرفات الوجه أيضاً. يمكنك استخدام هذه المعرفات كمجموعة مستهدفة من الوجوه التي يمكن من خلالها العثور على وجه مشابه.

https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Daughter1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Mom1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Son1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family2-Lady1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family2-Man1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family3-Lady1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family3-Man1.jpg

وأخيراً، اكتشف وجه المصدر الفردي الذي ستستخدمه للمطابقة، ثم احفظ معرفه. احتفظ بهذا المعرف منفصلاً عن المعرفات الأخرى.

https://csdx.blob.core.windows.net/resources/Face/Images/findsimilar.jpg

Photo of a man smiling

البحث عن المطابقات

انسخ الأمر التالي إلى محرر نص.

curl -v -X POST "https://westus.api.cognitive.microsoft.com/face/v1.0/findsimilars" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{body}"

ثم قم بإجراء التغييرات التالية:

  1. عيّن Ocp-Apim-Subscription-Key لمفتاح اشتراك Face صالح.
  2. غيّر الجزء الأول من عنوان URL للاستعلام لمطابقة نقطة النهاية التي تتوافق مع مفتاح اشتراكك.

استخدم محتوى JSON التالي للقيمة body:

{
    "faceId": "",
    "faceIds": [],
    "maxNumOfCandidatesReturned": 10,
    "mode": "matchPerson"
}
  1. استخدم معرف الوجه المصدر لـ "faceId".
  2. الصق معرفات الوجه الأخرى كشروط في المصفوفة "faceIds".

فحص النتائج

ستتلقى استجابة JSON التي تسرد معرفات الوجوه التي تطابق وجه الاستعلام.

[
    {
        "persistedFaceId" : "015839fb-fbd9-4f79-ace9-7675fc2f1dd9",
        "confidence" : 0.82
    },
    ...
] 

في هذا البرنامج، يجب إرجاع الوجه المكتشف في هذه الصورة كوجه مشابه لوجه الصورة المصدر.

Photo of a man smiling; this is the same person as the previous image

تنظيف الموارد

إذا كنت تريد تنظيف وإلغاء اشتراك الخدمات المعرفية، يمكنك حذف المورد أو مجموعة الموارد. يؤدي حذف مجموعة الموارد إلى حذف أية موارد أخرى مقترنة بها أيضًا.

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

في هذا التشغيل السريع، تعلمت كيفية استخدام Face REST API للقيام بمهام التعرف على الوجه الأساسية. بعد ذلك، تعرفت على نماذج كشف الوجه المختلفة وكيفية تحديد النموذج المناسب لحالة الاستخدام.