Catch up on highlights from Firebase at Google I/O 2023. Learn more

Rozpoznaj tekst w obrazach za pomocą Firebase ML na iOS

Możesz użyć Firebase ML do rozpoznawania tekstu na obrazach. Firebase ML ma zarówno interfejs API ogólnego przeznaczenia, odpowiedni do rozpoznawania tekstu na obrazach, na przykład tekstu znaku ulicznego, jak i interfejs API zoptymalizowany pod kątem rozpoznawania tekstu dokumentów.

Zanim zaczniesz

    Jeśli jeszcze nie dodałeś Firebase do swojej aplikacji, zrób to, wykonując czynności opisane w przewodniku wprowadzającym .

    Użyj Menedżera pakietów Swift, aby zainstalować i zarządzać zależnościami Firebase.

    1. W Xcode przy otwartym projekcie aplikacji przejdź do File > Add Packages .
    2. Po wyświetleniu monitu dodaj repozytorium Firebase Apple platforms SDK:
    3.   https://github.com/firebase/firebase-ios-sdk
    4. Wybierz bibliotekę Firebase ML.
    5. Po zakończeniu Xcode automatycznie rozpocznie rozwiązywanie i pobieranie zależności w tle.

    Następnie wykonaj konfigurację w aplikacji:

    1. W swojej aplikacji zaimportuj Firebase:

      Szybki

      import FirebaseMLModelDownloader

      Cel C

      @import FirebaseMLModelDownloader;
  1. Jeśli jeszcze nie włączyłeś interfejsów API opartych na chmurze dla swojego projektu, zrób to teraz:

    1. Otwórz stronę Firebase ML APIs w konsoli Firebase.
    2. Jeśli jeszcze nie zaktualizowałeś swojego projektu do planu cenowego Blaze, kliknij Uaktualnij , aby to zrobić. (Zostaniesz poproszony o uaktualnienie tylko wtedy, gdy Twój projekt nie jest objęty planem Blaze).

      Tylko projekty na poziomie Blaze mogą korzystać z interfejsów API opartych na chmurze.

    3. Jeśli interfejsy API oparte na chmurze nie są jeszcze włączone, kliknij opcję Włącz interfejsy API oparte na chmurze .

Teraz możesz rozpocząć rozpoznawanie tekstu na obrazach.

Wprowadź wskazówki dotyczące obrazu

  • Aby Firebase ML dokładnie rozpoznawał tekst, obrazy wejściowe muszą zawierać tekst reprezentowany przez wystarczającą ilość danych w pikselach. Idealnie, dla tekstu łacińskiego, każdy znak powinien mieć co najmniej 16x16 pikseli. W przypadku tekstu chińskiego, japońskiego i koreańskiego każdy znak powinien mieć rozmiar 24 x 24 piksele. W przypadku wszystkich języków generalnie nie ma żadnych korzyści w zakresie dokładności, jeśli znaki są większe niż 24 x 24 piksele.

    Na przykład obraz o rozdzielczości 640 x 480 może dobrze nadawać się do zeskanowania wizytówki, która zajmuje całą szerokość obrazu. Aby zeskanować dokument wydrukowany na papierze formatu Letter, może być wymagany obraz o rozdzielczości 720 x 1280 pikseli.

  • Słaba ostrość obrazu może zaszkodzić dokładności rozpoznawania tekstu. Jeśli nie otrzymujesz akceptowalnych wyników, spróbuj poprosić użytkownika o ponowne przechwycenie obrazu.


Rozpoznawanie tekstu na obrazach

Aby rozpoznać tekst na obrazie, uruchom narzędzie do rozpoznawania tekstu w sposób opisany poniżej.

1. Uruchom rozpoznawanie tekstu

Przekaż obraz jako UIImage lub CMSampleBufferRef do process(_:completion:) VisionTextRecognizer :

  1. Uzyskaj instancję VisionTextRecognizer , wywołując cloudTextRecognizer :

    Szybki

    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)
    

    Cel 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. Aby wywołać Cloud Vision, obraz musi być sformatowany jako ciąg zakodowany w base64. Aby przetworzyć UIImage :

    Szybki

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

    Cel C

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. Następnie przekaż obraz do metody process(_:completion:) :

    Szybki

    textRecognizer.process(visionImage) { result, error in
      guard error == nil, let result = result else {
        // ...
        return
      }
    
      // Recognized text
    }
    

    Cel C

    [textRecognizer processImage:image
                      completion:^(FIRVisionText *_Nullable result,
                                   NSError *_Nullable error) {
      if (error != nil || result == nil) {
        // ...
        return;
      }
    
      // Recognized text
    }];
    

2. Wyodrębnij tekst z bloków rozpoznanego tekstu

Jeśli operacja rozpoznawania tekstu powiedzie się, zwróci obiekt VisionText . Obiekt VisionText zawiera pełny tekst rozpoznawany na obrazie i zero lub więcej obiektów VisionTextBlock .

Każdy VisionTextBlock reprezentuje prostokątny blok tekstu, który zawiera zero lub więcej obiektów VisionTextLine . Każdy obiekt VisionTextLine zawiera zero lub więcej obiektów VisionTextElement , które reprezentują słowa i obiekty podobne do słów (daty, liczby itd.).

Dla każdego obiektu VisionTextBlock , VisionTextLine i VisionTextElement można rozpoznać tekst w regionie i współrzędne ograniczające region.

Na przykład:

Szybki

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
        }
    }
}

Cel 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;
    }
  }
}

Następne kroki


Rozpoznawanie tekstu na obrazach dokumentów

Aby rozpoznać tekst dokumentu, skonfiguruj i uruchom narzędzie do rozpoznawania tekstu dokumentu zgodnie z poniższym opisem.

Opisany poniżej interfejs API rozpoznawania tekstu dokumentu zapewnia interfejs, który ma być wygodniejszy w pracy z obrazami dokumentów. Jeśli jednak wolisz interfejs zapewniany przez interfejs API tekstu rzadkiego, możesz go użyć do skanowania dokumentów, konfigurując aparat rozpoznawania tekstu w chmurze do korzystania z modelu gęstego tekstu .

Aby użyć interfejsu API rozpoznawania tekstu dokumentu:

1. Uruchom rozpoznawanie tekstu

Przekaż obraz jako UIImage lub CMSampleBufferRef do process(_:completion:) VisionDocumentTextRecognizer :

  1. Uzyskaj instancję VisionDocumentTextRecognizer , wywołując cloudDocumentTextRecognizer :

    Szybki

    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)
    

    Cel 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. Aby wywołać Cloud Vision, obraz musi być sformatowany jako ciąg zakodowany w base64. Aby przetworzyć UIImage :

    Szybki

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

    Cel C

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. Następnie przekaż obraz do metody process(_:completion:) :

    Szybki

    textRecognizer.process(visionImage) { result, error in
      guard error == nil, let result = result else {
        // ...
        return
      }
    
      // Recognized text
    }
    

    Cel C

    [textRecognizer processImage:image
                      completion:^(FIRVisionDocumentText *_Nullable result,
                                   NSError *_Nullable error) {
      if (error != nil || result == nil) {
        // ...
        return;
      }
    
        // Recognized text
    }];
    

2. Wyodrębnij tekst z bloków rozpoznanego tekstu

Jeśli operacja rozpoznawania tekstu powiedzie się, zwróci obiekt VisionDocumentText . Obiekt VisionDocumentText zawiera pełny tekst rozpoznany na obrazie oraz hierarchię obiektów odzwierciedlającą strukturę rozpoznanego dokumentu:

Dla każdego obiektu VisionDocumentTextBlock , VisionDocumentTextParagraph , VisionDocumentTextWord i VisionDocumentTextSymbol można rozpoznać tekst w regionie i współrzędne ograniczające region.

Na przykład:

Szybki

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
            }
        }
    }
}

Cel 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;
      }
    }
  }
}

Następne kroki