Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Rozpoznaj tekst w obrazach za pomocą Firebase ML na iOS

Możesz używać Firebase ML do rozpoznawania tekstu na obrazach. Firebase ML ma zarówno interfejs API ogólnego przeznaczenia, który nadaje się do rozpoznawania tekstu na obrazach, np. tekst znaku ulicznego, jak i interfejs API zoptymalizowany pod kątem rozpoznawania tekstu w dokumentach.

Zanim zaczniesz

  1. Jeśli nie masz już dodane Firebase do aplikacji, należy to zrobić, wykonując czynności opisane w podręcznej instrukcji .
  2. Obejmują Firebase w Podfile:
    pod 'Firebase/MLVision'
    
    Po zainstalowaniu lub aktualizacji Pods Twojego projektu, należy otworzyć swój projekt Xcode używając jego .xcworkspace .
  3. W swojej aplikacji zaimportuj Firebase:

    Szybki

    import Firebase

    Cel C

    @import Firebase;
  4. Jeśli nie masz jeszcze włączonych interfejsów API opartych na chmurze w swoim projekcie, zrób to teraz:

    1. Otwórz stronę Firebase ML API konsoli Firebase.
    2. Jeśli nie masz już uaktualniony projekt do planu cenowego Blaze, kliknij przycisk Zmień, 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 API w chmurze nie są już włączone, kliknij przycisk Włącz API chmurowej.

Teraz możesz zacząć rozpoznawać tekst na obrazach.

Wskazówki dotyczące obrazu wejściowego

  • Aby usługa Firebase ML mogła dokładnie rozpoznawać tekst, obrazy wejściowe muszą zawierać tekst reprezentowany przez wystarczającą ilość danych pikseli. Idealnie, w przypadku tekstu łacińskiego, każdy znak powinien mieć co najmniej 16x16 pikseli. W przypadku tekstu w języku chińskim, japońskim i koreańskim każdy znak powinien mieć wymiary 24x24 piksele. W przypadku wszystkich języków nie ma na ogół korzyści z dokładności w przypadku znaków większych niż 24x24 piksele.

    Na przykład obraz 640x480 może dobrze się sprawdzić w przypadku wizytówki zajmującej całą szerokość obrazu. Aby zeskanować dokument wydrukowany na papierze formatu Letter, może być wymagany obraz o wymiarach 720x1280 pikseli.

  • Słaba ostrość obrazu może zaszkodzić dokładności rozpoznawania tekstu. Jeśli nie uzyskujesz zadowalających wyników, poproś użytkownika o ponowne przechwycenie obrazu.


Rozpoznawaj tekst na obrazach

Aby rozpoznać tekst na obrazie, uruchom aparat rozpoznawania tekstu w sposób opisany poniżej.

1. Uruchom aparat rozpoznawania tekstu

Przepuścić obrazu jako UIImage lub CMSampleBufferRef do tego VisionTextRecognizer „s process(_:completion:) sposobu:

  1. Uzyskaj wystąpienie 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 można było wywołać Cloud Vision, obraz musi być sformatowany jako ciąg znaków zakodowany w base64. 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 przekazać obraz do process(_:completion:) metoda:

    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 się powiedzie rozpoznawania tekstu, zwróci się VisionText obiekt. VisionText obiekt zawiera pełny tekst rozpoznany na obraz i zero lub więcej VisionTextBlock obiektów.

Każdy VisionTextBlock przedstawia prostokątny blok tekstu, który zawiera zero lub większą liczbę VisionTextLine obiektów. Każdy VisionTextLine obiekt zawiera zero lub więcej VisionTextElement obiektów, które reprezentują słowa i słowa, jak podmioty (daty, liczby, i tak dalej).

Dla każdego VisionTextBlock , VisionTextLine i VisionTextElement obiektu, można uzyskać tekst rozpoznany w regionie oraz obwiedni współrzędne regionu.

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


Rozpoznawaj tekst na obrazach dokumentów

Aby rozpoznać tekst dokumentu, skonfiguruj i uruchom aparat rozpoznawania tekstu dokumentu w sposób opisany poniżej.

Opisany poniżej interfejs API rozpoznawania tekstu dokumentu zapewnia interfejs, który ma być wygodniejszy do pracy z obrazami dokumentów. Jednakże, jeśli wolisz interfejs dostarczony przez rozrzedzony tekstu API, można go używać zamiast do skanowania dokumentów poprzez skonfigurowanie rozpoznawania chmura tekstową użyć gęstego modelu tekstu .

Aby użyć interfejsu API rozpoznawania tekstu dokumentu:

1. Uruchom aparat rozpoznawania tekstu

Przepuścić obrazu jako UIImage lub CMSampleBufferRef do tego VisionDocumentTextRecognizer „s process(_:completion:) sposobu:

  1. Uzyskaj wystąpienie 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 można było wywołać Cloud Vision, obraz musi być sformatowany jako ciąg znaków zakodowany w base64. 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 przekazać obraz do process(_:completion:) metoda:

    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 się powiedzie rozpoznawania tekstu, zwróci się VisionDocumentText obiekt. VisionDocumentText obiekt zawiera pełny tekst rozpoznany na obraz i hierarchii obiektów, które odzwierciedlają strukturę rozpoznanego dokumentu:

Dla każdego VisionDocumentTextBlock , VisionDocumentTextParagraph , VisionDocumentTextWord i VisionDocumentTextSymbol obiektu, można uzyskać tekst rozpoznany w regionie oraz obwiedni współrzędne regionu.

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