رصد الأوضاع باستخدام أدوات تعلّم الآلة على نظام التشغيل iOS

توفّر مجموعة أدوات تعلّم الآلة حزمة تطوير برامج (SDK) محسَّنة للكشف عن الوضعية.

اسم حزمة SDKPoseDetectionPoseDetectionAccurate
التنفيذيتم ربط مواد عرض أداة الرصد الأساسية بتطبيقك بشكل ثابت في وقت الإصدار.يتم ربط مواد العرض الخاصة بأداة الرصد الدقيقة بشكل ثابت بتطبيقك في وقت الإصدار.
حجم التطبيقالحد الأقصى لحجم الملف هو 29.6 ميغابايت.الحد الأقصى لحجم الملف هو 33.2 ميغابايت.
الأداءiPhone X: 45 لقطة في الثانية تقريبًاiPhone X: 29 لقطة في الثانية تقريبًا

جرّبه الآن

  • يمكنك تجربة نموذج التطبيق من أجل يمكنك الاطّلاع على مثال حول استخدام واجهة برمجة التطبيقات هذه.

قبل البدء

  1. تضمين مجموعات ML Kit التالية في Podfile:

    # If you want to use the base implementation:
    pod 'GoogleMLKit/PoseDetection', '3.2.0'
    
    # If you want to use the accurate implementation:
    pod 'GoogleMLKit/PoseDetectionAccurate', '3.2.0'
    
  2. بعد تثبيت مجموعات مشروعك المتسلسلة أو تحديثها، افتح مشروع Xcode باستخدام xcworkspace. تتوفّر حزمة تعلّم الآلة في الإصدار 13.2.1 من Xcode أو الإصدارات الأحدث.

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

2. تحضير صورة الإدخال

لاكتشاف الوضعيات، اتّبِع الخطوات التالية لكل صورة أو إطار فيديو. في حال تفعيل وضع البث، يجب إنشاء VisionImage عناصر من CMSampleBuffer

إنشاء عنصر VisionImage باستخدام UIImage أو CMSampleBuffer

إذا كنت تستخدم UIImage، يُرجى اتّباع الخطوات التالية:

  • أنشئ كائن VisionImage باستخدام UIImage. تأكَّد من تحديد قيمة .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;
      }
    }
          
  • إنشاء عنصر VisionImage باستخدام عنصر CMSampleBuffer والاتجاه:

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

3- معالجة الصورة

مرِّر 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.
                  }];

4. الحصول على معلومات عن الوضع الذي تم رصده

إذا تم رصد شخص في الصورة، تعمل واجهة برمجة التطبيقات لرصد الوضعية على تمرير مصفوفة من الكائنات Pose إلى معالج الإكمال أو إرجاع الصفيفة، اعتمادًا على ما إذا كنت قد استدعيت الطريقة غير المتزامنة أو المتزامنة.

وإذا لم يكن الشخص داخل الصورة بالكامل، فإن النموذج يعين إحداثيات المعالم المفقودة خارج الإطار ومنحها قيم InFrameConference.

وإذا لم يتم رصد أي شخص، ستكون الصفيفة فارغة.

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

نصائح لتحسين الأداء

تعتمد جودة نتائجك على جودة الصورة التي تم إدخالها:

  • لكي تتمكن أدوات تعلّم الآلة من اكتشاف الوضعية بدقة، يجب أن يكون الشخص الذي يظهر في الصورة ممثلة ببيانات بكسل كافية؛ للحصول على أفضل أداء، يجب أن يجب أن يكون حجمها 256×256 بكسل على الأقل.
  • إذا اكتشفت وضعية في تطبيق الوقت الفعلي، يمكنك أيضًا التفكير في الأبعاد العامة للصور المدخلة. يمكن معالجة الصور الأصغر حجمًا بشكل أسرع، لتقليل وقت الاستجابة، والتقِط الصور بدرجات دقة أقل، مع الاحتفاظ مراعاة متطلبات الحل المذكورة أعلاه وتأكد من أن الموضوع يشغل من الصورة قدر الإمكان.
  • ويمكن أن يؤثر التركيز الضعيف للصورة أيضًا في الدقة. إذا لم تحصل على نتائج مقبولة، اطلب من المستخدم تلخيص الصورة.

إذا أردت استخدام ميزة "رصد الوضعية" في تطبيق في الوقت الفعلي، يُرجى اتّباع الإرشادات التالية لتحقيق أفضل معدّلات عرض إطارات:

  • استخدِم حِزمة تطوير البرامج (SDK) الأساسية لميزة PoseDetection وميزة الرصد stream.
  • يمكنك التقاط صور بدقة أقل. مع ذلك، ضَع في اعتبارك أيضًا متطلبات أبعاد الصورة في واجهة برمجة التطبيقات هذه.
  • لمعالجة إطارات الفيديو، استخدِم واجهة برمجة التطبيقات المتزامنة results(in:) الخاصة بأداة الرصد. يمكنك استدعاء هذه الطريقة من قائمة التشغيل AVCaptureVideoDataOutputSampleBufferDelegate. captureOutput(_, didOutput:from:) للحصول على النتائج بشكل متزامن من إطار الفيديو المحدّد. احتفظ بـ alwaysDiscardsLateVideoFrames التابع لـ AVCaptureVideoDataOutput كـ "صحيح" لتقييد المكالمات الواردة إلى أداة الرصد.) إذا أصبح إطار فيديو جديد متاحًا أثناء تشغيل أداة الرصد، سيتم تجاهلها.
  • في حال استخدام مخرجات أداة الكشف لتركيب الرسومات على الصورة المدخلة، يمكنك أولاً الحصول على النتيجة من ML Kit، ثم عرض الصورة والتراكب في خطوة واحدة. ومن خلال القيام بذلك، فإنك تعرض المحتوى على سطح الشاشة مرة واحدة فقط لكل إطار إدخال تمت معالجته. يمكنك الاطّلاع على previewOverlayView و MLKDetectionOverlayView الفئات في نموذج تطبيق العرض كمثال.

الخطوات التالية