আইওএস-এ একটি কাস্টম শ্রেণীবিভাগ মডেলের সাহায্যে বস্তুগুলি সনাক্ত করুন, ট্র্যাক করুন এবং শ্রেণীবদ্ধ করুন৷

আপনি এমএল কিট ব্যবহার করে পরপর ভিডিও ফ্রেমে বস্তু সনাক্ত ও ট্র্যাক করতে পারেন।

আপনি যখন এমএল কিট-এ কোনো ছবি পাঠান, তখন এটি ছবিটির মধ্যে থাকা পাঁচটি পর্যন্ত বস্তু এবং সেগুলোর প্রত্যেকটির অবস্থান শনাক্ত করে। ভিডিও স্ট্রিমে বস্তু শনাক্ত করার সময়, প্রতিটি বস্তুর একটি অনন্য আইডি থাকে, যা ব্যবহার করে আপনি ফ্রেম থেকে ফ্রেমে বস্তুটিকে ট্র্যাক করতে পারেন।

শনাক্ত করা বস্তুগুলোকে শ্রেণিবদ্ধ করতে আপনি একটি কাস্টম ইমেজ ক্লাসিফিকেশন মডেল ব্যবহার করতে পারেন। মডেলের সামঞ্জস্যতার প্রয়োজনীয়তা, প্রি-ট্রেইনড মডেল কোথায় পাবেন এবং কীভাবে আপনার নিজের মডেলকে ট্রেইন করবেন, সে সম্পর্কে নির্দেশনার জন্য এমএল কিট (ML Kit)-এর কাস্টম মডেল (Custom models with ML Kit ) অংশটি দেখুন।

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

বান্ডেল মডেল হোস্টেড মডেল
মডেলটি আপনার অ্যাপের .ipa ফাইলের একটি অংশ, যা এর আকার বাড়িয়ে দেয়। মডেলটি আপনার অ্যাপের .ipa ফাইলের অংশ নয়। এটি ক্লাউড স্টোরেজে আপলোড করে হোস্ট করা হয়। আমরা ফায়ারবেসের জন্য ক্লাউড স্টোরেজ ব্যবহার করার পরামর্শ দিই।
অ্যান্ড্রয়েড ডিভাইসটি অফলাইনে থাকলেও মডেলটি তাৎক্ষণিকভাবে পাওয়া যায়। আপনার অ্যাপে চাহিদা অনুযায়ী মডেল ডাউনলোড করার কোড অবশ্যই অন্তর্ভুক্ত থাকতে হবে।
ফায়ারবেস প্রজেক্টের প্রয়োজন নেই একটি Firebase প্রজেক্ট প্রয়োজন (যদি Cloud Storage for Firebase ব্যবহার করা হয়)।
মডেলটি আপডেট করতে আপনাকে অবশ্যই আপনার অ্যাপটি পুনরায় প্রকাশ করতে হবে। আপনার অ্যাপ পুনরায় প্রকাশ না করেই মডেল আপডেটগুলি পাঠান।
অন্তর্নির্মিত A/B টেস্টিং নেই ফায়ারবেস রিমোট কনফিগ ব্যবহার করে এ/বি টেস্টিং

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

শুরু করার আগে

  1. আপনার Podfile-এ ML Kit লাইব্রেরিগুলো অন্তর্ভুক্ত করুন:

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

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

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

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

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

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

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

    সুইফট

    let localModel = LocalModel(path: localModelFilePath)

    উদ্দেশ্য-সি

    MLKLocalModel *localModel =
        [[MLKLocalModel alloc] initWithPath:localModelFilePath];

দূরবর্তীভাবে হোস্ট করা মডেল উৎস কনফিগার করুন

রিমোটলি-হোস্টেড মডেল ব্যবহার করার জন্য, আপনাকে অবশ্যই আপনার নিজস্ব অ্যাপ লজিক ব্যবহার করে মডেল ফাইলটি ডিভাইসের লোকাল স্টোরেজে ডাউনলোড করতে হবে এবং তারপরে এটিকে একটি লোকাল মডেল হিসাবে লোড করতে হবে। আমরা একটি মডেল হোস্ট করার জন্য ক্লাউড স্টোরেজ ফর ফায়ারবেস (Cloud Storage for Firebase) ব্যবহার করার পরামর্শ দিই। বাস্তবায়নের বিস্তারিত তথ্যের জন্য, ফায়ারবেস এমএল টু ক্লাউড স্টোরেজ মাইগ্রেশন গাইড (Firebase ML to Cloud Storage migration guide ) দেখুন।

২. অবজেক্ট ডিটেক্টরটি কনফিগার করুন।

আপনার মডেল সোর্সগুলো কনফিগার করার পর, একটি CustomObjectDetectorOptions অবজেক্ট ব্যবহার করে আপনার ব্যবহারের ক্ষেত্র অনুযায়ী অবজেক্ট ডিটেক্টরটি কনফিগার করুন। আপনি নিম্নলিখিত সেটিংসগুলো পরিবর্তন করতে পারেন:

অবজেক্ট ডিটেক্টর সেটিংস
সনাক্তকরণ মোড STREAM_MODE (ডিফল্ট) | SINGLE_IMAGE_MODE

STREAM_MODE (ডিফল্ট), অবজেক্ট ডিটেক্টর কম ল্যাটেন্সিতে চলে, কিন্তু ডিটেক্টরের প্রথম কয়েকটি চালনায় এটি অসম্পূর্ণ ফলাফল (যেমন অনির্দিষ্ট বাউন্ডিং বক্স বা ক্যাটাগরি লেবেল) দিতে পারে। এছাড়াও, STREAM_MODE ডিটেক্টর অবজেক্টগুলোকে ট্র্যাকিং আইডি প্রদান করে, যা ব্যবহার করে আপনি বিভিন্ন ফ্রেমে অবজেক্ট ট্র্যাক করতে পারেন। যখন আপনি অবজেক্ট ট্র্যাক করতে চান, অথবা যখন কম ল্যাটেন্সি গুরুত্বপূর্ণ, যেমন রিয়েল টাইমে ভিডিও স্ট্রিম প্রসেস করার সময়, তখন এই মোডটি ব্যবহার করুন।

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

একাধিক বস্তু সনাক্ত ও ট্র্যাক করুন false (ডিফল্ট) | true

সর্বোচ্চ পাঁচটি বস্তু সনাক্ত ও ট্র্যাক করা হবে, নাকি শুধুমাত্র সবচেয়ে সুস্পষ্ট বস্তুটি (ডিফল্ট)।

বস্তু শ্রেণীবদ্ধ করুন false (ডিফল্ট) | true

প্রদত্ত কাস্টম ক্লাসিফায়ার মডেল ব্যবহার করে শনাক্তকৃত বস্তুগুলোকে শ্রেণিবদ্ধ করা হবে কি না। আপনার কাস্টম ক্লাসিফিকেশন মডেল ব্যবহার করতে হলে, আপনাকে এটি ' true সেট করতে হবে।

শ্রেণিবিন্যাস আত্মবিশ্বাস থ্রেশহোল্ড

শনাক্তকৃত লেবেলগুলির সর্বনিম্ন কনফিডেন্স স্কোর। যদি এটি সেট করা না থাকে, তাহলে মডেলের মেটাডেটা দ্বারা নির্দিষ্ট করা যেকোনো ক্লাসিফায়ার থ্রেশহোল্ড ব্যবহার করা হবে। যদি মডেলে কোনো মেটাডেটা না থাকে অথবা মেটাডেটাতে কোনো ক্লাসিফায়ার থ্রেশহোল্ড নির্দিষ্ট করা না থাকে, তাহলে ০.০-এর একটি ডিফল্ট থ্রেশহোল্ড ব্যবহার করা হবে।

প্রতি বস্তুতে সর্বাধিক লেবেল

ডিটেক্টর প্রতিটি অবজেক্টের জন্য সর্বোচ্চ যতগুলো লেবেল ফেরত দেবে। যদি সেট করা না থাকে, তাহলে ডিফল্ট মান ১০ ব্যবহার করা হবে।

আপনার কাছে যদি কেবল একটি স্থানীয়ভাবে বান্ডেল করা মডেল থাকে, তাহলে আপনার LocalModel অবজেক্ট থেকে একটি অবজেক্ট ডিটেক্টর তৈরি করুন:

সুইফট

let options = CustomObjectDetectorOptions(localModel: localModel)
options.detectorMode = .singleImage
options.shouldEnableClassification = true
options.shouldEnableMultipleObjects = true
options.classificationConfidenceThreshold = NSNumber(value: 0.5)
options.maxPerObjectLabelCount = 3

উদ্দেশ্য-সি

MLKCustomObjectDetectorOptions *options =
    [[MLKCustomObjectDetectorOptions alloc] initWithLocalModel:localModel];
options.detectorMode = MLKObjectDetectorModeSingleImage;
options.shouldEnableClassification = YES;
options.shouldEnableMultipleObjects = YES;
options.classificationConfidenceThreshold = @(0.5);
options.maxPerObjectLabelCount = 3;

আপনার মডেলটি যদি দূরবর্তী স্থানে হোস্ট করা থাকে, তবে সেটি চালানোর আগে আপনাকে যাচাই করে নিতে হবে যে সেটি ডাউনলোড হয়েছে কি না।

যদিও অবজেক্ট ডিটেক্টর চালানোর আগে আপনাকে কেবল এটি নিশ্চিত করতে হয়, আপনার কাছে যদি একটি রিমোটলি-হোস্টেড মডেল এবং একটি লোকালি-বান্ডেলড মডেল উভয়ই থাকে, তবে ObjectDetector ইনস্ট্যানশিয়েট করার সময় এই চেকটি করে নেওয়া যুক্তিযুক্ত হতে পারে: ডিটেক্টরটি রিমোট মডেল থেকে তৈরি করুন যদি সেটি ডাউনলোড করা হয়ে থাকে, এবং অন্যথায় লোকাল মডেল থেকে তৈরি করুন।

সুইফট

// Path where your download logic saves the model
let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let localModelURL = documentDirectory.appendingPathComponent("my_remote_model.tflite")

let model: LocalModel
if FileManager.default.fileExists(atPath: localModelURL.path) {
  // Use the downloaded model
  model = LocalModel(path: localModelURL.path)
} else {
  // Fall back to bundled model
  guard let bundledModelPath = Bundle.main.path(forResource: "model", ofType: "tflite") else { return }
  model = LocalModel(path: bundledModelPath)
}

let options = CustomObjectDetectorOptions(localModel: model)
options.detectorMode = .singleImage
options.shouldEnableClassification = true
options.shouldEnableMultipleObjects = true
options.classificationConfidenceThreshold = NSNumber(value: 0.5)
options.maxPerObjectLabelCount = 3
let objectDetector = ObjectDetector.objectDetector(options: options)

উদ্দেশ্য-সি

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *localModelPath = [documentsDirectory stringByAppendingPathComponent:@"my_remote_model.tflite"];

MLKLocalModel *model;
if ([NSFileManager.defaultManager fileExistsAtPath:localModelPath]) {
  // Use the downloaded model
  model = [[MLKLocalModel alloc] initWithPath:localModelPath];
} else {
  // Fall back to bundled model
  NSString *bundledModelPath = [NSBundle.mainBundle pathForResource:@"model" ofType:@"tflite"];
  model = [[MLKLocalModel alloc] initWithPath:bundledModelPath];
}

MLKCustomObjectDetectorOptions *options = [[MLKCustomObjectDetectorOptions alloc] initWithLocalModel:model];
options.detectorMode = MLKObjectDetectorModeSingleImage;
options.shouldEnableClassification = YES;
options.shouldEnableMultipleObjects = YES;
options.classificationConfidenceThreshold = @(0.5);
options.maxPerObjectLabelCount = 3;
MLKObjectDetector *objectDetector = [MLKObjectDetector objectDetectorWithOptions:options];

আপনার কাছে যদি শুধুমাত্র দূরবর্তী স্থানে হোস্ট করা কোনো মডেল থাকে, তাহলে মডেলটি ডাউনলোড হয়েছে কিনা তা নিশ্চিত না হওয়া পর্যন্ত মডেল-সম্পর্কিত কার্যকারিতা নিষ্ক্রিয় করে রাখা উচিত—যেমন, আপনার UI-এর কোনো অংশ ধূসর করে দেওয়া বা লুকিয়ে রাখা।

সুইফট

let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let localModelURL = documentDirectory.appendingPathComponent("my_remote_model.tflite")
if FileManager.default.fileExists(atPath: localModelURL.path) {
  // Model is already cached, initialize immediately
  self.initializeDetector(with: localModelURL)
} else {
  // Model is not yet available, show loading UI and start download
  self.showLoadingUI()
  let storage = Storage.storage()
  let modelRef = storage.reference(forURL: "gs://YOUR_BUCKET/path/to/model.tflite")
  modelRef.write(toFile: localModelURL) { url, error in
    self.hideLoadingUI()
    if let error = error {
      // Handle download error
      self.showErrorUI()
    } else if let modelURL = url {
      // Download success, initialize detector
      self.initializeDetector(with: modelURL)
    }
  }
}

func initializeDetector(with modelURL: URL) {
  let localModel = LocalModel(path: modelURL.path)
  let options = CustomObjectDetectorOptions(localModel: localModel)
  options.detectorMode = .singleImage
  options.shouldEnableClassification = true
  options.shouldEnableMultipleObjects = true
  self.objectDetector = ObjectDetector.objectDetector(options: options)
  // Enable ML features in UI
  self.enableMLFeatures()
}

উদ্দেশ্য-সি

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *localModelPath = [documentsDirectory stringByAppendingPathComponent:@"my_remote_model.tflite"];
NSURL *localModelURL = [NSURL fileURLWithPath:localModelPath];

if ([NSFileManager.defaultManager fileExistsAtPath:localModelPath]) {
  // Model is already cached, initialize immediately
  [self initializeDetectorWithURL:localModelURL];
} else {
  // Model is not yet available, show loading UI and start download
  [self showLoadingUI];

  FIRStorage *storage = [FIRStorage storage];
  FIRStorageReference *modelRef = [storage referenceForURL:@"gs://YOUR_BUCKET/path/to/model.tflite"];

  [modelRef writeToFile:localModelURL
             completion:^(NSURL * _Nullable URL, NSError * _Nullable error) {
               [self hideLoadingUI];
               if (error != nil) {
                 // Handle download error
                 [self showErrorUI];
               } else {
                 // Download success, initialize detector
                 [self initializeDetectorWithURL:URL];
               }
             }];
}

- (void)initializeDetectorWithURL:(NSURL *)modelURL {
  MLKLocalModel *localModel = [[MLKLocalModel alloc] initWithPath:modelURL.path];
  MLKCustomObjectDetectorOptions *options = [[MLKCustomObjectDetectorOptions alloc] initWithLocalModel:localModel];
  options.detectorMode = MLKObjectDetectorModeSingleImage;
  options.shouldEnableClassification = YES;
  options.shouldEnableMultipleObjects = YES;
  self.objectDetector = [MLKObjectDetector objectDetectorWithOptions:options];

  // Enable ML features in UI
  [self enableMLFeatures];
}

অবজেক্ট ডিটেকশন এবং ট্র্যাকিং এপিআইটি এই দুটি মূল ব্যবহারের ক্ষেত্রের জন্য অপ্টিমাইজ করা হয়েছে:

  • ক্যামেরার ভিউফাইন্ডারে থাকা সবচেয়ে সুস্পষ্ট বস্তুটির সরাসরি শনাক্তকরণ ও অনুসরণ।
  • একটি স্থির চিত্র থেকে একাধিক বস্তু শনাক্তকরণ।

এই ব্যবহারের ক্ষেত্রগুলির জন্য API কনফিগার করতে:

সুইফট

// Live detection and tracking
let options = CustomObjectDetectorOptions(localModel: localModel)
options.shouldEnableClassification = true
options.maxPerObjectLabelCount = 3

// Multiple object detection in static images
let options = CustomObjectDetectorOptions(localModel: localModel)
options.detectorMode = .singleImage
options.shouldEnableMultipleObjects = true
options.shouldEnableClassification = true
options.maxPerObjectLabelCount = 3

উদ্দেশ্য-সি

// Live detection and tracking
MLKCustomObjectDetectorOptions *options =
    [[MLKCustomObjectDetectorOptions alloc] initWithLocalModel:localModel];
options.shouldEnableClassification = YES;
options.maxPerObjectLabelCount = 3;

// Multiple object detection in static images
MLKCustomObjectDetectorOptions *options =
    [[MLKCustomObjectDetectorOptions alloc] initWithLocalModel:localModel];
options.detectorMode = MLKObjectDetectorModeSingleImage;
options.shouldEnableMultipleObjects = YES;
options.shouldEnableClassification = YES;
options.maxPerObjectLabelCount = 3;

৩. ইনপুট চিত্রটি প্রস্তুত করুন।

একটি 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];

৪. অবজেক্ট ডিটেক্টরটি তৈরি করুন এবং চালান।

  1. একটি নতুন অবজেক্ট ডিটেক্টর তৈরি করুন:

    সুইফট

    let objectDetector = ObjectDetector.objectDetector(options: options)

    উদ্দেশ্য-সি

    MLKObjectDetector *objectDetector = [MLKObjectDetector objectDetectorWithOptions:options];
  2. তারপর, ডিটেক্টরটি ব্যবহার করুন:

    অ্যাসিঙ্ক্রোনাসভাবে:

    সুইফট

    objectDetector.process(image) { objects, error in
        guard error == nil, let objects = objects, !objects.isEmpty else {
            // Handle the error.
            return
        }
        // Show results.
    }

    উদ্দেশ্য-সি

    [objectDetector
        processImage:image
          completion:^(NSArray *_Nullable objects,
                       NSError *_Nullable error) {
            if (objects.count == 0) {
                // Handle the error.
                return;
            }
            // Show results.
         }];

    একই সাথে:

    সুইফট

    var objects: [Object]
    do {
        objects = try objectDetector.results(in: image)
    } catch let error {
        // Handle the error.
        return
    }
    // Show results.

    উদ্দেশ্য-সি

    NSError *error;
    NSArray *objects =
        [objectDetector resultsInImage:image error:&error];
    // Show results or handle the error.

৫. চিহ্নিত বস্তুগুলো সম্পর্কে তথ্য সংগ্রহ করুন।

ইমেজ প্রসেসরের কল সফল হলে, আপনি অ্যাসিঙ্ক্রোনাস নাকি সিঙ্ক্রোনাস মেথড কল করেছেন তার উপর নির্ভর করে এটি হয় কমপ্লিশন হ্যান্ডলারে Object গুলোর একটি তালিকা পাঠায় অথবা তালিকাটিই ফেরত দেয়।

প্রতিটি Object নিম্নলিখিত বৈশিষ্ট্যগুলো থাকে:

frame একটি CGRect যা ছবিতে বস্তুটির অবস্থান নির্দেশ করে।
trackingID একটি পূর্ণসংখ্যা যা একাধিক ছবির মধ্যে বস্তুটিকে শনাক্ত করে, অথবা SINGLE_IMAGE_MODE-এ `nil`।
labels
label.text লেবেলের পাঠ্য বিবরণ। এটি শুধুমাত্র তখনই ফেরত দেওয়া হয়, যখন LiteRT মডেলের মেটাডেটাতে লেবেলের বিবরণ থাকে।
label.index ক্লাসিফায়ার দ্বারা সমর্থিত সমস্ত লেবেলের মধ্যে লেবেলটির সূচক।
label.confidence বস্তু শ্রেণিবিন্যাসের আত্মবিশ্বাস মান।

সুইফট

// objects contains one item if multiple object detection wasn't enabled.
for object in objects {
  let frame = object.frame
  let trackingID = object.trackingID
  let description = object.labels.enumerated().map { (index, label) in
    "Label \(index): \(label.text), \(label.confidence), \(label.index)"
  }.joined(separator: "\n")
}

উদ্দেশ্য-সি

// The list of detected objects contains one item if multiple object detection
// wasn't enabled.
for (MLKObject *object in objects) {
  CGRect frame = object.frame;
  NSNumber *trackingID = object.trackingID;
  for (MLKObjectLabel *label in object.labels) {
    NSString *labelString =
        [NSString stringWithFormat:@"%@, %f, %lu",
                                   label.text,
                                   label.confidence,
                                   (unsigned long)label.index];
  }
}

একটি দুর্দান্ত ব্যবহারকারীর অভিজ্ঞতা নিশ্চিত করা

সর্বোত্তম ব্যবহারকারী অভিজ্ঞতার জন্য, আপনার অ্যাপে এই নির্দেশিকাগুলো অনুসরণ করুন:

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

এছাড়াও, এমএল কিট ম্যাটেরিয়াল ডিজাইন শোকেস অ্যাপ এবং মেশিন লার্নিং-চালিত ফিচারগুলোর জন্য ম্যাটেরিয়াল ডিজাইন প্যাটার্নস কালেকশনটি দেখে নিন।

কর্মক্ষমতা উন্নত করা

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

  • রিয়েল-টাইম অ্যাপ্লিকেশনে স্ট্রিমিং মোড ব্যবহার করার সময় মাল্টিপল অবজেক্ট ডিটেকশন ব্যবহার করবেন না, কারণ বেশিরভাগ ডিভাইস পর্যাপ্ত ফ্রেমরেট তৈরি করতে সক্ষম হবে না।

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