iOS-এ AutoML-প্রশিক্ষিত মডেল দিয়ে ছবি লেবেল করুন

AutoML Vision Edge ব্যবহার করে আপনার নিজস্ব মডেলকে প্রশিক্ষণ দেওয়ার পর, আপনি আপনার অ্যাপে ছবি লেবেল করার জন্য এটি ব্যবহার করতে পারবেন।

AutoML Vision Edge থেকে প্রশিক্ষিত মডেলগুলিকে একীভূত করার দুটি উপায় রয়েছে। আপনি মডেলের ফাইলগুলি আপনার Xcode প্রোজেক্টে কপি করে মডেলটিকে বান্ডল করতে পারেন, অথবা আপনি Firebase থেকে এটি ডায়নামিকভাবে ডাউনলোড করতে পারেন।

মডেল বান্ডলিং বিকল্পগুলি
আপনার অ্যাপে অন্তর্ভুক্ত
  • মডেলটি বান্ডেলের একটি অংশ।
  • iOS ডিভাইসটি অফলাইনে থাকলেও মডেলটি তাৎক্ষণিকভাবে পাওয়া যায়।
  • ফায়ারবেস প্রজেক্টের প্রয়োজন নেই
ফায়ারবেস দিয়ে হোস্ট করা হয়েছে
  • ফায়ারবেস মেশিন লার্নিং- এ মডেলটি আপলোড করে হোস্ট করুন।
  • অ্যাপ বান্ডেলের আকার হ্রাস করে
  • মডেলটি চাহিদা অনুযায়ী ডাউনলোড করা হয়।
  • আপনার অ্যাপ পুনরায় প্রকাশ না করেই মডেল আপডেটগুলি পাঠান।
  • Firebase Remote Config-এর মাধ্যমে সহজে A/B টেস্টিং
  • একটি ফায়ারবেস প্রজেক্ট প্রয়োজন।

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

  • এই 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 অংশটি দেখুন।