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

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

قبل از اینکه شروع کنی

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

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

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

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

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

      سویفت

      import FirebaseMLModelDownloader

      هدف-سی

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

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

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

    3. اگر APIهای مبتنی بر ابر از قبل فعال نشده‌اند، روی فعال کردن APIهای مبتنی بر ابر کلیک کنید.

حالا شما آماده‌اید تا متن را در تصاویر تشخیص دهید.

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

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

    بنابراین، برای مثال، یک تصویر با ابعاد ۶۴۰x۴۸۰ پیکسل ممکن است برای اسکن یک کارت ویزیت که تمام عرض تصویر را اشغال می‌کند، مناسب باشد. برای اسکن یک سند چاپ شده روی کاغذ با اندازه Letter، ممکن است به یک تصویر با ابعاد ۷۲۰x۱۲۸۰ پیکسل نیاز باشد.

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


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

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

۱. تشخیص‌دهنده متن را اجرا کنید

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

  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)

    هدف-سی

    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()

    هدف-سی

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

۲. استخراج متن از بلوک‌های متن شناخته‌شده

اگر عملیات تشخیص متن با موفقیت انجام شود، یک شیء 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;
    }
  }
}

مراحل بعدی


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

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

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

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

۱. تشخیص‌دهنده متن را اجرا کنید

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

  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)

    هدف-سی

    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()

    هدف-سی

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

۲. استخراج متن از بلوک‌های متن شناخته‌شده

اگر عملیات تشخیص متن با موفقیت انجام شود، یک شیء 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;
      }
    }
  }
}

مراحل بعدی