تتيح لك مهمة "أداة تحديد معالم الوجه" في MediaPipe إمكانية رصد معالم الوجه وتعبيرات الوجه في الصور والفيديوهات. يمكنك استخدام هذه المهمة لتحديد تعابير الوجه البشري، وتطبيق فلاتر وتأثيرات على الوجه، وإنشاء صور أفاتار افتراضية. تستخدم هذه المهمة نماذج تعلُّم آلي يمكنها التعامل مع صور فردية أو سلسلة متواصلة من الصور. تنتج المهمة نقاطًا مرجعية ثلاثية الأبعاد للوجه، ونتائج blendshape (معاملات تمثّل تعابير الوجه) لاستنتاج تفاصيل سطوح الوجه في الوقت الفعلي، ومصفوفات التحويل لتنفيذ عمليات التحويل المطلوبة لعرض المؤثرات.
تتوفّر عيّنة التعليمات البرمجية الموضّحة في هذه التعليمات على GitHub. لمزيد من المعلومات حول إمكانات هذه المهمة ونماذجها وخيارات إعداداتها، يُرجى الاطّلاع على نظرة عامة.
مثال على الرمز
إنّ نموذج الرمز البرمجي الخاص بـ MediaPipe Tasks هو عملية تنفيذ بسيطة لتطبيق Face Landmarker على Android. يستخدم المثال الكاميرا على جهاز Android فعلي لرصد الوجوه في بث فيديو متواصل. يمكن للتطبيق أيضًا رصد الوجوه في الصور والفيديوهات من معرض الصور على الجهاز.
يمكنك استخدام التطبيق كنقطة بداية لتطبيق Android الخاص بك، أو الرجوع إليه عند تعديل تطبيق حالي. تتم استضافة نموذج الرمز البرمجي الخاص بأداة Face Landmarker على GitHub.
تنزيل الرمز
توضّح لك التعليمات التالية كيفية إنشاء نسخة محلية من رمز المثال باستخدام أداة سطر الأوامر git.
لتنزيل نموذج الرمز البرمجي، اتّبِع الخطوات التالية:
- استنسِخ مستودع git باستخدام الأمر التالي:
git clone https://github.com/google-ai-edge/mediapipe-samples
- يمكنك اختياريًا ضبط مثيل git لاستخدام sparse checkout، وذلك لتوفير الملفات الخاصة بتطبيق Face Landmarker النموذجي فقط:
cd mediapipe-samples git sparse-checkout init --cone git sparse-checkout set examples/face_landmarker/android
بعد إنشاء نسخة محلية من رمز المثال، يمكنك استيراد المشروع إلى "استوديو Android" وتشغيل التطبيق. وللحصول على التعليمات، راجِع دليل الإعداد لنظام التشغيل Android.
المكوّنات الرئيسية
تحتوي الملفات التالية على الرمز الأساسي لتطبيق المثال على تحديد مواضع الوجه:
- FaceLandmarkerHelper.kt - تهيئة أداة تحديد معالم الوجه والتعامل مع اختيار النموذج والمفوّض
- CameraFragment.kt: يتعامل مع كاميرا الجهاز ويعالج بيانات إدخال الصور والفيديوهات.
- GalleryFragment.kt: تتفاعل هذه الفئة مع
OverlayViewلعرض الصورة أو الفيديو الناتجَين. - OverlayView.kt: تنفّذ هذه الفئة العرض مع شبكة وجه للوجوه التي تم رصدها.
الإعداد
يوضّح هذا القسم الخطوات الأساسية لإعداد بيئة التطوير ومشاريع الرموز البرمجية لاستخدام Face Landmarker على وجه التحديد. للحصول على معلومات عامة حول إعداد بيئة التطوير لاستخدام مهام MediaPipe، بما في ذلك متطلبات إصدار النظام الأساسي، راجِع دليل الإعداد لنظام التشغيل Android.
الاعتمادية
تستخدِم مهمة "تحديد معالم الوجه" مكتبة com.google.mediapipe:tasks-vision. أضِف التبعية إلى ملف build.gradle في تطبيق Android:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
الطراز
تتطلّب مهمة MediaPipe Face Landmarker حزمة نموذج مدرَّب متوافقة مع هذه المهمة. لمزيد من المعلومات حول النماذج المدرَّبة المتاحة في Face Landmarker، راجِع قسم "النماذج" في نظرة عامة على المهمة.
اختَر النموذج ونزِّله، ثم خزِّنه في دليل مشروعك:
<dev-project-root>/src/main/assets
حدِّد مسار النموذج ضمن المَعلمة ModelAssetPath. في مثال الرمز البرمجي، يتم تحديد النموذج في ملف FaceLandmarkerHelper.kt:
baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)
إنشاء المهمة
تستخدم مهمة MediaPipe Face Landmarker الدالة createFromOptions() لإعداد المهمة. تقبل الدالة createFromOptions() قيمًا لخيارات الإعداد. لمزيد من المعلومات حول خيارات الإعداد، يُرجى الاطّلاع على خيارات الإعداد.
يتوافق Face Landmarker مع أنواع بيانات الإدخال التالية: الصور الثابتة وملفات الفيديو وأحداث بث الفيديو المباشر. يجب تحديد وضع التشغيل المناسب لنوع بيانات الإدخال عند إنشاء المهمة. اختَر علامة التبويب الخاصة بنوع بيانات الإدخال لمعرفة كيفية إنشاء المهمة وتشغيل الاستدلال.
صورة
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()
val optionsBuilder =
FaceLandmarker.FaceLandmarkerOptions.builder()
.setBaseOptions(baseOptionsBuilder.build())
.setMinFaceDetectionConfidence(minFaceDetectionConfidence)
.setMinTrackingConfidence(minFaceTrackingConfidence)
.setMinFacePresenceConfidence(minFacePresenceConfidence)
.setNumFaces(maxNumFaces)
.setRunningMode(RunningMode.IMAGE)
val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
فيديو
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()
val optionsBuilder =
FaceLandmarker.FaceLandmarkerOptions.builder()
.setBaseOptions(baseOptionsBuilder.build())
.setMinFaceDetectionConfidence(minFaceDetectionConfidence)
.setMinTrackingConfidence(minFaceTrackingConfidence)
.setMinFacePresenceConfidence(minFacePresenceConfidence)
.setNumFaces(maxNumFaces)
.setRunningMode(RunningMode.VIDEO)
val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
بث مباشر
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()
val optionsBuilder =
FaceLandmarker.FaceLandmarkerOptions.builder()
.setBaseOptions(baseOptionsBuilder.build())
.setMinFaceDetectionConfidence(minFaceDetectionConfidence)
.setMinTrackingConfidence(minFaceTrackingConfidence)
.setMinFacePresenceConfidence(minFacePresenceConfidence)
.setNumFaces(maxNumFaces)
.setResultListener(this::returnLivestreamResult)
.setErrorListener(this::returnLivestreamError)
.setRunningMode(RunningMode.LIVE_STREAM)
val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
يتيح تنفيذ نموذج التعليمة البرمجية Face Landmarker للمستخدم التبديل بين أوضاع المعالجة. ويؤدي هذا الأسلوب إلى تعقيد رمز إنشاء المهام وقد لا يكون مناسبًا لحالة الاستخدام. يمكنك الاطّلاع على هذا الرمز في الدالة
setupFaceLandmarker() في الملف
FaceLandmarkerHelper.kt.
خيارات الإعداد
تتضمّن هذه المهمة خيارات الإعداد التالية لتطبيقات Android:
| اسم الخيار | الوصف | نطاق القيم | القيمة التلقائية |
|---|---|---|---|
runningMode |
تضبط هذه السمة وضع التشغيل للمهمة. تتوفّر ثلاثة أوضاع: الصورة: الوضع المخصّص لإدخال صورة واحدة. الفيديو: وضع الإطارات التي تم فك ترميزها في الفيديو LIVE_STREAM: وضع البث المباشر لبيانات الإدخال، مثل البيانات الواردة من كاميرا. في هذا الوضع، يجب استدعاء resultListener لإعداد أداة معالجة لتلقّي النتائج بشكل غير متزامن. |
{IMAGE, VIDEO, LIVE_STREAM} |
IMAGE |
numFaces |
الحد الأقصى لعدد الوجوه التي يمكن أن يرصدها
FaceLandmarker. لا يتم تطبيق التنعيم إلا عندما يكون
num_faces مضبوطًا على 1.
|
Integer > 0 |
1 |
minFaceDetectionConfidence |
الحد الأدنى لنتيجة الثقة المطلوبة لنجاح عملية رصد الوجه. | Float [0.0,1.0] |
0.5 |
minFacePresenceConfidence |
الحد الأدنى لنتيجة الثقة في رصد الوجه في عملية رصد المعالم. | Float [0.0,1.0] |
0.5 |
minTrackingConfidence |
تمثّل هذه السمة الحد الأدنى لدرجة الثقة التي يجب تحقيقها حتى يتم اعتبار عملية تتبُّع الوجه ناجحة. | Float [0.0,1.0] |
0.5 |
outputFaceBlendshapes |
تحديد ما إذا كان Face Landmarker يعرض أشكال الوجه الممزوجة. يتم استخدام أشكال الوجه الممزوجة لعرض نموذج الوجه الثلاثي الأبعاد. | Boolean |
False |
outputFacialTransformationMatrixes |
تحديد ما إذا كان سيتم عرض مصفوفة تحويل الوجه في FaceLandmarker تستخدم أداة FaceLandmarker المصفوفة لتحويل معالم الوجه من نموذج وجه أساسي إلى الوجه الذي تم رصده، ما يتيح للمستخدمين تطبيق المؤثرات على المعالم التي تم رصدها. | Boolean |
False |
resultListener |
تضبط هذه السمة أداة معالجة النتائج لتلقّي نتائج التعرّف على المعالم بشكل غير متزامن عندما يكون FaceLandmarker في وضع البث المباشر.
لا يمكن استخدامها إلا عندما يكون وضع التشغيل مضبوطًا على LIVE_STREAM |
ResultListener |
N/A |
errorListener |
تضبط هذه السمة أداة معالجة الأخطاء الاختيارية. | ErrorListener |
N/A |
إعداد البيانات
تعمل ميزة "تحديد موضع الوجه" مع الصور وملفات الفيديو وأحداث البث المباشر. تعالج المهمة عملية المعالجة المسبقة لمدخلات البيانات، بما في ذلك تغيير الحجم والتدوير وتسوية القيم.
يوضّح الرمز التالي كيفية تسليم البيانات لمعالجتها. وتتضمّن هذه النماذج تفاصيل حول كيفية التعامل مع البيانات من الصور وملفات الفيديو وأحداث البث المباشر.
صورة
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(image).build()
فيديو
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage val argb8888Frame = if (frame.config == Bitmap.Config.ARGB_8888) frame else frame.copy(Bitmap.Config.ARGB_8888, false) // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(argb8888Frame).build()
بث مباشر
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(rotatedBitmap).build()
في نموذج الرمز البرمجي الخاص بأداة Face Landmarker، تتم معالجة إعداد البيانات في ملف
FaceLandmarkerHelper.kt.
تنفيذ المهمة
استنادًا إلى نوع البيانات التي تعمل عليها، استخدِم طريقة
FaceLandmarker.detect...() المحدّدة لنوع البيانات هذا. استخدِم
detect() للصور الفردية وdetectForVideo() للإطارات في ملفات الفيديو
وdetectAsync() لبث الفيديو. عند إجراء عمليات رصد على بث فيديو، احرص على تنفيذ عمليات الرصد في سلسلة محادثات منفصلة لتجنُّب حظر سلسلة محادثات واجهة المستخدم.
تعرض عيّنات الرموز البرمجية التالية أمثلة بسيطة حول كيفية تشغيل أداة Face Landmarker في أوضاع البيانات المختلفة هذه:
صورة
val result = FaceLandmarker.detect(mpImage)
فيديو
val timestampMs = i * inferenceIntervalMs FaceLandmarker.detectForVideo(mpImage, timestampMs) .let { detectionResult -> resultList.add(detectionResult) }
بث مباشر
val mpImage = BitmapImageBuilder(rotatedBitmap).build()
val frameTime = SystemClock.uptimeMillis()
FaceLandmarker.detectAsync(mpImage, frameTime)
يُرجى ملاحظة ما يلي:
- عند التشغيل في وضع الفيديو أو وضع البث المباشر، يجب تقديم الطابع الزمني لإطار الإدخال إلى مهمة "تحديد معالم الوجه".
- عند التشغيل في وضع الصورة أو الفيديو، تحظر مهمة Face Landmarker المؤشر الحالي إلى أن تنتهي من معالجة صورة الإدخال أو الإطار. ولتجنُّب حظر واجهة المستخدم، نفِّذ عملية المعالجة في سلسلة محادثات في الخلفية.
- عند التشغيل في وضع البث المباشر، تعرض مهمة "تحديد موضع الوجه" النتائج على الفور ولا تحظر سلسلة المحادثات الحالية. سيتم استدعاء أداة معالجة النتائج مع نتيجة الرصد في كل مرة تنتهي فيها معالجة إطار إدخال.
في مثال الرمز البرمجي الخاص بأداة Face Landmarker، يتم تعريف الدوال detect وdetectForVideo وdetectAsync في الملف FaceLandmarkerHelper.kt.
التعامل مع النتائج وعرضها
تعرض أداة Face Landmarker كائن FaceLandmarkerResult لكل عملية رصد. يحتوي عنصر النتيجة على شبكة وجه لكل وجه تم رصده، مع إحداثيات لكل معلم من معالم الوجه. اختياريًا، يمكن أن يحتوي عنصر النتيجة أيضًا على أشكال مزج تشير إلى تعابير الوجه، ومصفوفات تحويل الوجه لتطبيق مؤثرات الوجه على نقاط التحديد التي تم رصدها.
في ما يلي مثال على بيانات الإخراج من هذه المهمة:
FaceLandmarkerResult:
face_landmarks:
NormalizedLandmark #0:
x: 0.5971359014511108
y: 0.485361784696579
z: -0.038440968841314316
NormalizedLandmark #1:
x: 0.3302789330482483
y: 0.29289937019348145
z: -0.09489090740680695
... (478 landmarks for each face)
face_blendshapes:
browDownLeft: 0.8296722769737244
browDownRight: 0.8096957206726074
browInnerUp: 0.00035583582939580083
browOuterUpLeft: 0.00035752105759456754
... (52 blendshapes for each face)
facial_transformation_matrixes:
[9.99158978e-01, -1.23036895e-02, 3.91213447e-02, -3.70770246e-01]
[1.66496094e-02, 9.93480563e-01, -1.12779640e-01, 2.27719707e+01]
...
تعرض الصورة التالية تمثيلاً مرئيًا لناتج المهمة:
يوضّح نموذج رمز Face Landmarker كيفية عرض النتائج التي تعرضها المهمة، راجِع فئة OverlayView لمزيد من التفاصيل.