يمكنك استخدام Firebase ML للتعرف على النص في الصور. يحتوي Firebase ML على واجهة برمجة التطبيقات ذات الأغراض العامة المناسبة للتعرف على النص في الصور، مثل نص علامة الشارع، وواجهة برمجة التطبيقات المحسنة للتعرف على نص المستندات.
قبل ان تبدأ
- إذا لم تكن قد أضفت Firebase إلى تطبيقك بالفعل، فقم بذلك باتباع الخطوات الواردة في دليل البدء .
- في Xcode، مع فتح مشروع التطبيق الخاص بك، انتقل إلى File > Add Packages .
- عندما يُطلب منك ذلك، قم بإضافة مستودع Firebase Apple الأساسي لـ SDK:
- اختر مكتبة Firebase ML.
- أضف علامة
-ObjC
إلى قسم إشارات الرابط الأخرى في إعدادات إنشاء هدفك. - عند الانتهاء، سيبدأ Xcode تلقائيًا في حل وتنزيل تبعياتك في الخلفية.
- في تطبيقك، قم باستيراد Firebase:
سويفت
import FirebaseMLModelDownloader
ج موضوعية
@import FirebaseMLModelDownloader;
إذا لم تكن قد قمت بالفعل بتمكين واجهات برمجة التطبيقات المستندة إلى السحابة لمشروعك، فقم بذلك الآن:
- افتح صفحة Firebase ML APIs لوحدة تحكم Firebase.
إذا لم تكن قد قمت بالفعل بترقية مشروعك إلى خطة تسعير Blaze، فانقر فوق ترقية للقيام بذلك. (سيُطلب منك الترقية فقط إذا لم يكن مشروعك مدرجًا في خطة Blaze.)
يمكن فقط للمشاريع على مستوى Blaze استخدام واجهات برمجة التطبيقات المستندة إلى السحابة.
- إذا لم تكن واجهات برمجة التطبيقات المستندة إلى السحابة ممكّنة بالفعل، فانقر على تمكين واجهات برمجة التطبيقات المستندة إلى السحابة .
استخدم Swift Package Manager لتثبيت تبعيات Firebase وإدارتها.
https://github.com/firebase/firebase-ios-sdk.git
بعد ذلك، قم بإجراء بعض الإعدادات داخل التطبيق:
أنت الآن جاهز لبدء التعرف على النص في الصور.
إرشادات إدخال الصورة
لكي يتعرف 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 في الإنتاج، يجب عليك اتخاذ بعض الخطوات الإضافية لمنع وتخفيف تأثير الوصول غير المصرح به إلى API .
التعرف على النص في صور المستندات
للتعرف على نص مستند، قم بتكوين أداة التعرف على نص المستند وتشغيلها كما هو موضح أدناه.
توفر واجهة 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 في الإنتاج، يجب عليك اتخاذ بعض الخطوات الإضافية لمنع وتخفيف تأثير الوصول غير المصرح به إلى API .