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

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

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

कोड का उदाहरण

MediaPipe Tasks उदाहरण कोड, Android के लिए फ़ेस लैंडमार्कर ऐप्लिकेशन को लागू करने का एक आसान तरीका है. इस उदाहरण में, Android डिवाइस के कैमरे का इस्तेमाल किया गया है, ताकि लगातार वीडियो स्ट्रीम में चेहरों की पहचान की जा सके. ऐप्लिकेशन, डिवाइस की गैलरी से इमेज और वीडियो में मौजूद चेहरों की पहचान भी कर सकता है.

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

कोड डाउनलोड करें

नीचे दिए गए निर्देशों में git कमांड लाइन टूल का इस्तेमाल करके, उदाहरण कोड की लोकल कॉपी बनाने का तरीका बताया गया है.

उदाहरण कोड डाउनलोड करने के लिए:

  1. नीचे दिए गए निर्देश का इस्तेमाल करके, गिट रिपॉज़िटरी का क्लोन बनाएं:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. इसके अलावा, स्पार्स चेकआउट का इस्तेमाल करने के लिए अपने गिट इंस्टेंस को कॉन्फ़िगर करें. ऐसा करने से, आपके पास सिर्फ़ Face लैंडमार्कर के उदाहरण वाले ऐप्लिकेशन की फ़ाइलें होती हैं:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_landmarker/android
    

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

मुख्य कॉम्पोनेंट

इन फ़ाइलों में, फ़ेस लैंडमार्क के उदाहरण वाले ऐप्लिकेशन के लिए ज़रूरी कोड मौजूद है:

  • FaceLandmarkerHelper.kt - फ़ेस लैंडमार्कर को शुरू करता है. साथ ही, मॉडल और चुनने का काम मैनेज करता है.
  • CameraFragment.kt - डिवाइस के कैमरे को हैंडल करता है और इमेज और वीडियो के इनपुट डेटा को प्रोसेस करता है.
  • GalleryFragment.kt - आउटपुट इमेज या वीडियो दिखाने के लिए OverlayView के साथ इंटरैक्ट करता है.
  • OverlayView.kt - पता लगाए गए चेहरों के लिए, फ़ेस मेश के साथ डिसप्ले लागू करता है.

सेटअप

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

डिपेंडेंसी

फ़ेस लैंडमार्क टास्क, com.google.mediapipe:tasks-vision लाइब्रेरी का इस्तेमाल करता है. अपने Android ऐप्लिकेशन की build.gradle फ़ाइल पर यह डिपेंडेंसी जोड़ें:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

मॉडल

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

मॉडल चुनें और डाउनलोड करें और इसे अपनी प्रोजेक्ट डायरेक्ट्री में स्टोर करें:

<dev-project-root>/src/main/assets

ModelAssetPath पैरामीटर में मॉडल का पाथ बताएं. उदाहरण कोड में, मॉडल की जानकारी FaceLandmarkerHelper.kt फ़ाइल में दी गई है:

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

टास्क बनाएं

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

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

Image

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)
    

फ़ेस लैंडमार्कर के उदाहरण वाले कोड को लागू करने पर, उपयोगकर्ता एक से दूसरे प्रोसेस मोड पर जा सकता है. यह तरीका टास्क बनाने वाले कोड को ज़्यादा जटिल बना देता है. ऐसा भी हो सकता है कि वह आपके इस्तेमाल के उदाहरण के लिए सही न हो. आपके पास इस कोड को FaceLandmarkerHelper.kt फ़ाइल में मौजूद setupFaceLandmarker() फ़ंक्शन में देखने का विकल्प है.

कॉन्फ़िगरेशन विकल्प

इस टास्क में, Android ऐप्लिकेशन के कॉन्फ़िगरेशन के ये विकल्प मौजूद हैं:

विकल्प का नाम ब्यौरा वैल्यू रेंज डिफ़ॉल्ट मान
runningMode टास्क के लिए, रनिंग मोड सेट करता है. इसके तीन मोड होते हैं:

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

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

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

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

फ़ेस लैंडमार्कर की सुविधा, इमेज, वीडियो फ़ाइलों, और लाइव वीडियो स्ट्रीम के साथ काम करती है. यह टास्क, डेटा इनपुट की प्री-प्रोसेसिंग को हैंडल करता है. इसमें साइज़ बदलना, घुमाना, और वैल्यू को सामान्य बनाना भी शामिल है.

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

Image

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()
    

फ़ेस लैंडमार्क के उदाहरण वाले कोड में, डेटा तैयार करने का काम FaceLandmarkerHelper.kt फ़ाइल में किया जाता है.

टास्क चलाएं

आपको किस तरह के डेटा के साथ काम करना है, इस आधार पर FaceLandmarker.detect...() वाला तरीका इस्तेमाल करें. यह तरीका खास तौर पर उस डेटा टाइप के हिसाब से होना चाहिए. अलग-अलग इमेज के लिए detect(), वीडियो फ़ाइलों में फ़्रेम के लिए detectForVideo(), और वीडियो स्ट्रीम के लिए detectAsync() का इस्तेमाल करें. किसी वीडियो स्ट्रीम पर डिटेक्शन चलाते समय, यूज़र इंटरफ़ेस थ्रेड को ब्लॉक होने से बचाने के लिए, पक्का करें कि आप डिटेक्शन को किसी अलग थ्रेड पर चलाएं.

नीचे दिए गए कोड सैंपल, इन अलग-अलग डेटा मोड में फ़ेस लैंडमार्कर का इस्तेमाल करने के कुछ आसान उदाहरण देते हैं:

Image

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)
    

निम्न पर ध्यान दें:

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

फ़ेस लैंडमार्क के उदाहरण वाले कोड में, detect, detectForVideo, और detectAsync फ़ंक्शन के बारे में FaceLandmarkerHelper.kt फ़ाइल में बताया गया है.

नतीजे मैनेज करें और दिखाएं

फ़ेस लैंडमार्क, हर बार पहचाने जाने के लिए एक 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]
    ...

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

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