يمكنك استخدام أدوات تعلّم الآلة للتعرّف على النص في الصور أو الفيديوهات، مثل نص لافتة الشارع. الخصائص الرئيسية لهذه الميزة هي:
واجهة برمجة تطبيقات التعرّف على النص الإصدار 2 | |
---|---|
الوصف | يمكنك التعرّف على النص في الصور أو الفيديوهات، وتوفير النصوص البرمجية اللاتينية والصينية والديفاناغارية واليابانية والكورية و مجموعة واسعة من اللغات. |
أسماء حِزم تطوير البرامج (SDK) | GoogleMLKit/TextRecognition |
التنفيذ | ترتبط مواد العرض بشكلٍ ثابت بتطبيقك في وقت الإصدار. |
تأثير حجم التطبيق | حوالي 38 ميغابايت لكل حزمة تطوير برامج (SDK) للنص البرمجي |
عروض أداء | يتم عرضها في الوقت الفعلي على معظم الأجهزة لحزمة SDK الخاصة بالنصوص اللاتينية، وتكون أبطأ في الأجهزة الأخرى. |
تجربة السمات والبيانات
- جرِّب نموذج التطبيق للاطّلاع على مثال حول استخدام واجهة برمجة التطبيقات هذه.
- جرِّب إدخال الرمز بنفسك باستخدام الدرس التطبيقي حول الترميز.
قبل البدء
- أدرِج مجموعات تعلّم الآلة التالية في Podfile:
# To recognize Latin script pod 'GoogleMLKit/TextRecognition', '3.2.0' # To recognize Chinese script pod 'GoogleMLKit/TextRecognitionChinese', '3.2.0' # To recognize Devanagari script pod 'GoogleMLKit/TextRecognitionDevanagari', '3.2.0' # To recognize Japanese script pod 'GoogleMLKit/TextRecognitionJapanese', '3.2.0' # To recognize Korean script pod 'GoogleMLKit/TextRecognitionKorean', '3.2.0'
- بعد تثبيت أو تحديث مجموعات Pods لمشروعك، افتح مشروع Xcode باستخدام
.xcworkspace
. تتوفّر هذه الأداة في الإصدار 12.4 من Xcode أو إصدار أحدث.
1- إنشاء مثيل لـ TextRecognizer
يمكنك إنشاء مثيل TextRecognizer
من خلال استدعاء
+textRecognizer(options:)
، مع تمرير الخيارات المتعلقة بحزمة تطوير البرامج (SDK) التي أشرت إليها باعتبارها
اعتمادًا على أعلاه:
Swift
// When using Latin script recognition SDK let latinOptions = TextRecognizerOptions() let latinTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Chinese script recognition SDK let chineseOptions = ChineseTextRecognizerOptions() let chineseTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Devanagari script recognition SDK let devanagariOptions = DevanagariTextRecognizerOptions() let devanagariTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Japanese script recognition SDK let japaneseOptions = JapaneseTextRecognizerOptions() let japaneseTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Korean script recognition SDK let koreanOptions = KoreanTextRecognizerOptions() let koreanTextRecognizer = TextRecognizer.textRecognizer(options:options)
Objective-C
// When using Latin script recognition SDK MLKTextRecognizerOptions *latinOptions = [[MLKTextRecognizerOptions alloc] init]; MLKTextRecognizer *latinTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Chinese script recognition SDK MLKChineseTextRecognizerOptions *chineseOptions = [[MLKChineseTextRecognizerOptions alloc] init]; MLKTextRecognizer *chineseTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Devanagari script recognition SDK MLKDevanagariTextRecognizerOptions *devanagariOptions = [[MLKDevanagariTextRecognizerOptions alloc] init]; MLKTextRecognizer *devanagariTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Japanese script recognition SDK MLKJapaneseTextRecognizerOptions *japaneseOptions = [[MLKJapaneseTextRecognizerOptions alloc] init]; MLKTextRecognizer *japaneseTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Korean script recognition SDK MLKKoreanTextRecognizerOptions *koreanOptions = [[MLKKoreanTextRecognizerOptions alloc] init]; MLKTextRecognizer *koreanTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options];
2. تحضير صورة الإدخال
مرِّر الصورة باعتبارهاUIImage
أو CMSampleBufferRef
إلى طريقة process(_:completion:)
في TextRecognizer
:
أنشِئ عنصر VisionImage
باستخدام UIImage
أو CMSampleBuffer
.
في حال استخدام "UIImage
"، يُرجى اتّباع الخطوات التالية:
- يمكنك إنشاء عنصر
VisionImage
باستخدامUIImage
. تأكَّد من تحديد سمة.orientation
الصحيحة.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
في حال استخدام "CMSampleBuffer
"، يُرجى اتّباع الخطوات التالية:
-
حدِّد اتجاه بيانات الصورة المضمّنة في
CMSampleBuffer
.للحصول على اتجاه الصورة:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> UIImage.Orientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftMirrored : .right case .landscapeLeft: return cameraPosition == .front ? .downMirrored : .up case .portraitUpsideDown: return cameraPosition == .front ? .rightMirrored : .left case .landscapeRight: return cameraPosition == .front ? .upMirrored : .down case .faceDown, .faceUp, .unknown: return .up } }
Objective-C
- (UIImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored : UIImageOrientationRight; case UIDeviceOrientationLandscapeLeft: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored : UIImageOrientationUp; case UIDeviceOrientationPortraitUpsideDown: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored : UIImageOrientationLeft; case UIDeviceOrientationLandscapeRight: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored : UIImageOrientationDown; case UIDeviceOrientationUnknown: case UIDeviceOrientationFaceUp: case UIDeviceOrientationFaceDown: return UIImageOrientationUp; } }
- ويمكنك إنشاء كائن
VisionImage
باستخدام كائنCMSampleBuffer
واتجاهه:Swift
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
Objective-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
3. معالجة الصورة
بعد ذلك، أدخِل الصورة إلى طريقة process(_:completion:)
:
Swift
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // Error handling return } // Recognized text }
Objective-C
[textRecognizer processImage:image completion:^(MLKText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // Error handling return; } // Recognized text }];
4. استخراج النص من مجموعات النصوص التي تم التعرف عليها
إذا نجحت عملية التعرّف على النص، سيتم عرض كائن Text
. يحتوي الكائن Text
على النص الكامل الذي
تم التعرّف عليه في الصورة ولا يحتوي على أي كائنات TextBlock
أو أكثر.
وتمثّل كل علامة TextBlock
نصًّا مستطيلاً لا يحتوي على عناصر TextLine
أو أكثر. لا يحتوي كل كائن TextLine
على كائنات TextElement
أو أكثر، ويمثّل ذلك الكلمات والكيانات التي تشبه الكلمات، مثل التواريخ والأرقام.
لكل عنصر من عناصر TextBlock
وTextLine
وTextElement
، يمكنك التعرّف على النص في المنطقة وإحداثيات الحدود.
مثال:
Swift
let resultText = result.text for block in result.blocks { let blockText = block.text let blockLanguages = block.recognizedLanguages let blockCornerPoints = block.cornerPoints let blockFrame = block.frame for line in block.lines { let lineText = line.text let lineLanguages = line.recognizedLanguages let lineCornerPoints = line.cornerPoints let lineFrame = line.frame for element in line.elements { let elementText = element.text let elementCornerPoints = element.cornerPoints let elementFrame = element.frame } } }
Objective-C
NSString *resultText = result.text; for (MLKTextBlock *block in result.blocks) { NSString *blockText = block.text; NSArray<MLKTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages; NSArray<NSValue *> *blockCornerPoints = block.cornerPoints; CGRect blockFrame = block.frame; for (MLKTextLine *line in block.lines) { NSString *lineText = line.text; NSArray<MLKTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages; NSArray<NSValue *> *lineCornerPoints = line.cornerPoints; CGRect lineFrame = line.frame; for (MLKTextElement *element in line.elements) { NSString *elementText = element.text; NSArray<NSValue *> *elementCornerPoints = element.cornerPoints; CGRect elementFrame = element.frame; } } }
إرشادات إدخال الصورة
-
لكي تتعرّف أدوات تعلُّم الآلة على النص بدقة، يجب أن تتضمّن صور الإدخال نصًا يتم تمثيله ببيانات بكسل كافية. ويُفضَّل أن يكون حجم كل حرف 16×16 بكسل على الأقل. بشكل عام، ما مِن مزايا تتعلّق بالدقة إذا كانت الأحرف أكبر من 24×24 بكسل.
على سبيل المثال، قد تنجح صورة بحجم 640×480 في إجراء مسح ضوئي لبطاقة نشاط تجاري تشغل العرض الكامل للصورة. لمسح مستند مطبوع على ورق بحجم الحرف، يجب توفير صورة بدقة 720x1280 بكسل.
-
يمكن أن يؤثر التركيز السيئ للصورة في دقة التعرّف على النص. إذا لم تحصل على نتائج مقبولة، حاوِل أن تطلب من المستخدم إعادة التقاط الصورة.
-
إذا كنت تتعرّف على نص في تطبيق في الوقت الفعلي، يجب مراعاة الأبعاد العامة للصور التي يتم إدخالها. يمكن معالجة الصور الأصغر حجمًا بشكل أسرع. لتقليل وقت الاستجابة، تأكَّد من أنّ النص يشغل النص بأكبر قدر ممكن من الصورة، والتقِط الصور بدرجات دقة أقل (مع مراعاة متطلبات الدقة المذكورة أعلاه). للحصول على مزيد من المعلومات، اطّلِع على نصائح لتحسين الأداء.
نصائح لتحسين الأداء
- لمعالجة إطارات الفيديو، استخدِم واجهة برمجة التطبيقات المتزامنة
results(in:)
لأداة الرصد. ويمكنك استدعاء هذه الطريقة من وظيفةcaptureOutput(_, didOutput:from:)
فيAVCaptureVideoDataOutputSampleBufferDelegate
للحصول على نتائج متزامنة من إطار الفيديو المحدّد. الاحتفاظ بـAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
true
لتقليل المكالمات الواردة إلى جهاز الرصد. في حال توفّر إطار فيديو جديد أثناء تشغيل أداة الرصد، سيتم تجاهله. - إذا كنت تستخدم نتيجة أداة الرصد لإضافة رسومات على الصورة التي تم إدخالها، احصل أولاً على النتيجة من أدوات تعلّم الآلة، ثم اعرض الصورة والتراكب في خطوة واحدة. بإجراء ذلك، يتم عرضك على سطح الشاشة مرة واحدة فقط لكل إطار إدخال تمت معالجته. للاطّلاع على مثال، يمكن الاطّلاع على updatePreviewOverlayViewWithLastFrame في نموذج البدء السريع في ML Kit.
- ننصحك بالتقاط الصور بدقة أقل. يُرجى العِلم أيضًا أنّ متطلبات أبعاد الصورة في واجهة برمجة التطبيقات هذه.
- لتجنُّب أي تدهور محتمل في الأداء، يُرجى عدم تشغيل مثيلات
TextRecognizer
متعددة باستخدام خيارات نصوص برمجية مختلفة بشكل متزامن.