يمكنك استخدام Firebase ML للتعرف على النص في الصور. يحتوي Firebase ML على واجهة برمجة تطبيقات للأغراض العامة مناسبة للتعرف على النص في الصور ، مثل نص لافتة الشارع وواجهة برمجة تطبيقات محسّنة للتعرف على نص المستندات.
قبل ان تبدأ
- إذا لم تكن قد أضفت Firebase بالفعل إلى تطبيقك ، فقم بذلك باتباع الخطوات الواردة في دليل البدء .
- في Xcode ، مع فتح مشروع التطبيق الخاص بك ، انتقل إلى ملف> إضافة حزم .
- عند المطالبة ، أضف مستودع SDK لأنظمة Apple الأساسية لـ Firebase:
- اختر مكتبة Firebase ML.
- عند الانتهاء ، سيبدأ Xcode تلقائيًا في حل وتنزيل التبعيات الخاصة بك في الخلفية.
- في تطبيقك ، استورد Firebase:
سويفت
import FirebaseMLModelDownloader
ج موضوعية
@import FirebaseMLModelDownloader;
إذا لم تكن قد قمت بالفعل بتمكين واجهات برمجة التطبيقات المستندة إلى السحابة لمشروعك ، فقم بذلك الآن:
- افتح صفحة Firebase ML APIs بوحدة تحكم Firebase.
إذا لم تكن قد قمت بالفعل بترقية مشروعك إلى خطة تسعير Blaze ، فانقر فوق ترقية للقيام بذلك. (ستتم مطالبتك بالترقية فقط إذا لم يكن مشروعك مدرجًا في خطة Blaze.)
يمكن فقط للمشاريع على مستوى Blaze استخدام واجهات برمجة التطبيقات المستندة إلى السحابة.
- إذا لم تكن واجهات برمجة التطبيقات المستندة إلى السحابة ممكّنة بالفعل ، فانقر فوق تمكين واجهات برمجة التطبيقات المستندة إلى السحابة .
استخدم Swift Package Manager لتثبيت وإدارة تبعيات Firebase.
https://github.com/firebase/firebase-ios-sdk
بعد ذلك ، قم بإجراء بعض الإعداد داخل التطبيق:
أنت الآن جاهز لبدء التعرف على النص في الصور.
إرشادات الصورة المدخلة
لكي يتعرف Firebase ML على النص بدقة ، يجب أن تحتوي الصور المدخلة على نص يتم تمثيله ببيانات بكسل كافية. من الناحية المثالية ، بالنسبة للنص اللاتيني ، يجب ألا يقل حجم كل حرف عن 16 × 16 بكسل. بالنسبة للنصوص الصينية واليابانية والكورية ، يجب أن يكون حجم كل حرف 24 × 24 بكسل. بالنسبة لجميع اللغات ، لا توجد ميزة دقة بشكل عام عندما تكون الأحرف أكبر من 24 × 24 بكسل.
لذلك ، على سبيل المثال ، قد تعمل صورة بحجم 640 × 480 بشكل جيد لمسح بطاقة عمل تشغل العرض الكامل للصورة. لمسح مستند مطبوع على ورق بحجم letter ، قد يلزم الحصول على صورة بدقة 720 × 1280 بكسل.
يمكن أن يؤدي التركيز الضعيف للصورة إلى الإضرار بدقة التعرف على النص. إذا لم تحصل على نتائج مقبولة ، فحاول مطالبة المستخدم بإعادة التقاط الصورة.
التعرف على النص في الصور
للتعرف على نص في صورة ، قم بتشغيل أداة التعرف على النص كما هو موضح أدناه.
1. قم بتشغيل أداة التعرف على النص
قم بتمرير الصورة كصورةUIImage
أو CMSampleBufferRef
إلى عملية VisionTextRecognizer
process(_:completion:)
:- احصل على مثيل من
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];
- من أجل استدعاء 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];
- بعد ذلك ، قم بتمرير الصورة إلى طريقة
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; } } }
الخطوات التالية
- قبل أن تنشر تطبيقًا يستخدم Cloud API لإنتاج تطبيق ، يجب عليك اتخاذ بعض الخطوات الإضافية لمنع وتخفيف تأثير الوصول غير المصرح به إلى واجهة برمجة التطبيقات .
التعرف على النص في صور المستندات
للتعرف على نص مستند ، قم بتكوين أداة التعرف على نص المستند وتشغيلها كما هو موضح أدناه.
توفر واجهة برمجة التطبيقات للتعرف على نص المستند ، الموضحة أدناه ، واجهة مصممة لتكون أكثر ملاءمة للعمل مع صور المستندات. ومع ذلك ، إذا كنت تفضل الواجهة التي توفرها واجهة برمجة التطبيقات للنص المتناثر ، فيمكنك استخدامها بدلاً من ذلك لمسح المستندات ضوئيًا عن طريق تكوين أداة التعرف على النص السحابي لاستخدام نموذج النص الكثيف .
لاستخدام واجهة برمجة تطبيقات التعرف على نص المستند:
1. قم بتشغيل أداة التعرف على النص
قم بتمرير الصورة كصورةUIImage
أو CMSampleBufferRef
إلى عملية VisionDocumentTextRecognizer
process(_:completion:)
:- احصل على مثيل لـ
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];
- من أجل استدعاء 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];
- بعد ذلك ، قم بتمرير الصورة إلى طريقة
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; } } } }
الخطوات التالية
- قبل أن تنشر تطبيقًا يستخدم Cloud API لإنتاج تطبيق ، يجب عليك اتخاذ بعض الخطوات الإضافية لمنع وتخفيف تأثير الوصول غير المصرح به إلى واجهة برمجة التطبيقات .