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

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

يمكنك استخدام مجموعة أدوات تعلّم الآلة لتصنيف العناصر التي تم التعرّف عليها في صورة. ويدعم النموذج الافتراضي المقدم مع ML Kit أكثر من 400 تصنيف مختلف.

تجربة السمات والبيانات

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

قبل البدء

  1. أدرِج لوحات ML Kit التالية في Podfile:
    pod 'GoogleMLKit/ImageLabeling', '3.2.0'
    
  2. بعد تثبيت لوحات إصدار المشروع أو تعديلها، افتح مشروع Xcode باستخدام .xcworkspace. يتم دعم ML Kit في Xcode الإصدار 12.4 أو أعلى.

أنت الآن مستعد لتصنيف الصور.

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 إلى طريقة ImageLabeler processImage().

  1. الْأَوَّلْ، الْحُصُولْ عَلَى نُسْخَة مِنْ 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];
  1. ثم مرِّر الصورة إلى الطريقة 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.