Check out what’s new from Firebase at Google I/O 2022. Learn more

iOS'ta Firebase ML ile Görüntülerdeki Metni Tanıyın

tutucu42 l10n-yer

Resimlerdeki metni tanımak için Firebase ML'yi kullanabilirsiniz. Firebase ML, hem sokak tabelası metni gibi görüntülerdeki metni tanımaya uygun genel amaçlı bir API'ye hem de belge metnini tanımak için optimize edilmiş bir API'ye sahiptir.

Sen başlamadan önce

    Uygulamanıza henüz Firebase'i eklemediyseniz, başlangıç ​​kılavuzundaki adımları izleyerek bunu yapın.

    Firebase bağımlılıklarını kurmak ve yönetmek için Swift Paket Yöneticisi'ni kullanın.

    1. Xcode'da, uygulama projeniz açıkken File > Add Packages seçeneğine gidin.
    2. İstendiğinde, Firebase Apple platformları SDK deposunu ekleyin:
    3.   https://github.com/firebase/firebase-ios-sdk
        
    4. Firebase ML kitaplığını seçin.
    5. Bittiğinde, Xcode otomatik olarak bağımlılıklarınızı arka planda çözmeye ve indirmeye başlayacaktır.

    Ardından, bazı uygulama içi kurulumları gerçekleştirin:

    1. Uygulamanızda Firebase'i içe aktarın:

      Süratli

      import FirebaseMLModelDownloader

      Amaç-C

      @import FirebaseMLModelDownloader;
  1. Projeniz için Bulut tabanlı API'leri henüz etkinleştirmediyseniz, şimdi yapın:

    1. Firebase konsolunun Firebase ML API'leri sayfasını açın.
    2. 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 istenir.)

      Yalnızca Blaze düzeyindeki projeler Bulut tabanlı API'leri kullanabilir.

    3. Bulut tabanlı API'ler zaten etkinleştirilmemişse Bulut Tabanlı API'leri Etkinleştir 'i tıklayın.

Artık resimlerdeki metni tanımaya başlamaya hazırsınız.

Giriş resmi yönergeleri

  • Firebase ML'nin metni doğru bir şekilde tanıması için giriş görüntülerinin yeterli piksel verisi ile temsil edilen metin içermesi gerekir. İdeal olarak, Latince metin için her karakter en az 16x16 piksel olmalıdır. Çince, Japonca ve Korece metin için her karakter 24x24 piksel olmalıdır. Tüm diller için, karakterlerin 24x24 pikselden daha büyük olması için genellikle doğruluk avantajı yoktur.

    Bu nedenle, örneğin, 640x480 boyutundaki 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 yazdırılan 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 almıyorsanız, kullanıcıdan resmi yeniden çekmesini istemeyi deneyin.


Resimlerdeki metni tanıma

Bir görüntüdeki metni tanımak için, aşağıda açıklandığı gibi metin tanıyıcıyı çalıştırın.

1. Metin tanıyıcıyı çalıştırın

Görüntüyü UIImage veya CMSampleBufferRef olarak VisionTextRecognizer process(_:completion:) yöntemine iletin:

  1. cloudTextRecognizer çağırarak VisionTextRecognizer ö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];
    
  2. Cloud Vision'ı çağırmak için görüntünün base64 ile kodlanmış bir dize olarak biçimlendirilmesi gerekir. Bir UIImage işlemek için:

    Süratli

    guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return }
    let base64encodedImage = imageData.base64EncodedString()

    Amaç-C

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. 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 metin ayıklayın

Metin tanıma işlemi başarılı olursa, bir VisionText nesnesi döndürü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


Belge görüntülerindeki metni tanıma

Bir belgenin metnini tanımak için, belge metni tanıyıcısını aşağıda açıklandığı gibi yapılandırın ve çalıştırın.

Aşağıda açıklanan belge metni tanıma API'si, belge görüntüleriyle çalışmak için daha uygun olması amaçlanan bir arabirim 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 kullanabilirsiniz.

Belge metni tanıma API'sini kullanmak için:

1. Metin tanıyıcıyı çalıştırın

Görüntüyü UIImage veya CMSampleBufferRef olarak VisionDocumentTextRecognizer process(_:completion:) yöntemine iletin:

  1. VisionDocumentTextRecognizer çağırarak cloudDocumentTextRecognizer ö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];
    
  2. Cloud Vision'ı çağırmak için görüntünün base64 ile kodlanmış bir dize olarak biçimlendirilmesi gerekir. Bir UIImage işlemek için:

    Süratli

    guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return }
    let base64encodedImage = imageData.base64EncodedString()

    Amaç-C

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. 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 metin ayıklayın

Metin tanıma işlemi başarılı olursa, bir VisionDocumentText nesnesi döndürür. Bir VisionDocumentText nesnesi, görüntüde tanınan tam metni ve tanınan belgenin yapısını yansıtan nesneler 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