iOS-এ ML Kit-এর মাধ্যমে ছবি লেবেল করা

আপনি কোনও ছবিতে শনাক্ত করা অবজেক্ট লেবেল করার জন্য ML Kit ব্যবহার করতে পারেন। ML Kit-এর সাথে দেওয়া ডিফল্ট মডেল ৪০০টিরও বেশি আলাদা আলাদা লেবেলের সাথে কাজ করে।

এটি ব্যবহার করে দেখুন

শুরু করার আগে

  1. আপনার Podfile-এ নিম্নলিখিত ML Kit পড অন্তর্ভুক্ত করুন:
    pod 'GoogleMLKit/ImageLabeling', '8.0.0'
    
  2. আপনার প্রোজেক্টের Pod ইনস্টল বা আপডেট করার পরে, এর .xcworkspace ব্যবহার করে আপনার Xcode প্রোজেক্ট খুলুন। Xcode ভার্সন 12.4 বা তার পরবর্তী ভার্সনে ML Kit কাজ করে।

এখন আপনি ছবি লেবেল করার জন্য প্রস্তুত।

১. ইনপুট ছবি প্রস্তুত করুন

UIImage বা CMSampleBuffer ব্যবহার করে VisionImage অবজেক্ট তৈরি করুন।

আপনি UIImage ব্যবহার করলে, এইসব ধাপ অনুসরণ করুন:

  • UIImage-এর সাহায্যে VisionImage অবজেক্ট তৈরি করুন। সঠিক .orientation উল্লেখ করতে ভুলবেন না।

    Swift

    let image = VisionImage(image: UIImage)
    visionImage.orientation = image.imageOrientation

    Objective-C

    MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image];
    visionImage.orientation = image.imageOrientation;

আপনি CMSampleBuffer ব্যবহার করলে, এইসব ধাপ অনুসরণ করুন:

  • CMSampleBuffer-এ থাকা ছবির ডেটার ওরিয়েন্টেশন নির্দিষ্ট করুন।

    ছবির ওরিয়েন্টেশন পেতে:

    Swift

    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
      }
    }
          

    Objective-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 অবজেক্ট তৈরি করুন:

    Swift

    let image = VisionImage(buffer: sampleBuffer)
    image.orientation = imageOrientation(
      deviceOrientation: UIDevice.current.orientation,
      cameraPosition: cameraPosition)

    Objective-C

     MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer];
     image.orientation =
       [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                    cameraPosition:cameraPosition];

২. ইমেজ লেবেলার কনফিগার ও রান করুন

কোনও ছবির অবজেক্ট লেবেল করতে, VisionImage অবজেক্টটিকে ImageLabeler-এর processImage() মেথডে পাস করুন।

  1. প্রথমে, ImageLabeler-এর একটি ইনস্ট্যান্স পান।

Swift

let labeler = ImageLabeler.imageLabeler()

// Or, to set the minimum confidence required:
// let options = ImageLabelerOptions()
// options.confidenceThreshold = 0.7
// let labeler = ImageLabeler.imageLabeler(options: options)

Objective-C

MLKImageLabeler *labeler = [MLKImageLabeler imageLabeler];

// Or, to set the minimum confidence required:
// MLKImageLabelerOptions *options =
//         [[MLKImageLabelerOptions alloc] init];
// options.confidenceThreshold = 0.7;
// MLKImageLabeler *labeler =
//         [MLKImageLabeler imageLabelerWithOptions:options];
  1. তারপর, processImage() পদ্ধতিতে ছবিটি পাস করুন:

Swift

labeler.process(image) { labels, error in
    guard error == nil, let labels = labels else { return }

    // Task succeeded.
    // ...
}

Objective-C

[labeler processImage:image
completion:^(NSArray *_Nullable labels,
            NSError *_Nullable error) {
   if (error != nil) { return; }

   // Task succeeded.
   // ...
}];

৩. লেবেল করা অবজেক্ট সম্পর্কে তথ্য পান

ইমেজ লেবেলিং সফল হলে, সম্পূর্ণতা হ্যান্ডলার ImageLabel অবজেক্টের একটি অ্যারে পায়। প্রতিটি ImageLabel অবজেক্ট এমন কিছুকে দেখায় যা ছবিতে লেবেল করা হয়েছে। বেস মডেল ৪০০টিরও বেশি আলাদা লেবেল সাপোর্ট করে। আপনি প্রতিটি লেবেলের টেক্সট বিবরণ, মডেলের সাথে কাজ করে এমন সব লেবেলের মধ্যে ইনডেক্স এবং ম্যাচের কনফিডেন্স স্কোর পেতে পারেন। যেমন:

Swift

for label in labels {
    let labelText = label.text
    let confidence = label.confidence
    let index = label.index
}

Objective-C

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