توفّر مجموعة أدوات تعلّم الآلة حزمة تطوير برامج (SDK) محسَّنة للكشف عن الوضعية.
اسم حزمة SDK | PoseDetection | PoseDetectionAccurate |
---|---|---|
التنفيذ | يتم ربط مواد عرض أداة الرصد الأساسية بتطبيقك بشكل ثابت في وقت الإصدار. | يتم ربط مواد العرض الخاصة بأداة الرصد الدقيقة بشكل ثابت بتطبيقك في وقت الإصدار. |
حجم التطبيق | الحد الأقصى لحجم الملف هو 29.6 ميغابايت. | الحد الأقصى لحجم الملف هو 33.2 ميغابايت. |
عروض أداء | iPhone X: 45 لقطة في الثانية تقريبًا | iPhone X: 29 لقطة في الثانية تقريبًا |
التجربة الآن
- يمكنك تجربة نموذج التطبيق للاطّلاع على مثال على استخدام واجهة برمجة التطبيقات هذه.
قبل البدء
تضمين مجموعات 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'
بعد تثبيت مجموعات مشروعك المتسلسلة أو تحديثها، افتح مشروع 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
إلى معالج الإكمال أو عرض المصفوفة،
بناءً على ما إذا كنت قد استدعيت الطريقة غير المتزامنة أو المتزامنة.
إذا لم يكن الشخص داخل الصورة بشكل كامل، فإن النموذج يخصص إحداثيات المعالم المفقودة خارج الإطار ويمنحها قيم InFrameConflence منخفضة.
وإذا لم يتم رصد أي شخص، تكون الصفيفة فارغة.
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:)
الخاصة بأداة الرصد. استدعِ هذه الطريقة من دالة captureOutput(_, didOutput:from:) الخاصة بـ AVCaptureVideoDataOutputSampleBufferDelegate للحصول على النتائج من إطار الفيديو المعني بشكل متزامن. احتفظ بـ alwaysDiscardsLateVideoFrames التابع لـ AVCaptureVideoDataOutput كـ "صحيح" لتقييد المكالمات الواردة إلى أداة الرصد.) إذا أصبح إطار فيديو جديد متاحًا أثناء تشغيل أداة الرصد، سيتم تجاهلها. - في حال استخدام مخرجات أداة الكشف لتركيب الرسومات على الصورة المدخلة، يمكنك أولاً الحصول على النتيجة من ML Kit، ثم عرض الصورة والتراكب في خطوة واحدة. ومن خلال القيام بذلك، فإنك تعرض المحتوى على سطح الشاشة مرة واحدة فقط لكل إطار إدخال تمت معالجته. للحصول على مثال، يمكنك الاطّلاع على الفئتين previewOverlayView وMLKDetectionOverlayView في نموذج تطبيق العرض
الخطوات التالية
- لمعرفة كيفية استخدام وضعية المعالم من أجل تصنيف الوضعيات، يمكنك الاطّلاع على نصائح تصنيف الوضعية.
- يمكنك الاطّلاع على نموذج البدء السريع في حزمة تعلّم الآلة على GitHub للاطّلاع على مثال لواجهة برمجة التطبيقات هذه قيد الاستخدام.