Python के लिए फ़ेस लैंडमार्क की पहचान करने वाली गाइड

MediaPipe Face Transcribeer टास्क की मदद से, इमेज और वीडियो में चेहरे के लैंडमार्क और चेहरे के हाव-भाव का पता लगाया जा सकता है. इस टास्क का इस्तेमाल, इंसान के चेहरे के हाव-भाव की पहचान करने और वर्चुअल अवतार बनाने के लिए चेहरे के फ़िल्टर और इफ़ेक्ट लगाने के लिए किया जा सकता है. यह टास्क, मशीन लर्निंग (एमएल) मॉडल का इस्तेमाल करता है. यह मॉडल एक इमेज या लगातार स्ट्रीम की जा सकने वाली इमेज के साथ काम कर सकता है. इस टास्क में, 3-डाइमेंशन वाले चेहरे के लैंडमार्क, ब्लेंडशेप स्कोर (चेहरे के हाव-भाव को दिखाने वाले गुणांक), रीयल-टाइम में चेहरे की पूरी जानकारी का पता लगाने के लिए, ट्रांसफ़ॉर्मेशन मैट्रिक्स दिए जाते हैं. इसके अलावा, इफ़ेक्ट रेंडरिंग के लिए ज़रूरी ट्रांसफ़ॉर्मेशन के तरीकों के बारे में भी बताया जाता है.

इन निर्देशों में दिया गया कोड सैंपल, GitHub पर उपलब्ध है. इस टास्क की क्षमताओं, मॉडल, और कॉन्फ़िगरेशन विकल्पों के बारे में ज़्यादा जानकारी के लिए, खास जानकारी देखें.

कोड का उदाहरण

फ़ेस लैंडमार्क का उदाहरण कोड, आपके रेफ़रंस के लिए, Python में इस टास्क को पूरी तरह लागू करने का तरीका बताता है. इस कोड की मदद से, इस टास्क को टेस्ट किया जा सकता है. साथ ही, फ़ेस लैंडमार्कर बनाने का काम भी शुरू किया जा सकता है. आप सिर्फ़ अपने वेब ब्राउज़र का इस्तेमाल करके फ़ेस लैंडमार्कर के उदाहरण वाले कोड को देख सकते हैं, चला सकते हैं, और उसमें बदलाव कर सकते हैं.

अगर रैज़बेरी पाई के लिए फ़ेस लैंडमार्क का इस्तेमाल किया जा रहा है, तो Raspबेरी Pi के उदाहरण वाला ऐप्लिकेशन देखें.

सेटअप

इस सेक्शन में, डेवलपमेंट एनवायरमेंट को सेट अप करने के मुख्य चरणों के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि खास तौर पर फ़ेस लैंडमार्क का इस्तेमाल करने के लिए, कोड प्रोजेक्ट कैसे सेट अप किए जाते हैं. MediaPipe टास्क का इस्तेमाल करने के लिए अपना डेवलपमेंट एनवायरमेंट सेट अप करने से जुड़ी सामान्य जानकारी के लिए, Python के लिए सेटअप गाइड देखें. इसमें प्लैटफ़ॉर्म के वर्शन की ज़रूरी शर्तों के बारे में भी जानकारी शामिल है.

पैकेज

MediaPipe Face Transcribeer टास्क के लिए, MediaPipe PyPI पैकेज की ज़रूरत होती है. इन डिपेंडेंसी को इनके साथ इंस्टॉल और इंपोर्ट किया जा सकता है:

$ python -m pip install mediapipe

इंपोर्ट

फ़ेस लैंडमार्क टास्क के फ़ंक्शन ऐक्सेस करने के लिए, नीचे दी गई क्लास इंपोर्ट करें:

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

मॉडल

MediaPipe Face Transcribeer टास्क के लिए, ऐसा ट्रेनिंग मॉडल होना ज़रूरी है जो इस टास्क के साथ काम कर सके. फ़ेस लैंडमार्क के लिए तैयार किए गए मॉडल के बारे में ज़्यादा जानकारी के लिए, टास्क की खास जानकारी मॉडल सेक्शन देखें.

मॉडल चुनें और उसे डाउनलोड करें. इसके बाद, उसे किसी लोकल डायरेक्ट्री में सेव करें:

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

यह तय करने के लिए कि इस्तेमाल किए जाने वाले मॉडल का पाथ क्या है, BaseOptions ऑब्जेक्ट model_asset_path पैरामीटर का इस्तेमाल करें. कोड के उदाहरण के लिए, अगला सेक्शन देखें.

टास्क बनाएं

MediaPipe Face Transcribeer टास्क, टास्क सेट अप करने के लिए create_from_options फ़ंक्शन का इस्तेमाल करता है. create_from_options फ़ंक्शन, हैंडल करने के लिए कॉन्फ़िगरेशन विकल्पों की वैल्यू स्वीकार करता है. कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानकारी के लिए, कॉन्फ़िगरेशन के विकल्प देखें.

नीचे दिया गया कोड इस टास्क को बनाने और कॉन्फ़िगर करने का तरीका बताता है.

ये सैंपल, इमेज, वीडियो फ़ाइलों, और लाइव स्ट्रीम के लिए, टास्क बनाने के तरीके को भी दिखाते हैं.

Image

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 टास्क के लिए, रनिंग मोड सेट करता है. इसके तीन मोड होते हैं:

इमेज: सिंगल इमेज इनपुट के लिए मोड.

वीडियो: वीडियो के डिकोड किए गए फ़्रेम का मोड.

LIVE_STREAM: इनपुट डेटा की लाइव स्ट्रीम का मोड, जैसे कि कैमरे से स्ट्रीम किया जाने वाला मोड. इस मोड में, रिज़ल्ट पहचानकर्ता को लिसनर को सेट अप करने के लिए कॉल किया जाना चाहिए, ताकि वह एसिंक्रोनस तरीके से नतीजे पा सके.
{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 फ़ेस लैंडमार्कर, ब्लेंड शेप को आउटपुट करता है या नहीं. चेहरे के ब्लेंडशेप का इस्तेमाल, 3D चेहरे के मॉडल को रेंडर करने के लिए किया जाता है. Boolean False
output_facial_transformation_matrixes FaceLandमार्कर, चेहरे के ट्रांसफ़ॉर्मेशन मैट्रिक्स को दिखाता है या नहीं. FaceLandमार्कर, चेहरे के लैंडमार्क को कैननिकल चेहरे के मॉडल से पहचाने गए चेहरे में बदलने के लिए, मैट्रिक्स का इस्तेमाल करता है. इससे उपयोगकर्ता, पहचाने गए लैंडमार्क पर इफ़ेक्ट लागू कर सकते हैं. Boolean False
result_callback जब FaceLandमार्कर लाइव स्ट्रीम मोड में हो, तब यह सुविधा लैंडमार्क के नतीजों को एसिंक्रोनस तरीके से पाने के लिए, नतीजे की पहचान करने वाली सुविधा को सेट करती है. सिर्फ़ तब इस्तेमाल किया जा सकता है, जब रनिंग मोड LIVE_STREAM पर सेट हो ResultListener N/A

डेटा तैयार करना

अपने इनपुट को इमेज फ़ाइल या संख्यात्मक कलेक्शन के तौर पर तैयार करें. इसके बाद, उसे mediapipe.Image ऑब्जेक्ट में बदलें. अगर आपने किसी वेबकैम से कोई वीडियो फ़ाइल या लाइव स्ट्रीम इनपुट की है, तो आपके पास OpenCV जैसी बाहरी लाइब्रेरी का इस्तेमाल करने का विकल्प है. इस लाइब्रेरी में मौजूद इनपुट फ़्रेम को सुन्न कलेक्शन के तौर पर लोड किया जा सकता है.

Image

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)
    

टास्क चलाएं

फ़ेस लैंडमार्कर, अनुमान लगाने के लिए detect, detect_for_video, और detect_async फ़ंक्शन का इस्तेमाल करता है. चेहरे की पहचान करने के लिए, इसमें इनपुट डेटा को पहले से प्रोसेस करना और इमेज में चेहरों का पता लगाना होता है.

नीचे दिया गया कोड बताता है कि टास्क मॉडल से प्रोसेसिंग को कैसे एक्ज़ीक्यूट करें.

Image

# 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]
    ...

इस इमेज में, टास्क के आउटपुट का विज़ुअलाइज़ेशन दिखाया गया है:

फ़ेस लैंडमार्क के उदाहरण वाले कोड से पता चलता है कि टास्क से दिखाए गए नतीजों को कैसे दिखाया जाता है. ज़्यादा जानकारी के लिए, कोड का उदाहरण देखें.