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

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

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

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

চেষ্টা করে দেখো

শুরু করার আগে

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

আপনার অ্যাপের সাথে একটি মডেল বান্ডেল করার জন্য:
    pod 'GoogleMLKit/ImageLabelingAutoML'
    
Firebase থেকে একটি মডেল গতিশীলভাবে ডাউনলোড করার জন্য, LinkFirebase নির্ভরতা যোগ করুন:
    pod 'GoogleMLKit/ImageLabelingAutoML'
    pod 'GoogleMLKit/LinkFirebase'
    
২. আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পর, আপনার Xcode প্রোজেক্টটি .xcworkspace কোড> ব্যবহার করে খুলুন। ML Kit Xcode সংস্করণ ১৩.২.১ বা তার বেশি সংস্করণে সমর্থিত। ৩. আপনি যদি একটি মডেল ডাউনলোড করতে চান , তাহলে নিশ্চিত করুন যে আপনি আপনার iOS প্রোজেক্টে Firebase যোগ করেছেন , যদি আপনি ইতিমধ্যে তা না করে থাকেন। মডেলটি বান্ডিল করার সময় এটি প্রয়োজন হয় না।

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

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

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

১. ফায়ারবেস কনসোল থেকে ডাউনলোড করা জিপ আর্কাইভ থেকে মডেল এবং এর মেটাডেটা একটি ফোল্ডারে বের করুন:
    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];

একটি Firebase-হোস্টেড মডেল সোর্স কনফিগার করুন

রিমোটলি-হোস্টেড মডেল ব্যবহার করতে, একটি 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.

তারপর, মডেল ডাউনলোড টাস্ক শুরু করুন, আপনি কোন শর্তাবলীর অধীনে ডাউনলোডের অনুমতি দিতে চান তা উল্লেখ করুন। যদি মডেলটি ডিভাইসে না থাকে, অথবা মডেলের একটি নতুন সংস্করণ উপলব্ধ থাকে, তাহলে টাস্কটি 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 অবজেক্ট তৈরি করুন।

যদি আপনার কেবল স্থানীয়ভাবে তৈরি মডেল থাকে, তাহলে আপনার 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];
            }];

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];

৩. ইমেজ লেবেলারটি চালান

অ্যাসিঙ্ক্রোনাসলি:

সুইফট

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:) সিঙ্ক্রোনাস API ব্যবহার করুন। প্রদত্ত ভিডিও ফ্রেম থেকে সিঙ্ক্রোনাসভাবে ফলাফল পেতে AVCaptureVideoDataOutputSampleBufferDelegate এর captureOutput(_, didOutput:from:) ফাংশন থেকে এই পদ্ধতিটি কল করুন। ডিটেক্টরে থ্রোটল কলের জন্য AVCaptureVideoDataOutput এর alwaysDiscardsLateVideoFrames কে true হিসাবে রাখুন। ডিটেক্টর চলাকালীন যদি একটি নতুন ভিডিও ফ্রেম উপলব্ধ হয়, তবে এটি বাদ দেওয়া হবে।
  • যদি আপনি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য ডিটেক্টরের আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফলটি পান, তারপর ইমেজটি রেন্ডার করুন এবং এক ধাপে ওভারলে করুন। এটি করার মাধ্যমে, আপনি প্রতিটি প্রক্রিয়াজাত ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার ডিসপ্লে সারফেসে রেন্ডার করবেন। উদাহরণের জন্য ML Kit কুইকস্টার্ট নমুনায় updatePreviewOverlayViewWithLastFrame দেখুন।