يمكنك استخدام مجموعة أدوات تعلُّم الآلة للتعرّف على النص في الصور أو الفيديو، مثل نصوص لافتة الشارع. الخصائص الرئيسية لهذه الميزة هي:
واجهة برمجة التطبيقات للإصدار 2 من تعرّف النص | |
---|---|
الوصف | التعرف على النص في الصور أو مقاطع الفيديو، ودعم النصوص اللاتينية والصينية والديفاناغارية واليابانية والكورية مجموعة واسعة من اللغات |
أسماء حِزم تطوير البرامج (SDK) | GoogleMLKit/TextRecognition |
التنفيذ | تكون مواد العرض مرتبطة بشكل ثابت بتطبيقك في وقت الإنشاء. |
تأثير حجم التطبيق | حوالي 38 ميغابايت لكل حزمة SDK للنص البرمجي |
الأداء | العرض في الوقت الفعلي على معظم الأجهزة لحزمة تطوير البرامج (SDK) الخاصة بالنصوص اللاتينية، ويكون أبطأ بالنسبة إلى الأجهزة الأخرى |
جرّبه الآن
- يمكنك تجربة نموذج التطبيق من أجل يمكنك الاطّلاع على مثال حول استخدام واجهة برمجة التطبيقات هذه.
- جرب الرمز بنفسك باستخدام درس تطبيقي حول الترميز.
قبل البدء
- تضمين مجموعات ML Kit التالية في 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 جيدًا لمسح بطاقة عمل ضوئيًا تشغل العرض الكامل للصورة لإجراء مسح ضوئي لمستند مطبوع على ورق بحجم حرف، فقد يلزم صورة 720×1280 بكسل.
-
يمكن أن يؤثر التركيز الضعيف للصورة على دقة التعرّف على النص. إذا لم تكن كذلك والحصول على نتائج مقبولة، فحاول أن تطلب من المستخدم تلخيص الصورة.
-
إذا كنت تتعرف على النص في تطبيق في الوقت الفعلي، فيجب عليك مراعاة الأبعاد الكلية للصور المدخلة. أصغر يمكن معالجة الصور بشكل أسرع. ولتقليل وقت الاستجابة، تأكد من أن النص يشغل أكبر قدر من الصورة قدر الإمكان، والتقاط الصور بدرجات دقة أقل (مع الأخذ في الاعتبار دقة المتطلبات المذكورة أعلاه). لمزيد من المعلومات، يُرجى مراجعة نصائح لتحسين الأداء.
نصائح لتحسين الأداء
- لمعالجة إطارات الفيديو، استخدِم واجهة برمجة التطبيقات المتزامنة
results(in:)
الخاصة بأداة الرصد. اتصل لهذه الطريقة منAVCaptureVideoDataOutputSampleBufferDelegate
captureOutput(_, didOutput:from:)
للحصول على النتائج من الفيديو المحدّد بشكل متزامن الإطار. إبقاء جهازAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
كـtrue
لضبط الاتصالات الموجَّهة إلى أداة الرصد. إذا كانت تجربة يصبح إطار الفيديو متاحًا أثناء تشغيل أداة الكشف، وسيتم إسقاطه. - إذا استخدمت مخرجات أداة الكشف لتراكب الرسومات على الصورة المدخلة، والحصول أولاً على النتيجة من ML Kit، ثم عرض الصورة وتراكبها في خطوة واحدة. ومن خلال القيام بذلك، يمكنك العرض على سطح الشاشة مرة واحدة فقط لكل إطار إدخال تمت معالجته. راجع updatePreviewOverlayViewWithLastFrame في عينة البدء السريع لأدوات تعلُّم الآلة كمثال.
- يمكنك التقاط صور بدقة أقل. ومع ذلك، ضع في اعتبارك أيضًا متطلبات أبعاد الصورة في واجهة برمجة التطبيقات هذه.
- لتجنّب التدهور المحتمل في الأداء، لا تُشغّل
TextRecognizer
أمثلة بخيارات نصوص برمجية مختلفة في الوقت نفسه.