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

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

قبل البدء

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

    يمكنك استخدام "مدير حزم Swift" لتثبيت اعتماديات Firebase وإدارتها.

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

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

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

      Swift

      import FirebaseMLModelDownloader

      Objective-C

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

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

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

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

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

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

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

    لذلك، على سبيل المثال، يمكن استخدام صورة بحجم 640×480 لإجراء مسح ضوئي لبطاقة نشاط تجاري تشغل بالعرض الكامل للصورة. لإجراء مسح ضوئي لمستند مطبوع على ورق بحجم حروف، قد يلزم صورة بحجم 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;
      }
    }
  }
}

الخطوات اللاحقة