دليل التعرّف على الوجوه على أجهزة iOS

تتيح لك مهمة "التعرّف على الوجوه" اكتشاف الوجوه في صورة أو فيديو. يمكنك استخدام هذه المهمة لتحديد موقع الوجوه وملامح الوجه داخل الإطار. تستخدم هذه المهمة نموذج التعلم الآلي (ML) الذي يعمل مع الصور الفردية أو التدفق المستمر للصور. وتؤدي المهمة إلى إخراج مواقع الوجه، بالإضافة إلى النقاط الرئيسية للوجه التالية: العين اليسرى والعين اليمنى وطرف الأنف والفم وآثار العين اليسرى والعين اليُمنى.

يتوفّر نموذج الرمز البرمجي الموضّح في هذه التعليمات على GitHub. يمكنك مشاهدة هذه المهمة وهي قيد التنفيذ من خلال عرض هذا العرض التوضيحي على الويب. للحصول على مزيد من المعلومات حول الإمكانات والنماذج وخيارات الضبط لهذه المهمة، يُرجى الاطّلاع على نظرة عامة.

مثال الرمز البرمجي

يعتبر الرمز البرمجي لمهام MediaPipe بمثابة تنفيذ بسيط لتطبيق Face Detector لنظام التشغيل iOS. يستخدم المثال الكاميرا على جهاز Android فعلي لاكتشاف الوجوه في فيديو مضمّن. يمكن للتطبيق أيضًا اكتشاف الوجوه في الصور والفيديوهات من معرض الأجهزة.

ويمكنك استخدام التطبيق كنقطة بداية لتطبيق iOS الخاص بك، أو الرجوع إليه عند تعديل تطبيق حالي. تتم استضافة مثال الرمز البرمجي لأداة "التعرّف على الوجوه" على GitHub.

تنزيل الرمز

توضّح لك التعليمات التالية كيفية إنشاء نسخة محلية من رمز المثال باستخدام أداة سطر الأوامر git.

لتنزيل نموذج الرمز:

  1. استنسِخ مستودع git باستخدام الأمر التالي:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. يمكنك اختياريًا ضبط مثيل git لاستخدام طريقة الدفع المتفرقة، بحيث لا يكون لديك سوى ملفات تطبيق مثال أداة التعرّف على الوجوه:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_detector/ios/
    

بعد إنشاء نسخة محلية من نموذج الرمز، يمكنك تثبيت مكتبة مهام MediaPipe، وفتح المشروع باستخدام Xcode، وتشغيل التطبيق. وللحصول على التعليمات، يمكنك الاطّلاع على دليل الإعداد لنظام التشغيل iOS.

المكونات الرئيسية

تحتوي الملفات التالية على الرمز المهم لتطبيق مثال أداة "التعرّف على الوجه":

  • FaceDetectorService.swift: يضبط هذا الإعداد أداة الرصد ويعالج اختيار النموذج ويُجري الاستنتاج على بيانات الإدخال.
  • CameraViewController: ينفّذ هذا التطبيق واجهة المستخدم في وضع إدخال خلاصة الكاميرا المباشرة ويعرض نتائج الرصد.
  • MediaLibraryViewController.swift: ينفّذ هذا الإجراء واجهة المستخدم في وضع إدخال ملف الفيديو والصور الثابتة، ويعرض نتائج الرصد.

ضبط إعدادات الجهاز

يصف هذا القسم الخطوات الأساسية لإعداد بيئة التطوير ومشاريع الرموز لاستخدام ميزة "التعرّف على الوجه". للحصول على معلومات عامة حول إعداد بيئة التطوير لاستخدام مهام MediaPipe، بما في ذلك متطلبات إصدار النظام الأساسي، يُرجى الاطّلاع على دليل الإعداد لنظام التشغيل iOS.

التبعيات

تستخدم ميزة "التعرّف على الوجوه" مكتبة MediaPipeTasksVision التي يجب تثبيتها باستخدام CocoaPods. المكتبة متوافقة مع كل من تطبيقَي Swift وObjective-C ولا تتطلب أي إعداد إضافي خاص بلغة معيّنة.

للحصول على تعليمات حول تثبيت CocoaPods على نظام التشغيل macOS، يُرجى الرجوع إلى دليل تثبيت CocoaPods. للحصول على تعليمات حول كيفية إنشاء Podfile مع مجموعات الإعلانات المتسلسلة اللازمة لتطبيقك، يمكنك الاطّلاع على المقالة استخدام CocoaPods.

أضِف مجموعة MediaPipeTasksVision في Podfile باستخدام الرمز التالي:

target 'MyFaceDetectorApp' do
  use_frameworks!
  pod 'MediaPipeTasksVision'
end

إذا كان تطبيقك يتضمّن أهداف اختبار الوحدات، يُرجى الرجوع إلى دليل الإعداد لنظام التشغيل iOS للحصول على معلومات إضافية حول إعداد Podfile.

الطراز

تتطلّب مهمة MediaPipe Face Detector نموذجًا مدرَّبًا متوافقًا مع هذه المَهمّة. للحصول على مزيد من المعلومات عن النماذج المدربة المتاحة لأداة "التعرّف على الوجوه"، يُرجى الاطّلاع على قسم النظرة العامة على المهمة في قسم الطُرز.

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

استخدِم السمة BaseOptions.modelAssetPath لتحديد المسار إلى النموذج في حِزمة التطبيق. للاطّلاع على مثال على الرمز البرمجي، راجِع القسم التالي.

إنشاء المهمة

يمكنك إنشاء مهمة أداة "التعرّف على الوجوه" عن طريق استدعاء إحدى أدوات الإعداد. يقبل مبدئي FaceDetector(options:) القيم لخيارات الضبط.

إذا لم تكن بحاجة إلى إعداد "أداة التعرّف على الوجوه" باستخدام خيارات ضبط مخصّصة، يمكنك استخدام أداة الإعداد "FaceDetector(modelPath:)" لإنشاء "أداة التعرّف على الوجوه" باستخدام الخيارات التلقائية. لمزيد من المعلومات حول خيارات الضبط، يُرجى الاطّلاع على نظرة عامة على الإعدادات.

تتيح مهمة "أداة التعرّف على الوجوه" استخدام 3 أنواع من بيانات الإدخال، وهي الصور الثابتة وملفات الفيديو وأحداث الفيديو المباشرة. يبدأ FaceDetector(modelPath:) تلقائيًا في إعداد مهمة للصور الثابتة. إذا كنت تريد إعداد مهمتك لمعالجة ملفات الفيديو أو أحداث البث المباشر، استخدِم FaceDetector(options:) لتحديد الفيديو أو وضع تشغيل البث المباشر. يتطلّب وضع البث المباشر أيضًا خيار ضبط faceDetectorLiveStreamDelegate الإضافي، والذي يتيح لأداة "التعرّف على الوجوه" عرض نتائج التعرّف على الوجوه للمفوَّض بشكل غير متزامن.

اختَر علامة التبويب المقابلة لوضع الركض لمعرفة كيفية إنشاء المهمة وتشغيل الاستنتاج.

Swift

صورة

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = FaceDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .image

let faceDetector = try FaceDetector(options: options)
    

حملة فيديو

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = FaceDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .video

let faceDetector = try FaceDetector(options: options)
    

أحداث بث مباشر

import MediaPipeTasksVision

// Class that conforms to the `FaceDetectorLiveStreamDelegate` protocol and
// implements the method that the face detector calls once it finishes
// detecting faces in each input frame.
class FaceDetectorResultProcessor: NSObject, FaceDetectorLiveStreamDelegate {

  func faceDetector(
    _ faceDetector: FaceDetector,
    didFinishDetection result: FaceDetectorResult?,
    timestampInMilliseconds: Int,
    error: Error?) {

    // Process the face detection result or errors here.

  }
}

let modelPath = Bundle.main.path(
  forResource: "model",
  ofType: "tflite")

let options = FaceDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .liveStream

// Assign an object of the class to the `faceDetectorLiveStreamDelegate`
// property.
let processor = FaceDetectorResultProcessor()
options.faceDetectorLiveStreamDelegate = processor

let faceDetector = try FaceDetector(options: options)
    

Objective-C

صورة

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeImage;

MPPFaceDetector *faceDetector =
      [[MPPFaceDetector alloc] initWithOptions:options error:nil];
    

حملة فيديو

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeVideo;

MPPFaceDetector *faceDetector =
      [[MPPFaceDetector alloc] initWithOptions:options error:nil];
    

أحداث بث مباشر

@import MediaPipeTasksVision;

// Class that conforms to the `MPPFaceDetectorLiveStreamDelegate` protocol
// and implements the method that the face detector calls once it finishes
// detecting faces in each input frame.

@interface APPFaceDetectorResultProcessor : NSObject 

@end

@implementation APPFaceDetectorResultProcessor

-   (void)faceDetector:(MPPFaceDetector *)faceDetector
    didFinishDetectionWithResult:(MPPFaceDetectorResult *)faceDetectorResult
         timestampInMilliseconds:(NSInteger)timestampInMilliseconds
                           error:(NSError *)error {

    // Process the face detector result or errors here.

}

@end

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeLiveStream;

// Assign an object of the class to the `faceDetectorLiveStreamDelegate`
// property.
APPFaceDetectorResultProcessor *processor = [APPFaceDetectorResultProcessor new];
options.faceDetectorLiveStreamDelegate = processor;

MPPFaceDetector *faceDetector =
      [[MPPFaceDetector alloc] initWithOptions:options error:nil];
    

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

خيارات الضبط

تتضمّن هذه المهمة خيارات الضبط التالية لتطبيقات iOS:

اسم الخيار الوصف نطاق القيمة القيمة التلقائية
runningMode تحدِّد هذه السياسة وضع التشغيل للمهمة. هناك ثلاثة أوضاع:

IMAGE: وضع إدخالات الصورة الفردية.

فيديو: وضع لقطات الفيديو التي تم فك ترميزها

البث المباشر: وضع بث مباشر لبيانات الإدخال، مثل الكاميرا. في هذا الوضع، يجب استدعاء resultsListener لإعداد أداة معالجة الصوت لكي تتلقى النتائج بشكل غير متزامن.
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
minDetectionConfidence الحد الأدنى لدرجة الثقة ليتم اعتبار ميزة "التعرّف على الوجه" ناجحة. Float [0,1] 0.5
minSuppressionThreshold الحد الأدنى غير الأقصى للمنع الذي يتم اعتباره ميزة "التعرّف على الوجه" متداخلاً. Float [0,1] 0.3

إعدادات البث المباشر

عند ضبط وضع التشغيل على البث المباشر، تتطلّب "أداة التعرّف على الوجوه" خيار ضبط faceDetectorLiveStreamDelegate إضافي، ما يتيح لأداة رصد الوجوه عرض نتائج الرصد بشكل غير متزامن. ينفِّذ المفوَّض طريقة faceDetector(_:didFinishDetection:timestampInMilliseconds:error:)، التي تطلبها "أداة التعرّف على الوجوه" بعد معالجة نتائج ميزة "التعرّف على الوجوه" لكل إطار.

اسم الخيار الوصف نطاق القيمة القيمة التلقائية
faceDetectorLiveStreamDelegate تؤدي هذه السياسة إلى تفعيل ميزة "التعرّف على الوجوه" لتلقّي نتائج التعرّف على الوجوه بشكل غير متزامن في وضع البث المباشر. أمّا الفئة التي تم ضبط مثيلها على هذه السمة، فعليها تنفيذ الطريقة faceDetector(_:didFinishDetection:timestampInMilliseconds:error:). غير منطبق لم يتم الضبط.

إعداد البيانات

عليك تحويل الصورة أو الإطار الذي تم إدخاله إلى كائن MPImage قبل تمريره إلى "أداة التعرّف على الوجوه". تتوافق "MPImage" مع أنواع مختلفة من تنسيقات الصور على iOS، ويمكن استخدامها في أي وضع تشغيل للاستنتاج. لمزيد من المعلومات حول MPImage، يمكنك مراجعة MPImage API

اختَر تنسيق صورة iOS استنادًا إلى حالة الاستخدام ووضع التشغيل الذي يتطلبه تطبيقك.تقبل "MPImage" تنسيقات الصور UIImage وCVPixelBuffer وCMSampleBuffer على iOS.

UIImage

يناسب تنسيق UIImage أوضاع الجري التالية:

  • الصور: صور من حِزمة تطبيق أو معرض مستخدمين أو نظام ملفات بتنسيق UIImage يمكن تحويله إلى عنصر MPImage.

  • الفيديوهات: استخدِم AVAssetImageGenerator لاستخراج إطارات الفيديو إلى تنسيق CGImage، ثم تحويلها إلى صور UIImage

Swift

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(uiImage: image)
    

Objective-C

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

يؤدي المثال إلى إعداد MPImage باستخدام الاتجاه التلقائي UIImage.Orientation.Up. يمكنك إعداد MPImage باستخدام أي من قيم UIImage.Orientation المتوافقة. لا تتيح أداة "التعرّف على الوجه" استخدام ميزة الاتجاهات المعكوسة، مثل .upMirrored و.downMirrored و.leftMirrored و.rightMirrored.

لمزيد من المعلومات حول UIImage، يمكن الاطّلاع على مستندات مطوّري واجهة برمجة التطبيقات UIImage من Apple.

CVPixelBuffer

يناسب تنسيق CVPixelBuffer التطبيقات التي تنشئ إطارات وتستخدم إطار عمل CoreImage لنظام التشغيل iOS من أجل المعالجة.

يناسب تنسيق CVPixelBuffer أوضاع الجري التالية:

  • الصور: إنّ التطبيقات التي تنشئ صور CVPixelBuffer بعد إجراء بعض عمليات المعالجة باستخدام إطار عمل CoreImage على iOS يمكن إرسالها إلى "أداة التعرّف على الوجوه" في وضع تشغيل الصور.

  • الفيديوهات: يمكن تحويل إطارات الفيديو إلى تنسيق CVPixelBuffer لمعالجتها، ثم إرسالها إلى أداة التعرّف على الوجوه في وضع الفيديو.

  • البث المباشر: يمكن تحويل التطبيقات التي تستخدم كاميرا iOS لإنشاء الإطارات إلى تنسيق CVPixelBuffer لمعالجتها قبل إرسالها إلى "أداة التعرّف على الوجوه" في وضع البث المباشر.

Swift

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(pixelBuffer: pixelBuffer)
    

Objective-C

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

لمزيد من المعلومات حول CVPixelBuffer، يُرجى الاطّلاع على مستندات مطوّري برامج CVPixelBuffer Apple.

CMSampleBuffer

يخزّن تنسيق CMSampleBuffer عينات وسائط من نوع وسائط موحد، وهو مناسب تمامًا لوضع تشغيل البث المباشر. ويتم عرض الإطارات المباشرة من كاميرات iOS بالتنسيق CMSampleBuffer بشكل غير متزامن بواسطة AVCaptureVideoDataOutput في نظام التشغيل iOS.

Swift

// Obtain a CMSampleBuffer.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(sampleBuffer: sampleBuffer)
    

Objective-C

// Obtain a `CMSampleBuffer`.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
    

لمزيد من المعلومات حول CMSampleBuffer، يُرجى الاطّلاع على مستندات مطوّري البرامج الخاصة بـ CMعيّنBuffer من Apple.

تنفيذ المهمة

لتشغيل "أداة التعرّف على الوجوه"، استخدِم طريقة detect() الخاصة بوضع التشغيل المحدَّد:

  • صورة ثابتة: detect(image:)
  • الفيديو: detect(videoFrame:timestampInMilliseconds:)
  • بث مباشر: detectAsync(image:timestampInMilliseconds:)

تعرض "أداة التعرّف على الوجوه" الوجوه التي تم اكتشافها داخل الصورة أو الإطار المُدخل.

تعرض نماذج الرموز التالية أمثلة بسيطة على كيفية تشغيل ميزة "التعرّف على الوجه" في أوضاع التشغيل المختلفة هذه:

Swift

صورة

let result = try faceDetector.detect(image: image)
    

حملة فيديو

let result = try faceDetector.detect(
  videoFrame: image,
  timestampInMilliseconds: timestamp)
    

أحداث بث مباشر

try faceDetector.detectAsync(
  image: image,
  timestampInMilliseconds: timestamp)
    

Objective-C

صورة

MPPFaceDetectorResult *result = [faceDetector detectInImage:image
                                                      error:nil];
    

حملة فيديو

MPPFaceDetectorResult *result = [faceDetector detectInVideoFrame:image
                                         timestampInMilliseconds:timestamp
                                                           error:nil];
    

أحداث بث مباشر

BOOL success = [faceDetector detectAsyncInImage:image
                        timestampInMilliseconds:timestamp
                                          error:nil];
    

يوضّح مثال رمز أداة "التعرّف على الوجه" عمليات تنفيذ كل من هذه الأوضاع بمزيد من التفصيل detect(image:) وdetect(videoFrame:timestampInMilliseconds:) وdetectAsync(image:timestampInMilliseconds:). يتيح نموذج الرمز للمستخدم التبديل بين أوضاع المعالجة التي قد لا تكون مطلوبة لحالة الاستخدام.

يُرجى ملاحظة ما يلي:

  • عند تشغيل المحتوى في وضع الفيديو أو وضع البث المباشر، يجب أيضًا توفير الطابع الزمني لإطار الإدخال في مهمة "أداة التعرّف على الوجوه".

  • عند تشغيل مهمة "التعرّف على الوجوه" في وضع الصور أو الفيديو، تحظر سلسلة التعليمات الحالية إلى أن تنتهي من معالجة الصورة أو الإطار المُدخل. لتجنُّب حظر سلسلة التعليمات الحالية، نفِّذ عملية المعالجة في سلسلة محادثات في الخلفية باستخدام إطارَي عمل Dispatch أو NSOperation في نظام التشغيل iOS.

  • عند تشغيل مهمة "التعرّف على الوجوه" في وضع البث المباشر، تظهر على الفور بدون حظر سلسلة المحادثات الحالية. ويستدعي أسلوب faceDetector(_:didFinishDetection:timestampInMilliseconds:error:) مع نتيجة "التعرّف على الوجه" بعد معالجة كل إطار إدخال. تستدعي أداة التعرّف على الوجوه هذه الطريقة بشكلٍ غير متزامن في قائمة انتظار إرسال تسلسلية مخصصة. لعرض النتائج على واجهة المستخدم، قم بإرسال النتائج إلى قائمة الانتظار الرئيسية بعد معالجة النتائج. إذا تم استدعاء الوظيفة detectAsync عندما تكون مهمة "التعرّف على الوجوه" مشغولة بمعالجة إطار آخر، تتجاهل أداة التعرّف على الوجوه إطار الإدخال الجديد.

التعامل مع النتائج وعرضها

عند تنفيذ الاستنتاج، تعرض مهمة "أداة التعرّف على الوجوه" كائن FaceDetectorResult يحتوي على مربّعات الإحاطة بالوجوه التي تم رصدها ودرجة ثقة لكل وجه تم رصده.

ويوضح ما يلي مثالاً على بيانات المخرجات من هذه المهمة:

FaceDetectionResult:
  Detections:
    Detection #0:
      BoundingBox:
        origin_x: 126
        origin_y: 100
        width: 463
        height: 463
      Categories:
        Category #0:
          index: 0
          score: 0.9729152917861938
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.18298381567001343
          y: 0.2961040139198303
        NormalizedKeypoint #1:
          x: 0.3302789330482483
          y: 0.29289937019348145
        ... (6 keypoints for each face)
    Detection #1:
      BoundingBox:
        origin_x: 616
        origin_y: 193
        width: 430
        height: 430
      Categories:
        Category #0:
          index: 0
          score: 0.9251380562782288
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.6151331663131714
          y: 0.3713381886482239
        NormalizedKeypoint #1:
          x: 0.7460576295852661
          y: 0.38825345039367676
        ... (6 keypoints for each face)

تُظهر الصورة التالية تصورًا لناتج المهمة:

بالنسبة إلى الصورة التي لا تحتوي على مربّعات حدود، يمكنك الاطّلاع على الصورة الأصلية.

يوضح مثال رمز أداة التعرّف على الوجوه كيفية عرض النتائج. اطّلِع على مثال الرمز البرمجي لمعرفة التفاصيل.