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

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

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

আপনি সনাক্ত করা বস্তুগুলিকে শ্রেণীবদ্ধ করতে একটি কাস্টম চিত্র শ্রেণীবিভাগ মডেল ব্যবহার করতে পারেন। মডেল সামঞ্জস্যের প্রয়োজনীয়তা, কোথায় প্রাক-প্রশিক্ষিত মডেলগুলি খুঁজে পাবেন এবং কীভাবে আপনার নিজের মডেলগুলিকে প্রশিক্ষিত করবেন সে সম্পর্কে নির্দেশনার জন্য অনুগ্রহ করে ML কিট সহ কাস্টম মডেলগুলি দেখুন৷

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

বান্ডিল মডেল হোস্টেড মডেল
মডেলটি আপনার অ্যাপের .ipa ফাইলের অংশ, যা এর আকার বাড়ায়। মডেলটি আপনার অ্যাপের .ipa ফাইলের অংশ নয়৷ এটি ফায়ারবেস মেশিন লার্নিং -এ আপলোড করে হোস্ট করা হয়।
Android ডিভাইস অফলাইনে থাকলেও মডেলটি অবিলম্বে উপলব্ধ মডেলটি চাহিদা অনুযায়ী ডাউনলোড করা হয়
ফায়ারবেস প্রকল্পের প্রয়োজন নেই একটি ফায়ারবেস প্রকল্প প্রয়োজন
মডেল আপডেট করতে আপনাকে অবশ্যই আপনার অ্যাপটি পুনরায় প্রকাশ করতে হবে আপনার অ্যাপ পুনঃপ্রকাশ না করেই মডেল আপডেট পুশ করুন
বিল্ট-ইন A/B টেস্টিং নেই ফায়ারবেস রিমোট কনফিগারেশনের সাথে সহজ A/B টেস্টিং

চেষ্টা কর

তুমি শুরু করার আগে

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

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

    pod 'GoogleMLKit/ObjectDetectionCustom', '3.2.0'
    

    Firebase থেকে গতিশীলভাবে একটি মডেল ডাউনলোড করার জন্য, LinkFirebase নির্ভরতা যোগ করুন:

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

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

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

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

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

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

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

    সুইফট

    let localModel = LocalModel(path: localModelFilePath)

    উদ্দেশ্য গ

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

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

দূরবর্তীভাবে-হোস্ট করা মডেল ব্যবহার করতে, একটি CustomRemoteModel অবজেক্ট তৈরি করুন, আপনি মডেলটি প্রকাশ করার সময় যে নামটি নির্ধারণ করেছিলেন তা উল্লেখ করে:

সুইফট

let firebaseModelSource = FirebaseModelSource(
    name: "your_remote_model") // The name you assigned in
                               // the Firebase console.
let remoteModel = CustomRemoteModel(remoteModelSource: firebaseModelSource)

উদ্দেশ্য গ

MLKFirebaseModelSource *firebaseModelSource =
    [[MLKFirebaseModelSource alloc]
        initWithName:@"your_remote_model"]; // The name you assigned in
                                            // the Firebase console.
MLKCustomRemoteModel *remoteModel =
    [[MLKCustomRemoteModel alloc]
        initWithRemoteModelSource:firebaseModelSource];

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

অনেক অ্যাপ তাদের ইনিশিয়ালাইজেশন কোডে ডাউনলোড টাস্ক শুরু করে, কিন্তু মডেল ব্যবহার করার আগে আপনি যেকোন সময়ে তা করতে পারেন।

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

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

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

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

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

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

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

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

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

শ্রেণীবিভাগ আত্মবিশ্বাস থ্রেশহোল্ড

শনাক্ত করা লেবেলের ন্যূনতম কনফিডেন্স স্কোর। সেট করা না থাকলে, মডেলের মেটাডেটা দ্বারা নির্দিষ্ট করা কোনো ক্লাসিফায়ার থ্রেশহোল্ড ব্যবহার করা হবে। যদি মডেলটিতে কোনো মেটাডেটা না থাকে বা মেটাডেটা কোনো শ্রেণীবদ্ধ থ্রেশহোল্ড নির্দিষ্ট না করে, তাহলে 0.0 এর একটি ডিফল্ট থ্রেশহোল্ড ব্যবহার করা হবে।

প্রতি বস্তুর জন্য সর্বোচ্চ লেবেল

প্রতি অবজেক্টের সর্বোচ্চ সংখ্যক লেবেল যা ডিটেক্টর ফেরত দেবে। যদি সেট না করা হয়, 10 এর ডিফল্ট মান ব্যবহার করা হবে।

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

আপনার যদি দূরবর্তীভাবে-হোস্ট করা মডেল থাকে, তাহলে আপনাকে এটি চালানোর আগে এটি ডাউনলোড করা হয়েছে কিনা তা পরীক্ষা করতে হবে। আপনি মডেল ম্যানেজারের isModelDownloaded(remoteModel:) পদ্ধতি ব্যবহার করে মডেল ডাউনলোড টাস্কের স্থিতি পরীক্ষা করতে পারেন।

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

সুইফট

var options: CustomObjectDetectorOptions!
if (ModelManager.modelManager().isModelDownloaded(remoteModel)) {
  options = CustomObjectDetectorOptions(remoteModel: remoteModel)
} else {
  options = CustomObjectDetectorOptions(localModel: localModel)
}
options.detectorMode = .singleImage
options.shouldEnableClassification = true
options.shouldEnableMultipleObjects = true
options.classificationConfidenceThreshold = NSNumber(value: 0.5)
options.maxPerObjectLabelCount = 3

উদ্দেশ্য গ

MLKCustomObjectDetectorOptions *options;
if ([[MLKModelManager modelManager] isModelDownloaded:remoteModel]) {
  options = [[MLKCustomObjectDetectorOptions alloc] initWithRemoteModel:remoteModel];
} else {
  options = [[MLKCustomObjectDetectorOptions alloc] initWithLocalModel:localModel];
}
options.detectorMode = MLKObjectDetectorModeSingleImage;
options.shouldEnableClassification = YES;
options.shouldEnableMultipleObjects = YES;
options.classificationConfidenceThreshold = @(0.5);
options.maxPerObjectLabelCount = 3;

যদি আপনার কাছে শুধুমাত্র একটি দূরবর্তীভাবে হোস্ট করা মডেল থাকে, তাহলে আপনার মডেল-সম্পর্কিত কার্যকারিতা অক্ষম করা উচিত-উদাহরণস্বরূপ, ধূসর-আউট বা আপনার 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];
            }];

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

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

এই ব্যবহারের ক্ষেত্রে 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;

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

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

  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.

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

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

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

frame একটি CGRect ছবিতে বস্তুর অবস্থান নির্দেশ করে।
trackingID একটি পূর্ণসংখ্যা যা চিত্র জুড়ে বস্তুটিকে শনাক্ত করে বা SINGLE_IMAGE_MODE-এ `nil`।
labels
label.text লেবেলের পাঠ্য বিবরণ। শুধুমাত্র TensorFlow Lite মডেলের মেটাডেটাতে লেবেলের বিবরণ থাকলেই ফেরত দেওয়া হয়।
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];
  }
}

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

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

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

এছাড়াও, মেশিন লার্নিং-চালিত বৈশিষ্ট্য সংগ্রহের জন্য [ML Kit Material Design শোকেস অ্যাপ][শোকেস-লিঙ্ক]{: .external } এবং মেটেরিয়াল ডিজাইন প্যাটার্ন দেখুন।

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

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

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

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