iOS पर AutoML की मदद से ट्रेन किए गए मॉडल का इस्तेमाल करके, इमेज को लेबल करना
AutoML Vision Edge का इस्तेमाल करके अपना मॉडल ट्रेन करने के बाद, इसका इस्तेमाल अपने ऐप्लिकेशन में इमेज को लेबल करने के लिए किया जा सकता है.
AutoML Vision Edge से ट्रेन किए गए मॉडल को इंटिग्रेट करने के दो तरीके हैं. मॉडल को बंडल किया जा सकता है. इसके लिए, मॉडल की फ़ाइलों को अपने Xcode प्रोजेक्ट में कॉपी करें. इसके अलावा, मॉडल को Firebase से डाइनैमिक तौर पर डाउनलोड भी किया जा सकता है.
मॉडल बंडल करने के विकल्प | |
---|---|
आपके ऐप्लिकेशन में बंडल किया गया है |
|
Firebase की मदद से होस्ट किया गया |
|
इसे आज़माएं
- इस एपीआई के इस्तेमाल का उदाहरण देखने के लिए, सैंपल ऐप्लिकेशन का इस्तेमाल करें.
शुरू करने से पहले
1. अपनी Podfile में ML Kit की लाइब्रेरी शामिल करें:अपने ऐप्लिकेशन के साथ मॉडल को बंडल करने के लिए:
pod 'GoogleMLKit/ImageLabelingAutoML'
LinkFirebase
डिपेंडेंसी जोड़ें:
pod 'GoogleMLKit/ImageLabelingAutoML' pod 'GoogleMLKit/LinkFirebase'
.xcworkspace
code> का इस्तेमाल करके खोलें. ML Kit, Xcode के 13.2.1 या इससे नए वर्शन पर काम करता है.
3. अगर आपको कोई मॉडल डाउनलोड करना है, तो पक्का करें कि आपने
अपने iOS प्रोजेक्ट में Firebase जोड़ा हो. ऐसा तब करना होता है, जब आपने पहले से ऐसा न किया हो. मॉडल को बंडल करने पर इसकी ज़रूरत नहीं होती.
1. मॉडल लोड करना
लोकल मॉडल सोर्स कॉन्फ़िगर करना
मॉडल को अपने ऐप्लिकेशन के साथ बंडल करने के लिए:1. Firebase कंसोल से डाउनलोड किए गए zip संग्रह से, मॉडल और उसके मेटाडेटा को किसी फ़ोल्डर में निकालें:
your_model_directory |____dict.txt |____manifest.json |____model.tflite
2. फ़ोल्डर को अपने Xcode प्रोजेक्ट में कॉपी करें. ऐसा करते समय, फ़ोल्डर के रेफ़रंस बनाएं को चुनना न भूलें. मॉडल फ़ाइल और मेटाडेटा, ऐप्लिकेशन बंडल में शामिल किया जाएगा और ML Kit के लिए उपलब्ध होगा.
3. मॉडल की मेनिफ़ेस्ट फ़ाइल का पाथ तय करके,
AutoMLImageLabelerLocalModel
ऑब्जेक्ट बनाएं:
Swift
guard let manifestPath = Bundle.main.path( forResource: "manifest", ofType: "json", inDirectory: "your_model_directory" ) else { return } let localModel = AutoMLImageLabelerLocalModel(manifestPath: manifestPath)
Objective-C
NSString *manifestPath = [NSBundle.mainBundle pathForResource:@"manifest" ofType:@"json" inDirectory:@"your_model_directory"]; MLKAutoMLImageLabelerLocalModel *localModel = [[MLKAutoMLImageLabelerLocalModel alloc] initWithManifestPath:manifestPath];
Firebase होस्ट किए गए मॉडल सोर्स को कॉन्फ़िगर करना
रिमोटली होस्ट किए गए मॉडल का इस्तेमाल करने के लिए, एक AutoMLImageLabelerRemoteModel
ऑब्जेक्ट बनाएं. इसमें वह नाम डालें जो आपने मॉडल को पब्लिश करते समय दिया था:
Swift
let remoteModel = AutoMLImageLabelerRemoteModel( name: "your_remote_model" // The name you assigned in // the Firebase console. )
Objective-C
MLKAutoMLImageLabelerRemoteModel *remoteModel = [[MLKAutoMLImageLabelerRemoteModel alloc] initWithName:@"your_remote_model"]; // The name you assigned in // the Firebase console.
इसके बाद, मॉडल डाउनलोड करने का टास्क शुरू करें. इसमें उन शर्तों के बारे में बताएं जिनके तहत आपको डाउनलोड करने की अनुमति देनी है. अगर मॉडल डिवाइस पर मौजूद नहीं है या मॉडल का नया वर्शन उपलब्ध है, तो टास्क, 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];
कई ऐप्लिकेशन, डाउनलोड करने का टास्क अपने इनिशियलाइज़ेशन कोड में शुरू करते हैं. हालांकि, मॉडल का इस्तेमाल करने से पहले किसी भी समय ऐसा किया जा सकता है.
अपने मॉडल से इमेज लेबलर बनाना
मॉडल सोर्स कॉन्फ़िगर करने के बाद, उनमें से किसी एक से ImageLabeler
ऑब्जेक्ट बनाएं.
अगर आपके पास सिर्फ़ स्थानीय तौर पर बंडल किया गया मॉडल है, तो अपने AutoMLImageLabelerLocalModel
ऑब्जेक्ट से एक लेबलर बनाएं. इसके बाद, भरोसे के स्कोर का वह थ्रेशोल्ड कॉन्फ़िगर करें जो आपको चाहिए (अपने मॉडल का आकलन करें देखें):
Swift
let options = AutoMLImageLabelerOptions(localModel: localModel) options.confidenceThreshold = NSNumber(value: 0.0) // Evaluate your model in the Firebase console // to determine an appropriate value. let imageLabeler = ImageLabeler.imageLabeler(options: options)
Objective-C
MLKAutoMLImageLabelerOptions *options = [[MLKAutoMLImageLabelerOptions alloc] initWithLocalModel:localModel]; options.confidenceThreshold = @(0.0); // Evaluate your model in the Firebase console // to determine an appropriate value. MLKImageLabeler *imageLabeler = [MLKImageLabeler imageLabelerWithOptions:options];
अगर आपके पास रिमोटली होस्ट किया गया मॉडल है, तो आपको यह देखना होगा कि उसे चलाने से पहले डाउनलोड किया गया हो. मॉडल मैनेजर के isModelDownloaded
(remoteModel:) तरीके का इस्तेमाल करके, मॉडल डाउनलोड करने के टास्क की स्थिति देखी जा सकती है.
हालांकि, लेबलर को चलाने से पहले ही इसकी पुष्टि करनी होती है. अगर आपके पास रिमोटली होस्ट किया गया मॉडल और स्थानीय तौर पर बंडल किया गया मॉडल, दोनों हैं, तो ImageLabeler
को इंस्टैंटिएट करते समय इस जांच को पूरा करना सही हो सकता है: अगर रिमोट मॉडल डाउनलोड किया गया है, तो उससे लेबलर बनाएं. अगर ऐसा नहीं है, तो स्थानीय मॉडल से लेबलर बनाएं.
Swift
var options: AutoMLImageLabelerOptions! if (ModelManager.modelManager().isModelDownloaded(remoteModel)) { options = AutoMLImageLabelerOptions(remoteModel: remoteModel) } else { options = AutoMLImageLabelerOptions(localModel: localModel) } options.confidenceThreshold = NSNumber(value: 0.0) // Evaluate your model in the Firebase console // to determine an appropriate value. let imageLabeler = ImageLabeler.imageLabeler(options: options)
Objective-C
MLKAutoMLImageLabelerOptions *options; if ([[MLKModelManager modelManager] isModelDownloaded:remoteModel]) { options = [[MLKAutoMLImageLabelerOptions alloc] initWithRemoteModel:remoteModel]; } else { options = [[MLKAutoMLImageLabelerOptions alloc] initWithLocalModel:localModel]; } options.confidenceThreshold = @(0.0); // Evaluate your model in the Firebase console // to determine an appropriate value. MLKImageLabeler *imageLabeler = [MLKImageLabeler imageLabelerWithOptions:options];
अगर आपके पास सिर्फ़ रिमोटली होस्ट किया गया मॉडल है, तो आपको मॉडल से जुड़ी सुविधा बंद करनी चाहिए. उदाहरण के लिए, जब तक मॉडल डाउनलोड होने की पुष्टि नहीं हो जाती, तब तक अपने यूज़र इंटरफ़ेस (यूआई) के कुछ हिस्से को धूसर कर दें या छिपा दें.
डिफ़ॉल्ट सूचना केंद्र में ऑब्ज़र्वर अटैच करके, मॉडल डाउनलोड करने की स्थिति के बारे में जानकारी पाई जा सकती है. ऑब्ज़र्वर ब्लॉक में 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]; }];
2. इनपुट इमेज तैयार करना
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. इमेज लेबलर को चलाना
एसिंक्रोनस तरीके से:
Swift
imageLabeler.process(image) { labels, error in guard error == nil, let labels = labels, !labels.isEmpty else { // Handle the error. return } // Show results. }
Objective-C
[imageLabeler processImage:image completion:^(NSArray*_Nullable labels, NSError *_Nullable error) { if (labels.count == 0) { // Handle the error. return; } // Show results. }];
सिंक्रोनस तरीके से:
Swift
var labels: [ImageLabel] do { labels = try imageLabeler.results(in: image) } catch let error { // Handle the error. return } // Show results.
Objective-C
NSError *error; NSArray*labels = [imageLabeler resultsInImage:image error:&error]; // Show results or handle the error.
4. लेबल किए गए ऑब्जेक्ट के बारे में जानकारी पाना
अगर इमेज लेबल करने की प्रोसेस पूरी हो जाती है, तो यहImageLabel
का कलेक्शन दिखाता है. हर ImageLabel
, इमेज में लेबल की गई किसी चीज़ को दिखाता है. आपको हर लेबल की टेक्स्ट जानकारी, कॉन्फ़िडेंस स्कोर, और इंडेक्स मिल सकता है. हालांकि, यह जानकारी तब ही मिलेगी, जब TensorFlow Lite मॉडल फ़ाइल के मेटाडेटा में यह उपलब्ध हो.
उदाहरण के लिए:
Swift
for label in labels { let labelText = label.text let confidence = label.confidence let index = label.index }
Objective-C
for (MLKImageLabel *label in labels) { NSString *labelText = label.text; float confidence = label.confidence; NSInteger index = label.index; }
रीयल-टाइम परफ़ॉर्मेंस को बेहतर बनाने के लिए सलाह
अगर आपको रीयल-टाइम ऐप्लिकेशन में इमेज लेबल करनी हैं, तो सबसे अच्छे फ़्रेमरेट पाने के लिए, इन दिशा-निर्देशों का पालन करें:
- वीडियो फ़्रेम प्रोसेस करने के लिए, डिटेक्टर के
results(in:)
सिंक्रोनस एपीआई का इस्तेमाल करें. दिए गए वीडियो फ़्रेम से नतीजे पाने के लिए, इस तरीके कोAVCaptureVideoDataOutputSampleBufferDelegate
केcaptureOutput(_, didOutput:from:)
फ़ंक्शन से कॉल करें. डिटेक्टर को कॉल करने की फ़्रीक्वेंसी कम करने के लिए,AVCaptureVideoDataOutput
केalwaysDiscardsLateVideoFrames
कोtrue
के तौर पर सेट करें. अगर डिटेक्टर के चालू होने के दौरान कोई नया वीडियो फ़्रेम उपलब्ध होता है, तो उसे छोड़ दिया जाएगा. - अगर आपको इनपुट इमेज पर ग्राफ़िक ओवरले करने के लिए, डिटेक्टर के आउटपुट का इस्तेमाल करना है, तो पहले ML Kit से नतीजे पाएं. इसके बाद, इमेज को रेंडर करें और एक ही चरण में ओवरले करें. ऐसा करने से, आपको हर प्रोसेस किए गए इनपुट फ़्रेम के लिए, डिसप्ले सर्फ़ेस पर सिर्फ़ एक बार रेंडर करना होता है. उदाहरण के लिए, ML Kit के क्विकस्टार्ट सैंपल में updatePreviewOverlayViewWithLastFrame देखें.