تسمح لك مهمة "التعرّف على الوجوه" برصد الوجوه في صورة أو فيديو. يمكنك استخدام هذه المهمة لتحديد الوجوه وملامح الوجه داخل إطار. تستخدم هذه المهمة نموذج تعلُّم الآلة الذي يعمل مع صور فردية أو بث متواصل من الصور تظهر المواقع الجغرافية بالإضافة إلى مفتاح الوجه التالي بعد إخراج المهمة. النقاط: العين اليسرى، والعين اليمنى، وطرف الأنف، والفم، وحدوث خلل في العين اليسرى، والعين اليمنى للمأساة.
يتوفّر نموذج الرمز البرمجي الموضّح في هذه التعليمات على GitHub. يمكنك رؤية هذه المهمة وهي قيد التنفيذ من خلال عرض الويب هذا تجريبي. لمزيد من المعلومات، المزيد من المعلومات حول الإمكانات والنماذج وخيارات الضبط المهمة، راجع نظرة عامة:
مثال على الرمز البرمجي
رمز مثال "مهام MediaPipe" هو تنفيذ بسيط لأداة رصد الوجوه لنظام التشغيل iOS. يستخدم المثال الكاميرا على جهاز Android فعلي لاكتشاف في بث فيديو مستمر. يمكن للتطبيق أيضًا اكتشاف الوجوه في الصور فيديوهات من معرض الجهاز.
يمكنك استخدام التطبيق كنقطة بداية لتطبيق iOS، أو الرجوع إليه عند تعديل تطبيق حالي. تتم استضافة نموذج الرمز البرمجي الخاص بميزة "التعرّف على الوجوه" على GitHub.
تنزيل الرمز
توضّح لك التعليمات التالية كيفية إنشاء نسخة على الجهاز من هذا المثال. باستخدام أداة سطر الأوامر git.
لتنزيل نموذج الرمز:
استنساخ مستودع git باستخدام الأمر التالي:
git clone https://github.com/google-ai-edge/mediapipe-samples
يمكنك اختياريًا ضبط مثيل 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)
تُظهر الصورة التالية تصورًا لنتج المهمة:
بالنسبة إلى الصورة التي لا تحتوي على مربّعات إحاطة، يمكنك الاطّلاع على الصورة الأصلية.
يوضح مثال رمز ميزة "التعرّف على الوجوه" طريقة عرض النتائج. يمكنك الاطّلاع على مثال على الرمز لمعرفة التفاصيل.