Google стремится к продвижению расового равенства для чернокожего населения. Смотри как.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Признайте текст в изображениях с ML Kit на прошивке

Вы можете использовать ML Kit для распознавания текста в изображениях. ML Kit имеет как общего назначения, API, пригодный для распознавания текста в изображениях, например, текст улицы знака, и API оптимизирован для распознавания текста документов. Общее назначение API имеет как на устройстве и модели облачной. распознавания текста документа доступны только в качестве модели на основе облака. См обзора для сравнения облака и на устройстве моделей.

Прежде чем вы начнете

  1. Если вы еще не добавили Firebase в ваше приложение, сделать это, следуя инструкциям , приведенным в руководстве Приступая к работе .
  2. Включите библиотеки ML Kit в вашей Podfile:
    pod 'Firebase/MLVision', '6.25.0'
    # If using an on-device API:
    pod 'Firebase/MLVisionTextModel', '6.25.0'
    
    После установки или обновления Бобы вашего проекта, не забудьте открыть свой проект Xcode , используя его .xcworkspace .
  3. В приложении, импортировать Firebase:

    стриж

    import Firebase

    Objective-C

    @import Firebase;
  4. Если вы хотите использовать модель на основе облака, и вы уже не позволили API-интерфейсов на основе облака для вашего проекта, сделайте это сейчас:

    1. Откройте страницу ML Kit API , консоли Firebase.
    2. Если вы еще не модернизировал свой проект в план Blaze, нажмите кнопку Upgrade , чтобы сделать это. (Вам будет предложено обновить только если ваш проект не по плану Blaze.)

      Только проекты Blaze уровня могут использовать API-интерфейсы на основе облака.

    3. Если API - интерфейсы на основе облака еще не включен, нажмите Включить API для облачных вычислений.

    Если вы хотите использовать только модель на устройстве, вы можете пропустить этот шаг.

Теперь вы готовы начать распознавание текста в изображениях.

принципы ввода изображения

  • Для ML Комплект для точного распознавания текста, входные изображения должны содержать текст, который представлен достаточных данных пикселя. В идеале, для латинского текста, каждый символ должен быть не менее 16х16 пикселей. Для китайского, японского и корейского текста (поддерживается только облачных API), каждый символ должен быть 24x24 пикселей. Для всех языков, нет вообще никакой точности пользы для символов, чтобы быть больше, чем 24x24 пикселей.

    Так, например, 640х480 изображения может хорошо работать, чтобы отсканировать визитную карточку, которая занимает всю ширину изображения. Для того, чтобы отсканировать документ, напечатанный на букву размера бумаги, может потребоваться 720x1280 пикселей изображения.

  • Плохое фокус изображения может повредить точности распознавания текста. Если вы не получаете приемлемые результаты, попытайтесь спросить пользователя, чтобы вернуть изображение.

  • Если вы распознавание текста в режиме реального времени приложения, вы также можете рассмотреть общие размеры входных изображений. Меньшие изображения могут быть обработаны быстрее, так, чтобы уменьшить время ожидания, захват изображения при более низких разрешениях (имея в виду выше требования к точности) и убедитесь, что текст занимает столько же изображения, как это возможно. Смотрите также советы для повышения производительности в режиме реального времени .


Распознать текст в изображениях

Для распознавания текста в изображении с использованием либо на устройстве или облачной модели, запустить текстовый распознаватель, как описано ниже.

1. Запустите текстовый распознаватель

Пропускают изображение в виде `UIImage` или` CMSampleBufferRef` к `` процесса VisionTextRecognizer` в (_: завершение:) `метод:
  1. Получить экземпляр VisionTextRecognizer по телефону либо onDeviceTextRecognizer или cloudTextRecognizer :

    стриж

    Для того, чтобы использовать эту модель на устройстве:

    let vision = Vision.vision()
    let textRecognizer = vision.onDeviceTextRecognizer()
    

    Чтобы использовать модель облака:

    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 onDeviceTextRecognizer];
    

    Чтобы использовать модель облака:

    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. Создание VisionImage объекта с использованием UIImage или CMSampleBufferRef .

    Чтобы использовать UIImage :

    1. При необходимости, вращать изображение , чтобы его imageOrientation свойство .up .
    2. Создание VisionImage объекта с помощью правильно повернутой UIImage . Не указать любое вращение метаданные значения по умолчанию, .topLeft , должно быть использовано.

      стриж

      let image = VisionImage(image: uiImage)

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    Чтобы использовать CMSampleBufferRef :

    1. Создать VisionImageMetadata объект , который определяет ориентацию данных изображения , содержащихся в CMSampleBufferRef буфере.

      Для того, чтобы получить ориентацию изображения:

      стриж

      func imageOrientation(
          deviceOrientation: UIDeviceOrientation,
          cameraPosition: AVCaptureDevice.Position
          ) -> VisionDetectorImageOrientation {
          switch deviceOrientation {
          case .portrait:
              return cameraPosition == .front ? .leftTop : .rightTop
          case .landscapeLeft:
              return cameraPosition == .front ? .bottomLeft : .topLeft
          case .portraitUpsideDown:
              return cameraPosition == .front ? .rightBottom : .leftBottom
          case .landscapeRight:
              return cameraPosition == .front ? .topRight : .bottomRight
          case .faceDown, .faceUp, .unknown:
              return .leftTop
          }
      }

      Objective-C

      - (FIRVisionDetectorImageOrientation)
          imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                                 cameraPosition:(AVCaptureDevicePosition)cameraPosition {
        switch (deviceOrientation) {
          case UIDeviceOrientationPortrait:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationLeftTop;
            } else {
              return FIRVisionDetectorImageOrientationRightTop;
            }
          case UIDeviceOrientationLandscapeLeft:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationBottomLeft;
            } else {
              return FIRVisionDetectorImageOrientationTopLeft;
            }
          case UIDeviceOrientationPortraitUpsideDown:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationRightBottom;
            } else {
              return FIRVisionDetectorImageOrientationLeftBottom;
            }
          case UIDeviceOrientationLandscapeRight:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationTopRight;
            } else {
              return FIRVisionDetectorImageOrientationBottomRight;
            }
          default:
            return FIRVisionDetectorImageOrientationTopLeft;
        }
      }

      Затем создайте объект метаданных:

      стриж

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      Objective-C

      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      AVCaptureDevicePosition cameraPosition =
          AVCaptureDevicePositionBack;  // Set to the capture device you used.
      metadata.orientation =
          [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                       cameraPosition:cameraPosition];
    2. Создание VisionImage объекта с помощью CMSampleBufferRef объекта и метаданные вращения:

      стриж

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. Затем передать изображение в process(_:completion:) Метод:

    стриж

    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. Извлечь текст из блоков распознанного текста

Если операция распознавания текста успешно, она возвращает [VisionText` `] [VisionText] объект. Символ 'Объект VisionText` содержит полный текст, признанный в образе и ноль или более [ `VisionTextBlock`] [VisionTextBlock] объектов. Каждый `VisionTextBlock` представляет собой прямоугольный блок текста, который содержит ноль или более [` VisionTextLine`] [VisionTextLine] объекты. Каждый объект `VisionTextLine` содержит ноль или более [` VisionTextElement`] [VisionTextElement] объекты, которые представляют собой слова и слова типа сущностей (даты, номера и так далее). Для каждого `` VisionTextBlock`, VisionTextLine` и объекта `VisionTextElement`, вы можете получить текст, признанный в регионе и ограничивающую координату области. Например:

стриж

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

Советы по повышению производительности в режиме реального времени

Если вы хотите использовать модель на устройстве для распознавания текста в режиме реального времени приложения, следуйте этим инструкциям, чтобы достичь наилучших частот кадров:

  • Дроссельные вызовы текста распознаватель. Если новый кадр видео становится доступным в то время как текст распознаватель работает, кадр был отброшен.
  • Если вы используете вывод текста распознаватель для наложения графики на входном изображении, первым получить результат от ML Kit, а затем сделать изображение и наложение на один шаг. Поступая таким образом, вы оказываете на поверхность дисплея только один раз для каждого входного кадра. См previewOverlayView и FIRDetectionOverlayView классов в примере приложении витрины для примера.
  • Рассмотрим захват изображений с более низким разрешением. Тем не менее, иметь в виду требования размеров изображения этого API.

Следующие шаги


Распознать текст в изображениях документов

Чтобы распознать текст документа, настроить и запустить облачный документ текста распознаватель, как описано ниже.

Документ распознавание текста API, описанный ниже, обеспечивает интерфейс, который предназначен, чтобы быть более удобными для работы с изображениями документов. Однако, если вы предпочитаете интерфейс , предоставляемый разреженного текста API, вы можете использовать его вместо того, чтобы сканировать документы, настроив облако текста распознаватель , чтобы использовать плотную текстовую модель .

Чтобы использовать API распознавания текста документа:

1. Запустите текстовый распознаватель

Пропускают изображение как UIImage или CMSampleBufferRef к VisionDocumentTextRecognizer «S process(_:completion:) метода:

  1. Получить экземпляр VisionDocumentTextRecognizer по телефону cloudDocumentTextRecognizer :

    стриж

    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. Создание VisionImage объекта с использованием UIImage или CMSampleBufferRef .

    Чтобы использовать UIImage :

    1. При необходимости, вращать изображение , чтобы его imageOrientation свойство .up .
    2. Создание VisionImage объекта с помощью правильно повернутой UIImage . Не указать любое вращение метаданные значения по умолчанию, .topLeft , должно быть использовано.

      стриж

      let image = VisionImage(image: uiImage)

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    Чтобы использовать CMSampleBufferRef :

    1. Создать VisionImageMetadata объект , который определяет ориентацию данных изображения , содержащихся в CMSampleBufferRef буфере.

      Для того, чтобы получить ориентацию изображения:

      стриж

      func imageOrientation(
          deviceOrientation: UIDeviceOrientation,
          cameraPosition: AVCaptureDevice.Position
          ) -> VisionDetectorImageOrientation {
          switch deviceOrientation {
          case .portrait:
              return cameraPosition == .front ? .leftTop : .rightTop
          case .landscapeLeft:
              return cameraPosition == .front ? .bottomLeft : .topLeft
          case .portraitUpsideDown:
              return cameraPosition == .front ? .rightBottom : .leftBottom
          case .landscapeRight:
              return cameraPosition == .front ? .topRight : .bottomRight
          case .faceDown, .faceUp, .unknown:
              return .leftTop
          }
      }

      Objective-C

      - (FIRVisionDetectorImageOrientation)
          imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                                 cameraPosition:(AVCaptureDevicePosition)cameraPosition {
        switch (deviceOrientation) {
          case UIDeviceOrientationPortrait:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationLeftTop;
            } else {
              return FIRVisionDetectorImageOrientationRightTop;
            }
          case UIDeviceOrientationLandscapeLeft:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationBottomLeft;
            } else {
              return FIRVisionDetectorImageOrientationTopLeft;
            }
          case UIDeviceOrientationPortraitUpsideDown:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationRightBottom;
            } else {
              return FIRVisionDetectorImageOrientationLeftBottom;
            }
          case UIDeviceOrientationLandscapeRight:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationTopRight;
            } else {
              return FIRVisionDetectorImageOrientationBottomRight;
            }
          default:
            return FIRVisionDetectorImageOrientationTopLeft;
        }
      }

      Затем создайте объект метаданных:

      стриж

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      Objective-C

      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      AVCaptureDevicePosition cameraPosition =
          AVCaptureDevicePositionBack;  // Set to the capture device you used.
      metadata.orientation =
          [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                       cameraPosition:cameraPosition];
    2. Создание VisionImage объекта с помощью CMSampleBufferRef объекта и метаданные вращения:

      стриж

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. Затем передать изображение в process(_:completion:) Метод:

    стриж

    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. Извлечь текст из блоков распознанного текста

Если операция распознавания текста успешно, она возвращает VisionDocumentText объект. VisionDocumentText объект содержит полный текст , признанный в образе и иерархии объектов, отражающих структуру признанного документа:

Для каждого VisionDocumentTextBlock , VisionDocumentTextParagraph , VisionDocumentTextWord и VisionDocumentTextSymbol объекта, вы можете получить текст , признанный в регионе и ограничивающую координату области.

Например:

стриж

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

Следующие шаги