يمكنك استخدام حزمة تعلّم الآلة لتصنيف العناصر التي يتم التعرّف عليها في صورة. يتناسب النموذج الافتراضي المقدم مع تتيح حزمة تعلّم الآلة استخدام أكثر من 400 تصنيف مختلف.
جرّبه الآن
- يمكنك تجربة نموذج التطبيق من أجل يمكنك الاطّلاع على مثال حول استخدام واجهة برمجة التطبيقات هذه.
قبل البدء
- تضمين مجموعات ML Kit التالية في Podfile:
pod 'GoogleMLKit/ImageLabeling', '15.5.0'
- بعد تثبيت لوحات مشروعك أو تحديثها، افتح مشروع 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:)
الخاصة بأداة تصنيف الصور. اتصل لهذه الطريقة منAVCaptureVideoDataOutputSampleBufferDelegate
captureOutput(_, didOutput:from:)
للحصول على النتائج من الفيديو المحدّد بشكل متزامن الإطار. إبقاء جهازAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
كـtrue
لمنع المكالمات الواردة إلى مصنِّف الصور. إذا كانت تجربة يصبح إطار الفيديو متاحًا أثناء تشغيل أداة تصنيف الصور، وسيتم إسقاطه. - إذا كنت تستخدم مخرجات أداة تصنيف الصور لتراكب الرسومات على الصورة المدخلة، والحصول أولاً على النتيجة من ML Kit، ثم عرض الصورة وتراكبها في خطوة واحدة. ومن خلال القيام بذلك، يمكنك العرض على سطح الشاشة مرة واحدة فقط لكل إطار إدخال تمت معالجته. راجع updatePreviewOverlayViewWithLastFrame في عينة البدء السريع لأدوات تعلُّم الآلة كمثال.