Android के लिए चेहरा पहचानने की गाइड

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

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

कोड का उदाहरण

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

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

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

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

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

  1. नीचे दिए गए निर्देश का इस्तेमाल करके, गिट रिपॉज़िटरी का क्लोन बनाएं:
    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_detector/android
    

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

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

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

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

सेटअप

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

डिपेंडेंसी

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

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

मॉडल

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

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

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

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

val modelName = "face_detection_short_range.tflite"
baseOptionsBuilder.setModelAssetPath(modelName)

टास्क बनाएं

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

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

Image

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    FaceDetector.FaceDetectorOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinDetectionConfidence(threshold)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()

FaceDetector =
    FaceDetector.createFromOptions(context, options)
    

वीडियो

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    FaceDetector.FaceDetectorOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinDetectionConfidence(threshold)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()

FaceDetector =
    FaceDetector.createFromOptions(context, options)
    

लाइव स्ट्रीम

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    FaceDetector.FaceDetectorOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinDetectionConfidence(threshold)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()

FaceDetector =
    FaceDetector.createFromOptions(context, options)
    

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

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

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

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

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

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

LIVE_STREAM: इनपुट डेटा की लाइव स्ट्रीम का मोड, जैसे कि कैमरे से स्ट्रीम किया जाने वाला मोड. इस मोड में, रिज़ल्ट पहचानकर्ता को लिसनर को सेट अप करने के लिए कॉल किया जाना चाहिए, ताकि वह एसिंक्रोनस तरीके से नतीजे पा सके.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
minDetectionConfidence चेहरे की पहचान के लिए ज़रूरी सबसे कम कॉन्फ़िडेंस स्कोर. इस स्कोर को बेहतर माना जाता है. Float [0,1] 0.5
minSuppressionThreshold चेहरे की पहचान के लिए, नॉन-ज़्यादा से ज़्यादा सप्रेशन की सीमा, ताकि उसे ओवरलैप माना जा सके. Float [0,1] 0.3
resultListener जब फ़ेस डिटेक्टर लाइव स्ट्रीम मोड में हो, तो नतीजे लिसनर को पहचान के नतीजों को एसिंक्रोनस तरीके से पाने के लिए सेट करता है. इसे सिर्फ़ तब इस्तेमाल किया जा सकता है, जब रनिंग मोड LIVE_STREAM पर सेट हो. N/A Not set
errorListener गड़बड़ी की जानकारी देने वाला वैकल्पिक लिसनर सेट करता है. N/A Not set

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

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

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

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

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

टास्क चलाएं

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

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

Image

val result = faceDetector.detect(mpImage)
    

वीडियो

val timestampMs = i * inferenceIntervalMs

faceDetector.detectForVideo(mpImage, timestampMs)
    .let { detectionResult ->
        resultList.add(detectionResult)
    }
    

लाइव स्ट्रीम

val mpImage = BitmapImageBuilder(rotatedBitmap).build()
val frameTime = SystemClock.uptimeMillis()

faceDetector.detectAsync(mpImage, frameTime)
    

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

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

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

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

फ़ेस डिटेक्टर हर बार चलाए जाने के लिए, एक FaceDetectorResult ऑब्जेक्ट दिखाता है. नतीजे के ऑब्जेक्ट में, पहचाने गए चेहरों के लिए बाउंडिंग बॉक्स और पहचाने गए हर चेहरे के लिए कॉन्फ़िडेंस स्कोर होता है.

इस टास्क के आउटपुट डेटा का एक उदाहरण यहां दिया गया है:

FaceDetectionResult:
  Detections:
    Detection #0:
      BoundingBox:
        origin_x: 126
        origin_y: 100
        width: 463
        height: 463
      Categories:
        Category #0:
          index: 0
          score: 0.9729152917861938
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.18298381567001343
          y: 0.2961040139198303
        NormalizedKeypoint #1:
          x: 0.3302789330482483
          y: 0.29289937019348145
        ... (6 keypoints for each face)
    Detection #1:
      BoundingBox:
        origin_x: 616
        origin_y: 193
        width: 430
        height: 430
      Categories:
        Category #0:
          index: 0
          score: 0.9251380562782288
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.6151331663131714
          y: 0.3713381886482239
        NormalizedKeypoint #1:
          x: 0.7460576295852661
          y: 0.38825345039367676
        ... (6 keypoints for each face)

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

बिना बाउंडिंग बॉक्स वाली इमेज के लिए, ओरिजनल इमेज देखें.

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