Görsellerdeki metinleri tanımak için Firebase ML'yi kullanabilirsiniz. Firebase ML'de hem resimlerdeki metinlerin (ör. sokak tabelalarındaki metin) tanınmaya uygun genel amaçlı bir API'ye hem de belge metinlerini tanımak için optimize edilmiş bir API'ye sahip olması gerekir.
Başlamadan önce
-
Uygulamanıza Firebase'i henüz eklemediyseniz başlangıç kılavuzundaki adımları uygulayarak bunu yapın.
- Xcode'da, uygulamanız açıkken File > Add Packages'a (Dosya > Paket Ekle) gidin.
- İstendiğinde Firebase Apple platformlar SDK deposunu ekleyin:
- Firebase ML kitaplığını seçin.
-ObjC
işaretini, hedefinizin derleme ayarlarındaki Diğer Bağlayıcı İşaretleri bölümüne ekleyin.- İşlem tamamlandığında Xcode, arka planda bağımlılıklarınızı otomatik olarak çözümlemeye ve indirmeye başlar.
- Uygulamanızda Firebase'i içe aktarın:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
Projeniz için Cloud tabanlı API'leri henüz etkinleştirmediyseniz hemen etkinleştirin:
- Firebase konsolunun Firebase ML API'leri sayfasını açın.
-
Projenizi daha önce Blaze fiyatlandırma planına yükseltmediyseniz Yükselt'i tıklayarak yükseltme yapabilirsiniz. (Yalnızca projeniz Blaze planında değilse yükseltme yapmanız istenir.)
Bulut tabanlı API'ler yalnızca Blaze düzeyindeki projelerde kullanılabilir.
- Cloud tabanlı API'ler henüz etkinleştirilmemişse Cloud tabanlı API'leri etkinleştir'i tıklayın.
Firebase bağımlılıklarını yükleyip yönetmek için Swift Package Manager'ı kullanın.
https://github.com/firebase/firebase-ios-sdk.git
Sonra, bazı uygulama içi kurulum işlemleri gerçekleştirin:
Artık resimlerdeki metinleri tanımaya hazırsınız.
Giriş resmi kuralları
-
Firebase ML'nin metni doğru bir şekilde tanıyabilmesi için giriş resimleri, yeterli piksel verisiyle temsil edilen metin içermelidir. İdeal olarak, Latin metinleri için her karakter en az 16x16 piksel olmalıdır. Çince, Japonca ve Korece metinler için her karakter 24x24 piksel olmalıdır. Tüm dillerde, karakterlerin 24x24 pikselden büyük olması genellikle herhangi bir doğruluk avantajı sağlamaz.
Bu nedenle, örneğin, 640x480 boyutundaki bir resim, resmin tam genişliğini kaplayan bir kartviziti taramak için iyi sonuç verebilir. Harf boyutunda kağıda basılı bir dokümanı taramak için 720x1280 piksel boyutunda bir resim gerekli olabilir.
-
Kötü resim odağı, metin tanıma doğruluğunu olumsuz etkileyebilir. Kabul edilebilir sonuçlar alamıyorsanız kullanıcıdan resmi yeniden çekmesini isteyin.
Resimlerdeki metinleri tanıyın
Görüntüdeki metni 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
Görüntüyü,VisionTextRecognizer
'nin process(_:completion:)
yöntemine UIImage
veya CMSampleBufferRef
olarak iletin:
cloudTextRecognizer
çağrısı yaparakVisionTextRecognizer
örneğini alın:Swift
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
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];
-
Cloud Vision'ı çağırmak için görüntünün base64 kodlu bir dize olarak biçimlendirilmelidir. Bir
UIImage
öğesini işlemek için:Swift
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
-
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 birVisionText
nesnesi döndürür. VisionText
nesnesi, resimde algılanan tam metni ve sıfır veya daha fazla VisionTextBlock
nesneyi içerir.
Her VisionTextBlock
, sıfır veya daha fazla VisionTextLine
nesne içeren dikdörtgen bir metin blokunu temsil eder. Her VisionTextLine
nesnesi, kelimeleri ve kelime benzeri varlıkları (tarihler, sayılar vb.) temsil eden sıfır veya daha fazla VisionTextElement
nesne içerir.
Her VisionTextBlock
, VisionTextLine
ve VisionTextElement
nesnesi için bölgede tanınan metin ve bölgenin sınırlayıcı koordinatlarını alabilirsiniz.
Örnek:
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; } } }
Sonraki adımlar
- Cloud API kullanan bir uygulamanın üretimine dağıtmadan önce yetkisiz API erişiminin etkilerini önlemek ve azaltmak için ek adımlar atmanız gerekir.
Belge resimlerindeki metinleri tanıyın
Bir dokümandaki metni tanımak için doküman metni tanıyıcıyı aşağıda açıklandığı şekilde yapılandırıp çalıştırın.
Aşağıda açıklanan belge metni tanıma API'si, belge görüntüleriyle çalışırken daha kullanışlı olması amaçlanan bir arayüz sağlar. Ancak seyrek metin API'si tarafından sağlanan arayüzü tercih ederseniz bulut metin tanıyıcıyı yoğun metin modelini kullanacak şekilde yapılandırarak dokümanları taramak yerine bu arayüzü kullanabilirsiniz.
Doküman metni tanıma API'sini kullanmak için:
1. Metin tanıyıcıyı çalıştır
Görüntüyü,VisionDocumentTextRecognizer
'nin process(_:completion:)
yöntemine UIImage
veya CMSampleBufferRef
olarak iletin:
cloudDocumentTextRecognizer
çağrısı yaparakVisionDocumentTextRecognizer
örneğini alın: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];
-
Cloud Vision'ı çağırmak için görüntünün base64 kodlu bir dize olarak biçimlendirilmelidir. Bir
UIImage
öğesini işlemek için:Swift
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
-
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 birVisionDocumentText
nesnesi döndürür. VisionDocumentText
nesnesi, resimde tanınan tam metni ve tanınan belgenin yapısını yansıtan nesnelerin hiyerarşisini içerir:
Her VisionDocumentTextBlock
, VisionDocumentTextParagraph
, VisionDocumentTextWord
ve VisionDocumentTextSymbol
nesnesi için bölgede tanınan metni ve bölgenin sınırlayıcı koordinatlarını alabilirsiniz.
Örnek:
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 üretimine dağıtmadan önce yetkisiz API erişiminin etkilerini önlemek ve azaltmak için ek adımlar atmanız gerekir.