iOS-এ একটি কাস্টম মডেল সহ চিত্রগুলিকে লেবেল করুন৷

আপনি একটি ছবিতে সত্তা চিনতে এবং তাদের লেবেল করতে ML কিট ব্যবহার করতে পারেন। এই API কাস্টম ইমেজ শ্রেণীবিভাগ মডেলের বিস্তৃত পরিসর সমর্থন করে। মডেল সামঞ্জস্যের প্রয়োজনীয়তা, কোথায় প্রাক-প্রশিক্ষিত মডেলগুলি খুঁজে পাবেন এবং কীভাবে আপনার নিজের মডেলগুলিকে প্রশিক্ষিত করবেন সে সম্পর্কে নির্দেশনার জন্য অনুগ্রহ করে ML কিট সহ কাস্টম মডেলগুলি দেখুন৷

একটি কাস্টম মডেল সংহত করার দুটি উপায় আছে। আপনি মডেলটিকে আপনার অ্যাপের অ্যাসেট ফোল্ডারের মধ্যে রেখে বান্ডিল করতে পারেন, অথবা আপনি Firebase থেকে গতিশীলভাবে ডাউনলোড করতে পারেন। নিম্নলিখিত সারণী দুটি বিকল্পের তুলনা করে।

বান্ডিল মডেল হোস্টেড মডেল
মডেলটি আপনার অ্যাপের APK এর অংশ, যা এর আকার বাড়ায়। মডেল আপনার APK অংশ নয়. এটি ফায়ারবেস মেশিন লার্নিং -এ আপলোড করে হোস্ট করা হয়।
Android ডিভাইস অফলাইনে থাকলেও মডেলটি অবিলম্বে উপলব্ধ মডেলটি চাহিদা অনুযায়ী ডাউনলোড করা হয়
ফায়ারবেস প্রকল্পের প্রয়োজন নেই একটি ফায়ারবেস প্রকল্প প্রয়োজন
মডেল আপডেট করতে আপনাকে অবশ্যই আপনার অ্যাপটি পুনরায় প্রকাশ করতে হবে আপনার অ্যাপ পুনঃপ্রকাশ না করেই মডেল আপডেট পুশ করুন
বিল্ট-ইন A/B টেস্টিং নেই ফায়ারবেস রিমোট কনফিগারেশনের সাথে সহজ A/B টেস্টিং

চেষ্টা করে দেখুন

আপনি শুরু করার আগে

  1. আপনার পডফাইলে এমএল কিট লাইব্রেরি অন্তর্ভুক্ত করুন:

    আপনার অ্যাপের সাথে একটি মডেল বান্ডিল করার জন্য:

    pod 'GoogleMLKit/ImageLabelingCustom', '7.0.0'
    

    Firebase থেকে গতিশীলভাবে একটি মডেল ডাউনলোড করার জন্য, LinkFirebase নির্ভরতা যোগ করুন:

    pod 'GoogleMLKit/ImageLabelingCustom', '7.0.0'
    pod 'GoogleMLKit/LinkFirebase', '7.0.0'
    
  2. আপনি আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পরে, এটির .xcworkspace ব্যবহার করে আপনার Xcode প্রকল্পটি খুলুন। ML কিট Xcode সংস্করণ 13.2.1 বা উচ্চতর সমর্থিত।

  3. আপনি যদি একটি মডেল ডাউনলোড করতে চান , তাহলে নিশ্চিত করুন যে আপনি আপনার iOS প্রকল্পে Firebase যোগ করেছেন , যদি আপনি ইতিমধ্যে তা না করে থাকেন। আপনি মডেল বান্ডিল যখন এটি প্রয়োজন হয় না.

1. মডেল লোড করুন

একটি স্থানীয় মডেল উৎস কনফিগার করুন

আপনার অ্যাপের সাথে মডেল বান্ডিল করতে:

  1. আপনার Xcode প্রকল্পে মডেল ফাইলটি অনুলিপি করুন (সাধারণত .tflite বা .lite এ শেষ হয়), যখন আপনি এটি করবেন তখন Copy bundle resources নির্বাচন করার যত্ন নিন। মডেল ফাইলটি অ্যাপ বান্ডেলে অন্তর্ভুক্ত করা হবে এবং ML কিটে উপলব্ধ হবে।

  2. মডেল ফাইলের পাথ নির্দিষ্ট করে LocalModel অবজেক্ট তৈরি করুন:

    let localModel = LocalModel(path: localModelFilePath)
    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)
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
)
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)
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)
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]
    // ...
}
__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
    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];

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.
}
[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.
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
}
for (MLKImageLabel *label in labels) {
  NSString *labelText = label.text;
  float confidence = label.confidence;
  NSInteger index = label.index;
}

রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপস

আপনি যদি একটি রিয়েল-টাইম অ্যাপ্লিকেশনে চিত্রগুলিকে লেবেল করতে চান তবে সেরা ফ্রেমরেটগুলি অর্জন করতে এই নির্দেশিকাগুলি অনুসরণ করুন:

  • ভিডিও ফ্রেম প্রক্রিয়াকরণের জন্য, ডিটেক্টরের results(in:) সিঙ্ক্রোনাস API ব্যবহার করুন। প্রদত্ত ভিডিও ফ্রেম থেকে সুসংগতভাবে ফলাফল পেতে AVCaptureVideoDataOutputSampleBufferDelegate 's captureOutput(_, didOutput:from:) ফাংশন থেকে এই পদ্ধতিতে কল করুন। AVCaptureVideoDataOutput এর alwaysDiscardsLateVideoFrames ডিসকার্ডসলেটভিডিওফ্রেমগুলিকে ডিটেক্টরে কল থ্রোটল করার জন্য true হিসাবে রাখুন৷ ডিটেক্টর চলাকালীন একটি নতুন ভিডিও ফ্রেম উপলব্ধ হলে, এটি বাদ দেওয়া হবে৷
  • আপনি যদি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য ডিটেক্টরের আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফল পান, তারপর একটি একক ধাপে চিত্র এবং ওভারলে রেন্ডার করুন। এটি করার মাধ্যমে, আপনি প্রতিটি প্রক্রিয়াকৃত ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার প্রদর্শন পৃষ্ঠে রেন্ডার করবেন। একটি উদাহরণের জন্য ML কিট কুইকস্টার্ট নমুনায় UpdatePreviewOverlayViewWithLastFrame দেখুন।