我尝试使用ML Kit进行Firebase文本识别进行OCR处理


用于Firebase

的ML套件

OCR

将已打印文档的图像(通常由图像扫描仪捕获)转换为字符串的软件。

Firebase的ML套件

ML Kit是一种移动SDK,可提供Google的机器学习功能(如Android和iOS应用)。

文本识别

ML Kit的文本识别API允许您识别来自拉丁语的语言的文本(基于云的文本识别允许您识别更多语言的文本)。

文本识别可以自动处理信用卡,收据和名片上的数据输入麻烦。您还可以使用基于云的API从文档中的照片中提取文本。这使您可以改善可访问性和翻译文档。例如,您可以阅读火车上的号码,并让应用跟踪实际对象。

使用mekari等身份验证功能或OCR功能。如果您将ML Kit用于Firebase,看来OCR处理可以轻松完成,因此我尝试了一下。

提前准备

创建Firebase项目

如果没有google-services.json,它将无法正常运行,因此请在Firebase控制台中创建一个项目并添加一个应用。添加应用程序后,将创建google-services.json,因此请下载并将其添加到您的应用程序项目中。首先,该区域将用于Firebase,因此我将其省略。

启用基于云的API

这次我们将使用基于云的模型,因此启用基于云的API。
将Firebase项目计划升级到Blaze计划,并从"启用基于云的API"中启用基于云的API。

安装ML Kit库

应该使用CocoaPods安装ML Kit库。在您的podfile中包括ML Kit库。如果您还希望使用设备上的API进行文本识别,则最低要求为以下三个条件。

1
2
3
pod 'Firebase/Analytics'
pod 'Firebase/MLVision'
pod 'Firebase/MLVisionTextModel'

准备基础应用程序

首先,创建一个使用相机拍摄照片的应用程序。

スクリーンショット 2019-12-09 19.25.37.png

UI看起来像这样。使用"拍照"按钮启动相机,然后在"识别的文本视图"中绘制识别的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var recognizedTextView: UITextView!

    @IBAction func takePhotoButtonTouchUpInside(_ sender: Any) {

        if UIImagePickerController.isSourceTypeAvailable(.camera) {
            let imagePickerController = UIImagePickerController()
            imagePickerController.sourceType = .camera
            imagePickerController.delegate = self
            self.present(imagePickerController, animated: true, completion: nil)
        }

    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

}

ViewController的实现如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
extension ViewController: UIImagePickerControllerDelegate {

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        guard let image = info[.originalImage] as? UIImage else {
            return
        }

        picker.dismiss(animated: true, completion: nil)

    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {

        picker.dismiss(animated: true, completion: nil)

    }

}

extension ViewController: UINavigationControllerDelegate {

}

UIImagePickerControllerDelegate和UINavigationControllerDelegate的实现如下所示。

实现文本识别处理

最后是主要主题。
首先,导入Firebase。

1
import Firebase

接下来,在ViewController中实现文本识别处理方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private func recognizeTextInCloud(in image: UIImage) {

        let metadata = VisionImageMetadata()
        metadata.orientation = .rightTop

        let visionImage = VisionImage(image: image)
        visionImage.metadata = metadata

        let options = VisionCloudTextRecognizerOptions()

        let cloudTextRecognizer = Vision.vision().cloudTextRecognizer(options: options)

        cloudTextRecognizer.process(visionImage) { text, error in
            guard error == nil, let text = text else {
                print("Text recognizer failed with error: " + "\(error?.localizedDescription ?? "No Results")")
                return
            }

            self.recognizedTextView.text = text.text
        }

    }

是的,仅此。上面的代码是基于云的文本识别。
对于设备上的文本识别,在实例化TextRecognizer对象时,只需使用onDeviceTextRecognizer()而不是cloudTextRecognizer(options :)。

您要做的就是将相机拍摄的照片通过文本识别处理方法。

1
2
3
4
5
6
7
8
9
10
11
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

    guard let image = info[.originalImage] as? UIImage else {
        return
    }

    self.recognizeTextInCloud(in: image)

    picker.dismiss(animated: true, completion: nil)

}

像这样。

尝试移动

IMG_0158.PNG

当我像这样拍照时...

IMG_0159.PNG

符号可疑,但它可以相当准确地识别字符!
我认为,这可能会接近Mel-ri风格的身份验证功能!