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

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

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

कोड का उदाहरण

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

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

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

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

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

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

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

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

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

  • FaceDetectorHelper.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 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() फ़ंक्शन, कॉन्फ़िगरेशन के लिए वैल्यू स्वीकार करता है के विकल्प. कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानकारी पाने के लिए, यहां जाएं कॉन्फ़िगरेशन के विकल्प.

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

इमेज

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)
    

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

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

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

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

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इमेज: सिंगल इमेज इनपुट का मोड.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है वीडियो: किसी वीडियो के डिकोड किए गए फ़्रेम के लिए मोड.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है LIVE_STREAM: इनपुट की लाइवस्ट्रीम करने का मोड जैसी निजी जानकारी को किसी भी समय रिकॉर्ड कर सकते हैं. इस मोड में, resultListener होना चाहिए नतीजे पाने के लिए, लिसनर सेट अप करने के लिए कॉल किया गया एसिंक्रोनस रूप से.
{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

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

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

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

इमेज

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

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

इमेज

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