एमएल किट, पोज़ का पता लगाने के लिए, ऑप्टिमाइज़ किए गए दो SDK टूल उपलब्ध कराती है.
SDK टूल का नाम | Poseपहचान | सटीक मिलान |
---|---|---|
लागू करना | बेस का पता लगाने वाली एसेट, बिल्ड टाइम के दौरान स्टैटिक तौर पर आपके ऐप्लिकेशन से लिंक होती हैं. | सटीक पहचान करने वाले के एसेट, बिल्ड टाइम के दौरान आपके ऐप्लिकेशन से स्टैटिक तौर पर लिंक होते हैं. |
ऐप्लिकेशन का साइज़ | 29.6 एमबी तक | 33.2 एमबी तक |
परफ़ॉर्मेंस | iPhone X: ~45FPS | iPhone X: ~29FPS |
इसे आज़माएं
- इस एपीआई के इस्तेमाल का उदाहरण देखने के लिए, ऐप्लिकेशन के नमूने का इस्तेमाल करें.
शुरू करने से पहले
अपनी Podfile में ये ML किट पॉड शामिल करें:
# If you want to use the base implementation: pod 'GoogleMLKit/PoseDetection', '3.2.0' # If you want to use the accurate implementation: pod 'GoogleMLKit/PoseDetectionAccurate', '3.2.0'
अपने प्रोजेक्ट की पॉड इंस्टॉल या अपडेट करने के बाद, उसके
xcworkspace
का इस्तेमाल करके अपना Xcode प्रोजेक्ट खोलें. ML किट, Xcode के 13.2.1 या इसके बाद के वर्शन में काम करती है.
1. PoseDetector
का इंस्टेंस बनाएं
किसी इमेज में पोज़ का पता लगाने के लिए, पहले PoseDetector
का एक इंस्टेंस बनाएं और
विकल्प के तौर पर डिटेक्टर सेटिंग बताएं.
PoseDetector
विकल्प
वीडियो की पहचान करने वाला मोड
PoseDetector
, पहचान करने वाले दो मोड में काम करता है. पक्का करें कि आपने अपनी उपयोग स्थिति से
मिलता-जुलता टूल चुना है.
stream
(डिफ़ॉल्ट)- पॉज़ डिटेक्टर सबसे पहले इमेज में सबसे प्रमुख व्यक्ति की पहचान करके पोज़ की पहचान करेगा. बाद के फ़्रेम में, व्यक्ति की पहचान करने का तरीका तब तक नहीं पूरा किया जाएगा, जब तक वह व्यक्ति अंधेरे में रहे या पूरे भरोसे के साथ उसका पता न लगा ले. पोज़ डिटेक्टर, सबसे प्रमुख व्यक्ति को ट्रैक करने की कोशिश करेगा. साथ ही, हर अनुमान में अपनी पोज़ लौटाने की कोशिश करेगा. यह प्रतीक्षा अवधि को कम करता है और आसानी से पता लगाता है. इस मोड का इस्तेमाल तब करें, जब आपको किसी वीडियो स्ट्रीम में पोज़ का पता लगाना हो.
singleImage
- आपके पोज़ का पता लगाने वाला व्यक्ति किसी व्यक्ति की पहचान करके पोज़ की पहचान करता है. हर इमेज के लिए 'व्यक्ति-पहचान' का चरण चलेगा, इसलिए इंतज़ार का समय ज़्यादा होगा और कोई व्यक्ति-ट्रैकिंग नहीं होगी. स्टैटिक इमेज पर या ट्रैकिंग की ज़रूरत न होने पर, पोज़ की पहचान करने वाले मोड का इस्तेमाल करते समय इस मोड का इस्तेमाल करें.
पोज़ पहचानने वाले विकल्प तय करें:
Swift
// Base pose detector with streaming, when depending on the PoseDetection SDK let options = PoseDetectorOptions() options.detectorMode = .stream // Accurate pose detector on static images, when depending on the // PoseDetectionAccurate SDK let options = AccuratePoseDetectorOptions() options.detectorMode = .singleImage
Objective-C
// Base pose detector with streaming, when depending on the PoseDetection SDK MLKPoseDetectorOptions *options = [[MLKPoseDetectorOptions alloc] init]; options.detectorMode = MLKPoseDetectorModeStream; // Accurate pose detector on static images, when depending on the // PoseDetectionAccurate SDK MLKAccuratePoseDetectorOptions *options = [[MLKAccuratePoseDetectorOptions alloc] init]; options.detectorMode = MLKPoseDetectorModeSingleImage;
आखिर में, PoseDetector
का इंस्टेंस पाएं. बताए गए विकल्पों को पास करें:
Swift
let poseDetector = PoseDetector.poseDetector(options: options)
Objective-C
MLKPoseDetector *poseDetector = [MLKPoseDetector poseDetectorWithOptions:options];
2. इनपुट इमेज तैयार करें
पोज़ का पता लगाने के लिए, हर इमेज या वीडियो के फ़्रेम के लिए ये करें.
अगर आपने स्ट्रीम मोड चालू किया है, तो आपको CMSampleBuffer
से VisionImage
ऑब्जेक्ट बनाना होगा.
UIImage
या CMSampleBuffer
का इस्तेमाल करके, VisionImage
ऑब्जेक्ट बनाएं.
अगर आप UIImage
का इस्तेमाल करते हैं, तो यह तरीका अपनाएं:
UIImage
के साथ एकVisionImage
ऑब्जेक्ट बनाएं..orientation
का सही नाम डालना न भूलें.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
अगर आप CMSampleBuffer
का इस्तेमाल करते हैं, तो यह तरीका अपनाएं:
-
CMSampleBuffer
में शामिल इमेज डेटा का ओरिएंटेशन बताएं.इमेज का ओरिएंटेशन पाने के लिए:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> UIImage.Orientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftMirrored : .right case .landscapeLeft: return cameraPosition == .front ? .downMirrored : .up case .portraitUpsideDown: return cameraPosition == .front ? .rightMirrored : .left case .landscapeRight: return cameraPosition == .front ? .upMirrored : .down case .faceDown, .faceUp, .unknown: return .up } }
Objective-C
- (UIImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored : UIImageOrientationRight; case UIDeviceOrientationLandscapeLeft: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored : UIImageOrientationUp; case UIDeviceOrientationPortraitUpsideDown: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored : UIImageOrientationLeft; case UIDeviceOrientationLandscapeRight: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored : UIImageOrientationDown; case UIDeviceOrientationUnknown: case UIDeviceOrientationFaceUp: case UIDeviceOrientationFaceDown: return UIImageOrientationUp; } }
CMSampleBuffer
ऑब्जेक्ट और ओरिएंटेशन का इस्तेमाल करकेVisionImage
ऑब्जेक्ट बनाएं:Swift
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
Objective-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
3. इमेज को प्रोसेस करें
पोज़ पहचान करने वाले की इमेज प्रोसेसिंग विधियों में से एक को VisionImage
पास करें. आप एसिंक्रोनस process(image:)
विधि या सिंक्रोनस results()
विधि का इस्तेमाल कर सकते हैं.
सिंक्रोनस रूप से ऑब्जेक्ट का पता लगाने के लिए:
Swift
var results: [Pose] do { results = try poseDetector.results(in: image) } catch let error { print("Failed to detect pose with error: \(error.localizedDescription).") return } guard let detectedPoses = results, !detectedPoses.isEmpty else { print("Pose detector returned no results.") return } // Success. Get pose landmarks here.
Objective-C
NSError *error; NSArray*poses = [poseDetector resultsInImage:image error:&error]; if (error != nil) { // Error. return; } if (poses.count == 0) { // No pose detected. return; } // Success. Get pose landmarks here.
ऑब्जेक्ट को एसिंक्रोनस रूप से पहचानने के लिए:
Swift
poseDetector.process(image) { detectedPoses, error in guard error == nil else { // Error. return } guard !detectedPoses.isEmpty else { // No pose detected. return } // Success. Get pose landmarks here. }
Objective-C
[poseDetector processImage:image completion:^(NSArray* _Nullable poses, NSError * _Nullable error) { if (error != nil) { // Error. return; } if (poses.count == 0) { // No pose detected. return; } // Success. Get pose landmarks here. }];
4. पता लगाई गई स्थिति के बारे में जानकारी पाएं
अगर इमेज में किसी व्यक्ति की पहचान होती है, तो पोज़ का पता लगाने वाला एपीआई या तो पूरा होने वाला हैंडलर के लिए Pose
ऑब्जेक्ट का क्रम पास करता है या श्रेणी दिखाता है.
यह इस बात पर निर्भर करता है कि आपने एसिंक्रोनस या सिंक्रोनस तरीके को कॉल किया है या नहीं.
अगर व्यक्ति पूरी तरह से इमेज के अंदर नहीं है, तो मॉडल, फ़्रेम के बाहर मौजूद छूटे हुए लैंडमार्क असाइन करता है और उन्हें कम InFrameConfidence वैल्यू देता है.
अगर किसी व्यक्ति का पता नहीं चला, तो श्रेणी खाली है.
Swift
for pose in detectedPoses { let leftAnkleLandmark = pose.landmark(ofType: .leftAnkle) if leftAnkleLandmark.inFrameLikelihood > 0.5 { let position = leftAnkleLandmark.position } }
Objective-C
for (MLKPose *pose in detectedPoses) { MLKPoseLandmark *leftAnkleLandmark = [pose landmarkOfType:MLKPoseLandmarkTypeLeftAnkle]; if (leftAnkleLandmark.inFrameLikelihood > 0.5) { MLKVision3DPoint *position = leftAnkleLandmark.position; } }
परफ़ॉर्मेंस को बेहतर बनाने के लिए सलाह
आपके नतीजों की क्वालिटी, इनपुट इमेज की क्वालिटी पर निर्भर करती है:
- एमएल किट को सही तरीके से पोज़ का पता लगाने के लिए, इमेज में मौजूद व्यक्ति को ज़रूरत के मुताबिक पिक्सल डेटा से दिखाया जाना चाहिए. सबसे अच्छी परफ़ॉर्मेंस के लिए, विषय को कम से कम 256x256 पिक्सल होना चाहिए.
- अगर आपको किसी रीयल-टाइम ऐप्लिकेशन में पोज़ का पता चलता है, तो आप इनपुट इमेज के सभी डाइमेंशन पर भी विचार कर सकते हैं. छोटी इमेज को तेज़ी से प्रोसेस किया जा सकता है, ताकि इंतज़ार का समय कम करने के लिए, कम रिज़ॉल्यूशन वाली इमेज कैप्चर की जा सकें. हालांकि, ध्यान रखें कि ऊपर दी गई रिज़ॉल्यूशन से जुड़ी शर्तों को ध्यान में रखें. साथ ही, पक्का करें कि इमेज में ज़रूरत के मुताबिक इमेज मौजूद हो.
- इमेज का फ़ोकस सही न होने से, उसकी सही जानकारी पर असर पड़ सकता है. अगर आपको सही नतीजे नहीं मिलते हैं, तो उपयोगकर्ता से इमेज हटाने के लिए कहें.
अगर आप रीयल-टाइम ऐप्लिकेशन में पोज़ पहचान का इस्तेमाल करना चाहते हैं, तो सबसे अच्छे फ़्रेम रेट पाने के लिए, इन दिशा-निर्देशों का पालन करें:
- Base PoseDetection SDK और
stream
पहचानने वाले मोड का इस्तेमाल करें. - कम रिज़ॉल्यूशन में इमेज कैप्चर करें. हालांकि, इस एपीआई की इमेज डाइमेंशन से जुड़ी ज़रूरी शर्तों का भी ध्यान रखें.
- वीडियो फ़्रेम प्रोसेस करने के लिए, डिटेक्टर के
results(in:)
सिंक्रोनस एपीआई का इस्तेमाल करें. किसी दिए गए वीडियो फ़्रेम से सिंक्रोनस रूप से नतीजे पाने के लिए, इस तरीके को AVCaptureVideoDataSampleBufferDelegate के captureInput(_, didInput:from:) फ़ंक्शन से कॉल करें. कॉल को थ्रॉटर करने के लिए, AVCaptureVideoDataInput के हमेशा के लिएवीडियो के फ़्रेम को सही रखें. अगर डिटेक्टर चलने के दौरान नया वीडियो फ़्रेम उपलब्ध हो जाता है, तो उसे छोड़ दिया जाएगा. - इनपुट इमेज पर ग्राफ़िक ओवरले करने के लिए, अगर पहचानकर्ता का आउटपुट इस्तेमाल किया जाता है, तो पहले ML किट से नतीजा पाएं. इसके बाद, इमेज और ओवरले को एक ही चरण में रेंडर करें. ऐसा करके, आप हर प्रोसेस किए गए इनपुट फ़्रेम के लिए, डिसप्ले को सिर्फ़ एक बार रेंडर करते हैं. उदाहरण के लिए, शोकेस सैंपल ऐप्लिकेशन में, previewOverlayView और MLKDetectionOverlayView क्लास देखें.
अगले चरण
- पोज़ के अलग-अलग हिस्सों को अलग-अलग कैटगरी में बांटने का तरीका जानने के लिए, पॉज़ क्लासिफ़िकेशन से जुड़ी सलाह देखें.
- इस्तेमाल किए जा रहे इस एपीआई का उदाहरण देखने के लिए, GitHub पर ML किट क्विकस्टार्ट सैंपल देखें.