دليل اكتشاف علامات الوجه في Python

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

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

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

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

إذا كنت بصدد تنفيذ ميزة "تحديد معالم الوجه" لأجهزة Raspberry Pi، يُرجى الرجوع إلى مثال على تطبيق Raspberry Pi.

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

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

الطرود

تتطلّب مهمة MediaPipe Face Landmarker حزمة mediapipe PyPI. يمكنك تثبيت هذه التبعيات استيرادها باستخدام ما يلي:

$ python -m pip install mediapipe

عمليات الاستيراد

استورِد الفئات التالية للوصول إلى وظائف مهمة "مُحدِّد معالم الوجه":

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

الطراز

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

اختَر النموذج ونزِّله، ثم احفظه في دليل على الجهاز:

model_path = '/absolute/path/to/face_landmarker.task'

استخدِم المَعلمة BaseOptions عنصر model_asset_path لتحديد مسار النموذج المطلوب استخدامه. للاطّلاع على مثال على الرمز، يُرجى الاطّلاع على القسم التالي.

إنشاء المهمة

تستخدِم مهمة MediaPipe Face Landmarker الدالة create_from_options لإعداد المهمة. تقبل الدالة create_from_options قيمًا لإعدادات options التي يجب التعامل معها. لمزيد من المعلومات حول خيارات الضبط، يُرجى الاطّلاع على خيارات الضبط.

يوضّح الرمز البرمجي التالي كيفية إنشاء هذه المهمة وضبطها.

تعرض هذه العيّنات أيضًا الصيغ المختلفة لإنشاء المهام للصور وملفات الفيديو وأحداث البث المباشر.

صورة

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.IMAGE)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

فيديو

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face landmarker instance with the video mode:
options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.VIDEO)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

بث مباشر

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
FaceLandmarkerResult = mp.tasks.vision.FaceLandmarkerResult
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face landmarker instance with the live stream mode:
def print_result(result: FaceLandmarkerResult, output_image: mp.Image, timestamp_ms: int):
    print('face landmarker result: {}'.format(result))

options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

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

خيارات الضبط

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

اسم الخيار الوصف نطاق القيمة القيمة التلقائية
running_mode لضبط وضع التشغيل للمهمة هناك ثلاثة أوضاع:

IMAGE: وضع الإدخالات باستخدام صورة واحدة.

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

LIVE_STREAM: وضع البث المباشر لبيانات الإدخال ، مثل بيانات الكاميرا في هذا الوضع، يجب استدعاء resultListener لإعداد مستمع لتلقّي النتائج بشكل غير متزامن.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_faces الحد الأقصى لعدد الوجوه التي يمكن رصدها باستخدام الFaceLandmarker لا يتم تطبيق التمويه إلا عند ضبط num_faces على 1. Integer > 0 1
min_face_detection_confidence الحد الأدنى لنتيجة الثقة ليعتبر رصد الوجه ناجحًا Float [0.0,1.0] 0.5
min_face_presence_confidence الحد الأدنى لنتيجة الثقة في توفّر الوجه نتيجة في ميزة "اكتشاف معالم الوجه" Float [0.0,1.0] 0.5
min_tracking_confidence الحد الأدنى لنتيجة الثقة لتتبُّع الوجوه ليكون ناجحاً Float [0.0,1.0] 0.5
output_face_blendshapes ما إذا كان "مُحدِّد معالم الوجه" يُخرج أشكالًا ممزوجة للوجه تُستخدَم أشكال مزج الوجه لعرض نموذج الوجه الثلاثي الأبعاد. Boolean False
output_facial_transformation_matrixes ما إذا كان FaceLandmarker يُخرج مصفوفة التحويل للوجه. يستخدم FaceLandmarker مصفوفة لتحويل معالم الوجه من نموذج وجه أساسي إلى الوجه الذي تم رصده، حتى يتمكّن المستخدمون من تطبيق تأثيرات على معالم الوجه التي تم رصدها. Boolean False
result_callback ضبط مستمع النتائج لتلقّي نتائج علامة المَعلم بشكل غير متزامن عندما يكون FaceLandmarker في وضع البث المباشر لا يمكن استخدامها إلا عند ضبط وضع التشغيل على LIVE_STREAM ResultListener N/A

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

حضِّر الإدخال كملف صورة أو صفيف numpy، ثم حوِّله إلى عنصر mediapipe.Image. إذا كان الإدخال عبارة عن ملف فيديو أو بث مباشر من كاميرا ويب، يمكنك استخدام مكتبة خارجية مثل OpenCV لتحميل لقطات الإدخال كصفائف numpy.

صورة

import mediapipe as mp

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
    

فيديو

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it to calculate the timestamp for each frame.

# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

بث مباشر

import mediapipe as mp

# Use OpenCV’s VideoCapture to start capturing from the webcam.

# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

تنفيذ المهمة

يستخدم Face Landmarker الدوالّ detect وdetect_for_video وdetect_async لبدء الاستنتاجات. بالنسبة إلى وضع علامات على معالم الوجه، يشمل ذلك المعالجة المسبقة لبيانات الإدخال ورصد الوجوه في الصورة.

يوضّح الرمز البرمجي التالي كيفية تنفيذ المعالجة باستخدام نموذج مهمة.

صورة

# Perform face landmarking on the provided single image.
# The face landmarker must be created with the image mode.
face_landmarker_result = landmarker.detect(mp_image)
    

فيديو

# Perform face landmarking on the provided single image.
# The face landmarker must be created with the video mode.
face_landmarker_result = landmarker.detect_for_video(mp_image, frame_timestamp_ms)
    

بث مباشر

# Send live image data to perform face landmarking.
# The results are accessible via the `result_callback` provided in
# the `FaceLandmarkerOptions` object.
# The face landmarker must be created with the live stream mode.
landmarker.detect_async(mp_image, frame_timestamp_ms)
    

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

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

للحصول على مثال كامل لتشغيل أداة "تحديد معالم الوجه" على صورة، اطّلِع على مثال الرمز المبرمَج للحصول على التفاصيل.

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

تُعرِض ميزة "وضع علامات على ملامح الوجه" عنصرًا من النوع 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]
    ...

تعرض الصورة التالية عرضًا مرئيًا لمعدّل تكرار المهمة:

رجل تمّ تخطيط مناطق وجهه بشكل هندسي للإشارة إلى شكل وجهه وأبعاده

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