Resimlerdeki metni tanımak için Firebase ML simgesini kullanabilirsiniz. Firebase ML, hem resimlerdeki metni (ör. sokak tabelası metni) tanımaya uygun genel amaçlı bir API'ye hem de belgelerin metnini tanımak için optimize edilmiş bir API'ye sahiptir.
Başlamadan önce
-
Firebase'i uygulamanıza henüz eklemediyseniz başlangıç kılavuzundaki adımları uygulayarak ekleyin.
- Xcode'da, uygulamanız açıkken Dosya > Paket Ekle'ye gidin.
- İstendiğinde Firebase Apple platformları SDK deposunu ekleyin:
- Firebase ML kitaplığını seçin.
-ObjC
işaretini, hedefinizin derleme ayarlarının Diğer Bağlantı Oluşturucu İşaretleri bölümüne ekleyin.- İşlem tamamlandığında Xcode, arka planda bağımlıları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 bulut tabanlı API'leri henüz etkinleştirmediyseniz şimdi etkinleştirin:
- Firebase konsolunun Firebase ML API'leri sayfasını açın.
-
Projenizi Blaze fiyatlandırma planına henüz yükseltmediyseniz bunu yapmak için Yükselt'i tıklayın. (Yükseltme işlemini yalnızca projeniz Blaze planında değilse yapmanız istenir.)
Cloud tabanlı API'ler yalnızca Blaze düzeyindeki projelerde kullanılabilir.
- Bulut tabanlı API'ler etkinleştirilmemişse Bulut tabanlı API'leri etkinleştir'i tıklayın.
Firebase bağımlılarını yüklemek ve yönetmek için Swift Package Manager'ı kullanın.
Firebase SDK'larını Apple projenize eklemenin farklı yolları (ör. doğrudan çerçeveleri içe aktarma ve CocoaPods kullanma) hakkında bilgi edinmek içinhttps://github.com/firebase/firebase-ios-sdk.git
Ardından, uygulama içi bazı ayarları yapın:
Artık resimlerdeki metinleri tanımaya hazırsınız.
Giriş resmi kuralları
-
Firebase ML'ün metni doğru şekilde tanıması için giriş resimlerinin, yeterli piksel verisiyle temsil edilen metin içermesi gerekir. İdeal olarak, Latin alfabesindeki her karakter en az 16x16 piksel olmalıdır. Çince, Japonca ve Korece metinlerde her karakter 24x24 piksel olmalıdır. Tüm diller için karakterlerin 24x24 pikselden büyük olmasının doğruluk açısından genellikle bir avantajı yoktur.
Örneğin, 640x480 boyutunda bir resim, resmin tüm genişliğini kaplayan bir kartvizitin taranması için uygun olabilir. A4 kağıdına basılmış bir belgeyi taramak için 720x1280 piksel boyutunda bir resim gerekebilir.
-
Kötü resim odaklanması, metin tanıma doğruluğunu olumsuz etkileyebilir. Kabul edilebilir sonuçlar elde edemiyorsanız kullanıcıdan resmi yeniden çekmesini isteyin.
Resimlerdeki metinleri tanıyın
Bir resimdeki metni tanımak için metin tanımayı aşağıda açıklandığı şekilde çalıştırın.
1. Metin tanıyıcıyı çalıştırma
ResmiUIImage
veya CMSampleBufferRef
olarak VisionTextRecognizer
'nin process(_:completion:)
yöntemine iletin:
cloudTextRecognizer
çağrısı yaparakVisionTextRecognizer
örneği 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'u çağırmak için görüntünün base64 kodlu bir dize olarak biçimlendirilmesi gerekir.
UIImage
dosyasını 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ından metin ayıklama
Metin tanıma işlemi başarılı olursa birVisionText
nesnesi döndürülür. VisionText
nesnesi, resimde tanınan metnin tamamını ve sıfır veya daha fazla VisionTextBlock
nesnesini içerir.
Her VisionTextBlock
, sıfır veya daha fazla VisionTextLine
nesnesi içeren dikdörtgen bir metin bloğunu temsil eder. Her VisionTextLine
nesnesi, kelimeleri ve kelime benzeri varlıkları (tarihler, sayılar vb.) temsil eden sıfır veya daha fazla VisionTextElement
nesnesi içerir.
Her VisionTextBlock
, VisionTextLine
ve VisionTextElement
nesnesi için bölgede tanınan metni ve bölgenin sınır koordinatlarını alabilirsiniz.
Ö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; } } }
Sonraki adımlar
- Cloud API kullanan bir uygulamayı üretime dağıtmadan önce yetkisiz API erişimini önlemek ve etkisini azaltmak için bazı ek adımlar atmanız gerekir.
Belge resimlerindeki metinleri tanıma
Bir belgenin metnini tanımak için belge metin tanımayı aşağıda açıklandığı şekilde yapılandırın ve çalıştırın.
Aşağıda açıklanan belge metin tanıma API'si, belge resimleriyle çalışmak için daha uygun olması amaçlanan bir arayüz sağlar. Bununla birlikte, seyrek metin API'si tarafından sağlanan arayüzü tercih ediyorsanız bulut metin tanımayı yoğun metin modelini kullanacak şekilde yapılandırarak dokümanları taramak için bu API'yi kullanabilirsiniz.
Belge metin tanıma API'sini kullanmak için:
1. Metin tanıyıcıyı çalıştırma
ResmiUIImage
veya CMSampleBufferRef
olarak VisionDocumentTextRecognizer
'nin process(_:completion:)
yöntemine iletin:
cloudDocumentTextRecognizer
çağrısı yaparakVisionDocumentTextRecognizer
örneği 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'u çağırmak için görüntünün base64 kodlu bir dize olarak biçimlendirilmesi gerekir.
UIImage
dosyasını 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ından metin ayıklama
Metin tanıma işlemi başarılı olursa birVisionDocumentText
nesnesi döndürülür. VisionDocumentText
nesnesi, resimde tanınan metnin tamamını ve tanınan belgenin yapısını yansıtan bir nesne hiyerarşisini içerir:
Her VisionDocumentTextBlock
, VisionDocumentTextParagraph
, VisionDocumentTextWord
ve VisionDocumentTextSymbol
nesnesi için bölgede tanınan metni ve bölgenin sınır koordinatlarını alabilirsiniz.
Ö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 uygulamayı üretime dağıtmadan önce yetkisiz API erişimini önlemek ve etkisini azaltmak için bazı ek adımlar atmanız gerekir.