Nhận dạng văn bản trong hình ảnh bằng công nghệ học máy của Firebase trên iOS

Bạn có thể sử dụng công nghệ học máy của Firebase để nhận dạng văn bản trong hình ảnh. Công nghệ học máy của Firebase có cả một API đa năng phù hợp để nhận dạng văn bản trong hình ảnh, chẳng hạn như văn bản của biển báo đường phố, và một API được tối ưu hoá để nhận dạng văn bản của tài liệu.

Trước khi bắt đầu

    Nếu bạn chưa thêm Firebase vào ứng dụng của mình, hãy thêm Firebase bằng cách làm theo các bước trong hướng dẫn bắt đầu sử dụng.

    Sử dụng Trình quản lý gói Swift để cài đặt và quản lý các phần phụ thuộc Firebase.

    1. Trong Xcode, khi dự án ứng dụng của bạn đang mở, hãy chuyển đến File > Add Packages (Tệp > Thêm gói).
    2. Khi được nhắc, hãy thêm kho lưu trữ SDK nền tảng Apple của Firebase:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Chọn thư viện máy học Firebase.
    5. Thêm cờ -ObjC vào mục Cờ trình liên kết khác trong chế độ cài đặt bản dựng của mục tiêu.
    6. Khi hoàn tất, Xcode sẽ tự động bắt đầu phân giải và tải các phần phụ thuộc của bạn xuống ở chế độ nền.

    Tiếp theo, hãy thực hiện một số thiết lập trong ứng dụng:

    1. Trong ứng dụng của bạn, hãy nhập Firebase:

      Swift

      import FirebaseMLModelDownloader

      Objective-C

      @import FirebaseMLModelDownloader;
  1. Nếu bạn chưa bật API trên đám mây cho dự án của mình, hãy bật ngay:

    1. Mở trang API ML của Firebase trong bảng điều khiển của Firebase.
    2. Nếu bạn chưa nâng cấp dự án của mình lên Gói linh hoạt, hãy nhấp vào Nâng cấp để thực hiện việc này. (Bạn sẽ chỉ được nhắc nâng cấp nếu dự án của bạn không phải là Gói linh hoạt.)

      Chỉ các dự án cấp Blaze mới có thể sử dụng API trên đám mây.

    3. Nếu bạn chưa bật API trên đám mây, hãy nhấp vào Bật API dựa trên đám mây.

Bây giờ, bạn đã sẵn sàng bắt đầu nhận dạng văn bản trong hình ảnh.

Nguyên tắc nhập hình ảnh

  • Để công nghệ học máy của Firebase có thể nhận dạng chính xác văn bản, hình ảnh đầu vào phải chứa văn bản được thể hiện bằng đủ dữ liệu pixel. Lý tưởng nhất là đối với văn bản Latinh, mỗi ký tự phải có kích thước ít nhất là 16x16 pixel. Đối với văn bản tiếng Trung, tiếng Nhật và tiếng Hàn, mỗi ký tự phải có kích thước 24x24 pixel. Đối với mọi ngôn ngữ, việc ký tự có kích thước lớn hơn 24x24 pixel thường không mang lại lợi ích về độ chính xác.

    Ví dụ: bạn có thể dùng hình ảnh 640x480 để quét danh thiếp chiếm toàn bộ chiều rộng của hình ảnh. Để quét tài liệu được in trên giấy có kích thước chữ cái, bạn có thể cần sử dụng hình ảnh 720x1280 pixel.

  • Tiêu điểm hình ảnh kém có thể ảnh hưởng đến độ chính xác của nhận dạng văn bản. Nếu bạn không nhận được kết quả chấp nhận được, hãy thử yêu cầu người dùng chụp lại hình ảnh.


Nhận biết văn bản trong hình ảnh

Để nhận dạng văn bản trong một hình ảnh, hãy chạy trình nhận dạng văn bản như mô tả dưới đây.

1. Chạy trình nhận dạng văn bản

Truyền hình ảnh dưới dạng UIImage hoặc CMSampleBufferRef vào phương thức process(_:completion:) của VisionTextRecognizer:

  1. Nhận một thực thể của VisionTextRecognizer bằng cách gọi 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. Để gọi Cloud Vision, hình ảnh phải được định dạng dưới dạng một chuỗi được mã hoá base64. Cách xử lý UIImage:

    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. Sau đó, hãy truyền hình ảnh đó vào phương thức process(_:completion:):

    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. Trích xuất văn bản từ các khối văn bản được nhận dạng

Nếu thành công, thao tác nhận dạng văn bản sẽ trả về một đối tượng VisionText. Đối tượng VisionText chứa văn bản đầy đủ được nhận dạng trong hình ảnh và không có hoặc có nhiều đối tượng VisionTextBlock.

Mỗi VisionTextBlock đại diện cho một khối văn bản hình chữ nhật, chứa 0 hoặc nhiều đối tượng VisionTextLine. Mỗi đối tượng VisionTextLine chứa từ 0 đối tượng VisionTextElement trở lên, đại diện cho các từ và thực thể giống từ (ngày, số, v.v.).

Đối với mỗi đối tượng VisionTextBlock, VisionTextLineVisionTextElement, bạn có thể nhận dạng văn bản trong khu vực và toạ độ giới hạn của khu vực.

Ví dụ:

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

Các bước tiếp theo


Nhận dạng văn bản trong hình ảnh của tài liệu

Để nhận dạng văn bản của một tài liệu, hãy định cấu hình và chạy trình nhận dạng văn bản tài liệu như mô tả dưới đây.

API nhận dạng văn bản tài liệu, được mô tả bên dưới, cung cấp một giao diện được thiết kế để thuận tiện hơn cho việc làm việc với hình ảnh của tài liệu. Tuy nhiên, nếu muốn giao diện do API văn bản thưa thớt cung cấp, bạn có thể sử dụng giao diện này để quét tài liệu bằng cách định cấu hình trình nhận dạng văn bản trên đám mây để sử dụng mô hình văn bản dày đặc.

Để sử dụng API nhận dạng văn bản tài liệu:

1. Chạy trình nhận dạng văn bản

Truyền hình ảnh dưới dạng UIImage hoặc CMSampleBufferRef vào phương thức process(_:completion:) của VisionDocumentTextRecognizer:

  1. Nhận một thực thể của VisionDocumentTextRecognizer bằng cách gọi 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. Để gọi Cloud Vision, hình ảnh phải được định dạng dưới dạng một chuỗi được mã hoá base64. Cách xử lý UIImage:

    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. Sau đó, hãy truyền hình ảnh đó vào phương thức process(_:completion:):

    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. Trích xuất văn bản từ các khối văn bản được nhận dạng

Nếu thành công, thao tác nhận dạng văn bản sẽ trả về một đối tượng VisionDocumentText. Đối tượng VisionDocumentText chứa văn bản đầy đủ được ghi nhận trong hình ảnh và một hệ phân cấp các đối tượng phản ánh cấu trúc của tài liệu được công nhận:

Đối với mỗi đối tượng VisionDocumentTextBlock, VisionDocumentTextParagraph, VisionDocumentTextWordVisionDocumentTextSymbol, bạn có thể nhận dạng văn bản trong khu vực và toạ độ giới hạn của khu vực.

Ví dụ:

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

Các bước tiếp theo