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

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

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

कोड का उदाहरण

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

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

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

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

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

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

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

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

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

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

सेटअप

इस सेक्शन में, आपके डेवलपमेंट एनवायरमेंट को सेट अप करने और फ़ेस लैंडमार्कर का इस्तेमाल करने के लिए कोड प्रोजेक्ट बनाते हैं. इस पर सामान्य जानकारी के लिए MediaPipe के टास्क इस्तेमाल करने के लिए डेवलपमेंट एनवायरमेंट सेट अप करना. इसमें ये भी शामिल हैं प्लैटफ़ॉर्म वर्शन की ज़रूरी शर्तें, Google के सभी प्रॉडक्ट के लिए सेटअप गाइड Android.

डिपेंडेंसी

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

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

मॉडल

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

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

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

ModelAssetPath पैरामीटर में मॉडल का पाथ तय करें. इस उदाहरण के लिए, मॉडल FaceLandmarkerHelper.kt फ़ाइल:

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

टास्क बनाएं

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

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

इमेज

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)
    

फ़ेस लैंडमार्कर के उदाहरण वाले कोड को लागू करने पर, उपयोगकर्ता अलग-अलग डिवाइसों के बीच स्विच कर सकता है प्रोसेस मोड. इस तरीके से टास्क बनाने का कोड ज़्यादा मुश्किल हो जाता है और आपके इस्तेमाल के उदाहरण के लिए सही नहीं हो सकती है. आप इस कोड को यहां देख सकते हैं: 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 क्या फ़ेस लैंडमार्कर, चेहरे के अलग-अलग शेप दिखाता है. चेहरे के अलग-अलग आकार के आकारों का इस्तेमाल, चेहरे के 3D मॉडल को रेंडर करने के लिए किया जाता है. 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()
    

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

टास्क को पूरा करें

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

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

इमेज

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 क्लास देखें.