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/pose_landmarker/android
    

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

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

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

  • PoseLandmarkerHelper.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 पोज़ लैंडमार्कर टास्क के लिए, एक प्रशिक्षित मॉडल बंडल की ज़रूरत होती है, जो इस टास्क को पूरा करें. पोज़ लैंडमार्कर के लिए उपलब्ध ट्रेन किए गए मॉडल के बारे में ज़्यादा जानकारी के लिए, टास्क की खास जानकारी वाला मॉडल सेक्शन देखें.

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

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

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

val modelName = "pose_landmarker_lite.task"
baseOptionsBuilder.setModelAssetPath(modelName)

टास्क बनाएं

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

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

इमेज

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

val optionsBuilder = 
    poseLandmarker.poseLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinPoseDetectionConfidence(minPoseDetectionConfidence)
        .setMinTrackingConfidence(minPoseTrackingConfidence)
        .setMinPosePresenceConfidence(minposePresenceConfidence)
        .setNumPoses(maxNumPoses)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()
poseLandmarker = poseLandmarker.createFromOptions(context, options)
    

वीडियो

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

val optionsBuilder = 
    poseLandmarker.poseLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinPoseDetectionConfidence(minPoseDetectionConfidence)
        .setMinTrackingConfidence(minPoseTrackingConfidence)
        .setMinPosePresenceConfidence(minposePresenceConfidence)
        .setNumPoses(maxNumPoses)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()
poseLandmarker = poseLandmarker.createFromOptions(context, options)
    

लाइव स्ट्रीम

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

val optionsBuilder = 
    poseLandmarker.poseLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinPoseDetectionConfidence(minPoseDetectionConfidence)
        .setMinTrackingConfidence(minPoseTrackingConfidence)
        .setMinPosePresenceConfidence(minposePresenceConfidence)
        .setNumPoses(maxNumPoses)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()
poseLandmarker = poseLandmarker.createFromOptions(context, options)
    

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

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

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

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

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इमेज: सिंगल इमेज इनपुट का मोड.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है वीडियो: किसी वीडियो के डिकोड किए गए फ़्रेम के लिए मोड.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है LIVE_STREAM: इनपुट की लाइवस्ट्रीम करने का मोड जैसी निजी जानकारी को किसी भी समय रिकॉर्ड कर सकते हैं. इस मोड में, resultListener होना चाहिए नतीजे पाने के लिए, लिसनर सेट अप करने के लिए कॉल किया गया एसिंक्रोनस रूप से.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
numposes ज़्यादा से ज़्यादा पोज़ की संख्या जिनका पता लैंडमार्क पोज़ दें. Integer > 0 1
minPoseDetectionConfidence पोज़ की पहचान के लिए कम से कम कॉन्फ़िडेंस स्कोर यह होना चाहिए सफल माना जाता है. Float [0.0,1.0] 0.5
minPosePresenceConfidence पोज़ की मौजूदगी का कम से कम कॉन्फ़िडेंस स्कोर पोज़ लैंडमार्क की पहचान करने के लिए स्कोर किया जा सकता है. Float [0.0,1.0] 0.5
minTrackingConfidence पोज़ ट्रैकिंग के लिए कम से कम कॉन्फ़िडेंस स्कोर इन्हें सफल माना जाता है. Float [0.0,1.0] 0.5
outputSegmentationMasks क्या पोज़ लैंडमार्कर, पहचाने गए आइटम के लिए सेगमेंटेशन मास्क देता है पोज़. Boolean False
resultListener लैंडमार्कर के नतीजे पाने के लिए, यह नतीजा लिसनर को सेट करता है जब Pose मार्कर लाइव स्ट्रीम मोड में हो, तब यह एसिंक्रोनस रूप से उपलब्ध नहीं होता है. इसका इस्तेमाल सिर्फ़ तब किया जा सकता है, जब रनिंग मोड को 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()
    

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

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

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

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

इमेज

val result = poseLandmarker.detect(mpImage)
    

वीडियो

val timestampMs = i * inferenceIntervalMs

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

लाइव स्ट्रीम

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

poseLandmarker.detectAsync(mpImage, frameTime)
    

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

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

पॉज़ लैंडमार्कर के उदाहरण कोड में, detect, detectForVideo, और detectAsync फ़ंक्शन इसमें परिभाषित किए गए हैं: PoseLandmarkerHelper.kt फ़ाइल से लिए जाते हैं.

नतीजों को हैंडल करना और दिखाना

पोज़ लैंडमार्कर, हर पहचान के लिए एक poseLandmarkerResult ऑब्जेक्ट दिखाता है दौड़ना. नतीजे में मिले ऑब्जेक्ट में, हर पोज़ लैंडमार्क के लिए निर्देशांक शामिल हैं.

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

PoseLandmarkerResult:
  Landmarks:
    Landmark #0:
      x            : 0.638852
      y            : 0.671197
      z            : 0.129959
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.634599
      y            : 0.536441
      z            : -0.06984
      visibility   : 0.999909
      presence     : 0.999958
    ... (33 landmarks per pose)
  WorldLandmarks:
    Landmark #0:
      x            : 0.067485
      y            : 0.031084
      z            : 0.055223
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.063209
      y            : -0.00382
      z            : 0.020920
      visibility   : 0.999976
      presence     : 0.999998
    ... (33 world landmarks per pose)
  SegmentationMasks:
    ... (pictured below)

आउटपुट में नॉर्मलाइज़ किए गए निर्देशांक (Landmarks) और दुनिया, दोनों शामिल होते हैं हर लैंडमार्क के लिए निर्देशांक (WorldLandmarks) डालें.

आउटपुट में नीचे दिए गए नॉर्मलाइज़ किए गए निर्देशांक शामिल हैं (Landmarks):

  • x और y: लैंडमार्क कोऑर्डिनेट को 0.0 और 1.0 के बीच इमेज की चौड़ाई (x) और ऊंचाई (y).

  • z: लैंडमार्क गहराई, कूल्हे के बीच के बिंदु पर गहराई के रूप में ऑरिजिन. वैल्यू जितनी कम होती है, लैंडमार्क, कैमरे के उतना ही करीब होता है. कॉन्टेंट बनाने z मैग्निट्यूड भी x के बराबर स्केल का इस्तेमाल करता है.

  • visibility: इमेज में लैंडमार्क के दिखने की संभावना.

आउटपुट में दुनिया के ये निर्देशांक शामिल हैं (WorldLandmarks):

  • x, y, और z: मीटर में, वास्तविक दुनिया के 3-डाइमेंशन वाले निर्देशांक, मूल रूप से कूल्हे के बीच का हिस्सा.

  • visibility: इमेज में लैंडमार्क के दिखने की संभावना.

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

वैकल्पिक सेगमेंटेशन मास्क, हर पिक्सल से जुड़े होने की संभावना दिखाता है को नुकसान पहुंचता है. नीचे दी गई इमेज, टास्क आउटपुट:

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