iOS-এ ML Kit-এর মাধ্যমে পোজ শনাক্ত করা

ML Kit, পোজ শনাক্তকরণের জন্য দুটি অপ্টিমাইজ করা SDK প্রদান করে।

SDK-এর নামPoseDetectionPoseDetectionAccurate
প্রয়োগবেস ডিটেক্টরের অ্যাসেট বিল্ড করার সময় আপনার অ্যাপের সাথে স্ট্যাটিক লিঙ্ক করা হয়।সঠিক ডিটেক্টরের অ্যাসেট বিল্ড করার সময় আপনার অ্যাপের সাথে স্ট্যাটিক লিঙ্ক করা হয়।
অ্যাপ সাইজসর্বাধিক ২৯.৬ এমবিসর্বাধিক ৩৩.২ এমবি
পারফর্ম্যান্সiPhone X: ~৪৫ FPSiPhone X: ~২৯ FPS

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

শুরু করার আগে

  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
পোজে ডিটেক্টর কোনও ব্যক্তিকে শনাক্ত করবে এবং তারপর পোজে ডিটেকশন রান করবে। ব্যক্তি শনাক্তকরণের ধাপটি প্রতিটি ছবির জন্য চলবে, তাই লেটেন্সি বেশি হবে এবং কোনও ব্যক্তি-ট্র্যাকিং থাকবে না। স্ট্যাটিক ছবিতে পোজ ডিটেকশন ব্যবহার করার সময় অথবা যেখানে ট্র্যাকিং করার প্রয়োজন নেই সেখানে এই মোড ব্যবহার করুন।

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

Swift

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

Objective-C

// 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-এর একটি ইনস্ট্যান্স পান। আপনার উল্লেখ করা বিকল্পগুলি পাস করুন:

Swift

let poseDetector = PoseDetector.poseDetector(options: options)

Objective-C

MLKPoseDetector *poseDetector =
    [MLKPoseDetector poseDetectorWithOptions:options];

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

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

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-কে পোজ ডিটেক্টরের ইমেজ প্রসেসিং পদ্ধতির একটিতে পাস করুন। আপনি অ্যাসিঙ্ক্রোনাস process(image:) পদ্ধতি বা সিঙ্ক্রোনাস results() পদ্ধতি ব্যবহার করতে পারেন।

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

Swift

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.

Objective-C

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.

অ্যাসিঙ্ক্রোনাস পদ্ধতিতে অবজেক্ট শনাক্ত করতে:

Swift

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

Objective-C

[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.
                  }];

৪. শনাক্ত করা পোজ সম্পর্কে তথ্য পাওয়া

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

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

কোনও ব্যক্তিকে শনাক্ত করা না গেলে অ্যারে খালি থাকে।

Swift

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

Objective-C

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

পারফর্ম্যান্স উন্নত করার ব্যাপারে পরামর্শ

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

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

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

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

পরবর্তী ধাপ