MediaPipe के जेस्चर आइडेंटिफ़ायर टास्क से आपको रीयल टाइम में, हाथ के जेस्चर की पहचान करने में मदद मिलती है. हाथ के जेस्चर से जुड़े नतीजे और लैंडमार्क की मदद से, हाथों की पहचान हुई है. ये निर्देश आपको जेस्चर आइडेंटिफ़ायर को इस्तेमाल करने का तरीका बताते हैं Android ऐप्लिकेशन के साथ इन निर्देशों में बताया गया कोड सैंपल उपलब्ध है GitHub पर.
आप वेब डेमो शामिल है. क्षमताओं, मॉडल, और कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानकारी पाने के लिए इस टास्क की खास जानकारी देखें.
कोड का उदाहरण
MediaPipe Tasks के उदाहरण कोड से, जेस्चर आइडेंटिफ़ायर को आसानी से लागू किया जा सकता है Android के लिए ऐप. इस उदाहरण में, असली Android डिवाइस के कैमरे का इस्तेमाल इन कामों के लिए किया गया है हाथ के जेस्चर का लगातार पता लगाता है. साथ ही, हाथ के जेस्चर (हाव-भाव) की मदद से, इमेज और वीडियो डिवाइस की गैलरी से, जेस्चर का स्टैटिक तरीके से पता लगाया जा सकता है.
इस ऐप्लिकेशन का इस्तेमाल, अपने Android ऐप्लिकेशन को शुरू करने के लिए किया जा सकता है. इसके अलावा, इसे रेफ़रंस के तौर पर भी इस्तेमाल किया जा सकता है को अपडेट करें. जेस्चर आइडेंटिफ़ायर का उदाहरण कोड यहां होस्ट किया जाता है GitHub.
कोड डाउनलोड करें
नीचे दिए गए निर्देशों में आपको उदाहरण की स्थानीय कॉपी बनाने का तरीका बताया गया है git कमांड लाइन टूल का इस्तेमाल करके कोड बनाना और उसमें बदलाव करना.
उदाहरण कोड डाउनलोड करने के लिए:
- नीचे दिए गए कमांड का इस्तेमाल करके git रिपॉज़िटरी का क्लोन बनाएं:
git clone https://github.com/google-ai-edge/mediapipe-samples
- इसके अलावा, स्पार्स चेकआउट का इस्तेमाल करने के लिए अपना git इंस्टेंस कॉन्फ़िगर करें,
इसलिए आपके पास सिर्फ़ जेस्चर आइडेंटिफ़ायर के उदाहरण ऐप्लिकेशन की फ़ाइलें ही होती हैं:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/gesture_recognizer/android
उदाहरण के तौर पर दिए गए कोड का लोकल वर्शन बनाने के बाद, प्रोजेक्ट को इंपोर्ट किया जा सकता है और इस ऐप्लिकेशन को चलाएं. निर्देशों के लिए, इसे देखें Android के लिए सेटअप गाइड.
मुख्य कॉम्पोनेंट
इन फ़ाइलों में, हाथ के इस जेस्चर का ज़रूरी कोड शामिल है पहचान करने के लिए उदाहरण के तौर पर दिया गया ऐप्लिकेशन:
- GestureRecognizerHelper.kt - यह जेस्चर आइडेंटिफ़ायर को शुरू करता है. साथ ही, मॉडल और डेलिगेट को हैंडल करता है चुनें.
- MainActivity.kt -
ऐप्लिकेशन लागू करता है, जिसमें
GestureRecognizerHelper
को कॉल करना औरGestureRecognizerResultsAdapter
. - GestureRecognizerResultsAdapter.kt - नतीजों को हैंडल और फ़ॉर्मैट करता है.
सेटअप
इस सेक्शन में, आपके डेवलपमेंट एनवायरमेंट को सेट अप करने और कोड प्रोजेक्ट को खास तौर पर, जेस्चर आइडेंटिफ़ायर का इस्तेमाल करने के लिए किया जाता है. इस पर सामान्य जानकारी के लिए MediaPipe के टास्क इस्तेमाल करने के लिए डेवलपमेंट एनवायरमेंट सेट अप करना. इसमें ये भी शामिल हैं प्लैटफ़ॉर्म वर्शन की ज़रूरी शर्तें पूरी करते हैं. इसके बारे में ज़्यादा जानने के लिए, 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
पैरामीटर में मॉडल का पाथ तय करें. इस
उदाहरण के लिए कोड,
मॉडल की जानकारी GestureRecognizerHelper.kt
में दी गई है
फ़ाइल:
baseOptionBuilder.setModelAssetPath(MP_RECOGNIZER_TASK)
टास्क बनाएं
MediaPipe जेस्चर आइडेंटिफ़ायर टास्क सेट करने के लिए createFromOptions()
फ़ंक्शन का इस्तेमाल करता है
उस टास्क को पूरा किया जा सकता है. createFromOptions()
फ़ंक्शन
कॉन्फ़िगर करने के विकल्प दिए गए हैं. कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानकारी पाने के लिए,
कॉन्फ़िगरेशन के विकल्प देखें.
जेस्चर आइडेंटिफ़ायर तीन तरह के इनपुट डेटा के साथ काम करता है: स्टिल इमेज, वीडियो फ़ाइलें, और लाइव वीडियो स्ट्रीम. आपको इससे जुड़ा दौड़ने मोड तय करना होगा आपके इनपुट डेटा टाइप को टास्क बनाते समय डालें. इससे जुड़ा टैब चुनें अपने इनपुट डेटा टाइप को देखें, ताकि टास्क बनाने और अनुमान लगाने का तरीका देखा जा सके.
इमेज
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setRunningMode(RunningMode.IMAGE) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
वीडियो
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
लाइव स्ट्रीम
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setResultListener(this::returnLivestreamResult) .setErrorListener(this::returnLivestreamError) .setRunningMode(RunningMode.LIVE_STREAM) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
जेस्चर आइडेंटिफ़ायर के उदाहरण कोड को लागू करने पर, उपयोगकर्ता अलग-अलग कोड के बीच स्विच कर सकता है
प्रोसेस मोड. इस तरीके से टास्क बनाने का कोड ज़्यादा मुश्किल हो जाता है और
आपके इस्तेमाल के उदाहरण के लिए सही नहीं हो सकती है. आप इस कोड को यहां देख सकते हैं:
setupGestureRecognizer()
फ़ंक्शन
GestureRecognizerHelper.kt
फ़ाइल से लिए जाते हैं.
कॉन्फ़िगरेशन विकल्प
इस टास्क में Android ऐप्लिकेशन के लिए, नीचे दिए गए कॉन्फ़िगरेशन के विकल्प मौजूद हैं:
विकल्प का नाम | ब्यौरा | मान की सीमा | डिफ़ॉल्ट मान | |
---|---|---|---|---|
runningMode |
टास्क के लिए रनिंग मोड सेट करता है. तीन
मोड: अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इमेज: सिंगल इमेज इनपुट का मोड. अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है वीडियो: किसी वीडियो के डिकोड किए गए फ़्रेम के लिए मोड. अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है LIVE_STREAM: इनपुट की लाइवस्ट्रीम करने का मोड जैसी निजी जानकारी को किसी भी समय रिकॉर्ड कर सकते हैं. इस मोड में, resultListener होना चाहिए नतीजे पाने के लिए, लिसनर सेट अप करने के लिए कॉल किया गया एसिंक्रोनस रूप से. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
|
numHands |
हाथों की अधिकतम संख्या का पता लगाने के लिए
GestureRecognizer .
|
Any integer > 0 |
1 |
|
minHandDetectionConfidence |
हाथ की पहचान के लिए कम से कम कॉन्फ़िडेंस स्कोर इतना होना चाहिए हथेली की पहचान करने वाले मॉडल में सफल माना गया है. | 0.0 - 1.0 |
0.5 |
|
minHandPresenceConfidence |
हाथ की मौजूदगी का कम से कम कॉन्फ़िडेंस स्कोर लैंडमार्क डिटेक्शन मॉडल. जेस्चर आइडेंटिफ़ायर के वीडियो मोड और लाइव स्ट्रीम मोड में, अगर हैंड लैंडमार्क मॉडल से हैंड मौजूदगी का भरोसा देने वाले स्कोर से कम है तो यह पाम डिटेक्शन मॉडल को ट्रिगर करती है. या फिर, लाइटवेट हैंड ट्रैकिंग एल्गोरिदम का इस्तेमाल, इनकी जगह का पता लगाने के लिए किया जाता है बाद में लैंडमार्क की पहचान करने के लिए, हाथों का इस्तेमाल करना होगा. | 0.0 - 1.0 |
0.5 |
|
minTrackingConfidence |
हैंड ट्रैकिंग के लिए ज़रूरी कम से कम कॉन्फ़िडेंस स्कोर हो गया. यह बाउंडिंग बॉक्स IoU थ्रेशोल्ड है, जो मौजूदा फ़्रेम और आखिरी फ़्रेम. इनके वीडियो मोड और स्ट्रीम मोड में जेस्चर आइडेंटिफ़ायर, अगर ट्रैकिंग फ़ेल होती है, तो जेस्चर आइडेंटिफ़ायर हाथ से ट्रिगर होता है पता लगाया जा सकता है. अगर ऐसा नहीं होता है, तो हाथ की पहचान करने की सुविधा स्किप कर दी जाती है. | 0.0 - 1.0 |
0.5 |
|
cannedGesturesClassifierOptions |
पहले से तैयार जेस्चर की कैटगरी तय करने वाले व्यवहार को कॉन्फ़िगर करने के विकल्प. पहले से तैयार जेस्चर ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"] हैं |
|
|
|
customGesturesClassifierOptions |
कस्टम जेस्चर की कैटगरी तय करने वाले व्यवहार को कॉन्फ़िगर करने के विकल्प. |
|
|
|
resultListener |
यह नीति, क्लासिफ़िकेशन के नतीजे पाने के लिए, रिज़ल्ट लिसनर को सेट करती है
जब जेस्चर आइडेंटिफ़ायर लाइव स्ट्रीम मोड में हो, तब यह एसिंक्रोनस रूप से काम करता है.
इसका इस्तेमाल सिर्फ़ तब किया जा सकता है, जब रनिंग मोड को LIVE_STREAM पर सेट किया गया हो |
ResultListener |
लागू नहीं | लागू नहीं |
errorListener |
गड़बड़ी की जानकारी देने वाला वैकल्पिक लिसनर सेट करता है. | ErrorListener |
लागू नहीं | लागू नहीं |
डेटा तैयार करें
जेस्चर आइडेंटिफ़ायर, इमेज, वीडियो फ़ाइल, और लाइव स्ट्रीम वीडियो के साथ काम करता है. टास्क यह डेटा इनपुट की प्री-प्रोसेसिंग को हैंडल करता है. इसमें साइज़ बदलना, रोटेशन, और वैल्यू शामिल है नॉर्मलाइज़ेशन.
नीचे दिया गया कोड बताता है कि डेटा को किस तरह से प्रोसेस किया जा सकता है. थीस इन सैंपल में, इमेज, वीडियो फ़ाइलों, और लाइव स्ट्रीम के डेटा को मैनेज करने की जानकारी शामिल होती है वीडियो स्ट्रीम.
इमेज
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()
इस
जेस्चर आइडेंटिफ़ायर का उदाहरण कोड, डेटा तैयार करने का काम
GestureRecognizerHelper.kt
फ़ाइल से लिए जाते हैं.
टास्क को पूरा करें
जेस्चर आइडेंटिफ़ायर, recognize
, recognizeForVideo
, और recognizeAsync
का इस्तेमाल करता है
फ़ंक्शन का इस्तेमाल करता है. जेस्चर की पहचान करने के लिए, यह ज़रूरी है
इनपुट डेटा की प्री-प्रोसेसिंग, इमेज में हाथों की पहचान करना, हाथ की पहचान करना
लैंडमार्क को पहचानने और उसके हाथ के जेस्चर की पहचान करने के लिए किया जाता है.
नीचे दिया गया कोड, टास्क मॉडल की मदद से प्रोसेसिंग को एक्ज़ीक्यूट करने का तरीका बताता है. इन सैंपल में, इमेज, वीडियो फ़ाइलों, साथ ही, लाइव वीडियो स्ट्रीम भी दिखेंगी.
इमेज
val result = gestureRecognizer?.recognize(mpImage)
वीडियो
val timestampMs = i * inferenceIntervalMs gestureRecognizer?.recognizeForVideo(mpImage, timestampMs) ?.let { recognizerResult -> resultList.add(recognizerResult) }
लाइव स्ट्रीम
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() gestureRecognizer?.recognizeAsync(mpImage, frameTime)
निम्न पर ध्यान दें:
- वीडियो मोड या लाइव स्ट्रीम मोड में चलाते समय, आपको ये काम भी करने होंगे जेस्चर आइडेंटिफ़ायर टास्क के लिए इनपुट फ़्रेम का टाइमस्टैंप उपलब्ध कराएं.
- इमेज या वीडियो मोड में चलते समय, जेस्चर आइडेंटिफ़ायर का टास्क मौजूदा थ्रेड को तब तक ब्लॉक करें, जब तक कि यह इनपुट इमेज की प्रोसेसिंग पूरी न कर ले या फ़्रेम. यूज़र इंटरफ़ेस ब्लॉक न हो, इसके लिए प्रोसेसिंग को बैकग्राउंड थ्रेड.
- लाइव स्ट्रीम मोड में इस्तेमाल करते समय, जेस्चर आइडेंटिफ़ायर का टास्क ब्लॉक नहीं होता मौजूदा थ्रेड को हल करने में मदद मिलती है, लेकिन वह तुरंत वापस आ जाता है. यह अपने नतीजे को शुरू करेगा हर बार प्रोसेसिंग खत्म होने पर, पहचान करने के नतीजे के साथ लिसनर इनपुट फ़्रेम शामिल है. अगर पहचान करने वाले फ़ंक्शन को कॉल किया जाता है, तो जेस्चर आइडेंटिफ़ायर टास्क, दूसरे फ़्रेम को प्रोसेस करने में व्यस्त है. इसलिए, यह टास्क नए इनपुट फ़्रेम को अनदेखा करेगा.
इस
जेस्चर आइडेंटिफ़ायर का उदाहरण कोड, recognize
, recognizeForVideo
, और
recognizeAsync
फ़ंक्शन इसमें परिभाषित किए गए हैं:
GestureRecognizerHelper.kt
फ़ाइल से लिए जाते हैं.
नतीजों को हैंडल करना और दिखाना
जेस्चर आइडेंटिफ़ायर हर उपयोगकर्ता के लिए, जेस्चर की पहचान करने वाला नतीजा ऑब्जेक्ट जनरेट करता है पहचान करने के लिए इस्तेमाल किया जाता है. नतीजे के तौर पर दिखाए गए ऑब्जेक्ट में इमेज के निर्देशांकों में, हाथ के लैंडमार्क शामिल हैं, विश्व के निर्देशांकों में हैंड लैंडमार्क, किसी हाथ के इस्तेमाल(बायां/दायां हाथ), और हाथ पहचाने गए हाथों के जेस्चर की कैटगरी.
इस टास्क के आउटपुट डेटा का एक उदाहरण नीचे दिया गया है:
नतीजे में मिले GestureRecognizerResult
में चार कॉम्पोनेंट होते हैं और हर कॉम्पोनेंट एक कलेक्शन होता है. इसमें हर एलिमेंट में एक हाथ की पहचान होने पर मिला नतीजा शामिल होता है.
किसी खास हाथ का इस्तेमाल
किसी हाथ के काम से पता चलता है कि जिस हाथ की पहचान की गई है वह बाएं हाथ है या दाएं.
हाथ के जेस्चर
पहचाने गए हाथ के जेस्चर की कैटगरी.
लैंडमार्क
यहां 21 हाथ से बने लैंडमार्क हैं, जिनमें से हर एक में
x
,y
, औरz
निर्देशांक हैं. कॉन्टेंट बनानेx
औरy
कोऑर्डिनेट, इमेज की चौड़ाई के हिसाब से [0.0, 1.0] के लिए नॉर्मलाइज़ किए जाते हैं और उंचाई करता है.z
निर्देशांक लैंडमार्क की गहराई दिखाता है. इसमें कलाई पर मौजूद गहराई से इसका पता लगाया जा सकता है. वैल्यू जितनी कम होगी, वैल्यू उतनी ही कम होगी लैंडमार्क को कैमरे के सामने रखा जाता है.z
की तीव्रताx
.विश्व भू-स्थल
21 हाथ के लैंडमार्क को भी दुनिया के निर्देशांकों में दिखाया गया है. हर लैंडमार्क
x
,y
, औरz
से मिलकर बना है, जो वास्तविक दुनिया के 3D निर्देशांक दिखाता है मीटर.
GestureRecognizerResult:
Handedness:
Categories #0:
index : 0
score : 0.98396
categoryName : Left
Gestures:
Categories #0:
score : 0.76893
categoryName : Thumb_Up
Landmarks:
Landmark #0:
x : 0.638852
y : 0.671197
z : -3.41E-7
Landmark #1:
x : 0.634599
y : 0.536441
z : -0.06984
... (21 landmarks for a hand)
WorldLandmarks:
Landmark #0:
x : 0.067485
y : 0.031084
z : 0.055223
Landmark #1:
x : 0.063209
y : -0.00382
z : 0.020920
... (21 world landmarks for a hand)
इन इमेज में, टास्क के आउटपुट का विज़ुअलाइज़ेशन दिखाया गया है:
इस
जेस्चर आइडेंटिफ़ायर कोड का उदाहरण, GestureRecognizerResultsAdapter
क्लास
GestureRecognizerResultsAdapter.kt
फ़ाइल नतीजों को हैंडल करती है.