আইওএস-এ ML কিট দিয়ে বস্তুগুলি সনাক্ত করুন এবং ট্র্যাক করুন৷

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

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

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

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

  1. আপনার পডফাইলে নিম্নলিখিত এমএল কিট পডগুলি অন্তর্ভুক্ত করুন:
    pod 'GoogleMLKit/ObjectDetection', '3.2.0'
    
  2. আপনি আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পরে, এটির .xcworkspace ব্যবহার করে আপনার Xcode প্রকল্পটি খুলুন। ML Kit Xcode সংস্করণ 12.4 বা তার বেশিতে সমর্থিত।

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

অবজেক্ট সনাক্ত করতে এবং ট্র্যাক করতে, প্রথমে ObjectDetector এর একটি উদাহরণ তৈরি করুন এবং ঐচ্ছিকভাবে ডিফল্ট থেকে আপনি যে কোনও ডিটেক্টর সেটিংস পরিবর্তন করতে চান তা নির্দিষ্ট করুন।

  1. একটি ObjectDetectorOptions অবজেক্টের সাথে আপনার ব্যবহারের ক্ষেত্রে অবজেক্ট ডিটেক্টর কনফিগার করুন। আপনি নিম্নলিখিত সেটিংস পরিবর্তন করতে পারেন:

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

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

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

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

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

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

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

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

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

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

সুইফট

// Live detection and tracking
let options = ObjectDetectorOptions()
options.shouldEnableClassification = true

// Multiple object detection in static images
let options = ObjectDetectorOptions()
options.detectorMode = .singleImage
options.shouldEnableMultipleObjects = true
options.shouldEnableClassification = true

উদ্দেশ্য-C

// Live detection and tracking
MLKObjectDetectorOptions *options = [[MLKObjectDetectorOptions alloc] init];
options.shouldEnableClassification = YES;

// Multiple object detection in static images
MLKObjectDetectorOptions *options = [[MLKOptions alloc] init];
options.detectorMode = MLKObjectDetectorModeSingleImage;
options.shouldEnableMultipleObjects = YES;
options.shouldEnableClassification = YES;
  1. ObjectDetector এর একটি উদাহরণ পান:

সুইফট

let objectDetector = ObjectDetector.objectDetector()

// Or, to change the default settings:
let objectDetector = ObjectDetector.objectDetector(options: options)

উদ্দেশ্য-C

MLKObjectDetector *objectDetector = [MLKObjectDetector objectDetector];

// Or, to change the default settings:
MLKObjectDetector *objectDetector = [MLKObjectDetector objectDetectorWithOptions:options];

2. ইনপুট ইমেজ প্রস্তুত করুন

বস্তু সনাক্ত করতে এবং ট্র্যাক করতে, প্রতিটি চিত্র বা ভিডিওর ফ্রেমের জন্য নিম্নলিখিতগুলি করুন৷ আপনি যদি স্ট্রিম মোড সক্ষম করেন, তাহলে আপনাকে অবশ্যই CMSampleBuffer s থেকে VisionImage অবজেক্ট তৈরি করতে হবে।

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

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

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

    সুইফট

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

    উদ্দেশ্য-C

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

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

    সুইফট

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

    উদ্দেশ্য-C

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

3. চিত্রটি প্রক্রিয়া করুন

অবজেক্ট ডিটেক্টরের ইমেজ প্রসেসিং পদ্ধতির একটিতে VisionImage পাস করুন। আপনি হয় অ্যাসিঙ্ক্রোনাস process(image:) পদ্ধতি বা সিঙ্ক্রোনাস results() পদ্ধতি ব্যবহার করতে পারেন।

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

সুইফট

objectDetector.process(image) { objects, error in
  guard error == nil else {
    // Error.
    return
  }
  guard !objects.isEmpty else {
    // No objects detected.
    return
  }

  // Success. Get object info here.
  // ...
}

উদ্দেশ্য-C

[objectDetector processImage:image
                  completion:^(NSArray * _Nullable objects,
                               NSError * _Nullable error) {
                    if (error == nil) {
                      return;
                    }
                    if (objects.count == 0) {
                      // No objects detected.
                      return;
                    }

                    // Success. Get object info here.
                  }];

সিঙ্ক্রোনাসভাবে বস্তু সনাক্ত করতে:

সুইফট

var objects: [Object]
do {
  objects = try objectDetector.results(in: image)
} catch let error {
  print("Failed to detect object with error: \(error.localizedDescription).")
  return
}
guard !objects.isEmpty else {
  print("Object detector returned no results.")
  return
}

// Success. Get object info here.

উদ্দেশ্য-C

NSError *error;
NSArray *objects = [objectDetector resultsInImage:image error:&error];
if (error == nil) {
  return;
}
if (objects.count == 0) {
  // No objects detected.
  return;
}

// Success. Get object info here.

4. সনাক্ত করা বস্তু সম্পর্কে তথ্য পান

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

প্রতিটি Object নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

frame একটি CGRect ছবিতে বস্তুর অবস্থান নির্দেশ করে।
trackingID একটি পূর্ণসংখ্যা যা চিত্র জুড়ে বস্তুটিকে শনাক্ত করে বা একক চিত্র মোডে `nil`।
labels ডিটেক্টর দ্বারা ফিরে আসা বস্তুর বর্ণনাকারী লেবেলের একটি অ্যারে। ডিটেক্টর অপশন shouldEnableClassification false সেট করা থাকলে সম্পত্তি খালি।

সুইফট

// objects contains one item if multiple object detection wasn't enabled.
for object in objects {
  let frame = object.frame
  let trackingID = object.trackingID

  // If classification was enabled:
  let description = object.labels.enumerated().map { (index, label) in
    "Label \(index): \(label.text), \(label.confidence)"
    }.joined(separator:"\n")

}

উদ্দেশ্য-C

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