Resimlerdeki metni tanımak için Firebase ML'yi kullanabilirsiniz. Firebase ML, hem sokak tabelası metni gibi resimlerdeki metinleri tanımaya uygun genel amaçlı bir API'ye hem de belgelerin metnini tanımak için optimize edilmiş bir API'ye sahiptir.
Sen başlamadan önce
- Firebase'i uygulamanıza henüz eklemediyseniz başlangıç kılavuzundaki adımları izleyerek bunu yapın.
- Xcode'da uygulama projeniz açıkken Dosya > Paket Ekle'ye gidin.
- İstendiğinde Firebase Apple platformları SDK deposunu ekleyin:
- Firebase ML kitaplığını seçin.
-
-ObjC
bayrağını hedefinizin derleme ayarlarının Diğer Bağlayıcı Bayrakları bölümüne ekleyin. - Bitirdiğinizde Xcode, bağımlılıklarınızı arka planda otomatik olarak çözmeye ve indirmeye başlayacaktır.
- Uygulamanızda Firebase'i içe aktarın:
Süratli
import FirebaseMLModelDownloader
Amaç-C
@import FirebaseMLModelDownloader;
Projeniz için Bulut tabanlı API'leri henüz etkinleştirmediyseniz şimdi yapın:
- Firebase konsolunun Firebase ML API'leri sayfasını açın.
Projenizi henüz Blaze fiyatlandırma planına yükseltmediyseniz bunu yapmak için Yükselt'e tıklayın. (Yalnızca projeniz Blaze planında değilse yükseltme yapmanız istenecektir.)
Yalnızca Blaze düzeyindeki projeler Bulut tabanlı API'leri kullanabilir.
- Bulut tabanlı API'ler henüz etkin değilse Bulut Tabanlı API'leri Etkinleştir'i tıklayın.
Firebase bağımlılıklarını yüklemek ve yönetmek için Swift Paket Yöneticisini kullanın.
https://github.com/firebase/firebase-ios-sdk.git
Ardından, bazı uygulama içi kurulumları gerçekleştirin:
Artık resimlerdeki metni tanımaya hazırsınız.
Giriş görseli yönergeleri
Firebase ML'nin metni doğru bir şekilde tanıyabilmesi için giriş görüntülerinin yeterli piksel verileriyle temsil edilen metin içermesi gerekir. İdeal olarak Latince metinlerde 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 genellikle doğruluk açısından bir avantajı yoktur.
Örneğin, 640x480 boyutunda bir görüntü, görüntünün tüm genişliğini kaplayan bir kartviziti taramak için iyi sonuç verebilir. Letter boyutunda kağıda basılmış bir belgeyi taramak için 720x1280 piksel boyutunda bir görüntü gerekebilir.
Zayıf görüntü odağı metin tanıma doğruluğuna zarar verebilir. Kabul edilebilir sonuçlar alamıyorsanız kullanıcıdan görüntüyü yeniden yakalamasını istemeyi deneyin.
Resimlerdeki metni tanıma
Bir 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ın
Görüntüyü birUIImage
veya CMSampleBufferRef
olarak VisionTextRecognizer
process(_:completion:)
yöntemine iletin:-
cloudTextRecognizer
çağırarakVisionTextRecognizer
örneğini alın:Süratli
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)
Amaç-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çimlendirilmesi gerekir. Bir
UIImage
işlemek için:Süratli
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Amaç-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Ardından görüntüyü
process(_:completion:)
yöntemine iletin:Süratli
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Amaç-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 metni çıkarın
Metin tanıma işlemi başarılı olursa birVisionText
nesnesi döndürülür. Bir VisionText
nesnesi, görüntüde tanınan tam metni 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, sözcükleri ve sözcük 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ırlayıcı koordinatlarını alabilirsiniz.
Örneğin:
Süratli
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 } } }
Amaç-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 görsellerindeki metni tanıma
Bir belgenin metnini tanımak için belge metin tanıyıcısını aşağıda açıklandığı şekilde yapılandırın ve çalıştırın.
Aşağıda açıklanan belge metni tanıma API'si, belge görselleriyle çalışmak için daha uygun 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 belgeleri taramak için bunu kullanabilirsiniz.
Belge metni tanıma API'sini kullanmak için:
1. Metin tanıyıcıyı çalıştırın
Görüntüyü birUIImage
veya CMSampleBufferRef
olarak VisionDocumentTextRecognizer
process(_:completion:)
yöntemine iletin:-
cloudDocumentTextRecognizer
öğesini çağırarakVisionDocumentTextRecognizer
örneğini alın:Süratli
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)
Amaç-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çimlendirilmesi gerekir. Bir
UIImage
işlemek için:Süratli
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Amaç-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Ardından görüntüyü
process(_:completion:)
yöntemine iletin:Süratli
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Amaç-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 metni çıkarın
Metin tanıma işlemi başarılı olursaVisionDocumentText
nesnesini döndürür. VisionDocumentText
nesnesi, görüntüde 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.
Örneğin:
Süratli
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 } } } }
Amaç-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.