আপনি একটি ছবিতে সত্তা চিনতে এবং তাদের লেবেল করতে ML কিট ব্যবহার করতে পারেন। এই API কাস্টম ইমেজ শ্রেণীবিভাগ মডেলের বিস্তৃত পরিসর সমর্থন করে। মডেল সামঞ্জস্যের প্রয়োজনীয়তা, কোথায় প্রাক-প্রশিক্ষিত মডেলগুলি খুঁজে পাবেন এবং কীভাবে আপনার নিজের মডেলগুলিকে প্রশিক্ষিত করবেন সে সম্পর্কে নির্দেশনার জন্য অনুগ্রহ করে ML কিট সহ কাস্টম মডেলগুলি দেখুন৷
একটি কাস্টম মডেল সংহত করার দুটি উপায় আছে। আপনি মডেলটিকে আপনার অ্যাপের অ্যাসেট ফোল্ডারের মধ্যে রেখে বান্ডিল করতে পারেন, অথবা আপনি Firebase থেকে গতিশীলভাবে ডাউনলোড করতে পারেন। নিম্নলিখিত সারণী দুটি বিকল্পের তুলনা করে।
বান্ডিল মডেল | হোস্টেড মডেল |
---|---|
মডেলটি আপনার অ্যাপের APK এর অংশ, যা এর আকার বাড়ায়। | মডেল আপনার APK অংশ নয়. এটি ফায়ারবেস মেশিন লার্নিং -এ আপলোড করে হোস্ট করা হয়। |
Android ডিভাইস অফলাইনে থাকলেও মডেলটি অবিলম্বে উপলব্ধ | মডেলটি চাহিদা অনুযায়ী ডাউনলোড করা হয় |
ফায়ারবেস প্রকল্পের প্রয়োজন নেই | একটি ফায়ারবেস প্রকল্প প্রয়োজন |
মডেল আপডেট করতে আপনাকে অবশ্যই আপনার অ্যাপটি পুনরায় প্রকাশ করতে হবে | আপনার অ্যাপ পুনঃপ্রকাশ না করেই মডেল আপডেট পুশ করুন |
বিল্ট-ইন A/B টেস্টিং নেই | ফায়ারবেস রিমোট কনফিগারেশনের সাথে সহজ A/B টেস্টিং |
চেষ্টা করে দেখুন
- বান্ডিল মডেলের উদাহরণ ব্যবহারের জন্য ভিশন কুইকস্টার্ট অ্যাপ এবং হোস্ট করা মডেলের উদাহরণ ব্যবহারের জন্য অটোএমএল কুইকস্টার্ট অ্যাপ দেখুন।
আপনি শুরু করার আগে
আপনার পডফাইলে এমএল কিট লাইব্রেরি অন্তর্ভুক্ত করুন:
আপনার অ্যাপের সাথে একটি মডেল বান্ডিল করার জন্য:
pod 'GoogleMLKit/ImageLabelingCustom', '3.2.0'
Firebase থেকে গতিশীলভাবে একটি মডেল ডাউনলোড করার জন্য,
LinkFirebase
নির্ভরতা যোগ করুন:pod 'GoogleMLKit/ImageLabelingCustom', '3.2.0' pod 'GoogleMLKit/LinkFirebase', '3.2.0'
আপনি আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পরে, এটির
.xcworkspace
ব্যবহার করে আপনার Xcode প্রকল্পটি খুলুন। ML কিট Xcode সংস্করণ 13.2.1 বা উচ্চতর সমর্থিত।আপনি যদি একটি মডেল ডাউনলোড করতে চান , তাহলে নিশ্চিত করুন যে আপনি আপনার iOS প্রকল্পে Firebase যোগ করেছেন , যদি আপনি ইতিমধ্যে তা না করে থাকেন। আপনি মডেল বান্ডিল যখন এটি প্রয়োজন হয় না.
1. মডেল লোড করুন
একটি স্থানীয় মডেল উৎস কনফিগার করুন
আপনার অ্যাপের সাথে মডেল বান্ডিল করতে:
আপনার Xcode প্রকল্পে মডেল ফাইলটি অনুলিপি করুন (সাধারণত
.tflite
বা.lite
এ শেষ হয়), যখন আপনি এটি করবেন তখনCopy bundle resources
নির্বাচন করার যত্ন নিন। মডেল ফাইলটি অ্যাপ বান্ডেলে অন্তর্ভুক্ত করা হবে এবং ML কিটে উপলব্ধ হবে।মডেল ফাইলের পাথ নির্দিষ্ট করে
LocalModel
অবজেক্ট তৈরি করুন:সুইফট
let localModel = LocalModel(path: localModelFilePath)
উদ্দেশ্য-C
MLKLocalModel *localModel = [[MLKLocalModel alloc] initWithPath:localModelFilePath];
একটি Firebase-হোস্টেড মডেল উৎস কনফিগার করুন
দূরবর্তীভাবে-হোস্ট করা মডেল ব্যবহার করতে, একটি RemoteModel
অবজেক্ট তৈরি করুন, আপনি মডেলটি প্রকাশ করার সময় যে নামটি নির্ধারণ করেছিলেন তা উল্লেখ করে:
সুইফট
let firebaseModelSource = FirebaseModelSource( name: "your_remote_model") // The name you assigned in // the Firebase console. let remoteModel = CustomRemoteModel(remoteModelSource: firebaseModelSource)
উদ্দেশ্য-C
MLKFirebaseModelSource *firebaseModelSource = [[MLKFirebaseModelSource alloc] initWithName:@"your_remote_model"]; // The name you assigned in // the Firebase console. MLKCustomRemoteModel *remoteModel = [[MLKCustomRemoteModel alloc] initWithRemoteModelSource:firebaseModelSource];
তারপরে, আপনি যে শর্তে ডাউনলোড করার অনুমতি দিতে চান তা উল্লেখ করে মডেল ডাউনলোড টাস্ক শুরু করুন। যদি মডেলটি ডিভাইসে না থাকে, বা মডেলটির একটি নতুন সংস্করণ উপলব্ধ থাকলে, টাস্কটি অসিঙ্ক্রোনাসভাবে Firebase থেকে মডেলটি ডাউনলোড করবে:
সুইফট
let downloadConditions = ModelDownloadConditions( allowsCellularAccess: true, allowsBackgroundDownloading: true ) let downloadProgress = ModelManager.modelManager().download( remoteModel, conditions: downloadConditions )
উদ্দেশ্য-C
MLKModelDownloadConditions *downloadConditions = [[MLKModelDownloadConditions alloc] initWithAllowsCellularAccess:YES allowsBackgroundDownloading:YES]; NSProgress *downloadProgress = [[MLKModelManager modelManager] downloadModel:remoteModel conditions:downloadConditions];
অনেক অ্যাপ তাদের ইনিশিয়ালাইজেশন কোডে ডাউনলোড টাস্ক শুরু করে, কিন্তু মডেল ব্যবহার করার আগে আপনি যেকোন সময়ে তা করতে পারেন।
ইমেজ লেবেলার কনফিগার করুন
আপনি আপনার মডেল উত্সগুলি কনফিগার করার পরে, তাদের মধ্যে একটি থেকে একটি ImageLabeler
অবজেক্ট তৈরি করুন৷
নিম্নলিখিত বিকল্পগুলি উপলব্ধ:
অপশন | |
---|---|
confidenceThreshold | শনাক্ত করা লেবেলের ন্যূনতম কনফিডেন্স স্কোর। সেট করা না থাকলে, মডেলের মেটাডেটা দ্বারা নির্দিষ্ট করা কোনো ক্লাসিফায়ার থ্রেশহোল্ড ব্যবহার করা হবে। যদি মডেলটিতে কোনো মেটাডেটা না থাকে বা মেটাডেটা কোনো শ্রেণীবদ্ধ থ্রেশহোল্ড নির্দিষ্ট না করে, তাহলে 0.0 এর একটি ডিফল্ট থ্রেশহোল্ড ব্যবহার করা হবে। |
maxResultCount | ফেরত দিতে লেবেলের সর্বাধিক সংখ্যা৷ যদি সেট না করা হয়, 10 এর ডিফল্ট মান ব্যবহার করা হবে। |
আপনার যদি শুধুমাত্র স্থানীয়ভাবে বান্ডিল করা মডেল থাকে, তাহলে শুধু আপনার LocalModel
অবজেক্ট থেকে একটি লেবেলার তৈরি করুন:
সুইফট
let options = CustomImageLabelerOptions(localModel: localModel) options.confidenceThreshold = NSNumber(value: 0.0) let imageLabeler = ImageLabeler.imageLabeler(options: options)
উদ্দেশ্য-C
MLKCustomImageLabelerOptions *options = [[MLKCustomImageLabelerOptions alloc] initWithLocalModel:localModel]; options.confidenceThreshold = @(0.0); MLKImageLabeler *imageLabeler = [MLKImageLabeler imageLabelerWithOptions:options];
আপনার যদি দূরবর্তীভাবে-হোস্ট করা মডেল থাকে, তাহলে আপনাকে এটি চালানোর আগে এটি ডাউনলোড করা হয়েছে কিনা তা পরীক্ষা করতে হবে। আপনি মডেল ম্যানেজারের isModelDownloaded(remoteModel:)
পদ্ধতি ব্যবহার করে মডেল ডাউনলোড টাস্কের স্থিতি পরীক্ষা করতে পারেন।
যদিও আপনাকে শুধুমাত্র লেবেলার চালানোর আগে এটি নিশ্চিত করতে হবে, যদি আপনার কাছে একটি দূরবর্তীভাবে-হোস্ট করা মডেল এবং একটি স্থানীয়ভাবে-বান্ডিল মডেল উভয়ই থাকে, তাহলে ImageLabeler
টি ইনস্ট্যান্টিয়েট করার সময় এই চেকটি সম্পাদন করা বোধগম্য হতে পারে: যদি এটি হয় তাহলে দূরবর্তী মডেল থেকে একটি লেবেলার তৈরি করুন ডাউনলোড করা হয়েছে, এবং অন্যথায় স্থানীয় মডেল থেকে।
সুইফট
var options: CustomImageLabelerOptions! if (ModelManager.modelManager().isModelDownloaded(remoteModel)) { options = CustomImageLabelerOptions(remoteModel: remoteModel) } else { options = CustomImageLabelerOptions(localModel: localModel) } options.confidenceThreshold = NSNumber(value: 0.0) let imageLabeler = ImageLabeler.imageLabeler(options: options)
উদ্দেশ্য-C
MLKCustomImageLabelerOptions *options; if ([[MLKModelManager modelManager] isModelDownloaded:remoteModel]) { options = [[MLKCustomImageLabelerOptions alloc] initWithRemoteModel:remoteModel]; } else { options = [[MLKCustomImageLabelerOptions alloc] initWithLocalModel:localModel]; } options.confidenceThreshold = @(0.0); 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] // ... }
উদ্দেশ্য-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
উল্লেখ করতে ভুলবেন না।সুইফট
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
উদ্দেশ্য-C
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 } }
উদ্দেশ্য-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
অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
উদ্দেশ্য-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
3. ইমেজ লেবেলার চালান
একটি ইমেজে অবজেক্ট লেবেল করতে,
image
অবজেক্টটিকেImageLabeler
এরprocess()
পদ্ধতিতে পাস করুন।অ্যাসিঙ্ক্রোনাসভাবে:
সুইফট
imageLabeler.process(image) { labels, error in guard error == nil, let labels = labels, !labels.isEmpty else { // Handle the error. return } // Show results. }
উদ্দেশ্য-C
[imageLabeler processImage:image completion:^(NSArray
*_Nullable labels, NSError *_Nullable error) { if (label.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.
উদ্দেশ্য-C
NSError *error; NSArray
*labels = [imageLabeler resultsInImage:image error:&error]; // Show results or handle the error. 4. লেবেলযুক্ত সত্তা সম্পর্কে তথ্য পান
ইমেজ লেবেলিং অপারেশন সফল হলে, এটিImageLabel
এর একটি অ্যারে প্রদান করে। প্রতিটিImageLabel
এমন কিছু উপস্থাপন করে যা ছবিতে লেবেল করা হয়েছিল। আপনি প্রতিটি লেবেলের পাঠ্য বিবরণ পেতে পারেন (যদি TensorFlow Lite মডেল ফাইলের মেটাডেটা পাওয়া যায়), আত্মবিশ্বাসের স্কোর এবং সূচক। যেমন:সুইফট
for label in labels { let labelText = label.text let confidence = label.confidence let index = label.index }
উদ্দেশ্য-C
for (MLKImageLabel *label in labels) { NSString *labelText = label.text; float confidence = label.confidence; NSInteger index = label.index; }
রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপস
আপনি যদি একটি রিয়েল-টাইম অ্যাপ্লিকেশনে চিত্রগুলিকে লেবেল করতে চান তবে সেরা ফ্রেমরেটগুলি অর্জন করতে এই নির্দেশিকাগুলি অনুসরণ করুন:
- ভিডিও ফ্রেম প্রক্রিয়াকরণের জন্য, ডিটেক্টরের
results(in:)
সিঙ্ক্রোনাস API ব্যবহার করুন। প্রদত্ত ভিডিও ফ্রেম থেকে সুসংগতভাবে ফলাফল পেতেAVCaptureVideoDataOutputSampleBufferDelegate
'scaptureOutput(_, didOutput:from:)
ফাংশন থেকে এই পদ্ধতিতে কল করুন।AVCaptureVideoDataOutput
এরalwaysDiscardsLateVideoFrames
ডিসকার্ডসলেটভিডিওফ্রেমগুলিকে ডিটেক্টরে কল থ্রোটল করার জন্যtrue
হিসাবে রাখুন৷ ডিটেক্টর চলাকালীন একটি নতুন ভিডিও ফ্রেম উপলব্ধ হলে, এটি বাদ দেওয়া হবে৷ - আপনি যদি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য ডিটেক্টরের আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফল পান, তারপর একটি একক ধাপে চিত্র এবং ওভারলে রেন্ডার করুন। এটি করার মাধ্যমে, আপনি প্রতিটি প্রক্রিয়াকৃত ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার প্রদর্শন পৃষ্ঠে রেন্ডার করবেন। একটি উদাহরণের জন্য ML কিট কুইকস্টার্ট নমুনায় UpdatePreviewOverlayViewWithLastFrame দেখুন।
অন্য কিছু উল্লেখ না করা থাকলে, এই পৃষ্ঠার কন্টেন্ট Creative Commons Attribution 4.0 License-এর অধীনে এবং কোডের নমুনাগুলি Apache 2.0 License-এর অধীনে লাইসেন্স প্রাপ্ত। আরও জানতে, Google Developers সাইট নীতি দেখুন। Java হল Oracle এবং/অথবা তার অ্যাফিলিয়েট সংস্থার রেজিস্টার্ড ট্রেডমার্ক।
2024-10-30 UTC-তে শেষবার আপডেট করা হয়েছে।
[null,null,["2024-10-30 UTC-তে শেষবার আপডেট করা হয়েছে।"],[],[]] - ভিডিও ফ্রেম প্রক্রিয়াকরণের জন্য, ডিটেক্টরের