iOS-এ ML Kit-এর সাহায্যে পোজ শনাক্ত করুন

এমএল কিট পোজ ডিটেকশনের জন্য দুটি অপ্টিমাইজড এসডিকে প্রদান করে।

এসডিকে নাম ভঙ্গি সনাক্তকরণ পোজ ডিটেকশন অ্যাকুরেট
বাস্তবায়ন বেস ডিটেক্টরের অ্যাসেটগুলো বিল্ড করার সময় আপনার অ্যাপের সাথে স্ট্যাটিক্যালি লিঙ্ক করা হয়। সঠিক ডিটেক্টরের জন্য প্রয়োজনীয় অ্যাসেটগুলো বিল্ড করার সময় আপনার অ্যাপের সাথে স্ট্যাটিক্যালি লিঙ্ক করা হয়।
অ্যাপের আকার ২৯.৬ মেগাবাইট পর্যন্ত ৩৩.২ মেগাবাইট পর্যন্ত
কর্মক্ষমতা আইফোন এক্স: ~৪৫এফপিএস আইফোন এক্স: ~২৯এফপিএস

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

  • এই API-টির একটি উদাহরণমূলক ব্যবহার দেখতে নমুনা অ্যাপটি ব্যবহার করে দেখুন।

শুরু করার আগে

  1. আপনার Podfile-এ নিম্নলিখিত ML Kit পডগুলি অন্তর্ভুক্ত করুন:

    # If you want to use the base implementation:
    pod 'GoogleMLKit/PoseDetection', '8.0.0'
    
    # If you want to use the accurate implementation:
    pod 'GoogleMLKit/PoseDetectionAccurate', '8.0.0'
    
  2. আপনার প্রোজেক্টের পডগুলো ইনস্টল বা আপডেট করার পর, সেটির xcworkspace ব্যবহার করে আপনার Xcode প্রোজেক্টটি খুলুন। ML Kit, Xcode ভার্সন 13.2.1 বা তার উচ্চতর সংস্করণে সমর্থিত।

১. PoseDetector এর একটি ইনস্ট্যান্স তৈরি করুন।

কোনো ছবিতে পোজ শনাক্ত করতে, প্রথমে PoseDetector এর একটি ইনস্ট্যান্স তৈরি করুন এবং ঐচ্ছিকভাবে ডিটেক্টর সেটিংস নির্দিষ্ট করুন।

PoseDetector বিকল্পগুলি

সনাক্তকরণ মোড

PoseDetector দুটি ডিটেকশন মোডে কাজ করে। আপনার ব্যবহারের ধরনের সাথে মানানসই মোডটি বেছে নিন।

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

পোজ ডিটেক্টর বিকল্পগুলি নির্দিষ্ট করুন:

সুইফট

// Base pose detector with streaming, when depending on the PoseDetection SDK
let options = PoseDetectorOptions()
options.detectorMode = .stream

// Accurate pose detector on static images, when depending on the
// PoseDetectionAccurate SDK
let options = AccuratePoseDetectorOptions()
options.detectorMode = .singleImage

উদ্দেশ্য-সি

// Base pose detector with streaming, when depending on the PoseDetection SDK
MLKPoseDetectorOptions *options = [[MLKPoseDetectorOptions alloc] init];
options.detectorMode = MLKPoseDetectorModeStream;

// Accurate pose detector on static images, when depending on the
// PoseDetectionAccurate SDK
MLKAccuratePoseDetectorOptions *options =
    [[MLKAccuratePoseDetectorOptions alloc] init];
options.detectorMode = MLKPoseDetectorModeSingleImage;

অবশেষে, PoseDetector এর একটি ইনস্ট্যান্স নিন। আপনার নির্দিষ্ট করা অপশনগুলো পাস করুন:

সুইফট

let poseDetector = PoseDetector.poseDetector(options: options)

উদ্দেশ্য-সি

MLKPoseDetector *poseDetector =
    [MLKPoseDetector poseDetectorWithOptions:options];

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

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

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

৩. ছবিটি প্রক্রিয়া করুন

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

বস্তুগুলোকে একযোগে শনাক্ত করতে:

সুইফট

var results: [Pose]
do {
  results = try poseDetector.results(in: image)
} catch let error {
  print("Failed to detect pose with error: \(error.localizedDescription).")
  return
}
guard let detectedPoses = results, !detectedPoses.isEmpty else {
  print("Pose detector returned no results.")
  return
}

// Success. Get pose landmarks here.

উদ্দেশ্য-সি

NSError *error;
NSArray *poses = [poseDetector resultsInImage:image error:&error];
if (error != nil) {
  // Error.
  return;
}
if (poses.count == 0) {
  // No pose detected.
  return;
}

// Success. Get pose landmarks here.

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

সুইফট

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

  // Success. Get pose landmarks here.
}

উদ্দেশ্য-সি

[poseDetector processImage:image
                completion:^(NSArray * _Nullable poses,
                             NSError * _Nullable error) {
                    if (error != nil) {
                      // Error.
                      return;
                    }
                    if (poses.count == 0) {
                      // No pose detected.
                      return;
                    }

                    // Success. Get pose landmarks here.
                  }];

৪. শনাক্তকৃত ভঙ্গি সম্পর্কে তথ্য সংগ্রহ করুন

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

যদি ব্যক্তিটি সম্পূর্ণভাবে ছবির মধ্যে না থাকে, তাহলে মডেলটি অনুপস্থিত ল্যান্ডমার্কগুলোর স্থানাঙ্ক ফ্রেমের বাইরে নির্ধারণ করে এবং সেগুলোকে কম InFrameConfidence মান দেয়।

যদি কোনো ব্যক্তিকে শনাক্ত করা না যায়, তাহলে অ্যারেটি খালি থাকে।

সুইফট

for pose in detectedPoses {
  let leftAnkleLandmark = pose.landmark(ofType: .leftAnkle)
  if leftAnkleLandmark.inFrameLikelihood > 0.5 {
    let position = leftAnkleLandmark.position
  }
}

উদ্দেশ্য-সি

for (MLKPose *pose in detectedPoses) {
  MLKPoseLandmark *leftAnkleLandmark =
      [pose landmarkOfType:MLKPoseLandmarkTypeLeftAnkle];
  if (leftAnkleLandmark.inFrameLikelihood > 0.5) {
    MLKVision3DPoint *position = leftAnkleLandmark.position;
  }
}

কর্মক্ষমতা উন্নত করার টিপস

আপনার ফলাফলের মান ইনপুট ছবির মানের উপর নির্ভর করে:

  • এমএল কিট দ্বারা ভঙ্গি সঠিকভাবে শনাক্ত করার জন্য, ছবিতে থাকা ব্যক্তিকে পর্যাপ্ত পিক্সেল ডেটা দ্বারা উপস্থাপন করা উচিত; সর্বোত্তম পারফরম্যান্সের জন্য, সাবজেক্টটির আকার কমপক্ষে ২৫৬x২৫৬ পিক্সেল হওয়া উচিত।
  • যদি আপনি কোনো রিয়েল-টাইম অ্যাপ্লিকেশনে পোজ শনাক্ত করেন, তাহলে ইনপুট ইমেজগুলোর সামগ্রিক ডাইমেনশন বা মাপও বিবেচনা করতে পারেন। ছোট ইমেজ দ্রুত প্রসেস করা যায়, তাই ল্যাটেন্সি কমাতে কম রেজোলিউশনে ইমেজ ক্যাপচার করুন, কিন্তু উপরে উল্লিখিত রেজোলিউশনের প্রয়োজনীয়তাগুলো মনে রাখবেন এবং নিশ্চিত করবেন যেন সাবজেক্টটি ইমেজের যতটা সম্ভব বেশি অংশ জুড়ে থাকে।
  • ছবির ফোকাস খারাপ হলেও তা নির্ভুলতার ওপর প্রভাব ফেলতে পারে। যদি গ্রহণযোগ্য ফলাফল না পান, তবে ব্যবহারকারীকে ছবিটি পুনরায় তুলতে বলুন।

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

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

পরবর্তী পদক্ষেপ