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

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

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

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

قبل البدء

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

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

إنشاء مثيل TextRecognizer من خلال الاتصال +textRecognizer:

Swift

let textRecognizer = TextRecognizer.textRecognizer()
      

Objective-C

MLKTextRecognizer *textRecognizer = [MLKTextRecognizer textRecognizer];
      

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

تمرير الصورة بتنسيق UIImage أو CMSampleBufferRef إلى طريقة process(_:completion:) TextRecognizer&39:

يمكنك إنشاء كائن 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;
    }
  }
}

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

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

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

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

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

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

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