يمكنك استخدام ميزة Firebase ML للتعرّف على النص في الصور. يمتلك Firebase ML فإن كلاً من واجهة برمجة التطبيقات للأغراض العامة مناسبة للتعرف على النص في الصور، مثل ونص لافتة الشارع وواجهة برمجة تطبيقات محسنة للتعرف على نص المستندات.
قبل البدء
-
إذا لم يسبق لك إضافة Firebase إلى تطبيقك، يمكنك إجراء ذلك من خلال اتّباع
الخطوات في دليل البدء.
- في Xcode، انتقِل إلى File (ملف) > بعد فتح مشروع التطبيق الخاص بك. إضافة حِزم
- أضِف مستودع حزمة تطوير البرامج (SDK) لمنصّات Firebase Apple عندما يُطلب منك ذلك:
- اختَر مكتبة "Firebase ML".
- أضِف العلامة
-ObjC
إلى القسم علامات الروابط الأخرى في إعدادات إصدار هدفك. - عند الانتهاء، سيبدأ Xcode تلقائيًا في حل وتنزيل ملف والتبعيات في الخلفية.
- في تطبيقك، استورد Firebase:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
إذا لم يسبق لك تفعيل واجهات برمجة التطبيقات المستنِدة إلى السحابة الإلكترونية لمشروعك، يُرجى إجراء ذلك الآن:
- افتح Firebase ML. صفحة واجهات برمجة التطبيقات لوحدة تحكُّم Firebase.
-
إذا لم تكن قد أجريت ترقية لمشروعك إلى خطة أسعار Blaze، انقر على يجب الترقية لإجراء ذلك. (ستتم مطالبتك بالترقية فقط إذا كان مشروعك ليس على خطة Blaze).
يمكن للمشروعات على مستوى Blaze فقط استخدام واجهات برمجة التطبيقات المستنِدة إلى السحابة الإلكترونية.
- إذا لم تكن واجهات برمجة التطبيقات المستنِدة إلى السحابة الإلكترونية مُفعَّلة، انقر على تفعيل البيانات المستندة إلى السحابة الإلكترونية. API.
يمكنك استخدام "مدير حزم Swift" لتثبيت اعتماديات Firebase وإدارتها.
https://github.com/firebase/firebase-ios-sdk.git
بعد ذلك، يمكنك إجراء بعض الإعدادات داخل التطبيق:
أنت الآن جاهز لبدء التعرف على النص في الصور.
إرشادات إدخال الصور
-
ليتمكّن تطبيق Firebase ML من التعرّف على النص بدقة، يجب أن تحتوي الصور المدخلة على نص يتم تمثيله ببيانات بكسل كافية. من الناحية المثالية، للّغة اللاتينية نص، يجب أن يبلغ حجم كل حرف 16×16 بكسل على الأقل. بالنسبة إلى اللغة الصينية، يتضمن كل من النص الياباني والكورية يجب أن يكون حجم الحرف 24×24 بكسل. بالنسبة لجميع اللغات، لا يوجد عمومًا على الدقة المحدد للأحرف الأكبر من 24×24 بكسل.
لذلك، على سبيل المثال، قد تعمل صورة بحجم 640×480 جيدًا لمسح بطاقة عمل ضوئيًا تشغل العرض الكامل للصورة لإجراء مسح ضوئي لمستند مطبوع على ورق بحجم حرف، فقد يلزم صورة 720×1280 بكسل.
-
يمكن أن يؤدي التركيز الضعيف للصورة إلى التأثير سلبًا في دقة التعرّف على النص. إذا لم تكن كذلك والحصول على نتائج مقبولة، فحاول أن تطلب من المستخدم تلخيص الصورة.
التعرّف على النص في الصور
للتعرّف على النص في صورة، شغِّل أداة التعرّف على النص كما هو موضَّح. أدناه.
1- تشغيل أداة التعرّف على النص
تمرير الصورة كـUIImage
أو CMSampleBufferRef
إلى
جهاز process(_:completion:)
لـ "VisionTextRecognizer
"
:
- الحصول على نسخة افتراضية من "
VisionTextRecognizer
" من خلال الاتصالcloudTextRecognizer
:Swift
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)
Objective-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];
-
لاستدعاء Cloud Vision، يجب تنسيق الصورة بترميز base64.
السلسلة. لمعالجة
UIImage
:Swift
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
-
بعد ذلك، اضبط الصورة على طريقة
process(_:completion:)
:Swift
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Objective-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
،
فيمكنك التعرف على النص في المنطقة وإحداثيات الحدود
المنطقة.
على سبيل المثال:
Swift
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 } } }
Objective-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; } } }
الخطوات التالية
- قبل نشر تطبيق يستخدم Cloud API في قناة الإصدار العلني، يجب إجراء بعض الخطوات الإضافية لمنع وتخفيف تأثير الوصول غير المُصرح به إلى واجهة برمجة التطبيقات.
التعرّف على النص في صور المستندات
للتعرف على نص المستند، قم بتهيئة وتشغيل أداة التعرّف على النص في المستند كما هو موضّح أدناه.
وتوفر واجهة برمجة التطبيقات للتعرف على نص المستندات، الموضحة أدناه، واجهة أن يكون أكثر ملاءمة للعمل على صور المستندات. ومع ذلك، إذا كنت تفضّل استخدام الواجهة التي توفرها واجهة برمجة تطبيقات النصوص المتفرقة، يمكنك استخدامها لمسح المستندات ضوئيًا من خلال ضبط أداة التعرّف على النص في السحابة الإلكترونية استخدام نموذج النص الكثيف.
لاستخدام واجهة برمجة تطبيقات التعرف على النص في المستندات:
1- تشغيل أداة التعرّف على النص
تمرير الصورة كـUIImage
أو CMSampleBufferRef
إلى
جهاز process(_:completion:)
لـ "VisionDocumentTextRecognizer
"
:
- الحصول على نسخة افتراضية من "
VisionDocumentTextRecognizer
" من خلال الاتصالcloudDocumentTextRecognizer
:Swift
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)
Objective-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];
-
لاستدعاء Cloud Vision، يجب تنسيق الصورة بترميز base64.
السلسلة. لمعالجة
UIImage
:Swift
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
-
بعد ذلك، اضبط الصورة على طريقة
process(_:completion:)
:Swift
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Objective-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
، يمكنك الحصول على
للنص المعترف به في المنطقة وإحداثيات الإحاطة بهذه المنطقة.
على سبيل المثال:
Swift
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 } } } }
Objective-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; } } } }
الخطوات التالية
- قبل نشر تطبيق يستخدم Cloud API في قناة الإصدار العلني، يجب إجراء بعض الخطوات الإضافية لمنع وتخفيف تأثير الوصول غير المُصرح به إلى واجهة برمجة التطبيقات.