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

يمكنك استخدام مجموعة أدوات تعلّم الآلة للتعرّف على النص في الصور أو الفيديوهات، مثل نص لافتة في الشارع. الخصائص الرئيسية لهذه الميزة هي:

واجهة برمجة تطبيقات التعرف على النص
الوصفالتعرّف على النص المكتوب بأحرف لاتينية في الصور أو الفيديوهات
اسم حزمة تطوير البرامج (SDK)GoogleMLKit/TextRecognition (version 2.2.0)
التنفيذترتبط مواد العرض بتطبيقك بشكل ثابت في وقت الإنشاء.
تأثير حجم التطبيقحوالي 20 ميغابايت
الأداءالوقت الفعلي على معظم الأجهزة.

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

قبل البدء

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

1- إنشاء مثيل لـ TextRecognizer

إنشاء مثيل لـ TextRecognizer من خلال استدعاء +textRecognizer:

Swift

let textRecognizer = TextRecognizer.textRecognizer()
      

Objective-C

MLKTextRecognizer *textRecognizer = [MLKTextRecognizer textRecognizer];
      

2. إعداد صورة الإدخال

تمرير الصورة كـ UIImage أو CMSampleBufferRef إلى طريقة process(_:completion:) TextRecognizer:

يمكنك إنشاء كائن 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- معالجة الصورة

ثم مرِّر الصورة إلى الطريقة process(_:completion:):

Swift

textRecognizer.process(visionImage) { result, error in
  guard error == nil, let result = result else {
    // Error handling
    return
  }
  // Recognized text
}

Objective-C

[textRecognizer processImage:image
                  completion:^(MLKText *_Nullable result,
                               NSError *_Nullable error) {
  if (error != nil || result == nil) {
    // Error handling
    return;
  }
  // Recognized text
}];

4. استخراج النص من كتلة نص معروف

إذا نجحت عملية التعرّف على النص، سيتم عرض كائن Text. يحتوي كائن Text على النص الكامل الذي يتم التعرّف عليه في الصورة ولا يتضمّن أي عناصر TextBlock أو أكثر.

يمثل كل رمز TextBlock جزءًا مستطيلاً من النص يحتوي على صفر أو أكثر من عناصر TextLine. لا يحتوي كل كائن TextLine على أي كائنات TextElement أو أكثر، تمثل الكلمات والكيانات الشبيهة بالكلمات، مثل التواريخ والأرقام.

بالنسبة إلى كل كائن TextBlock وTextLine وTextElement، يمكنك معرفة النص في المنطقة والإحداثيات المحيطة للمنطقة.

مثلاً:

Swift

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockLanguages = block.recognizedLanguages
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for line in block.lines {
        let lineText = line.text
        let lineLanguages = line.recognizedLanguages
        let lineCornerPoints = line.cornerPoints
        let lineFrame = line.frame
        for element in line.elements {
            let elementText = element.text
            let elementCornerPoints = element.cornerPoints
            let elementFrame = element.frame
        }
    }
}

Objective-C

NSString *resultText = result.text;
for (MLKTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSArray<MLKTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages;
  NSArray<NSValue *> *blockCornerPoints = block.cornerPoints;
  CGRect blockFrame = block.frame;
  for (MLKTextLine *line in block.lines) {
    NSString *lineText = line.text;
    NSArray<MLKTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages;
    NSArray<NSValue *> *lineCornerPoints = line.cornerPoints;
    CGRect lineFrame = line.frame;
    for (MLKTextElement *element in line.elements) {
      NSString *elementText = element.text;
      NSArray<NSValue *> *elementCornerPoints = element.cornerPoints;
      CGRect elementFrame = element.frame;
    }
  }
}

إرشادات إدخال الصور

  • حتى تتمكن مجموعة تعلّم الآلة من التعرّف على النص بدقة، يجب أن تحتوي صور الإدخال على نص يمثّله بيانات بكسل كافية. في الوضع المثالي، يجب ألا يقل حجم كل حرف عن 16×16 بكسل. ولا يستفيد عمومًا من دقة الدقة في ما يتعلّق بالأحرف الأكبر من 24×24 بكسل.

    على سبيل المثال، قد تعمل صورة بحجم 640×480 على نحو جيد عند مسح بطاقة نشاط تجاري تشغل العرض الكامل للصورة. لمسح مستند مطبوع على ورقة بحجم حرف، قد يلزم صورة 720×1280 بكسل.

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

  • إذا كنت تتعرف على النص في تطبيق في الوقت الفعلي، يجب أن تضع في الاعتبار الأبعاد العامة لصور الإدخال. ويمكن معالجة الصور الأصغر بسرعة أكبر. لتقليل وقت الاستجابة، تأكّد من أن النص يشغل أكبر قدر ممكن من الصورة، والتقط الصور بدقة أقل (مع مراعاة متطلبات الدقة المذكورة أعلاه). ولمزيد من المعلومات، يُرجى الاطّلاع على نصائح لتحسين الأداء.

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

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