شما میتوانید Firebase ML برای تشخیص متن در تصاویر استفاده کنید. Firebase ML هم یک API عمومی مناسب برای تشخیص متن در تصاویر، مانند متن یک تابلوی خیابان، و هم یک API بهینه شده برای تشخیص متن اسناد دارد.
قبل از اینکه شروع کنی
- اگر هنوز Firebase را به برنامه خود اضافه نکردهاید، با دنبال کردن مراحل موجود در راهنمای شروع به کار ، این کار را انجام دهید.
- در Xcode، با باز کردن پروژه برنامه خود، به File > Add Packages بروید.
- وقتی از شما خواسته شد، مخزن SDK پلتفرمهای اپل فایربیس را اضافه کنید:
- کتابخانه Firebase ML را انتخاب کنید.
- پرچم
-ObjCرا به بخش Other Linker Flags در تنظیمات ساخت هدف خود اضافه کنید. - پس از اتمام، Xcode به طور خودکار شروع به حل و دانلود وابستگیهای شما در پسزمینه میکند.
- در برنامه خود، Firebase را وارد کنید:
سویفت
import FirebaseMLModelDownloader
هدف-سی
@import FirebaseMLModelDownloader;
اگر هنوز APIهای مبتنی بر ابر را برای پروژه خود فعال نکردهاید، اکنون این کار را انجام دهید:
- صفحه Firebase ML APIs را در کنسول Firebase باز کنید.
اگر هنوز پروژه خود را به طرح قیمتگذاری پرداخت در محل Blaze ارتقا ندادهاید، برای انجام این کار روی ارتقا کلیک کنید. (فقط در صورتی که پروژه شما در طرح قیمتگذاری Blaze نباشد، از شما خواسته میشود که آن را ارتقا دهید.)
فقط پروژههای موجود در طرح قیمتگذاری Blaze میتوانند از APIهای مبتنی بر ابر استفاده کنند.
- اگر APIهای مبتنی بر ابر از قبل فعال نشدهاند، روی فعال کردن APIهای مبتنی بر ابر کلیک کنید.
برای نصب و مدیریت وابستگیهای Firebase از Swift Package Manager استفاده کنید.
https://github.com/firebase/firebase-ios-sdk.git
در مرحله بعد، برخی تنظیمات درون برنامهای را انجام دهید:
حالا شما آمادهاید تا متن را در تصاویر تشخیص دهید.
دستورالعملهای تصویر ورودی
برای اینکه Firebase ML متن را به طور دقیق تشخیص دهد، تصاویر ورودی باید حاوی متنی باشند که با دادههای پیکسلی کافی نمایش داده میشود. در حالت ایدهآل، برای متن لاتین، هر کاراکتر باید حداقل 16x16 پیکسل باشد. برای متن چینی، ژاپنی و کرهای، هر کاراکتر باید 24x24 پیکسل باشد. برای همه زبانها، معمولاً هیچ مزیتی برای دقت کاراکترها وجود ندارد که بزرگتر از 24x24 پیکسل باشند.
بنابراین، برای مثال، یک تصویر با ابعاد ۶۴۰x۴۸۰ پیکسل ممکن است برای اسکن یک کارت ویزیت که تمام عرض تصویر را اشغال میکند، مناسب باشد. برای اسکن یک سند چاپ شده روی کاغذ با اندازه Letter، ممکن است به یک تصویر با ابعاد ۷۲۰x۱۲۸۰ پیکسل نیاز باشد.
فوکوس ضعیف تصویر میتواند به دقت تشخیص متن آسیب برساند. اگر نتایج قابل قبولی دریافت نمیکنید، سعی کنید از کاربر بخواهید که تصویر را دوباره ثبت کند.
تشخیص متن در تصاویر
برای تشخیص متن در یک تصویر، تشخیصدهنده متن را همانطور که در زیر توضیح داده شده است، اجرا کنید.
۱. تشخیصدهنده متن را اجرا کنید
تصویر را به عنوان یکUIImage یا یک CMSampleBufferRef به متد process(_:completion:) از VisionTextRecognizer ارسال کنید:- با فراخوانی
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];
- برای فراخوانی 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];
- سپس، تصویر را به متد
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 تشخیص متن سند، که در زیر شرح داده شده است، رابطی را ارائه میدهد که برای کار با تصاویر اسناد مناسبتر است. با این حال، اگر رابط ارائه شده توسط API متن پراکنده را ترجیح میدهید، میتوانید با پیکربندی تشخیصدهنده متن ابری برای استفاده از مدل متن متراکم ، از آن برای اسکن اسناد استفاده کنید.
برای استفاده از API تشخیص متن سند:
۱. تشخیصدهنده متن را اجرا کنید
تصویر را به عنوان یکUIImage یا یک CMSampleBufferRef به متد process(_:completion:) از VisionDocumentTextRecognizer ارسال کنید:- با فراخوانی
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];
- برای فراخوانی 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];
- سپس، تصویر را به متد
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; } } } }
مراحل بعدی
- قبل از اینکه برنامهای را که از API ابری استفاده میکند، به محیط عملیاتی منتقل کنید، باید اقدامات دیگری را برای جلوگیری و کاهش تأثیر دسترسی غیرمجاز به API انجام دهید.