يمكنك استخدام أدوات تعلّم الآلة لتصنيف العناصر التي تم التعرّف عليها في صورة. يشمل النموذج التلقائي المتوفّر في "حزمة تعلّم الآلة" أكثر من 400 تصنيف مختلف.
تجربة السمات والبيانات
- جرِّب نموذج التطبيق للاطّلاع على مثال حول استخدام واجهة برمجة التطبيقات هذه.
قبل البدء
- أدرِج مجموعات تعلّم الآلة التالية في Podfile:
pod 'GoogleMLKit/ImageLabeling', '3.2.0'
- بعد تثبيت أو تحديث مجموعات Pods لمشروعك، افتح مشروع Xcode باستخدام
.xcworkspace
. تتوفّر هذه الأداة في الإصدار 12.4 من Xcode أو إصدار أحدث.
أنت الآن جاهز لتسمية الصور.
1- تحضير صورة الإدخال
أنشِئ عنصر 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];
2. ضبط أداة تصنيف الصور وتشغيلها
لتصنيف الكائنات في صورة، مرِّر الكائنVisionImage
إلى طريقة processImage()
في ImageLabeler
.
- أولاً، احصل على مثيل لـ
ImageLabeler
.
Swift
let labeler = ImageLabeler.imageLabeler() // Or, to set the minimum confidence required: // let options = ImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = ImageLabeler.imageLabeler(options: options)
Objective-C
MLKImageLabeler *labeler = [MLKImageLabeler imageLabeler]; // Or, to set the minimum confidence required: // MLKImageLabelerOptions *options = // [[MLKImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // MLKImageLabeler *labeler = // [MLKImageLabeler imageLabelerWithOptions:options];
- بعد ذلك، أدخِل الصورة إلى طريقة
processImage()
:
Swift
labeler.process(image) { labels, error in guard error == nil, let labels = labels else { return } // Task succeeded. // ... }
Objective-C
[labeler processImage:image completion:^(NSArray*_Nullable labels, NSError *_Nullable error) { if (error != nil) { return; } // Task succeeded. // ... }];
3. الحصول على معلومات عن العناصر المصنّفة
إذا نجح تصنيف الصور، سيستلم معالج الإكمال مجموعة من عناصر ImageLabel
. يمثل كل كائن ImageLabel
شيئًا
تم تصنيفه في الصورة. يتيح النموذج الأساسي استخدام أكثر من 400 تصنيف مختلف.
يمكنك الحصول على الوصف النصي لكل تصنيف والفهرس بين جميع التصنيفات المتوافقة مع النموذج ونتيجة الثقة للمطابقة. مثال:
Swift
for label in labels { let labelText = label.text let confidence = label.confidence let index = label.index }
Objective-C
for (MLKImageLabel *label in labels) { NSString *labelText = label.text; float confidence = label.confidence; NSInteger index = label.index; }
نصائح لتحسين الأداء في الوقت الفعلي
إذا أردت تصنيف الصور في تطبيق في الوقت الفعلي، اتّبِع هذه الإرشادات لتحقيق أفضل معدلات عرض الإطارات:
- لمعالجة إطارات الفيديو، استخدِم واجهة برمجة التطبيقات المتزامنة
results(in:)
الخاصة بتصنيف الصور. ويمكنك استدعاء هذه الطريقة من وظيفةcaptureOutput(_, didOutput:from:)
فيAVCaptureVideoDataOutputSampleBufferDelegate
للحصول على نتائج متزامنة من إطار الفيديو المحدّد. احتفِظ بميزةalwaysDiscardsLateVideoFrames
الخاصة بـAVCaptureVideoDataOutput
كـtrue
للتحكّم في المكالمات الواردة إلى تصنيف الصور. في حال توفّر إطار فيديو جديد أثناء تشغيل مُصنِّف الصور، سيتم إسقاطه. - إذا كنت تستخدم مُخرجات تصنيف الصور لتركيب رسومات على الصورة التي تم إدخالها، احصل أولاً على النتيجة من ML Kit، ثم اعرض الصورة والتراكب في خطوة واحدة. بإجراء ذلك، يتم عرضك على سطح الشاشة مرة واحدة فقط لكل إطار إدخال تمت معالجته. للاطّلاع على مثال، يمكن الاطّلاع على updatePreviewOverlayViewWithLastFrame في نموذج البدء السريع في ML Kit.