iOS पर, कस्टम क्लासिफ़िकेशन मॉडल की मदद से, चीज़ों को पहचानें, उन्हें ट्रैक करें, और उनकी कैटगरी तय करें

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

जब कोई इमेज ML Kit में पास की जाती है, तो यह इमेज में ज़्यादा से ज़्यादा पांच ऑब्जेक्ट का पता लगाती है साथ ही, आपको इमेज में हर ऑब्जेक्ट की जगह की जानकारी भी मिलेगी. इसमें ऑब्जेक्ट का पता लगाते समय वीडियो स्ट्रीम, हर ऑब्जेक्ट का एक यूनीक आईडी होता है, जिसका इस्तेमाल करके ऑब्जेक्ट को ट्रैक किया जा सकता है से फ़्रेम-दर-फ़्रेम सेट करें.

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

कस्टम मॉडल को इंटिग्रेट करने के दो तरीके हैं. आप मॉडल को इसके अनुसार बंडल कर सकते हैं उसे अपने ऐप्लिकेशन के ऐसेट फ़ोल्डर में रखना या डाइनैमिक तौर पर डाउनलोड करना को Firebase से हटाएं. नीचे दी गई टेबल में दो विकल्पों की तुलना की गई है.

बंडल किया गया मॉडल होस्ट किया गया मॉडल
मॉडल आपके ऐप्लिकेशन की .ipa फ़ाइल का हिस्सा होता है, जो इसका आकार बढ़ा देता है. मॉडल आपके ऐप्लिकेशन की .ipa फ़ाइल का हिस्सा नहीं है. हां पर अपलोड करके होस्ट किया गया Firebase मशीन लर्निंग.
Android डिवाइस के ऑफ़लाइन होने पर भी, मॉडल तुरंत उपलब्ध हो जाता है मॉडल को मांग पर डाउनलोड किया जाता है
Firebase प्रोजेक्ट की ज़रूरत नहीं होती है Firebase प्रोजेक्ट होना ज़रूरी है
मॉडल को अपडेट करने के लिए, आपको अपने ऐप्लिकेशन को फिर से पब्लिश करना होगा अपने ऐप्लिकेशन को फिर से पब्लिश किए बिना, मॉडल के अपडेट पुश करें
पहले से कोई A/B टेस्टिंग नहीं है Firebase रिमोट कॉन्फ़िगरेशन की मदद से आसान A/B टेस्टिंग

इसे आज़माएं

शुरू करने से पहले

  1. अपनी Podfile में ML Kit लाइब्रेरी शामिल करें:

    अपने ऐप्लिकेशन के साथ किसी मॉडल को बंडल करने के लिए:

    pod 'GoogleMLKit/ObjectDetectionCustom', '8.0.0' 

    Firebase से मॉडल को डाइनैमिक तौर पर डाउनलोड करने के लिए, LinkFirebase जोड़ें निर्भरता:

    pod 'GoogleMLKit/ObjectDetectionCustom', '8.0.0' pod 'GoogleMLKit/LinkFirebase', '8.0.0' 
  2. अपने प्रोजेक्ट के Pods को इंस्टॉल या अपडेट करने के बाद, अपना Xcode प्रोजेक्ट खोलें इसके .xcworkspace का इस्तेमाल कर रहा है. ML Kit, Xcode के 13.2.1 वर्शन के साथ काम करता है या उससे ज़्यादा.

  3. अगर आपको कोई मॉडल डाउनलोड करना है, तो पक्का करें कि अपने iOS प्रोजेक्ट में Firebase जोड़ें, अगर आपने पहले से ऐसा नहीं किया है. जब आप बंडल को बंडल करते हैं, तो इसकी ज़रूरत नहीं होती है मॉडल.

1. मॉडल लोड करें

लोकल मॉडल सोर्स कॉन्फ़िगर करना

मॉडल को अपने ऐप्लिकेशन के साथ बंडल करने के लिए:

  1. अपने Xcode में मॉडल फ़ाइल (आम तौर पर, जिसके आखिर में .tflite या .lite आता है) कॉपी करें प्रोजेक्ट शामिल करते समय ध्यान रखें कि ऐसा करते समय Copy bundle resources को चुनें. कॉन्टेंट बनाने मॉडल फ़ाइल, ऐप्लिकेशन बंडल में शामिल की जाएगी और ML किट में उपलब्ध होगी.

  2. मॉडल फ़ाइल का पाथ बताते हुए LocalModel ऑब्जेक्ट बनाएं:

    Swift

    let localModel = LocalModel(path: localModelFilePath)

    Objective-C

    MLKLocalModel *localModel =     [[MLKLocalModel alloc] initWithPath:localModelFilePath];

Firebase से होस्ट किए गए मॉडल सोर्स को कॉन्फ़िगर करना

रिमोट तरीके से होस्ट किए गए मॉडल का इस्तेमाल करने के लिए, CustomRemoteModel ऑब्जेक्ट बनाएं, वह नाम दर्ज करना होगा जिसे आपने मॉडल को प्रकाशित करते समय असाइन किया था:

Swift

let firebaseModelSource = FirebaseModelSource(     name: "your_remote_model") // The name you assigned in                                // the Firebase console. let remoteModel = CustomRemoteModel(remoteModelSource: firebaseModelSource)

Objective-C

MLKFirebaseModelSource *firebaseModelSource =     [[MLKFirebaseModelSource alloc]         initWithName:@"your_remote_model"]; // The name you assigned in                                             // the Firebase console. MLKCustomRemoteModel *remoteModel =     [[MLKCustomRemoteModel alloc]         initWithRemoteModelSource:firebaseModelSource];

इसके बाद, उन शर्तों को तय करते हुए मॉडल डाउनलोड टास्क शुरू करें को डाउनलोड करने की अनुमति देनी है. अगर मॉडल डिवाइस पर नहीं है या नया डिवाइस है, तो मॉडल का वर्शन उपलब्ध है, तो टास्क एसिंक्रोनस रूप से Firebase से मिला मॉडल:

Swift

let downloadConditions = ModelDownloadConditions(   allowsCellularAccess: true,   allowsBackgroundDownloading: true )  let downloadProgress = ModelManager.modelManager().download(   remoteModel,   conditions: downloadConditions )

Objective-C

MLKModelDownloadConditions *downloadConditions =     [[MLKModelDownloadConditions alloc] initWithAllowsCellularAccess:YES                                          allowsBackgroundDownloading:YES];  NSProgress *downloadProgress =     [[MLKModelManager modelManager] downloadModel:remoteModel                                        conditions:downloadConditions];

कई ऐप्लिकेशन अपने इनिशलाइज़ेशन कोड में डाउनलोड का काम शुरू करते हैं, लेकिन आपके द्वारा मॉडल का उपयोग करने की आवश्यकता से पहले किसी भी समय ऐसा कर सकते है.

2. ऑब्जेक्ट डिटेक्टर को कॉन्फ़िगर करें

अपने मॉडल के सोर्स कॉन्फ़िगर करने के बाद, अपने CustomObjectDetectorOptions ऑब्जेक्ट के साथ इस्तेमाल का उदाहरण. आप ये सेटिंग:

ऑब्जेक्ट डिटेक्टर की सेटिंग
पहचान मोड STREAM_MODE (डिफ़ॉल्ट) | SINGLE_IMAGE_MODE

STREAM_MODE (डिफ़ॉल्ट तौर पर) में, ऑब्जेक्ट डिटेक्टर चलता है लेकिन इंतज़ार का समय कम हो, लेकिन हो सकता है कि नतीजे पूरे न हों (जैसे कि अनिर्दिष्ट बाउंडिंग बॉक्स या कैटगरी लेबल) डिटेक्टर के इस्तेमाल से जुड़ी जानकारी. साथ ही, STREAM_MODE में, डिटेक्टर, ऑब्जेक्ट को ट्रैकिंग आईडी असाइन करता है, जिनका इस्तेमाल इन कामों के लिए किया जा सकता है अलग-अलग फ़्रेम पर ऑब्जेक्ट ट्रैक कर सकते हैं. ट्रैक करने के लिए, इस मोड का इस्तेमाल करें ऑब्जेक्ट या जब इंतज़ार का समय कम होना ज़रूरी हो, जैसे कि प्रोसेस करते समय रीयल टाइम में वीडियो स्ट्रीम करने की सुविधा मिलती है.

SINGLE_IMAGE_MODE में, ऑब्जेक्ट डिटेक्टर वापस लौटता है ऑब्जेक्ट का बाउंडिंग बॉक्स तय करने के बाद मिलने वाला नतीजा. अगर आपको क्लासिफ़िकेशन के बाद, यह बाउंडिंग के बाद नतीजा दिखाता है बॉक्स और श्रेणी लेबल, दोनों उपलब्ध हैं. इस वजह से, इंतज़ार का समय ज़्यादा हो सकता है. साथ ही, SINGLE_IMAGE_MODE, ट्रैकिंग आईडी असाइन नहीं किए गए हैं. इस्तेमाल की जाने वाली चीज़ें यह मोड तब लागू होता है, जब इंतज़ार का समय काफ़ी अहम न हो और आपको आंशिक नतीजे.

एक से ज़्यादा ऑब्जेक्ट का पता लगाएं और उन्हें ट्रैक करें false (डिफ़ॉल्ट) | true

ज़्यादा से ज़्यादा पांच ऑब्जेक्ट या सिर्फ़ सबसे ज़्यादा ऑब्जेक्ट का पता लगाना और उन्हें ट्रैक करना है या नहीं साफ़ तौर पर दिखने वाला ऑब्जेक्ट (डिफ़ॉल्ट).

ऑब्जेक्ट को वर्गीकृत करें false (डिफ़ॉल्ट) | true

दिए गए विकल्पों का इस्तेमाल करके, पता लगाए गए ऑब्जेक्ट की कैटगरी तय करनी है या नहीं कस्टम क्लासिफ़ायर मॉडल का इस्तेमाल करें. पसंद के मुताबिक तय की गई कैटगरी का इस्तेमाल करने के लिए मॉडल, आपको इसे true पर सेट करना होगा.

क्लासिफ़िकेशन कॉन्फ़िडेंस थ्रेशोल्ड

पता लगाए गए लेबल का कम से कम कॉन्फ़िडेंस स्कोर. अगर यह नीति सेट नहीं है, तो किसी भी मॉडल के मेटाडेटा से तय किया गया क्लासिफ़ायर थ्रेशोल्ड इस्तेमाल किया जाएगा. अगर मॉडल में कोई मेटाडेटा नहीं है या मेटाडेटा में डेटा की कैटगरी तय करने वाले थ्रेशोल्ड को तय करें, तो डिफ़ॉल्ट थ्रेशोल्ड 0.0 होगा इस्तेमाल किया गया.

हर ऑब्जेक्ट के लिए ज़्यादा से ज़्यादा लेबल

हर ऑब्जेक्ट के हिसाब से लेबल की वह ज़्यादा से ज़्यादा संख्या जिसे डिटेक्टर वापसी. अगर यह नीति सेट नहीं है, तो डिफ़ॉल्ट वैल्यू 10 का इस्तेमाल किया जाएगा.

अगर आपके पास सिर्फ़ लोकल-बंडल किया गया मॉडल है, तो बस यहां से ऑब्जेक्ट डिटेक्टर बनाएं आपका LocalModel ऑब्जेक्ट:

Swift

let options = CustomObjectDetectorOptions(localModel: localModel) options.detectorMode = .singleImage options.shouldEnableClassification = true options.shouldEnableMultipleObjects = true options.classificationConfidenceThreshold = NSNumber(value: 0.5) options.maxPerObjectLabelCount = 3

Objective-C

MLKCustomObjectDetectorOptions *options =     [[MLKCustomObjectDetectorOptions alloc] initWithLocalModel:localModel]; options.detectorMode = MLKObjectDetectorModeSingleImage; options.shouldEnableClassification = YES; options.shouldEnableMultipleObjects = YES; options.classificationConfidenceThreshold = @(0.5); options.maxPerObjectLabelCount = 3;

अगर आपके पास रिमोट तौर पर होस्ट किया गया मॉडल है, तो आपको यह देखना होगा कि डाउनलोड करने की सुविधा देता है. मॉडल के डाउनलोड होने की स्थिति देखी जा सकती है टास्क बनाने के लिए, मॉडल मैनेजर के isModelDownloaded(remoteModel:) तरीके का इस्तेमाल करें.

हालांकि, आपको ऑब्जेक्ट डिटेक्टर को चलाने से पहले ही इसकी पुष्टि करनी होगी, अगर आपके पास रिमोट तौर पर होस्ट किया गया मॉडल और लोकल-बंडल्ड मॉडल, दोनों हैं, तो इससे ObjectDetector को इंस्टैंशिएट करते समय यह चेक करें: रिमोट मॉडल से लिया गया डिटेक्टर, अगर उसे डाउनलोड किया गया है और स्थानीय मॉडल से लिया गया है नहीं तो.

Swift

var options: CustomObjectDetectorOptions! if (ModelManager.modelManager().isModelDownloaded(remoteModel)) {   options = CustomObjectDetectorOptions(remoteModel: remoteModel) } else {   options = CustomObjectDetectorOptions(localModel: localModel) } options.detectorMode = .singleImage options.shouldEnableClassification = true options.shouldEnableMultipleObjects = true options.classificationConfidenceThreshold = NSNumber(value: 0.5) options.maxPerObjectLabelCount = 3

Objective-C

MLKCustomObjectDetectorOptions *options; if ([[MLKModelManager modelManager] isModelDownloaded:remoteModel]) {   options = [[MLKCustomObjectDetectorOptions alloc] initWithRemoteModel:remoteModel]; } else {   options = [[MLKCustomObjectDetectorOptions alloc] initWithLocalModel:localModel]; } options.detectorMode = MLKObjectDetectorModeSingleImage; options.shouldEnableClassification = YES; options.shouldEnableMultipleObjects = YES; options.classificationConfidenceThreshold = @(0.5); options.maxPerObjectLabelCount = 3;

अगर आपके पास सिर्फ़ रिमोट तौर पर होस्ट किया गया मॉडल है, तो आपको मॉडल से जुड़ी सेटिंग बंद करनी चाहिए सुविधा—उदाहरण के लिए, आपके यूज़र इंटरफ़ेस (यूआई) के किसी हिस्से को धूसर करना या छिपाना—जब तक तो यह पुष्टि की जाती है कि मॉडल डाउनलोड किया गया है.

ऑब्ज़र्वर को डिफ़ॉल्ट में अटैच करके मॉडल डाउनलोड स्थिति का पता लगाया जा सकता है सूचना केंद्र. पक्का करें कि ऑब्ज़र्वर में, self के लिए कमज़ोर रेफ़रंस का इस्तेमाल किया गया हो ब्लॉक है, क्योंकि डाउनलोड होने में कुछ समय लग सकता है और मूल ऑब्जेक्ट डाउनलोड पूरा होने पर खाली हो जाएगा. उदाहरण के लिए:

Swift

NotificationCenter.default.addObserver(     forName: .mlkitModelDownloadDidSucceed,     object: nil,     queue: nil ) { [weak self] notification in     guard let strongSelf = self,         let userInfo = notification.userInfo,         let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue]             as? RemoteModel,         model.name == "your_remote_model"         else { return }     // The model was downloaded and is available on the device }  NotificationCenter.default.addObserver(     forName: .mlkitModelDownloadDidFail,     object: nil,     queue: nil ) { [weak self] notification in     guard let strongSelf = self,         let userInfo = notification.userInfo,         let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue]             as? RemoteModel         else { return }     let error = userInfo[ModelDownloadUserInfoKey.error.rawValue]     // ... }

Objective-C

__weak typeof(self) weakSelf = self;  [NSNotificationCenter.defaultCenter     addObserverForName:MLKModelDownloadDidSucceedNotification                 object:nil                  queue:nil             usingBlock:^(NSNotification *_Nonnull note) {               if (weakSelf == nil | note.userInfo == nil) {                 return;               }               __strong typeof(self) strongSelf = weakSelf;                MLKRemoteModel *model = note.userInfo[MLKModelDownloadUserInfoKeyRemoteModel];               if ([model.name isEqualToString:@"your_remote_model"]) {                 // The model was downloaded and is available on the device               }             }];  [NSNotificationCenter.defaultCenter     addObserverForName:MLKModelDownloadDidFailNotification                 object:nil                  queue:nil             usingBlock:^(NSNotification *_Nonnull note) {               if (weakSelf == nil | note.userInfo == nil) {                 return;               }               __strong typeof(self) strongSelf = weakSelf;                NSError *error = note.userInfo[MLKModelDownloadUserInfoKeyError];             }];

ऑब्जेक्ट की पहचान और ट्रैकिंग एपीआई को इन दो मुख्य इस्तेमाल के लिए ऑप्टिमाइज़ किया गया है मामले:

  • कैमरे में सबसे ज़रूरी चीज़ का लाइव पता लगाना और उसे ट्रैक करना व्यूफ़ाइंडर.
  • किसी स्टैटिक इमेज से कई ऑब्जेक्ट की पहचान करना.

एपीआई को इस्तेमाल के इन उदाहरणों के हिसाब से कॉन्फ़िगर करने के लिए:

Swift

// Live detection and tracking let options = CustomObjectDetectorOptions(localModel: localModel) options.shouldEnableClassification = true options.maxPerObjectLabelCount = 3  // Multiple object detection in static images let options = CustomObjectDetectorOptions(localModel: localModel) options.detectorMode = .singleImage options.shouldEnableMultipleObjects = true options.shouldEnableClassification = true options.maxPerObjectLabelCount = 3

Objective-C

// Live detection and tracking MLKCustomObjectDetectorOptions *options =     [[MLKCustomObjectDetectorOptions alloc] initWithLocalModel:localModel]; options.shouldEnableClassification = YES; options.maxPerObjectLabelCount = 3;  // Multiple object detection in static images MLKCustomObjectDetectorOptions *options =     [[MLKCustomObjectDetectorOptions alloc] initWithLocalModel:localModel]; options.detectorMode = MLKObjectDetectorModeSingleImage; options.shouldEnableMultipleObjects = YES; options.shouldEnableClassification = YES; options.maxPerObjectLabelCount = 3;

3. इनपुट इमेज तैयार करें

एक VisionImage ऑब्जेक्ट को UIImage या CMSampleBuffer.

अगर 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;   } }       
  • इसका इस्तेमाल करके एक VisionImage ऑब्जेक्ट बनाएं CMSampleBuffer ऑब्जेक्ट और ओरिएंटेशन:

    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];

4. ऑब्जेक्ट डिटेक्टर बनाएं और चलाएं

  1. नया ऑब्जेक्ट डिटेक्टर बनाएं:

    Swift

    let objectDetector = ObjectDetector.objectDetector(options: options)

    Objective-C

    MLKObjectDetector *objectDetector = [MLKObjectDetector objectDetectorWithOptions:options];
  2. फिर, डिटेक्टर का इस्तेमाल करें:

    एसिंक्रोनस तरीके से:

    Swift

    objectDetector.process(image) { objects, error in     guard error == nil, let objects = objects, !objects.isEmpty else {         // Handle the error.         return     }     // Show results. }

    Objective-C

    [objectDetector     processImage:image       completion:^(NSArray *_Nullable objects,                    NSError *_Nullable error) {         if (objects.count == 0) {             // Handle the error.             return;         }         // Show results.      }];

    सिंक्रोनस:

    Swift

    var objects: [Object] do {     objects = try objectDetector.results(in: image) } catch let error {     // Handle the error.     return } // Show results.

    Objective-C

    NSError *error; NSArray *objects =     [objectDetector resultsInImage:image error:&error]; // Show results or handle the error.

5. लेबल किए गए ऑब्जेक्ट के बारे में जानकारी पाना

अगर इमेज प्रोसेसर को कॉल सफल होता है, तो यह Object पूरे करने वाले हैंडलर को या सूची को, इसके आधार पर लौटाता है आपने एसिंक्रोनस तरीका इस्तेमाल किया हो या सिंक्रोनस तरीका.

हर Object में ये प्रॉपर्टी शामिल होती हैं:

frame CGRect, जो इमेज.
trackingID वह पूर्णांक जो सभी इमेज में ऑब्जेक्ट की पहचान करता है या सिंगल_इमेज_मोड.
labels
label.text लेबल के टेक्स्ट की जानकारी. यह तब ही लौटाया जाता है, जब TensorFlow लाइट मॉडल के मेटाडेटा में लेबल की जानकारी शामिल है.
label.index द्वारा समर्थित सभी लेबल में से लेबल का इंडेक्स क्लासिफ़ायर का इस्तेमाल करें.
label.confidence ऑब्जेक्ट कैटगरी की कॉन्फ़िडेंस वैल्यू.

Swift

// objects contains one item if multiple object detection wasn't enabled. for object in objects {   let frame = object.frame   let trackingID = object.trackingID   let description = object.labels.enumerated().map { (index, label) in     "Label \(index): \(label.text), \(label.confidence), \(label.index)"   }.joined(separator: "\n") }

Objective-C

// The list of detected objects contains one item if multiple object detection // wasn't enabled. for (MLKObject *object in objects) {   CGRect frame = object.frame;   NSNumber *trackingID = object.trackingID;   for (MLKObjectLabel *label in object.labels) {     NSString *labelString =         [NSString stringWithFormat:@"%@, %f, %lu",                                    label.text,                                    label.confidence,                                    (unsigned long)label.index];   } }

बेहतरीन उपयोगकर्ता अनुभव देना

बेहतरीन उपयोगकर्ता अनुभव के लिए, अपने ऐप्लिकेशन में इन दिशा-निर्देशों का पालन करें:

  • ऑब्जेक्ट की पहचान हो पाना, ऑब्जेक्ट की विज़ुअल जटिलता पर निर्भर करता है. तय सीमा में कम विज़ुअल सुविधाओं वाले ऑब्जेक्ट का पता लगाने के लिए, इस्तेमाल करके इमेज के बड़े हिस्से का इस्तेमाल किया जा सकता है. आपको उपयोगकर्ताओं को इसके बारे में दिशा-निर्देश देने चाहिए कैप्चर करना जो ऐसे ऑब्जेक्ट के साथ अच्छा काम करता है जिनका आपको पता लगाना है.
  • क्लासिफ़िकेशन का इस्तेमाल करते समय, अगर आपको ऐसे ऑब्जेक्ट का पता लगाना है जो गिरते नहीं हैं समर्थित श्रेणियों में साफ़ तौर पर, अज्ञात के लिए विशेष हैंडलिंग लागू करें ऑब्जेक्ट हैं.

साथ ही, इसे देखें [ML Kit Material Design शोकेस ऐप्लिकेशन][showcase-link]{: .external } और मटीरियल डिज़ाइन मशीन लर्निंग से काम करने वाली सुविधाओं के पैटर्न का कलेक्शन.

Improving performance

अगर आपको रीयल-टाइम ऐप्लिकेशन में ऑब्जेक्ट की पहचान करने की सुविधा का इस्तेमाल करना है, तो इन निर्देशों का पालन करें सबसे सही फ़्रेमरेट हासिल करने के लिए दिशा-निर्देश:

  • रीयल-टाइम ऐप्लिकेशन में स्ट्रीमिंग मोड का इस्तेमाल करते समय, एक से ज़्यादा बार ऑब्जेक्ट पहचानने की सुविधा मिलती है, क्योंकि ज़्यादातर डिवाइस सही फ़्रेमरेट नहीं बना पाएंगे.

  • वीडियो फ़्रेम प्रोसेस करने के लिए, डिटेक्टर के results(in:) सिंक्रोनस एपीआई का इस्तेमाल करें. कॉल करें AVCaptureVideoDataOutputSampleBufferDelegate का captureOutput(_, didOutput:from:) फ़ंक्शन का इस्तेमाल, दिए गए वीडियो से सिंक्रोनस रूप से नतीजे पाने के लिए किया जाता है फ़्रेम. रखें AVCaptureVideoDataOutput का डिटेक्टर को कॉल थ्रॉटल करने के लिए, alwaysDiscardsLateVideoFrames को true के तौर पर सबमिट किया है. अगर नए डिटेक्टर के चलने के दौरान वीडियो फ़्रेम उपलब्ध हो जाता है. उसे छोड़ दिया जाएगा.
  • अगर ग्राफ़िक ओवरले करने के लिए डिटेक्टर के आउटपुट का इस्तेमाल किया जाता है, तो इनपुट इमेज को चुनने के बाद, पहले एमएल किट से नतीजा पाएं. इसके बाद, इमेज को रेंडर करें और ओवरले को एक ही चरण में पूरा करें. ऐसा करके, डिसप्ले सरफ़ेस पर रेंडर हो जाता है प्रोसेस किए गए हर इनपुट फ़्रेम के लिए, सिर्फ़ एक बार. updatePreviewOverlayViewWithLastFrame देखें उदाहरण के लिए, एमएल किट क्विकस्टार्ट सैंपल में.