يمكنك استخدام Firebase ML للتعرّف على النص في الصور. تتضمّن Firebase ML واجهة برمجة تطبيقات مخصّصة للأغراض العامة مناسبة للتعرّف على النص في الصور، مثل نص لافتة شارع، وواجهة برمجة تطبيقات محسّنة للتعرّف على نص المستندات.
قبل البدء
-
إذا لم يسبق لك إضافة Firebase إلى تطبيقك، يمكنك إجراء ذلك باتّباع
الخطوات الواردة في دليل البدء.
- في Xcode، مع فتح مشروع تطبيقك، انتقِل إلى ملف > إضافة حِزم.
- أضِف مستودع حزمة تطوير البرامج (SDK) لمنصّات Apple من Firebase عندما يُطلب منك ذلك:
- اختَر مكتبة Firebase ML.
- أضِف العلامة
-ObjC
إلى قسم رموز ربط أخرى في إعدادات الإنشاء الخاصة بالهدف. - عند الانتهاء، سيبدأ Xcode تلقائيًا في حلّ ملفاتك المضمّنة وتنزيلها في الخلفية.
- في تطبيقك، استورِد Firebase:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
إذا لم يسبق لك تفعيل واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية لمشروعك، عليك إجراء ذلك الآن:
- افتح Firebase ML صفحة "واجهات برمجة التطبيقات" في وحدة تحكّم Firebase.
-
إذا لم تكن قد أجريت ترقية لمشروعك إلى خطة أسعار Blaze، انقر على ترقية لإجراء ذلك. (لن يُطلب منك إجراء الترقية إلا إذا كان مشروعك غير مُدرَج في خطة Blaze).
يمكن للمشاريع على مستوى Blaze فقط استخدام واجهات برمجة التطبيقات المستندة إلى Cloud.
- إذا لم تكن واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية مفعّلة، انقر على تفعيل واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية.
استخدِم Swift Package Manager لتثبيت تبعيات Firebase وإدارتها.
https://github.com/firebase/firebase-ios-sdk.git
بعد ذلك، عليك إجراء بعض الإعدادات داخل التطبيق:
أنت الآن جاهز لبدء التعرّف على النص في الصور.
إرشادات حول إدخال الصور
-
لكي تتمكّن ميزة Firebase ML من التعرّف على النص بدقة، يجب أن تحتوي صور الإدخال على نص يمثّله عدد كافٍ من بيانات البكسل. من الأفضل أن يكون حجم كل حرف في النص اللاتيني 16×16 بكسل على الأقل. بالنسبة إلى النص باللغة الصينية واليابانية والكورية، يجب أن يكون حجم كل حرف 24 × 24 بكسل. بالنسبة إلى جميع اللغات، لا تُحقّق زيادة حجم الأحرف عن 24×24 بكسل أي فائدة من حيث الدقة.
على سبيل المثال، قد تكون الصورة بحجم 640×480 مناسبة لمسح بطاقة تعريف ملف شخصي تشغل العرض الكامل للصورة ضوئيًا. لمسح مستند مطبوع على ورقة بحجم A4 ضوئيًا، قد تكون صورة بدقة 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 في قناة الإصدار العلني، عليك اتّخاذ بعض الخطوات الإضافية لمنع أثر الوصول غير المصرَّح به إلى واجهة برمجة التطبيقات والحدّ منه.
التعرّف على النص في صور المستندات
للتعرّف على نص مستند، عليك ضبط ملف معالجة محتوى المستند وتشغيله كما هو موضّح أدناه.
توفّر واجهة برمجة التطبيقات لميزة التعرّف على نص المستندات، الموضّحة أدناه، واجهة مصمّمة لتكون أكثر ملاءمةً للعمل مع صور المستندات. ومع ذلك، إذا كنت تفضّل الواجهة التي تقدّمها واجهة برمجة التطبيقات للنص المتفرق، يمكنك استخدامها بدلاً من ذلك لفحص المستندات من خلال ضبط معرّف النصوص في السحابة الإلكترونية لاستخدام نموذج النصوص الكثيفة.
لاستخدام واجهة برمجة التطبيقات لميزة التعرّف على نص المستندات:
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 في قناة الإصدار العلني، عليك اتّخاذ بعض الخطوات الإضافية لمنع أثر الوصول غير المصرَّح به إلى واجهة برمجة التطبيقات والحدّ منه.