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