Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

التعرف على النص في الصور باستخدام Firebase ML على iOS

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

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

قبل ان تبدأ

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

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

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

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

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

      سويفت

      import FirebaseMLModelDownloader

      ج موضوعية

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

    1. افتح صفحة Firebase ML APIs بوحدة تحكم Firebase.
    2. إذا لم تكن قد قمت بالفعل بترقية مشروعك إلى خطة تسعير Blaze ، فانقر فوق ترقية للقيام بذلك. (ستتم مطالبتك بالترقية فقط إذا لم يكن مشروعك مدرجًا في خطة Blaze.)

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

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

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

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

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

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

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


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

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

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

قم بتمرير الصورة كصورة UIImage أو CMSampleBufferRef إلى عملية VisionTextRecognizer process(_:completion:) :

  1. احصل على مثيل من VisionTextRecognizer عن طريق استدعاء cloudTextRecognizer :

    سويفت

    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)
    

    ج موضوعية

    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 :

    سويفت

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

    ج موضوعية

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

    سويفت

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

    ج موضوعية

    [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 ، يمكنك التعرف على النص في المنطقة والإحداثيات المحيطة بالمنطقة.

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

سويفت

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
        }
    }
}

ج موضوعية

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 إلى عملية VisionDocumentTextRecognizer process(_:completion:) :

  1. احصل على مثيل لـ VisionDocumentTextRecognizer عن طريق استدعاء cloudDocumentTextRecognizer :

    سويفت

    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)
    

    ج موضوعية

    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 :

    سويفت

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

    ج موضوعية

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

    سويفت

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

    ج موضوعية

    [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 ، يمكنك التعرف على النص في المنطقة والإحداثيات المحيطة بالمنطقة.

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

سويفت

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
            }
        }
    }
}

ج موضوعية

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;
      }
    }
  }
}

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