تشخیص متن در تصاویر با Firebase ML در iOS

می توانید از Firebase ML برای تشخیص متن در تصاویر استفاده کنید. Firebase ML هم یک API همه منظوره مناسب برای تشخیص متن در تصاویر، مانند متن تابلوهای خیابان دارد و هم یک API بهینه شده برای تشخیص متن اسناد.

قبل از شروع

    اگر قبلاً Firebase را به برنامه خود اضافه نکرده اید، این کار را با دنبال کردن مراحل راهنمای شروع کار انجام دهید.

    برای نصب و مدیریت وابستگی های Firebase از Swift Package Manager استفاده کنید.

    1. در Xcode، با باز بودن پروژه برنامه، به File > Add Packages بروید.
    2. هنگامی که از شما خواسته شد، مخزن SDK پلتفرم های Apple Firebase را اضافه کنید:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. کتابخانه Firebase ML را انتخاب کنید.
    5. پرچم -ObjC را به بخش Other Linker Flags تنظیمات ساخت هدف خود اضافه کنید.
    6. پس از اتمام، Xcode به طور خودکار شروع به حل و دانلود وابستگی های شما در پس زمینه می کند.

    در مرحله بعد، تنظیمات درون برنامه ای را انجام دهید:

    1. در برنامه خود، Firebase را وارد کنید:

      سویفت

      import FirebaseMLModelDownloader

      هدف-C

      @import FirebaseMLModelDownloader;
  1. اگر قبلاً API های مبتنی بر Cloud را برای پروژه خود فعال نکرده اید، اکنون این کار را انجام دهید:

    1. صفحه Firebase ML APIs کنسول Firebase را باز کنید.
    2. اگر قبلاً پروژه خود را به طرح قیمت گذاری Blaze ارتقا نداده اید، برای انجام این کار روی Upgrade کلیک کنید. (فقط اگر پروژه شما در طرح Blaze نباشد، از شما خواسته می شود که ارتقا دهید.)

      فقط پروژه های سطح Blaze می توانند از API های مبتنی بر ابر استفاده کنند.

    3. اگر APIهای مبتنی بر Cloud قبلاً فعال نشده‌اند، روی Enable Cloud-based APIs کلیک کنید.

اکنون شما آماده شروع به تشخیص متن در تصاویر هستید.

دستورالعمل های تصویر ورودی

  • برای اینکه Firebase ML بتواند متن را به طور دقیق تشخیص دهد، تصاویر ورودی باید حاوی متنی باشند که با داده پیکسلی کافی نشان داده شود. در حالت ایده آل، برای متن لاتین، هر کاراکتر باید حداقل 16x16 پیکسل باشد. برای متن چینی، ژاپنی و کره ای، هر کاراکتر باید ۲۴×۲۴ پیکسل باشد. برای همه زبان ها، معمولاً هیچ مزیتی برای دقت بزرگتر از 24x24 پیکسل وجود ندارد.

    بنابراین، برای مثال، یک تصویر 640x480 ممکن است برای اسکن کارت ویزیتی که تمام عرض تصویر را اشغال می کند، به خوبی کار کند. برای اسکن یک سند چاپ شده روی کاغذ با اندازه حرف، ممکن است به یک تصویر 720x1280 پیکسل نیاز باشد.

  • فوکوس ضعیف تصویر می تواند به دقت تشخیص متن آسیب برساند. اگر نتایج قابل قبولی دریافت نکردید، از کاربر بخواهید که تصویر را دوباره بگیرد.


تشخیص متن در تصاویر

برای تشخیص متن در یک تصویر، شناسه متن را مطابق زیر اجرا کنید.

1. شناسه متن را اجرا کنید

تصویر را به عنوان UIImage یا CMSampleBufferRef به روش VisionTextRecognizer process(_:completion:) منتقل کنید:

  1. با فراخوانی cloudTextRecognizer یک نمونه از VisionTextRecognizer دریافت کنید:

    سویفت

    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)

    هدف-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 :

    سویفت

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

    هدف-C

    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
    }

    هدف-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 ، می توانید متن را در منطقه و مختصات مرزی منطقه تشخیص دهید.

به عنوان مثال:

سویفت

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

هدف-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;
    }
  }
}

مراحل بعدی


تشخیص متن در تصاویر اسناد

برای تشخیص متن یک سند، شناساگر متن سند را پیکربندی و اجرا کنید که در زیر توضیح داده شده است.

API تشخیص متن سند، که در زیر توضیح داده شده است، رابطی را ارائه می دهد که برای کار با تصاویر اسناد راحت تر است. با این حال، اگر رابط ارائه شده توسط API متن پراکنده را ترجیح می دهید، می توانید به جای آن برای اسکن اسناد با پیکربندی شناساگر متن ابری برای استفاده از مدل متن متراکم از آن استفاده کنید.

برای استفاده از API تشخیص متن سند:

1. شناسه متن را اجرا کنید

تصویر را به عنوان UIImage یا CMSampleBufferRef به روش VisionDocumentTextRecognizer process(_:completion:) منتقل کنید:

  1. با فراخوانی cloudDocumentTextRecognizer یک نمونه از VisionDocumentTextRecognizer دریافت کنید:

    سویفت

    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)

    هدف-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 :

    سویفت

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

    هدف-C

    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
    }

    هدف-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 ، می‌توانید متن را در منطقه و مختصات مرزی منطقه شناسایی کنید.

به عنوان مثال:

سویفت

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

هدف-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;
      }
    }
  }
}

مراحل بعدی