पोज़ की कैटगरी तय करने के विकल्प

एमएल किट पोज़ डिटेक्शन एपीआई से, आप शरीर के अलग-अलग हिस्सों की रिलेशनशिप को देख सकते हैं. साथ ही, किसी पोज़ की सही जानकारी पा सकते हैं. यह पेज कुछ उदाहरण दिखाता है.

k-NN एल्गोरिदम की मदद से, पोज़िशन और बार-बार होने वाली गिनती का पोज़िशन

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

इस सेक्शन में हमने बताया है कि हमने MediaPipe Colab का इस्तेमाल करके, पसंद के मुताबिक पोज़िशन बनाने का मनमुताबिक तरीका कैसे बनाया. साथ ही, हमारे ML किट के सैंपल ऐप्लिकेशन में, काम करने वाले अलग-अलग कैटगरी में काम करने वाले लोगों की मदद करें.

अगर आपको Google Colaboratory के बारे में जानकारी नहीं है, तो कृपया परिचय गाइड देखें.

आस-पास की जगहों की पहचान करने के लिए, हम सबसे नज़दीकी पड़ोसियों के एल्गोरिदम (k-NN) का इस्तेमाल करते हैं, क्योंकि यह आसान है और इसे शुरू करना भी आसान है. एल्गोरिदम, ट्रेनिंग सेट में मौजूद सबसे नज़दीकी सैंपल के आधार पर ऑब्जेक्ट की क्लास तय करता है.

आइडेंटिफ़ायर बनाने और उसे ट्रेनिंग देने के लिए, यह तरीका अपनाएं:

1. इमेज के नमूने इकट्ठा करें

हमने अलग-अलग स्रोतों से, टारगेट एक्सरसाइज़ के इमेज सैंपल इकट्ठा किए हैं. हम हर एक्सरसाइज़ के लिए कुछ सौ इमेज चुनते हैं, जैसे कि "up" &"down"position की मदद से पुश-अप. अलग-अलग कैमरे के कोणों, पर्यावरण स्थितियों, शरीर के आकार, और कसरत के अलग-अलग वैरिएंट को कवर करने वाले सैंपल इकट्ठा करना अहम होता है.

पहली इमेज. ऊपर और नीचे पुश अप पोज़ की स्थितियां

2. नमूने के तौर पर दिखाई जाने वाली इमेज पर, पोज़ का पता लगाने की सुविधा चालू करें

यह कसरत के लिए इस्तेमाल की जाने वाली मुद्राओं का एक सेट बनाता है. आस-पास के पोल दिखाने में हमारी दिलचस्पी नहीं है, क्योंकि हम अगले चरण में अपने मॉडल का ट्रेनिंग शुरू करेंगे.

'N-NN एल्गोरिदम' को हमने खुद की पसंद के हिसाब से दिखाने की कैटगरी के लिए चुना है. इसके लिए, हर सैंपल के लिए एक सुविधा का वेक्टर दिखाना ज़रूरी है. साथ ही, एक मेट्रिक के लिए दो वेक्टर की दूरी पता करना ज़रूरी होता है, ताकि पोज़ के नमूने के आस-पास का टारगेट पता किया जा सके. इसका मतलब है कि हमें उन मुद्राओं को बदल देना चाहिए जो हमने अभी-अभी देखी हैं.

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

3. मॉडल और ट्रेन के दोहराए जाने की ट्रेनिंग करें

डेटा की कैटगरी तय करने और मॉडल को ट्रेनिंग देने के लिए, हमने MediaPipe Colab का इस्तेमाल किया.

दोहराव की गिनती करने के लिए, हमने दूसरे Colab एल्गोरिदम का इस्तेमाल किया. इससे, टारगेट पोज़ की स्थिति की संभावना पर नज़र रखी जा सकती है. उदाहरण के लिए:

  • जब "down" की संभावना और पहली बार पोज़िशन क्लास किसी दी गई सीमा को पास करती है, तो एल्गोरिदम यह मार्क करता है कि "down" क्लास क्लास डाली गई है.
  • जब संभावना थ्रेशोल्ड से कम हो जाती है, तो एल्गोरिदम यह मार्क करता है कि "down" पोज़ क्लास से बाहर निकल गया है और काउंटर को बढ़ा रहा है.
दूसरी इमेज. दोहराए जाने की गिनती का उदाहरण

4. ML Kit के क्विकस्टार्ट ऐप्लिकेशन के साथ इंटिग्रेट करना

ऊपर दिया गया Colab एक CSV फ़ाइल बनाता है, जिसे आप अपने सभी पोज़ के सैंपल से भर सकते हैं. इस सेक्शन में, आप एमएल किट Android क्विकस्टार्ट ऐप्लिकेशन के साथ अपनी CSV फ़ाइल को इंटिग्रेट करने का तरीका जानेंगे. इससे आप रीयल-टाइम में पसंद के मुताबिक पोज़ की कैटगरी देख सकेंगे.

क्विकस्टार्ट ऐप्लिकेशन में मौजूद सैंपल के साथ, पोज़ की कैटगरी बनाने की कोशिश करें

  • GitHub से, ML Kit Android quickstart ऐप्लिकेशन प्रोजेक्ट पाएं. साथ ही, यह पक्का करें कि यह बिल्ड करता है और ठीक से चलता है.
  • LivePreviewActivity पर जाएं और 'सेटिंग'' पेज में जाकर, पोज़ की पहचान करने की सुविधा Run classification चालू करें. अब आप पुशअप और स्क्वॉट की कैटगरी तय कर पाएंगे.

अपनी खुद की CSV फ़ाइल जोड़ें

  • ऐप्लिकेशन की एसेट फ़ोल्डर में अपनी CSV फ़ाइल जोड़ें.
  • PoseClassifierProcessor में, POSE_SAMPLES_FILE और POSE_CLASSES वैरिएबल अपडेट करें, ताकि वे आपकी CSV फ़ाइल से मेल खा सकें और नमूने का अनुमान लगा सकें.
  • ऐप्लिकेशन बनाएं और चलाएं.

ध्यान दें कि अगर ज़रूरत के मुताबिक सैंपल न हो, तो हो सकता है कि कैटगरी सही तरीके से काम न करे. आम तौर पर, आपको एक ही पोज़ के लिए 100 सैंपल की ज़रूरत होती है.

इस बारे में ज़्यादा जानने और इसे खुद आज़माने के लिए, MediaPipe Colab और MediaPipe क्लासिफ़िकेशन गाइड देखें.

लैंडमार्क की दूरी का पता लगाकर, आसान जेस्चर को पहचानना

जब दो या ज़्यादा लैंडमार्क एक-दूसरे के नज़दीक होते हैं, तो उनका इस्तेमाल जेस्चर को पहचानने के लिए किया जा सकता है. उदाहरण के लिए, जब एक हाथ में एक या ज़्यादा उंगलियों का लैंडमार्क, नाक के लिए लैंडमार्क के पास होता है, तो आप यह अंदाज़ा लगा सकते हैं कि उपयोगकर्ता सबसे ज़्यादा अपने चेहरे को छू रहा है.

तीसरी इमेज. मकसद के बारे में बताना

ऐंगल ह्यूरिस्टिक की मदद से योगा आसन को पहचानना

आप अलग-अलग जोड़ों के कोणों का हिसाब लगाकर, योग की मुद्रा पहचान सकते हैं. उदाहरण के लिए, नीचे दी गई इमेज 2 में वॉरियर II योगा पोज़ दिख रहा है. इस पोज़ को पहचानने वाले अनुमानित कोणों को इस तरह लिखा गया है:

चौथी इमेज. किसी चीज़ को अलग-अलग कोण से दिखाना

इस आसन को शरीर के अनुमानित कोणों के इन मिले-जुले रूप में बताया जा सकता है:

  • दोनों कंधों पर 90 डिग्री का कोण
  • दोनों कोहों में 180 डिग्री
  • सामने वाले पैर और कमर पर 90 डिग्री का कोण
  • पीठ के निचले हिस्से का 180 डिग्री कोण
  • कमर पर 135 डिग्री का कोण

इन कोणों को गिनने के लिए पोज़ लैंडमार्क का इस्तेमाल करें. जैसे, दाएं सामने के पैर और कमर के लिए कोण, दाएं दाएं से दाएं कान की लाइन और दाएं हिप से दाएं घुटने की लाइन के बीच का कोण होता है.

जब आप पोज़ की पहचान करने के लिए सभी ज़रूरी कोणों की गिनती कर लेते हैं, तो आप यह देखने के लिए जांच कर सकते हैं कि क्या सही है या नहीं.

नीचे दिया गया कोड स्निपेट, शरीर के दो हिस्सों के बीच के कोण की गिनती करने के लिए X और Y निर्देशांकों को इस्तेमाल करने का तरीका बताता है. डेटा को अलग-अलग ग्रुप में बांटने के इस तरीके की कुछ सीमाएं हैं. सिर्फ़ X और Y को चुनकर, कैलकुलेट किए गए ऐंगल, सब्जेक्ट और कैमरे के बीच के ऐंगल के हिसाब से अलग-अलग होते हैं. आपको एक लेवल, सीधे आगे, और सिर की इमेज के साथ सबसे अच्छे नतीजे मिलेंगे. Z कोऑर्डिनेट का इस्तेमाल करके, इस एल्गोरिदम को बढ़ाया भी जा सकता है. साथ ही, यह देखा जा सकता है कि इस्तेमाल के उदाहरण के लिए, इसकी परफ़ॉर्मेंस बेहतर है या नहीं.

Android पर लैंडमार्क कोणों का पता लगाना

नीचे दिया गया तरीका किसी भी तीनों लैंडमार्क के बीच के ऐंगल की गिनती करता है. इससे यह पक्का होता है कि दिखाया गया कोण 0 और 180 डिग्री के बीच है.

Kotlin

fun getAngle(firstPoint: PoseLandmark, midPoint: PoseLandmark, lastPoint: PoseLandmark): Double {
        var result = Math.toDegrees(atan2(lastPoint.getPosition().y - midPoint.getPosition().y,
                lastPoint.getPosition().x - midPoint.getPosition().x)
                - atan2(firstPoint.getPosition().y - midPoint.getPosition().y,
                firstPoint.getPosition().x - midPoint.getPosition().x))
        result = Math.abs(result) // Angle should never be negative
        if (result > 180) {
            result = 360.0 - result // Always get the acute representation of the angle
        }
        return result
    }

Java

static double getAngle(PoseLandmark firstPoint, PoseLandmark midPoint, PoseLandmark lastPoint) {
  double result =
        Math.toDegrees(
            atan2(lastPoint.getPosition().y - midPoint.getPosition().y,
                      lastPoint.getPosition().x - midPoint.getPosition().x)
                - atan2(firstPoint.getPosition().y - midPoint.getPosition().y,
                      firstPoint.getPosition().x - midPoint.getPosition().x));
  result = Math.abs(result); // Angle should never be negative
  if (result > 180) {
      result = (360.0 - result); // Always get the acute representation of the angle
  }
  return result;
}

यहां दाएं कोने में कोण की गिनती करने का तरीका दिया गया है:

Kotlin

val rightHipAngle = getAngle(
                pose.getPoseLandmark(PoseLandmark.Type.RIGHT_SHOULDER),
                pose.getPoseLandmark(PoseLandmark.Type.RIGHT_HIP),
                pose.getPoseLandmark(PoseLandmark.Type.RIGHT_KNEE))

Java

double rightHipAngle = getAngle(
                pose.getPoseLandmark(PoseLandmark.Type.RIGHT_SHOULDER),
                pose.getPoseLandmark(PoseLandmark.Type.RIGHT_HIP),
                pose.getPoseLandmark(PoseLandmark.Type.RIGHT_KNEE));

iOS पर लैंडमार्क कोणों की गिनती करना

नीचे दिया गया तरीका किसी भी तीनों लैंडमार्क के बीच के ऐंगल की गिनती करता है. इससे यह पक्का होता है कि दिखाया गया कोण 0 और 180 डिग्री के बीच है.

Swift

func angle(
      firstLandmark: PoseLandmark,
      midLandmark: PoseLandmark,
      lastLandmark: PoseLandmark
  ) -> CGFloat {
      let radians: CGFloat =
          atan2(lastLandmark.position.y - midLandmark.position.y,
                    lastLandmark.position.x - midLandmark.position.x) -
            atan2(firstLandmark.position.y - midLandmark.position.y,
                    firstLandmark.position.x - midLandmark.position.x)
      var degrees = radians * 180.0 / .pi
      degrees = abs(degrees) // Angle should never be negative
      if degrees > 180.0 {
          degrees = 360.0 - degrees // Always get the acute representation of the angle
      }
      return degrees
  }

Objective-C

(CGFloat)angleFromFirstLandmark:(MLKPoseLandmark *)firstLandmark
                      midLandmark:(MLKPoseLandmark *)midLandmark
                     lastLandmark:(MLKPoseLandmark *)lastLandmark {
    CGFloat radians = atan2(lastLandmark.position.y - midLandmark.position.y,
                            lastLandmark.position.x - midLandmark.position.x) -
                      atan2(firstLandmark.position.y - midLandmark.position.y,
                            firstLandmark.position.x - midLandmark.position.x);
    CGFloat degrees = radians * 180.0 / M_PI;
    degrees = fabs(degrees); // Angle should never be negative
    if (degrees > 180.0) {
        degrees = 360.0 - degrees; // Always get the acute representation of the angle
    }
    return degrees;
}

यहां दाएं कोने में कोण की गिनती करने का तरीका दिया गया है:

Swift

let rightHipAngle = angle(
      firstLandmark: pose.landmark(ofType: .rightShoulder),
      midLandmark: pose.landmark(ofType: .rightHip),
      lastLandmark: pose.landmark(ofType: .rightKnee))

Objective-C

CGFloat rightHipAngle =
    [self angleFromFirstLandmark:[pose landmarkOfType:MLKPoseLandmarkTypeRightShoulder]
                     midLandmark:[pose landmarkOfType:MLKPoseLandmarkTypeRightHip]
                    lastLandmark:[pose landmarkOfType:MLKPoseLandmarkTypeRightKnee]];