يمكنك استخدام هذه الأدوات للتعرّف على النص في الصور أو الفيديوهات، مثل نص لافتة الشارع. السمات الأساسية لهذه الميزة هي:
واجهة برمجة التطبيقات للإصدار 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'
- بعد تثبيت لوحات مشروعك أو تحديثها، افتح مشروع 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
للحصول على نتائج بشكل متزامن من إطار الفيديو المحدّد. عليك مواصلة استخدامalwaysDiscardsLateVideoFrames
فيAVCaptureVideoDataOutput
كـtrue
لتضييق نطاق الطلبات المتعلّقة بأداة الرصد. وفي حال توفُّر إطار فيديو جديد أثناء تشغيل أداة الرصد، سيتم تجاهله. - إذا كنت تستخدم إخراج أداة الرصد لعرض الرسومات على الصورة المُدخَلة، احصل أولاً على النتيجة من أدوات تعلّم الآلة، ثم اعرض الصورة والتراكب في خطوة واحدة. ومن خلال إجراء ذلك، يتم العرض على سطح الشاشة مرة واحدة فقط لكل إطار إدخال تمت معالجته. للاطّلاع على مثال، راجِع updatePreviewOverlayViewWithLastFrame في نموذج البدء السريع حول حزمة ML Kit.
- ننصحك بالتقاط الصور بدرجة دقة أقل. ولا تنسَ أيضًا مراعاة متطلبات أبعاد الصورة في واجهة برمجة التطبيقات هذه.
- لتجنُّب تراجع الأداء المحتمل، يُرجى عدم تشغيل مثيلات
TextRecognizer
متعددة بخيارات نصوص برمجية مختلفة بشكل متزامن.