التعرّف على النص في "صور Google" باستخدام تعلُّم الآلة في Firebase على نظام التشغيل iOS

يمكنك استخدام Firebase ML للتعرّف على النص في الصور. تتضمّن Firebase ML واجهة برمجة تطبيقات مخصّصة للأغراض العامة مناسبة للتعرّف على النص في الصور، مثل نص لافتة شارع، وواجهة برمجة تطبيقات محسّنة للتعرّف على نص المستندات.

قبل البدء

    إذا لم يسبق لك إضافة Firebase إلى تطبيقك، يمكنك إجراء ذلك باتّباع الخطوات الواردة في دليل البدء.

    استخدِم Swift Package Manager لتثبيت تبعيات Firebase وإدارتها.

    1. في Xcode، مع فتح مشروع تطبيقك، انتقِل إلى ملف > إضافة حِزم.
    2. أضِف مستودع حزمة تطوير البرامج (SDK) لمنصّات Apple من Firebase عندما يُطلب منك ذلك:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. اختَر مكتبة Firebase ML.
    5. أضِف العلامة -ObjC إلى قسم رموز ربط أخرى في إعدادات الإنشاء الخاصة بالهدف.
    6. عند الانتهاء، سيبدأ Xcode تلقائيًا في حلّ ملفاتك المضمّنة وتنزيلها في الخلفية.

    بعد ذلك، عليك إجراء بعض الإعدادات داخل التطبيق:

    1. في تطبيقك، استورِد Firebase:

      Swift

      import FirebaseMLModelDownloader

      Objective-C

      @import FirebaseMLModelDownloader;
  1. إذا لم يسبق لك تفعيل واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية لمشروعك، عليك إجراء ذلك الآن:

    1. افتح Firebase ML صفحة "واجهات برمجة التطبيقات" في وحدة تحكّم Firebase.
    2. إذا لم تكن قد أجريت ترقية لمشروعك إلى خطة أسعار Blaze، انقر على ترقية لإجراء ذلك. (لن يُطلب منك إجراء الترقية إلا إذا كان مشروعك غير مُدرَج في خطة Blaze).

      يمكن للمشاريع على مستوى Blaze فقط استخدام واجهات برمجة التطبيقات المستندة إلى Cloud.

    3. إذا لم تكن واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية مفعّلة، انقر على تفعيل واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية.

أنت الآن جاهز لبدء التعرّف على النص في الصور.

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

  • لكي تتمكّن ميزة Firebase ML من التعرّف على النص بدقة، يجب أن تحتوي صور الإدخال على نص يمثّله عدد كافٍ من بيانات البكسل. من الأفضل أن يكون حجم كل حرف في النص اللاتيني 16×16 بكسل على الأقل. بالنسبة إلى النص باللغة الصينية واليابانية والكورية، يجب أن يكون حجم كل حرف 24 × 24 بكسل. بالنسبة إلى جميع اللغات، لا تُحقّق زيادة حجم الأحرف عن 24×24 بكسل أي فائدة من حيث الدقة.

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

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


التعرّف على النص في الصور

للتعرّف على النص في صورة، شغِّل معرّف النصوص كما هو موضّح أدناه.

1. تشغيل أداة التعرّف على النص

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

  1. يمكنك الحصول على مثيل من VisionTextRecognizer من خلال الاتصال cloudTextRecognizer:

    Swift

    let vision = Vision.vision()
    let textRecognizer = vision.cloudTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudTextRecognizer(options: options)

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudTextRecognizerOptions *options =
            [[FIRVisionCloudTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizerWithOptions:options];
  2. للاتصال بخدمة Cloud Vision، يجب تنسيق الصورة كسلسلة مُرمّزة بترميز base64. لمعالجة UIImage:

    Swift

    guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return }
    let base64encodedImage = imageData.base64EncodedString()

    Objective-C

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. بعد ذلك، نقْل الصورة إلى طريقة process(_:completion:):

    Swift

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

    Objective-C

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

2- استخراج نص من مجموعات النصوص التي تم التعرّف عليها

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

يمثّل كل VisionTextBlock كتلة مستطيلة من النص، والتي تحتوي على صفر أو أكثر من عناصر VisionTextLine. يحتوي كل عنصر VisionTextLine على عنصر VisionTextElement واحد أو أكثر، والذي يمثّل الكلمات والكيانات المشابهة للكلمات (التواريخ والأرقام وما إلى ذلك).

لكل عنصر من عناصر VisionTextBlock وVisionTextLine وVisionTextElement، يمكنك الحصول على النص الذي تم التعرّف عليه في المنطقة والإحداثيات الحدودية للمنطقة.

على سبيل المثال:

Swift

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

Objective-C

NSString *resultText = result.text;
for (FIRVisionTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages;
  NSArray<NSValue *> *blockCornerPoints = block.cornerPoints;
  CGRect blockFrame = block.frame;
  for (FIRVisionTextLine *line in block.lines) {
    NSString *lineText = line.text;
    NSNumber *lineConfidence = line.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages;
    NSArray<NSValue *> *lineCornerPoints = line.cornerPoints;
    CGRect lineFrame = line.frame;
    for (FIRVisionTextElement *element in line.elements) {
      NSString *elementText = element.text;
      NSNumber *elementConfidence = element.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *elementLanguages = element.recognizedLanguages;
      NSArray<NSValue *> *elementCornerPoints = element.cornerPoints;
      CGRect elementFrame = element.frame;
    }
  }
}

الخطوات التالية


التعرّف على النص في صور المستندات

للتعرّف على نص مستند، عليك ضبط ملف معالجة محتوى المستند وتشغيله كما هو موضّح أدناه.

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

لاستخدام واجهة برمجة التطبيقات لميزة التعرّف على نص المستندات:

1. تشغيل أداة التعرّف على النص

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

  1. يمكنك الحصول على مثيل من VisionDocumentTextRecognizer من خلال الاتصال cloudDocumentTextRecognizer:

    Swift

    let vision = Vision.vision()
    let textRecognizer = vision.cloudDocumentTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudDocumentTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudDocumentTextRecognizer(options: options)

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudDocumentTextRecognizerOptions *options =
            [[FIRVisionCloudDocumentTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizerWithOptions:options];
  2. للاتصال بخدمة Cloud Vision، يجب تنسيق الصورة كسلسلة مُرمّزة بترميز base64. لمعالجة UIImage:

    Swift

    guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return }
    let base64encodedImage = imageData.base64EncodedString()

    Objective-C

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. بعد ذلك، نقْل الصورة إلى طريقة process(_:completion:):

    Swift

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

    Objective-C

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

2- استخراج نص من مجموعات النصوص التي تم التعرّف عليها

إذا نجحت عملية التعرّف على النص، سيتم عرض عنصر VisionDocumentText. يحتوي عنصر VisionDocumentText على النص الكامل الذي تم التعرّف عليه في الصورة وتدرّج هرمي للعناصر التي تعكس بنية المستند الذي تم التعرّف عليه:

بالنسبة إلى كل عنصر من عناصر VisionDocumentTextBlock وVisionDocumentTextParagraph وVisionDocumentTextWord وVisionDocumentTextSymbol، يمكنك الحصول على النص الذي تم التعرّف عليه في المنطقة والإحداثيات الحدودية للمنطقة.

على سبيل المثال:

Swift

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockConfidence = block.confidence
    let blockRecognizedLanguages = block.recognizedLanguages
    let blockBreak = block.recognizedBreak
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for paragraph in block.paragraphs {
        let paragraphText = paragraph.text
        let paragraphConfidence = paragraph.confidence
        let paragraphRecognizedLanguages = paragraph.recognizedLanguages
        let paragraphBreak = paragraph.recognizedBreak
        let paragraphCornerPoints = paragraph.cornerPoints
        let paragraphFrame = paragraph.frame
        for word in paragraph.words {
            let wordText = word.text
            let wordConfidence = word.confidence
            let wordRecognizedLanguages = word.recognizedLanguages
            let wordBreak = word.recognizedBreak
            let wordCornerPoints = word.cornerPoints
            let wordFrame = word.frame
            for symbol in word.symbols {
                let symbolText = symbol.text
                let symbolConfidence = symbol.confidence
                let symbolRecognizedLanguages = symbol.recognizedLanguages
                let symbolBreak = symbol.recognizedBreak
                let symbolCornerPoints = symbol.cornerPoints
                let symbolFrame = symbol.frame
            }
        }
    }
}

Objective-C

NSString *resultText = result.text;
for (FIRVisionDocumentTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockRecognizedLanguages = block.recognizedLanguages;
  FIRVisionTextRecognizedBreak *blockBreak = block.recognizedBreak;
  CGRect blockFrame = block.frame;
  for (FIRVisionDocumentTextParagraph *paragraph in block.paragraphs) {
    NSString *paragraphText = paragraph.text;
    NSNumber *paragraphConfidence = paragraph.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *paragraphRecognizedLanguages = paragraph.recognizedLanguages;
    FIRVisionTextRecognizedBreak *paragraphBreak = paragraph.recognizedBreak;
    CGRect paragraphFrame = paragraph.frame;
    for (FIRVisionDocumentTextWord *word in paragraph.words) {
      NSString *wordText = word.text;
      NSNumber *wordConfidence = word.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *wordRecognizedLanguages = word.recognizedLanguages;
      FIRVisionTextRecognizedBreak *wordBreak = word.recognizedBreak;
      CGRect wordFrame = word.frame;
      for (FIRVisionDocumentTextSymbol *symbol in word.symbols) {
        NSString *symbolText = symbol.text;
        NSNumber *symbolConfidence = symbol.confidence;
        NSArray<FIRVisionTextRecognizedLanguage *> *symbolRecognizedLanguages = symbol.recognizedLanguages;
        FIRVisionTextRecognizedBreak *symbolBreak = symbol.recognizedBreak;
        CGRect symbolFrame = symbol.frame;
      }
    }
  }
}

الخطوات التالية