ML Kit, पोज़ की पहचान करने के लिए ऑप्टिमाइज़ किए गए दो SDK टूल उपलब्ध कराता है.
| एसडीके का नाम | PoseDetection | PoseDetectionAccurate |
|---|---|---|
| लागू करना | बेस डिटेक्टर की ऐसेट, ऐप्लिकेशन बनाते समय उससे स्टैटिक तौर पर लिंक की जाती हैं. | सटीक डिटेक्टर के लिए ऐसेट, बिल्ड के समय आपके ऐप्लिकेशन से स्टैटिक तौर पर लिंक की जाती हैं. |
| ऐप्लिकेशन का साइज़ | ज़्यादा से ज़्यादा 29.6 एमबी | ज़्यादा से ज़्यादा 33.2 एमबी |
| परफ़ॉर्मेंस | iPhone X: ~45FPS | iPhone X: ~29FPS |
इसे आज़माएं
- इस एपीआई के इस्तेमाल का उदाहरण देखने के लिए, सैंपल के तौर पर मिले ऐप्लिकेशन को आज़माएं.
शुरू करने से पहले
अपनी Podfile में ये ML Kit पॉड शामिल करें:
# If you want to use the base implementation: pod 'GoogleMLKit/PoseDetection', '8.0.0' # If you want to use the accurate implementation: pod 'GoogleMLKit/PoseDetectionAccurate', '8.0.0'अपने प्रोजेक्ट के पॉड इंस्टॉल या अपडेट करने के बाद,
xcworkspaceका इस्तेमाल करके अपना Xcode प्रोजेक्ट खोलें. ML Kit, 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; } }
परफ़ॉर्मेंस को बेहतर बनाने के लिए सलाह
नतीजों की क्वालिटी, इनपुट इमेज की क्वालिटी पर निर्भर करती है:
- ML Kit, पोज़ का सटीक तरीके से पता लगा सके, इसके लिए इमेज में मौजूद व्यक्ति को ज़रूरत के मुताबिक पिक्सल डेटा के साथ दिखाया जाना चाहिए. बेहतर परफ़ॉर्मेंस के लिए, सब्जेक्ट कम से कम 256x256 पिक्सल का होना चाहिए.
- अगर रीयल-टाइम ऐप्लिकेशन में पोज़ का पता लगाया जाता है, तो आपको इनपुट इमेज के कुल डाइमेंशन पर भी ध्यान देना चाहिए. छोटी इमेज को तेज़ी से प्रोसेस किया जा सकता है. इसलिए, इंतज़ार का समय कम करने के लिए, कम रिज़ॉल्यूशन वाली इमेज कैप्चर करें. हालांकि, रिज़ॉल्यूशन से जुड़ी ऊपर बताई गई ज़रूरी शर्तों का ध्यान रखें. साथ ही, यह पक्का करें कि इमेज में सब्जेक्ट ज़्यादा से ज़्यादा जगह घेरे.
- इमेज का फ़ोकस खराब होने से भी, सटीक नतीजे मिलने पर असर पड़ सकता है. अगर आपको सही नतीजे नहीं मिलते हैं, तो उपयोगकर्ता से इमेज को फिर से कैप्चर करने के लिए कहें.
अगर आपको रीयल-टाइम ऐप्लिकेशन में पोज़ की पहचान करने की सुविधा का इस्तेमाल करना है, तो सबसे सही फ़्रेमरेट पाने के लिए इन दिशा-निर्देशों का पालन करें:
- PoseDetection SDK टूल और
streamडिटेक्शन मोड का इस्तेमाल करें. - कम रिज़ॉल्यूशन वाली इमेज कैप्चर करें. हालांकि, इस एपीआई के लिए इमेज के डाइमेंशन से जुड़ी ज़रूरी शर्तों का भी ध्यान रखें.
- वीडियो फ़्रेम प्रोसेस करने के लिए, डिटेक्टर के
results(in:)सिंक्रोनस एपीआई का इस्तेमाल करें. दिए गए वीडियो फ़्रेम से सिंक्रोनस तरीके से नतीजे पाने के लिए, AVCaptureVideoDataOutputSampleBufferDelegate के captureOutput(_, didOutput:from:) फ़ंक्शन से इस तरीके को कॉल करें. डिटेक्टर को किए जाने वाले कॉल को थ्रॉटल करने के लिए, AVCaptureVideoDataOutput के alwaysDiscardsLateVideoFrames को 'सही' पर सेट रखें. अगर डिटेक्टर के चलने के दौरान कोई नया वीडियो फ़्रेम उपलब्ध होता है, तो उसे छोड़ दिया जाएगा. - अगर इनपुट इमेज पर ग्राफ़िक ओवरले करने के लिए, डिटेक्टर के आउटपुट का इस्तेमाल किया जाता है, तो पहले ML Kit से नतीजा पाएं. इसके बाद, इमेज को रेंडर करें और एक ही चरण में ओवरले करें. ऐसा करने पर, प्रोसेस किए गए हर इनपुट फ़्रेम के लिए, डिसप्ले सरफ़ेस पर सिर्फ़ एक बार रेंडर किया जाता है. उदाहरण के लिए, सैंपल ऐप्लिकेशन में previewOverlayView और MLKDetectionOverlayView क्लास देखें.
अगले चरण
- पोज़ को अलग-अलग कैटगरी में बांटने के लिए सलाह देखें. इसमें पोज़ लैंडमार्क का इस्तेमाल करके, पोज़ को अलग-अलग कैटगरी में बांटने का तरीका बताया गया है.
- इस एपीआई के इस्तेमाल का उदाहरण देखने के लिए, GitHub पर ML Kit का क्विकस्टार्ट सैंपल देखें.