Resimlerdeki metinleri tanımak için Makine Öğrenimi Kiti'ni kullanabilirsiniz. Makine Öğrenimi Kiti resimlerdeki metinlerin tanınması için uygun, genel amaçlı API; örneğin metni tanımak için optimize edilmiş bir API ve sokak işaretinin metni yardımcı olur. Genel amaçlı API'de hem cihaz üzerinde hem bulut tabanlı modeller bulunur. Doküman metni tanıma yalnızca bulut tabanlı bir model olarak kullanılabilir. Bkz. genel bakış bulut modelleri ve cihaz üzerindeki modeller.
Başlamadan önce
- Firebase'i uygulamanıza henüz eklemediyseniz başlangıç kılavuzundaki adımlara bakın.
- ML Kit kitaplıklarını Podfile'ınıza ekleyin:
Projenizin kapsüllerini yükledikten veya güncelledikten sonra Xcodepod 'Firebase/MLVision', '6.25.0' # If using an on-device API: pod 'Firebase/MLVisionTextModel', '6.25.0'
.xcworkspace
kullanarak projenize dahil olabilir. - Uygulamanızda Firebase'i içe aktarın:
Swift
import Firebase
Objective-C
@import Firebase;
-
Bulut tabanlı modeli kullanmak istiyorsanız ve henüz etkinleştirmediyseniz bulut tabanlı API'ler kullanmak için aşağıdaki adımları uygulayın:
- ML Kit'i açın Firebase konsolunun API'ler sayfasında gösterilir.
-
Projenizi daha önce Blaze fiyatlandırma planına yükseltmediyseniz Bunun için yeni sürüme geçin. (Yalnızca emin olun.)
Bulut tabanlı API'ler yalnızca Blaze düzeyindeki projelerde kullanılabilir.
- Cloud tabanlı API'ler henüz etkinleştirilmemişse Bulut tabanlı API'leri etkinleştir'i tıklayın. API'ler.
Yalnızca cihaz üzerindeki modeli kullanmak istiyorsanız bu adımı atlayabilirsiniz.
Artık resimlerdeki metinleri tanımaya hazırsınız.
Giriş resmi kuralları
-
Makine Öğrenimi Kiti'nin metni doğru bir şekilde tanıması için giriş resimlerinde yeterli piksel verisi ile temsil edilen metin. İdeal olarak, Latince metin, her karakter en az 16x16 piksel olmalıdır. Çince için Her biri Japonca ve Korece metinler (yalnızca bulut tabanlı API'ler tarafından desteklenir) karakter 24x24 piksel olmalıdır. Tüm dillerde genellikle daha doğru olması gerekir.
Bu nedenle, örneğin, 640x480 boyutunda bir resim, kartvizit taraması için iyi performans bir resim seçin. Üzerine yazdırılmış bir dokümanı taramak için büyük harf kullanıyorsanız 720x1280 piksel boyutunda bir resim gerekebilir.
-
Zayıf resim odağı, metin tanıma doğruluğunu olumsuz etkileyebilir. Uygun değilseniz kabul edilebilir sonuçlar alıyorsanız kullanıcıdan resmi yeniden çekmesini isteyin.
-
Gerçek zamanlı bir uygulamada metinleri tanıyorsanız, giriş resimlerinin genel boyutlarını göz önünde bulundurmak istersiniz. Daha küçük daha hızlı işlenebilir. Bu nedenle, gecikmeyi azaltmak için daha düşük çözünürlükler için (yukarıdaki doğruluk şartlarını göz önünde bulundurarak) ve metnin, resmin mümkün olduğunca büyük bir kısmını kapladığından emin olun. Şunlara da bakabilirsiniz: Gerçek zamanlı performansı iyileştirmeye yönelik ipuçları.
Resimlerdeki metinleri tanıyın
Cihaz üzerinde veya bulut tabanlı bir model kullanarak resimlerdeki metinleri tanımak için: metin tanıyıcıyı aşağıda açıklandığı şekilde çalıştırın.
1. Metin tanıyıcıyı çalıştır
Resmi "UIImage" veya "CMSampleBufferRef" olarak "VisionTextValidater" 'Process(_:complete:)" işlemi yöntem:- Aşağıdakilerden birini çağırarak
VisionTextRecognizer
örneğini alınonDeviceTextRecognizer
veyacloudTextRecognizer
:Swift
Cihaz üzerinde modeli kullanmak için:
let vision = Vision.vision() let textRecognizer = vision.onDeviceTextRecognizer()
Bulut modelini kullanmak için:
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
Cihaz üzerinde modeli kullanmak için:
FIRVision *vision = [FIRVision vision]; FIRVisionTextRecognizer *textRecognizer = [vision onDeviceTextRecognizer];
Bulut modelini kullanmak için:
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];
-
Bir
VisionImage
nesnesi oluşturmak içinUIImage
veyaCMSampleBufferRef
.UIImage
kullanmak için:- Gerekirse resmi,
imageOrientation
özellik değeri.up
. - Doğru şekilde döndürülen öğeyi kullanarak bir
VisionImage
nesnesi oluşturunUIImage
. Herhangi bir rotasyon meta verisi belirtme (varsayılan) değeri (.topLeft
) kullanılmalıdır.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
CMSampleBufferRef
kullanmak için:-
Aşağıdakini belirten bir
VisionImageMetadata
nesnesi oluşturun: içerdiği resim verilerinin yönüCMSampleBufferRef
arabellek.Resmin yönünü öğrenmek için:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
Objective-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
Ardından meta veri nesnesini oluşturun:
Swift
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Objective-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
- Şunu kullanarak bir
VisionImage
nesnesi oluşturun:CMSampleBufferRef
nesnesi ve rotasyon meta verileri:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- Gerekirse resmi,
-
Ardından resmi
process(_:completion:)
yöntemine iletin: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. Tanınan metin bloklarındaki metni ayıkla
Metin tanıma işlemi başarılı olursa, yeni bir ["VisionText"][VisionText] nesnesi. Bir "VisionText" nesnesi, metnin tamamını içeriyor resimde tanındı ve sıfır veya daha fazla [`VisionTextBlock`][VisionTextBlock] nesneler'i tıklayın. Her "VisionTextBlock", dikdörtgen metin blokunu temsil eder ve sıfır veya daha fazla [`VisionTextLine`][VisionTextLine] nesnesi. Her bir "VisionTextLine" nesne hiç veya daha fazla [`VisionTextElement`][VisionTextElement] nesnesi içeriyor, Bunlar, kelimeleri ve kelime benzeri varlıkları (tarihler, sayılar vb.) temsil eder. Her "VisionTextBlock", "VisionTextLine" ve "VisionTextElement" nesnesi için metnin bölgede tanındığını ve bu bölgenin sınırlayıcı koordinatlarının bölge. Örneğin: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; } } }
Gerçek zamanlı performansı iyileştirmeye yönelik ipuçları
Metinleri gerçek zamanlı olarak tanımak için cihaz üzerindeki modeli kullanmak istiyorsanız kullanırken en iyi kare hızlarına ulaşmak için şu yönergeleri izleyin:
- Metin tanıyıcıya yapılan çağrıları kısıtlayın. Yeni bir video karesi metin tanıyıcı çalışırken kullanılabilir durumdaysa çerçeveyi bırakın.
- Grafikleri üzerine yerleştirmek için metin tanıyıcının çıkışını kullanıyorsanız giriş görüntüsünü kullanın, önce ML Kit'ten sonucu alın ve ardından görüntüyü oluşturun tek bir adımda yapabilirsiniz. Bu şekilde, öğeleri ekran yüzeyinde her giriş karesi için yalnızca bir kez. Bkz. previewOverlayView ve FIRDetectionOverlayView sınıfları inceleyelim.
- Görüntüleri daha düşük çözünürlükte çekmeyi düşünün. Ancak unutmayın, resim boyutu şartlarına tabidir.
Sonraki adımlar
- Cloud API kullanan bir uygulamanın üretim sürümüne dağıtım yapmadan önce şunları yapmanız gerekir: önlemek ve etkilerini azaltmak amacıyla neden olabileceğiyle ilgili daha fazla bilgi edinin.
Belge resimlerindeki metinleri tanıyın
Bir dokümandaki metni tanımak için bulut tabanlı dosyayı yapılandırıp çalıştırın doküman metni tanıyıcıyı kullanın.
Aşağıda açıklanan doküman metni tanıma API'si, Google Cloud Platform'un doküman resimleriyle çalışırken daha kullanışlı olması amaçlanmıştır. Ancak, seyrek metin API'si tarafından sağlanan arayüzü tercih ederseniz bunu kullanabilirsiniz yapılandırarak dokümanları taramak yerine Cloud metin tanıyıcıyı yoğun metin modelini kullanın.
Doküman metni tanıma API'sini kullanmak için:
1. Metin tanıyıcıyı çalıştır
ResmiUIImage
veya CMSampleBufferRef
olarak şuraya aktarın:
VisionDocumentTextRecognizer
adlı çocuğun process(_:completion:)
cihazı
yöntem:
- Şu numarayı arayarak
VisionDocumentTextRecognizer
örneğini alın: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];
-
Bir
VisionImage
nesnesi oluşturmak içinUIImage
veyaCMSampleBufferRef
.UIImage
kullanmak için:- Gerekirse resmi,
imageOrientation
özellik değeri.up
. - Doğru şekilde döndürülen öğeyi kullanarak bir
VisionImage
nesnesi oluşturunUIImage
. Herhangi bir rotasyon meta verisi belirtme (varsayılan) değeri (.topLeft
) kullanılmalıdır.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
CMSampleBufferRef
kullanmak için:-
Aşağıdakini belirten bir
VisionImageMetadata
nesnesi oluşturun: içerdiği resim verilerinin yönüCMSampleBufferRef
arabellek.Resmin yönünü öğrenmek için:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
Objective-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
Ardından meta veri nesnesini oluşturun:
Swift
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Objective-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
- Şunu kullanarak bir
VisionImage
nesnesi oluşturun:CMSampleBufferRef
nesnesi ve rotasyon meta verileri:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- Gerekirse resmi,
-
Ardından resmi
process(_:completion:)
yöntemine iletin: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. Tanınan metin bloklarındaki metni ayıkla
Metin tanıma işlemi başarılı olursa, yeni birVisionDocumentText
nesnesini tanımlayın. VisionDocumentText
nesnesi
resimde tanınan tam metni ve
tanınan belgenin yapısını yansıtmalıdır:
Her VisionDocumentTextBlock
, VisionDocumentTextParagraph
için
VisionDocumentTextWord
ve VisionDocumentTextSymbol
nesnesini içeriyorsa
bölgede tanınan metin ve bölgenin sınırlayıcı koordinatları.
Örneğin:
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; } } } }
Sonraki adımlar
- Cloud API kullanan bir uygulamanın üretim sürümüne dağıtım yapmadan önce şunları yapmanız gerekir: önlemek ve etkilerini azaltmak amacıyla neden olabileceğiyle ilgili daha fazla bilgi edinin.