वीडियो के अलग-अलग फ़्रेम में ऑब्जेक्ट का पता लगाने और उन्हें ट्रैक करने के लिए, एमएल किट का इस्तेमाल किया जा सकता है.
जब आप ML Kit इमेज पास करते हैं, तो ML Kit हर इमेज के लिए, इमेज में, पता लगाए गए पांच ऑब्जेक्ट और उनकी जगह को तय किया जा सकता है. पता लगाते समय वीडियो स्ट्रीम में ऑब्जेक्ट हैं, तो हर ऑब्जेक्ट का एक आईडी होता है, जिसका उपयोग आप ऑब्जेक्ट को इमेज में डालें. आपके पास कर्स ऑब्जेक्ट को चालू करने का विकल्प भी है क्लासिफ़िकेशन, जो ऑब्जेक्ट की कैटगरी के बारे में जानकारी देने वाले बड़े पैमाने पर लेबल करता है.
शुरू करने से पहले
- अगर आपने पहले से अपने ऐप्लिकेशन में Firebase नहीं जोड़ा है, तो ऐसा करने के लिए शुरुआती निर्देश में दिए गए चरणों को पूरा करें.
- अपनी Podfile में ML Kit लाइब्रेरी शामिल करें:
pod 'Firebase/MLVision', '6.25.0' pod 'Firebase/MLVisionObjectDetection', '6.25.0'
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है प्रोजेक्ट के Pods को इंस्टॉल या अपडेट करने के बाद, अपना Xcode ज़रूर खोलें प्रोजेक्ट के.xcworkspace
का इस्तेमाल करके बनाया गया है. - अपने ऐप्लिकेशन में Firebase इंपोर्ट करें:
Swift
import Firebase
Objective-C
@import Firebase;
1. ऑब्जेक्ट डिटेक्टर को कॉन्फ़िगर करें
ऑब्जेक्ट का पता लगाने और उन्हें ट्रैक करने के लिए, पहले एक
VisionObjectDetector
, विकल्प के तौर पर आपकी पसंद की कोई भी डिटेक्टर सेटिंग तय करना
डिफ़ॉल्ट से बदलें.
अपने इस्तेमाल के उदाहरण के लिए, ऑब्जेक्ट डिटेक्टर को
VisionObjectDetectorOptions
ऑब्जेक्ट. आपके पास इन्हें बदलने का विकल्प है सेटिंग:ऑब्जेक्ट डिटेक्टर की सेटिंग पहचान मोड .stream
(डिफ़ॉल्ट) |.singleImage
स्ट्रीम मोड (डिफ़ॉल्ट) में, ऑब्जेक्ट डिटेक्टर बहुत कम स्क्रीन पर काम करता है इंतज़ार का समय, लेकिन हो सकता है कि पूरे नतीजे न मिलें. जैसे, इनके बारे में जानकारी न होना बाउंडिंग बॉक्स या कैटगरी) के आधार पर डिटेक्टर. साथ ही, स्ट्रीम मोड में, डिटेक्टर ट्रैकिंग ऑब्जेक्ट के आईडी, जिनका इस्तेमाल अलग-अलग फ़्रेम के बीच ऑब्जेक्ट को ट्रैक करने के लिए किया जा सकता है. ऑब्जेक्ट ट्रैक करने के लिए या इंतज़ार का समय कम होने पर इस मोड का इस्तेमाल करें ज़रूरी है, जैसे कि जब वीडियो स्ट्रीम को रीयल टाइम में प्रोसेस किया जाता हो समय.
सिंगल इमेज मोड में, ऑब्जेक्ट डिटेक्टर तब तक इंतज़ार करता है, जब तक उसका पता नहीं चल जाता ऑब्जेक्ट का बाउंडिंग बॉक्स और (अगर आपने क्लासिफ़िकेशन चालू किया है) कैटगरी ये नतीजे, नतीजे दिखाने से पहले उपलब्ध होते हैं. इस वजह से, इंतज़ार का समय ज़्यादा हो सकता है. साथ ही, एक इमेज में मोड में ट्रैकिंग आईडी असाइन नहीं किए जाते हैं. इंतज़ार का समय होने पर इस मोड का इस्तेमाल करें महत्वपूर्ण नहीं है और आप आंशिक रूप से नतीजे.
एक से ज़्यादा ऑब्जेक्ट का पता लगाएं और उन्हें ट्रैक करें false
(डिफ़ॉल्ट) |true
ज़्यादा से ज़्यादा पांच ऑब्जेक्ट या सिर्फ़ सबसे ज़्यादा ऑब्जेक्ट का पता लगाना और उन्हें ट्रैक करना है या नहीं साफ़ तौर पर दिखने वाला ऑब्जेक्ट (डिफ़ॉल्ट).
ऑब्जेक्ट को वर्गीकृत करें false
(डिफ़ॉल्ट) |true
पता लगाए गए ऑब्जेक्ट को अनुमानित कैटगरी में बांटना है या नहीं. चालू होने पर, ऑब्जेक्ट की पहचान करने वाला टूल ये कैटगरी हैं: फ़ैशन के सामान, खाना, घरेलू सामान, जगह, पौधे, और इसके बारे में कोई जानकारी नहीं है.
ऑब्जेक्ट की पहचान और ट्रैकिंग एपीआई को इन दो मुख्य इस्तेमाल के लिए ऑप्टिमाइज़ किया गया है मामले:
- कैमरे में सबसे ज़रूरी चीज़ का लाइव पता लगाना और उसे ट्रैक करना व्यूफ़ाइंडर
- किसी स्टैटिक इमेज में कई ऑब्जेक्ट की पहचान करना
एपीआई को इस्तेमाल के इन उदाहरणों के हिसाब से कॉन्फ़िगर करने के लिए:
Swift
// Live detection and tracking let options = VisionObjectDetectorOptions() options.detectorMode = .stream options.shouldEnableMultipleObjects = false options.shouldEnableClassification = true // Optional // Multiple object detection in static images let options = VisionObjectDetectorOptions() options.detectorMode = .singleImage options.shouldEnableMultipleObjects = true options.shouldEnableClassification = true // Optional
Objective-C
// Live detection and tracking FIRVisionObjectDetectorOptions *options = [[FIRVisionObjectDetectorOptions alloc] init]; options.detectorMode = FIRVisionObjectDetectorModeStream; options.shouldEnableMultipleObjects = NO; options.shouldEnableClassification = YES; // Optional // Multiple object detection in static images FIRVisionObjectDetectorOptions *options = [[FIRVisionObjectDetectorOptions alloc] init]; options.detectorMode = FIRVisionObjectDetectorModeSingleImage; options.shouldEnableMultipleObjects = YES; options.shouldEnableClassification = YES; // Optional
FirebaseVisionObjectDetector
का इंस्टेंस पाएं:Swift
let objectDetector = Vision.vision().objectDetector() // Or, to change the default settings: let objectDetector = Vision.vision().objectDetector(options: options)
Objective-C
FIRVisionObjectDetector *objectDetector = [[FIRVision vision] objectDetector]; // Or, to change the default settings: FIRVisionObjectDetector *objectDetector = [[FIRVision vision] objectDetectorWithOptions:options];
2. ऑब्जेक्ट डिटेक्टर चलाएं
ऑब्जेक्ट का पता लगाने और उन्हें ट्रैक करने के लिए, वीडियो की हर इमेज या फ़्रेम के लिए यह तरीका अपनाएं.
अगर आपने स्ट्रीम मोड चालू किया है, तो आपको इससे VisionImage
ऑब्जेक्ट बनाने होंगे
CMSampleBufferRef
.
एक
VisionImage
ऑब्जेक्ट कोUIImage
याCMSampleBufferRef
.UIImage
का इस्तेमाल करने के लिए:- अगर ज़रूरी हो, तो इमेज को घुमाएं, ताकि इसकी
imageOrientation
प्रॉपर्टी.up
है. - स्क्रीन की दिशा को सही तरीके से घुमाने के लिए,
VisionImage
ऑब्जेक्ट बनाएंUIImage
. कोई भी रोटेशन मेटाडेटा तय न करें—डिफ़ॉल्ट.topLeft
वैल्यू का इस्तेमाल करना ज़रूरी है.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
CMSampleBufferRef
का इस्तेमाल करने के लिए:-
एक
VisionImageMetadata
ऑब्जेक्ट बनाएं, जो में शामिल इमेज डेटा का ओरिएंटेशनCMSampleBufferRef
बफ़र.इमेज का ओरिएंटेशन पाने के लिए:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
Objective-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
इसके बाद, मेटाडेटा ऑब्जेक्ट बनाएं:
Swift
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Objective-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
VisionImage
ऑब्जेक्ट बनाने के लिए,CMSampleBufferRef
ऑब्जेक्ट और रोटेशन मेटाडेटा:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- अगर ज़रूरी हो, तो इमेज को घुमाएं, ताकि इसकी
ऑब्जेक्ट डिटेक्टर की इमेज प्रोसेसिंग में से किसी एक पर
VisionImage
को पास करें तरीकों का इस्तेमाल करना होगा. आप एसिंक्रोनसprocess(image:)
तरीके का इस्तेमाल कर सकते हैं या फिर सिंक्रोनसresults()
तरीका.एसिंक्रोनस तरीके से ऑब्जेक्ट का पता लगाने के लिए:
Swift
objectDetector.process(image) { detectedObjects, error in guard error == nil else { // Error. return } guard let detectedObjects = detectedObjects, !detectedObjects.isEmpty else { // No objects detected. return } // Success. Get object info here. // ... }
Objective-C
[objectDetector processImage:image completion:^(NSArray<FIRVisionObject *> * _Nullable objects, NSError * _Nullable error) { if (error == nil) { return; } if (objects == nil | objects.count == 0) { // No objects detected. return; } // Success. Get object info here. // ... }];
ऑब्जेक्ट का सिंक्रोनस रूप से पता लगाने के लिए:
Swift
var results: [VisionObject]? = nil do { results = try objectDetector.results(in: image) } catch let error { print("Failed to detect object with error: \(error.localizedDescription).") return } guard let detectedObjects = results, !detectedObjects.isEmpty else { print("Object detector returned no results.") return } // ...
Objective-C
NSError *error; NSArray<FIRVisionObject *> *objects = [objectDetector resultsInImage:image error:&error]; if (error == nil) { return; } if (objects == nil | objects.count == 0) { // No objects detected. return; } // Success. Get object info here. // ...
अगर इमेज प्रोसेसर को कॉल सफल होता है, तो यह
VisionObject
पूरे करने वाले हैंडलर को या सूची को, इसके आधार पर लौटाता है आपने एसिंक्रोनस तरीका इस्तेमाल किया हो या सिंक्रोनस तरीका.हर
VisionObject
में ये प्रॉपर्टी शामिल होती हैं:frame
CGRect
, जो इमेज.trackingID
वह पूर्णांक जो सभी इमेज में ऑब्जेक्ट की पहचान करता है. सिंगल इन वीडियो में कुछ नहीं इमेज मोड. classificationCategory
ऑब्जेक्ट की अनुमानित कैटगरी. अगर ऑब्जेक्ट की पहचान करने वाला टूल काम नहीं करता क्लासिफ़िकेशन की सुविधा चालू रखें, यह हमेशा .unknown
होता है.confidence
ऑब्जेक्ट कैटगरी की कॉन्फ़िडेंस वैल्यू. अगर आपको डिटेक्टर में क्लासिफ़िकेशन चालू नहीं है या ऑब्जेक्ट अज्ञात के रूप में वर्गीकृत किया गया, यह nil
है.Swift
// detectedObjects contains one item if multiple object detection wasn't enabled. for obj in detectedObjects { let bounds = obj.frame let id = obj.trackingID // If classification was enabled: let category = obj.classificationCategory let confidence = obj.confidence }
Objective-C
// The list of detected objects contains one item if multiple // object detection wasn't enabled. for (FIRVisionObject *obj in objects) { CGRect bounds = obj.frame; if (obj.trackingID) { NSInteger id = obj.trackingID.integerValue; } // If classification was enabled: FIRVisionObjectCategory category = obj.classificationCategory; float confidence = obj.confidence.floatValue; }
उपयोगिता और परफ़ॉर्मेंस में सुधार करना
बेहतरीन उपयोगकर्ता अनुभव के लिए, अपने ऐप्लिकेशन में इन दिशा-निर्देशों का पालन करें:
- ऑब्जेक्ट की पहचान हो पाना, ऑब्जेक्ट की विज़ुअल जटिलता पर निर्भर करता है. ऑब्जेक्ट कम विज़ुअल सुविधाओं का इस्तेमाल करने पर, हो सकता है कि पहचानी जाने वाली इमेज. आपको उपयोगकर्ताओं को कैप्चर करने के लिए ऐसा इनपुट जो उन ऑब्जेक्ट के साथ अच्छे से काम करता है जिनका आपको पता लगाना है.
- क्लासिफ़िकेशन का इस्तेमाल करते समय, अगर आपको ऐसे ऑब्जेक्ट का पता लगाना है जो गिरते नहीं हैं समर्थित श्रेणियों में साफ़ तौर पर, अज्ञात के लिए विशेष हैंडलिंग लागू करें ऑब्जेक्ट हैं.
साथ ही, इसे देखें [ML Kit Material Design शोकेस ऐप्लिकेशन][showcase-link]{: .external } और मटीरियल डिज़ाइन मशीन लर्निंग से काम करने वाली सुविधाओं के पैटर्न का कलेक्शन.
रीयल-टाइम ऐप्लिकेशन में स्ट्रीमिंग मोड का इस्तेमाल करते समय, इन दिशा-निर्देशों का पालन करें बेहतरीन फ़्रेम रेट हासिल करें:
स्ट्रीमिंग मोड में एक से ज़्यादा ऑब्जेक्ट की पहचान करने की सुविधा का इस्तेमाल न करें, क्योंकि ज़्यादातर डिवाइस सही फ़्रेमरेट बना सके.
अगर आपको डेटा की कैटगरी तय करने की ज़रूरत नहीं है, तो उसे बंद कर दें.
- डिटेक्टर को कॉल थ्रॉटल करें. अगर कोई नया वीडियो फ़्रेम डिटेक्टर के चलने के दौरान उपलब्ध होने पर, फ़्रेम छोड़ें.
- अगर ग्राफ़िक को ओवरले करने के लिए, डिटेक्टर के आउटपुट का इस्तेमाल किया जा रहा है इनपुट इमेज को चुनने के बाद, पहले एमएल किट से नतीजा पाएं. इसके बाद, इमेज को रेंडर करें और ओवरले को एक ही चरण में पूरा करें. ऐसा करके, डिसप्ले सरफ़ेस पर रेंडर हो जाता है हर इनपुट फ़्रेम के लिए सिर्फ़ एक बार. previewOverlayView देखें और FIRDetectionOverlayView उदाहरण के लिए शोकेस सैंपल ऐप्लिकेशन में क्लास.