Resimlerdeki veya videolardaki metinleri (ör. sokak tabelası metni) tanımak için ML Kit'i kullanabilirsiniz. Bu özelliğin temel özellikleri şunlardır:
Metin Tanıma v2 API'si | |
---|---|
Açıklama | Resimlerdeki veya videolardaki metinleri tanıma, Latince, Çince, Devanagari, Japonca ve Korece alfabeler için destek ve çok çeşitli diller |
SDK adları | GoogleMLKit/TextRecognition |
Uygulama | Öğeler, derleme sırasında statik olarak uygulamanıza bağlıdır |
Uygulama boyutu etkisi | Komut dosyası SDK'sı başına yaklaşık 38 MB |
Performans | Çoğu cihazda Latin komut dosyası SDK'sı için gerçek zamanlı çalışırken diğerleri için daha yavaştır. |
Deneyin
- Bu API'nin örnek bir kullanımını görmek için örnek uygulamayı inceleyin.
- Codelab ile kodu kendiniz deneyin.
Başlamadan önce
- Aşağıdaki ML Kiti kapsüllerini Podfile'ınıza ekleyin:
# 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'
- Projenizin Kapsüllerini yükledikten veya güncelledikten sonra,
.xcworkspace
kullanarak Xcode projenizi açın. ML Kit, Xcode 12.4 veya üzeri sürümlerde desteklenir.
1. TextRecognizer
örneği oluşturun
Yukarıda bağımlı olduğunu beyan ettiğiniz SDK ile ilgili seçenekleri ileterek +textRecognizer(options:)
yöntemini çağırarak TextRecognizer
örneği oluşturun:
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. Giriş görüntüsünü hazırlama
Resmi,TextRecognizer
'in process(_:completion:)
yöntemine UIImage
veya CMSampleBufferRef
olarak iletin:
UIImage
veya CMSampleBuffer
kullanarak VisionImage
nesnesi oluşturun.
UIImage
kullanıyorsanız şu adımları uygulayın:
UIImage
ile birVisionImage
nesnesi oluşturun. Doğru.orientation
değerini belirttiğinizden emin olun.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
CMSampleBuffer
kullanıyorsanız şu adımları uygulayın:
-
CMSampleBuffer
içinde yer alan resim verilerinin yönünü belirtin.Resmin yönünü belirlemek için:
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; } }
CMSampleBuffer
nesnesini ve yönünü kullanarak birVisionImage
nesnesi oluşturun: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. Resmi işle
Ardından resmi process(_:completion:)
yöntemine iletin:
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. Tanınan metin bloklarından metin çıkarın
Metin tanıma işlemi başarılı olursa Text
nesnesi döndürür. Bir Text
nesnesi, resimde tanınan tam metni ve sıfır veya daha fazla TextBlock
nesne içerir.
Her bir TextBlock
, sıfır veya daha fazla TextLine
nesne içeren dikdörtgen bir metin bloğunu temsil eder. Her TextLine
nesnesi, tarihler ve sayılar gibi kelimeleri ve kelime benzeri varlıkları temsil eden sıfır veya daha fazla TextElement
nesnesi içerir.
Her TextBlock
, TextLine
ve TextElement
nesnesi için metnin bölgede ve bölgenin sınırlayıcı koordinatlarında tanınmasını sağlayabilirsiniz.
Örneğin:
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; } } }
Giriş resmi kuralları
-
ML Kit'in metinleri doğru şekilde tanıması için giriş resimlerinin, yeterli sayıda piksel verisiyle temsil edilen metinler içermesi gerekir. İdeal olarak her karakter en az 16x16 piksel olmalıdır. 24x24 pikselden büyük karakterlerin genellikle doğruluk açısından bir faydası yoktur.
Bu nedenle, örneğin 640x480 boyutunda bir resim, resmin tüm genişliğini kaplayan bir kartvizit taramak için uygun olabilir. Harf boyutundaki kağıda basılı bir dokümanı taramak için 720x1280 piksel boyutunda bir resim gerekebilir.
-
Kötü görüntü odağı, metin tanıma doğruluğunu etkileyebilir. Kabul edilebilir sonuçlar alamıyorsanız kullanıcıdan resmi özetlemesini istemeyi deneyin.
-
Gerçek zamanlı bir uygulamada metni tanıyorsanız giriş resimlerinin genel boyutlarını göz önünde bulundurmanız gerekir. Daha küçük resimler daha hızlı işlenebilir. Gecikmeyi azaltmak için metnin resmin mümkün olduğunca büyük bir kısmını kapladığından emin olun ve görüntüleri daha düşük çözünürlüklerde yakalayın (yukarıda belirtilen doğruluk gereksinimlerini göz önünde bulundurun). Daha fazla bilgi için Performansı iyileştirmeye yönelik ipuçları sayfasını inceleyin.
Performansı artırmaya yönelik ipuçları
- Video karelerini işlemek için algılayıcının
results(in:)
eşzamanlı API'sini kullanın. Belirtilen video karesinden eşzamanlı olarak sonuç almak için bu yöntemiAVCaptureVideoDataOutputSampleBufferDelegate
captureOutput(_, didOutput:from:)
işlevinden çağırın. Algılayıcıya gelen çağrıları kısmak içinAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
özelliğinitrue
olarak bırakın. Algılayıcı çalışırken yeni bir video karesi kullanılabilir hale gelirse atlanır. - Algılayıcının çıkışını giriş görüntüsünün üzerine grafik yerleştirmek için kullanırsanız önce sonucu ML Kit'ten alın, ardından görüntüyü ve yer paylaşımını tek bir adımda oluşturun. Böylece, işlenen her giriş çerçevesi için görüntü yüzeyinde yalnızca bir kez görüntü oluşturursunuz. Örnek için Makine Öğrenimi Kiti hızlı başlangıç örneğindeki updatePreviewOverlayViewWithLastFrame konusuna bakın.
- Daha düşük çözünürlükte resimler çekmeyi deneyin. Bununla birlikte, bu API'nin resim boyutu koşullarını da göz önünde bulundurun.
- Performans düşüşü olasılığını önlemek için farklı komut dosyası seçeneklerine sahip birden fazla
TextRecognizer
örneğini aynı anda çalıştırmayın.