iOS'te Firebase ML ile Görsellerdeki Metinleri Tanıma

Resimlerdeki metinleri tanımak için Firebase ML simgesini kullanabilirsiniz. Firebase ML, resimlerdeki metinleri (ör. sokak tabelasındaki metin) tanımaya uygun genel amaçlı bir API'ye ve belgelerdeki metinleri tanımak için optimize edilmiş bir API'ye sahiptir.

Başlamadan önce

    Firebase'i henüz uygulamanıza eklemediyseniz başlangıç kılavuzundaki adımları uygulayarak ekleyin.

    Firebase bağımlılarını yükleyip yönetmek için Swift Package Manager'ı kullanın.

    1. Xcode'da, uygulamanız açıkken File > Add Packages (Dosya > Paket Ekle) seçeneğine gidin.
    2. İstendiğinde Firebase Apple platformları SDK deposunu ekleyin:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Firebase ML kitaplığını seçin.
    5. -ObjC işaretini hedefinizin derleme ayarlarının Other Linker Flags (Diğer Bağlayıcı İşaretleri) bölümüne ekleyin.
    6. İşlem tamamlandığında Xcode otomatik olarak arka planda bağımlılarınızı çözümlemeye ve indirmeye başlar.

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

    1. Uygulamanıza Firebase'i aktarın:

      Swift

      import FirebaseMLModelDownloader

      Objective-C

      @import FirebaseMLModelDownloader;
  1. Projeniz için henüz etkinleştirmediyseniz Cloud tabanlı API'leri şimdi etkinleştirin:

    1. Firebase konsolunda Firebase ML API'ler sayfasını açın.
    2. Projenizi henüz kullandıkça öde Blaze fiyatlandırma planına yükseltmediyseniz yükseltmek için Yükselt'i tıklayın. (Yalnızca projeniz Blaze fiyatlandırma planında değilse yükseltmeniz istenir.)

      Yalnızca Blaze fiyatlandırma planındaki projeler bulut tabanlı API'leri kullanabilir.

    3. Bulut tabanlı API'ler henüz etkinleştirilmediyse Bulut tabanlı API'leri etkinleştir'i tıklayın.

Artık resimlerdeki metinleri tanımaya başlayabilirsiniz.

Giriş resmi kuralları

  • Firebase ML'nın metni doğru şekilde tanıması için giriş resimlerinde yeterli piksel verisiyle temsil edilen metin bulunmalıdır. İdeal olarak, Latin metinlerde her karakter en az 16x16 piksel olmalıdır. Çince, Japonca ve Korece metinlerde her karakter 24x24 piksel olmalıdır. Genel olarak, tüm dillerde karakterlerin 24x24 pikselden büyük olması doğruluk açısından bir avantaj sağlamaz.

    Bu nedenle, örneğin, resmin tam genişliğini kaplayan bir kartviziti taramak için 640x480 boyutundaki bir resim iyi sonuç verebilir. Mektup boyutunda kağıda yazdırılmış bir belgeyi taramak için 720x1280 piksel boyutunda bir görüntü gerekebilir.

  • Resmin net olmaması, 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

Bir resimdeki metni tanımak için aşağıda açıklandığı şekilde metin tanıma aracını çalıştırın.

1. Metin tanıyıcıyı çalıştırma

Resmi UIImage veya CMSampleBufferRef olarak VisionTextRecognizer'nin process(_:completion:) yöntemine iletin:

  1. VisionTextRecognizer numaralı telefonu arayarak VisionTextRecognizer örneğini alın: cloudTextRecognizer:

    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];
  2. Cloud Vision'ı çağırmak için görüntünün base64 kodlu bir dize olarak biçimlendirilmesi gerekir. UIImage 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];
  3. Ardından, görüntüyü 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 çıkarma

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


Belge resimlerindeki metinleri tanıma

Bir belgedeki metni tanımak için belge metni tanıyıcıyı 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 resimleriyle çalışmayı kolaylaştırmak için tasarlanmış bir arayüz sağlar. Ancak, seyrek metin API'sinin sağladığı arayüzü tercih ederseniz bulut metin tanıyıcıyı yoğun metin modelini kullanacak şekilde yapılandırarak belgeleri taramak için bu arayüzü kullanabilirsiniz.

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

1. Metin tanıyıcıyı çalıştırma

Resmi UIImage veya CMSampleBufferRef olarak VisionDocumentTextRecognizer'nin process(_:completion:) yöntemine iletin:

  1. VisionDocumentTextRecognizer numaralı telefonu 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];
  2. Cloud Vision'ı çağırmak için görüntünün base64 kodlu bir dize olarak biçimlendirilmesi gerekir. UIImage 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];
  3. Ardından, görüntüyü 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 çıkarma

Metin tanıma işlemi başarılı olursa VisionDocumentText 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ırlama 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