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

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

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

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

رمز مثال "مهام MediaPipe" هو تنفيذ بسيط لأداة رصد الوجوه لنظام التشغيل 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.

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

تحتوي الملفات التالية على الرمز المهم لمثال أداة اكتشاف الوجه app:

  • 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 نموذجًا مدرَّبًا ومتوافقًا. بهذه المهمة. لمزيد من المعلومات عن النماذج المدربة المتاحة ميزة "التعرّف على الوجوه"، راجِع النظرة العامة على المهمة النماذج .

اختَر نموذجًا ونزِّله، ثم أضِفه إلى دليل مشروعك باستخدام 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: وضع إدخالات الصورة الفردية

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

LIVE_STREAM: وضع البث المباشر للإدخال البيانات، مثل تلك الواردة من الكاميرا. في هذا الوضع، يجب أن يكون resultListener يتم استدعاءها لإعداد مستمع للحصول على النتائج بشكل غير متزامن.
{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

اختَر تنسيق صورة لنظام التشغيل 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 Developer الوثائق.

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 من قِبل نظام التشغيل iOS AVCaptureVideoDataOutput.

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، يُرجى الرجوع إلى CMSampleBuffer 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:). يسمح المثال بالرمز البرمجي المستخدم للتبديل بين أوضاع المعالجة التي قد لا تكون مطلوبة لاستخدامك الحالة.

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

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

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

  • عند تشغيل ميزة "التعرّف على الوجوه" في وضع البث المباشر، ستعود مهمة ميزة "التعرّف على الوجوه" على الفور. ولا يحظر سلسلة المحادثات الحالية إنه يستدعي طريقة واحدة (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)

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

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

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