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

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

SDK নাম পোজ ডিটেকশন PoseDetection নির্ভুল
বাস্তবায়ন বেস ডিটেক্টরের জন্য সম্পদগুলি বিল্ড টাইমে আপনার অ্যাপের সাথে স্ট্যাটিকভাবে লিঙ্ক করা হয়। নির্ভুল সনাক্তকারীর জন্য সম্পদগুলি বিল্ড টাইমে আপনার অ্যাপের সাথে স্ট্যাটিকভাবে লিঙ্ক করা হয়।
অ্যাপের আকার 29.6MB পর্যন্ত 33.2MB পর্যন্ত
কর্মক্ষমতা iPhone X: ~45FPS iPhone X: ~29FPS

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

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

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

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

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

উদ্দেশ্য-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 এর একটি উদাহরণ পান। আপনার নির্দিষ্ট করা বিকল্পগুলি পাস করুন:

সুইফট

let poseDetector = PoseDetector.poseDetector(options: options)

উদ্দেশ্য-C

MLKPoseDetector *poseDetector =
    [MLKPoseDetector poseDetectorWithOptions: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() পদ্ধতি ব্যবহার করতে পারেন।

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

সুইফট

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.

উদ্দেশ্য-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.

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

সুইফট

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

উদ্দেশ্য-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.
                  }];

4. সনাক্ত করা ভঙ্গি সম্পর্কে তথ্য পান

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

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

যদি কোনো ব্যক্তি সনাক্ত না করা হয় তাহলে অ্যারে খালি।

সুইফট

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

উদ্দেশ্য-C

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

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

আপনার ফলাফলের গুণমান ইনপুট চিত্রের মানের উপর নির্ভর করে:

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

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

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

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