iOS-এ AutoML-প্রশিক্ষিত মডেল দিয়ে ছবি লেবেল করুন
AutoML Vision Edge ব্যবহার করে আপনার নিজস্ব মডেলকে প্রশিক্ষণ দেওয়ার পর, আপনি আপনার অ্যাপে ছবি লেবেল করার জন্য এটি ব্যবহার করতে পারবেন।
AutoML Vision Edge থেকে প্রশিক্ষিত মডেলগুলিকে একীভূত করার দুটি উপায় রয়েছে। আপনি মডেলের ফাইলগুলি আপনার Xcode প্রোজেক্টে কপি করে মডেলটিকে বান্ডল করতে পারেন, অথবা আপনি Firebase থেকে এটি ডায়নামিকভাবে ডাউনলোড করতে পারেন।
| মডেল বান্ডলিং বিকল্পগুলি | |
|---|---|
| আপনার অ্যাপে অন্তর্ভুক্ত |
|
| ফায়ারবেস দিয়ে হোস্ট করা হয়েছে |
|
চেষ্টা করে দেখুন
- এই API-টির একটি উদাহরণমূলক ব্যবহার দেখতে নমুনা অ্যাপটি ব্যবহার করে দেখুন।
শুরু করার আগে
১. আপনার Podfile-এ ML Kit লাইব্রেরিগুলো অন্তর্ভুক্ত করুন:আপনার অ্যাপের সাথে একটি মডেল যুক্ত করার জন্য:
pod 'GoogleMLKit/ImageLabelingAutoML'
LinkFirebase ডিপেন্ডেন্সিটি যোগ করুন:
pod 'GoogleMLKit/ImageLabelingAutoML'
pod 'GoogleMLKit/LinkFirebase'
.xcworkspace ফোল্ডার ব্যবহার করে আপনার Xcode প্রোজেক্টটি খুলুন। ML Kit, Xcode ভার্সন 13.2.1 বা তার পরবর্তী ভার্সনে সমর্থিত। ৩. আপনি যদি কোনো মডেল ডাউনলোড করতে চান , তাহলে নিশ্চিত করুন যে আপনি আপনার iOS প্রোজেক্টে Firebase যোগ করেছেন , যদি আগে থেকে তা করা না থাকে। মডেলটি বান্ডল করার সময় এটি করার প্রয়োজন নেই।১. মডেলটি লোড করুন
একটি স্থানীয় মডেল উৎস কনফিগার করুন
আপনার অ্যাপের সাথে মডেলটি বান্ডল করতে:১. ফায়ারবেস কনসোল থেকে ডাউনলোড করা জিপ আর্কাইভ থেকে মডেল এবং এর মেটাডেটা একটি ফোল্ডারে এক্সট্র্যাক্ট করুন:
your_model_directory
|____dict.txt
|____manifest.json
|____model.tflite
২. ফোল্ডারটি আপনার Xcode প্রজেক্টে কপি করুন এবং কপি করার সময় 'Create folder references' অপশনটি নির্বাচন করতে ভুলবেন না। মডেল ফাইল এবং মেটাডেটা অ্যাপ বান্ডেলে অন্তর্ভুক্ত হবে এবং ML Kit-এর জন্য উপলব্ধ থাকবে।
৩. মডেল ম্যানিফেস্ট ফাইলের পাথ উল্লেখ করে
AutoMLImageLabelerLocalModel অবজেক্টটি তৈরি করুন: সুইফট
guard let manifestPath = Bundle.main.path( forResource: "manifest", ofType: "json", inDirectory: "your_model_directory" ) else { return } let localModel = AutoMLImageLabelerLocalModel(manifestPath: manifestPath)
উদ্দেশ্য-সি
NSString *manifestPath = [NSBundle.mainBundle pathForResource:@"manifest" ofType:@"json" inDirectory:@"your_model_directory"]; MLKAutoMLImageLabelerLocalModel *localModel = [[MLKAutoMLImageLabelerLocalModel alloc] initWithManifestPath:manifestPath];
ফায়ারবেস-হোস্টেড মডেল সোর্স কনফিগার করুন
রিমোটলি-হোস্টেড মডেলটি ব্যবহার করতে, একটি AutoMLImageLabelerRemoteModel অবজেক্ট তৈরি করুন এবং মডেলটি পাবলিশ করার সময় আপনি যে নামটি দিয়েছিলেন, সেটি উল্লেখ করুন:
সুইফট
let remoteModel = AutoMLImageLabelerRemoteModel( name: "your_remote_model" // The name you assigned in // the Firebase console. )
উদ্দেশ্য-সি
MLKAutoMLImageLabelerRemoteModel *remoteModel = [[MLKAutoMLImageLabelerRemoteModel alloc] initWithName:@"your_remote_model"]; // The name you assigned in // the Firebase console.
এরপর, মডেল ডাউনলোড টাস্কটি শুরু করুন এবং কোন শর্তে আপনি ডাউনলোডের অনুমতি দিতে চান তা উল্লেখ করুন। যদি মডেলটি ডিভাইসে না থাকে, অথবা মডেলটির কোনো নতুন সংস্করণ উপলব্ধ থাকে, তাহলে টাস্কটি অ্যাসিঙ্ক্রোনাসভাবে ফায়ারবেস থেকে মডেলটি ডাউনলোড করবে:
সুইফট
let downloadConditions = ModelDownloadConditions( allowsCellularAccess: true, allowsBackgroundDownloading: true ) let downloadProgress = ModelManager.modelManager().download( remoteModel, conditions: downloadConditions )
উদ্দেশ্য-সি
MLKModelDownloadConditions *downloadConditions = [[MLKModelDownloadConditions alloc] initWithAllowsCellularAccess:YES allowsBackgroundDownloading:YES]; NSProgress *downloadProgress = [[MLKModelManager modelManager] downloadModel:remoteModel conditions:downloadConditions];
অনেক অ্যাপ তাদের ইনিশিয়ালাইজেশন কোডে ডাউনলোডের কাজটি শুরু করে, কিন্তু মডেলটি ব্যবহার করার প্রয়োজন হওয়ার আগে যেকোনো সময়ে আপনি তা করতে পারেন।
আপনার মডেল থেকে একটি ইমেজ লেবেলার তৈরি করুন
আপনার মডেল সোর্সগুলো কনফিগার করার পর, সেগুলোর যেকোনো একটি থেকে একটি ImageLabeler অবজেক্ট তৈরি করুন।
আপনার কাছে যদি কেবল একটি স্থানীয়ভাবে বান্ডেল করা মডেল থাকে, তাহলে আপনার AutoMLImageLabelerLocalModel অবজেক্ট থেকে একটি লেবেলার তৈরি করুন এবং আপনার প্রয়োজনীয় কনফিডেন্স স্কোর থ্রেশহোল্ড কনফিগার করুন ( আপনার মডেল মূল্যায়ন করুন দেখুন)।
সুইফট
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)
উদ্দেশ্য-সি
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 ইনস্ট্যানশিয়েট করার সময় এই চেকটি করে নেওয়া যুক্তিযুক্ত হতে পারে: যদি রিমোট মডেলটি ডাউনলোড করা হয়ে থাকে তবে সেখান থেকে লেবেলার তৈরি করুন, এবং অন্যথায় লোকাল মডেল থেকে তৈরি করুন।
সুইফট
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)
উদ্দেশ্য-সি
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];
আপনার কাছে যদি শুধুমাত্র দূরবর্তী স্থানে হোস্ট করা কোনো মডেল থাকে, তাহলে মডেলটি ডাউনলোড হয়েছে কিনা তা নিশ্চিত না হওয়া পর্যন্ত মডেল-সম্পর্কিত কার্যকারিতা নিষ্ক্রিয় করে রাখা উচিত—যেমন, আপনার UI-এর কোনো অংশ ধূসর করে দেওয়া বা লুকিয়ে রাখা।
ডিফল্ট নোটিফিকেশন সেন্টারে অবজারভার সংযুক্ত করে আপনি মডেল ডাউনলোডের স্ট্যাটাস জানতে পারবেন। অবজারভার ব্লকে অবশ্যই self এর একটি উইক রেফারেন্স ব্যবহার করবেন, কারণ ডাউনলোড হতে কিছুটা সময় লাগতে পারে এবং ডাউনলোড শেষ হওয়ার আগেই মূল অবজেক্টটি ফ্রি হয়ে যেতে পারে। উদাহরণস্বরূপ:
সুইফট
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] // ... }
উদ্দেশ্য-সি
__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]; }];
২. ইনপুট চিত্রটি প্রস্তুত করুন।
একটি UIImage বা একটি CMSampleBuffer ব্যবহার করে একটি VisionImage অবজেক্ট তৈরি করুন।
আপনি যদি UIImage ব্যবহার করেন, তাহলে এই ধাপগুলো অনুসরণ করুন:
-
UIImageব্যবহার করে একটিVisionImageঅবজেক্ট তৈরি করুন। সঠিক.orientationউল্লেখ করতে ভুলবেন না।সুইফট
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
উদ্দেশ্য-সি
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
আপনি যদি
CMSampleBufferব্যবহার করেন, তাহলে এই ধাপগুলো অনুসরণ করুন:CMSampleBufferএ থাকা ইমেজ ডেটার অভিমুখ নির্দিষ্ট করুন।ছবির অভিমুখ পেতে:
সুইফট
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 } }
উদ্দেশ্য-সি
- (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অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
উদ্দেশ্য-সি
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
৩. ইমেজ লেবেলারটি চালান।
অ্যাসিঙ্ক্রোনাসভাবে:
সুইফট
imageLabeler.process(image) { labels, error in guard error == nil, let labels = labels, !labels.isEmpty else { // Handle the error. return } // Show results. }
উদ্দেশ্য-সি
[imageLabeler processImage:image completion:^(NSArray
*_Nullable labels, NSError *_Nullable error) { if (labels.count == 0) { // Handle the error. return; } // Show results. }]; একই সাথে:
সুইফট
var labels: [ImageLabel] do { labels = try imageLabeler.results(in: image) } catch let error { // Handle the error. return } // Show results.
উদ্দেশ্য-সি
NSError *error; NSArray
*labels = [imageLabeler resultsInImage:image error:&error]; // Show results or handle the error. ৪. চিহ্নিত বস্তুগুলো সম্পর্কে তথ্য সংগ্রহ করুন।
ইমেজ লেবেলিং অপারেশন সফল হলে, এটিImageLabelএর একটি অ্যারে রিটার্ন করে। প্রতিটিImageLabelইমেজের লেবেল করা কোনো একটি বিষয়কে উপস্থাপন করে। আপনি প্রতিটি লেবেলের টেক্সট বিবরণ (যদি TensorFlow Lite মডেল ফাইলের মেটাডেটাতে উপলব্ধ থাকে), কনফিডেন্স স্কোর এবং ইনডেক্স পেতে পারেন। উদাহরণস্বরূপ:সুইফট
for label in labels { let labelText = label.text let confidence = label.confidence let index = label.index }
উদ্দেশ্য-সি
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) থেকে ফলাফলটি নিন, তারপর ইমেজটি রেন্ডার করুন এবং একটি একক ধাপে ওভারলে করুন। এভাবে করলে, প্রতিটি প্রসেস করা ইনপুট ফ্রেমের জন্য আপনি ডিসপ্লে সারফেসে কেবল একবারই রেন্ডার করবেন। একটি উদাহরণের জন্য এমএল কিট কুইকস্টার্ট স্যাম্পলের updatePreviewOverlayViewWithLastFrame অংশটি দেখুন।
- ভিডিও ফ্রেম প্রসেস করার জন্য, ডিটেক্টরের
অন্য কিছু উল্লেখ না করা থাকলে, এই পৃষ্ঠার কন্টেন্ট Creative Commons Attribution 4.0 License-এর অধীনে এবং কোডের নমুনাগুলি Apache 2.0 License-এর অধীনে লাইসেন্স প্রাপ্ত। আরও জানতে, Google Developers সাইট নীতি দেখুন। Java হল Oracle এবং/অথবা তার অ্যাফিলিয়েট সংস্থার রেজিস্টার্ড ট্রেডমার্ক।
2026-04-18 UTC-তে শেষবার আপডেট করা হয়েছে।
[null,null,["2026-04-18 UTC-তে শেষবার আপডেট করা হয়েছে।"],[],[]]