जब किसी इमेज को एमएल किट में भेजा जाता है, तो वह इमेज में मौजूद पांच ऑब्जेक्ट की पहचान करता है. साथ ही, इमेज में मौजूद हर ऑब्जेक्ट की जगह की जानकारी भी देता है. वीडियो स्ट्रीम में ऑब्जेक्ट का पता लगाते समय, हर ऑब्जेक्ट का एक यूनीक आईडी होता है. इसका इस्तेमाल करके, ऑब्जेक्ट को फ़्रेम से फ़्रेम तक ट्रैक किया जा सकता है.
जिन ऑब्जेक्ट का पता लगाया गया है उनकी कैटगरी तय करने के लिए, कस्टम इमेज क्लासिफ़िकेशन मॉडल का इस्तेमाल किया जा सकता है. मॉडल के साथ काम करने से जुड़ी ज़रूरी शर्तों के बारे में दिशा-निर्देश पाने, पहले से ट्रेन किए गए मॉडल कहां मिलेंगे, और अपने मॉडल को ट्रेनिंग कैसे दी जा सकती है, इस बारे में जानने के लिए कृपया एमएल किट वाले कस्टम मॉडल देखें.
कस्टम मॉडल को इंटिग्रेट करने के दो तरीके हैं. मॉडल को अपने ऐप्लिकेशन के एसेट फ़ोल्डर में डालकर, उसे बंडल किया जा सकता है या Firebase से डाइनैमिक तौर पर डाउनलोड किया जा सकता है. नीचे दी गई टेबल में दोनों विकल्पों की तुलना की गई है.
बंडल किया गया मॉडल | होस्ट किया गया मॉडल |
---|---|
यह मॉडल आपके ऐप्लिकेशन की .ipa फ़ाइल का हिस्सा है, जिससे फ़ाइल का साइज़ बढ़ जाता है. |
मॉडल आपके ऐप्लिकेशन की .ipa फ़ाइल का हिस्सा नहीं है. इसे
Firebase मशीन लर्निंग पर अपलोड करके
होस्ट किया जाता है. |
यह मॉडल तुरंत उपलब्ध है, भले ही Android डिवाइस ऑफ़लाइन हो | मॉडल को मांग पर डाउनलोड किया गया है |
Firebase प्रोजेक्ट की ज़रूरत नहीं है | Firebase प्रोजेक्ट की ज़रूरत होती है |
मॉडल अपडेट करने के लिए, आपको ऐप्लिकेशन को फिर से पब्लिश करना होगा | अपने ऐप्लिकेशन को फिर से पब्लिश किए बिना, मॉडल के अपडेट पुश करें |
पहले से मौजूद A/B टेस्टिंग की सुविधा मौजूद नहीं है | Firebase रिमोट कॉन्फ़िगरेशन की मदद से, आसानी से A/B टेस्टिंग की जा सकती है |
इसे आज़माएं
- बंडल किए गए मॉडल के इस्तेमाल के उदाहरण के लिए, विज़न क्विकस्टार्ट ऐप्लिकेशन देखें. साथ ही, होस्ट किए गए मॉडल के इस्तेमाल के उदाहरण के लिए, automl क्विकस्टार्ट ऐप्लिकेशन देखें.
- इस एपीआई को शुरू से लेकर अंत तक लागू करने के लिए, मटीरियल डिज़ाइन शोकेस ऐप्लिकेशन देखें.
शुरू करने से पहले
अपनी Podfile में ML Kit लाइब्रेरी शामिल करें:
अपने ऐप्लिकेशन के साथ किसी मॉडल को बंडल करने के लिए:
pod 'GoogleMLKit/ObjectDetectionCustom', '3.2.0'
Firebase से किसी मॉडल को डाइनैमिक तरीके से डाउनलोड करने के लिए,
LinkFirebase
डिपेंडेंसी जोड़ें:pod 'GoogleMLKit/ObjectDetectionCustom', '3.2.0' pod 'GoogleMLKit/LinkFirebase', '3.2.0'
अपने प्रोजेक्ट के पॉड इंस्टॉल या अपडेट करने के बाद, Xcode प्रोजेक्ट खोलें. इसके लिए,
.xcworkspace
का इस्तेमाल करें. ML किट, Xcode के 13.2.1 या इसके बाद के वर्शन पर काम करती है.अगर आपको कोई मॉडल डाउनलोड करना है, तो पक्का करें कि आपने अपने iOS प्रोजेक्ट में Firebase को जोड़ा हो. ऐसा तब करें, जब आपने पहले से ऐसा न किया हो. मॉडल को बंडल करते समय ऐसा करने की ज़रूरत नहीं होती.
1. मॉडल लोड करें
लोकल मॉडल के सोर्स को कॉन्फ़िगर करना
मॉडल को अपने ऐप्लिकेशन के साथ बंडल करने के लिए:
मॉडल फ़ाइल (आम तौर पर
.tflite
या.lite
पर खत्म होती है) को अपने Xcode प्रोजेक्ट में कॉपी करें. ऐसा करते समय,Copy bundle resources
को चुनें. मॉडल फ़ाइल, ऐप्लिकेशन बंडल में शामिल की जाएगी और ML Kit में उपलब्ध होगी.मॉडल फ़ाइल का पाथ बताते हुए
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
|
एक से ज़्यादा ऑब्जेक्ट का पता लगाएं और उन्हें ट्रैक करें |
false (डिफ़ॉल्ट) | true
ज़्यादा से ज़्यादा पांच ऑब्जेक्ट का पता लगाना और उन्हें ट्रैक करना है या सिर्फ़ सबसे ज़्यादा प्रमुखता से नज़र आने वाले ऑब्जेक्ट (डिफ़ॉल्ट) का पता लगाना है. |
वस्तुओं को वर्गीकृत करें |
false (डिफ़ॉल्ट) | 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. इनपुट इमेज तैयार करना
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];
4. ऑब्जेक्ट डिटेक्टर बनाना और चलाना
कोई नया ऑब्जेक्ट डिटेक्टर बनाएं:
Swift
let objectDetector = ObjectDetector.objectDetector(options: options)
Objective-C
MLKObjectDetector *objectDetector = [MLKObjectDetector objectDetectorWithOptions:options];
इसके बाद, डिटेक्टर का इस्तेमाल करें:
एसिंक्रोनस रूप से:
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 |
एक पूर्णांक, जो इमेज में ऑब्जेक्ट की पहचान करता है या SINGLE_IMAGE_MODE में `कोई नहीं` लगाता है. | ||||||
labels |
|
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 देखें.