光学字符识别 (OCR) 是使用计算机视觉和机器学习技术从图像中识别字符的过程。此参考应用程序演示了如何使用 TensorFlow Lite 进行 OCR。它结合使用 文本检测模型 和 文本识别模型 作为 OCR 管道来识别文本字符。
入门
如果您是 TensorFlow Lite 的新手,并且正在使用 Android,我们建议您探索以下示例应用程序,它可以帮助您入门。
如果您使用的是 Android 以外的平台,或者您已经熟悉 TensorFlow Lite API,您可以从 TF Hub 下载模型。
工作原理
OCR 任务通常分为两个阶段。首先,我们使用文本检测模型来检测可能文本周围的边界框。其次,我们将处理后的边界框馈送到文本识别模型,以确定边界框内的特定字符(在文本识别之前,我们还需要进行非最大抑制、透视变换等)。在本例中,这两个模型都来自 TensorFlow Hub,它们是 FP16 量化模型。
性能基准
性能基准数字是使用 此处 描述的工具生成的。
模型名称 | 模型大小 | 设备 | CPU | GPU |
---|---|---|---|---|
文本检测 | 45.9 Mb | Pixel 4 (Android 10) | 181.93ms* | 89.77ms* |
文本识别 | 16.8 Mb | Pixel 4 (Android 10) | 338.33ms* | N/A** |
* 使用了 4 个线程。
** 此模型无法使用 GPU 代理,因为我们需要运行 TensorFlow 操作
输入
文本检测模型接受一个 4 维 float32
张量,形状为 (1, 320, 320, 3) 作为输入。
文本识别模型接受一个 4 维 float32
张量,形状为 (1, 31, 200, 1) 作为输入。
输出
文本检测模型返回一个 4 维 float32
张量,形状为 (1, 80, 80, 5) 作为边界框,以及一个 4 维 float32
张量,形状为 (1,80, 80, 5) 作为检测分数。
文本识别模型返回一个 2 维 float32
张量,形状为 (1, 48) 作为映射索引到字母列表 '0123456789abcdefghijklmnopqrstuvwxyz'
局限性
当前 文本识别模型 使用包含英语字母和数字的合成数据进行训练,因此仅支持英语。
这些模型对于野外 OCR(例如,智能手机相机在低光照条件下拍摄的随机图像)来说还不够通用。
因此,我们只选择了 3 个 Google 产品徽标来演示如何使用 TensorFlow Lite 进行 OCR。如果您正在寻找可直接使用的生产级 OCR 产品,您应该考虑 Google ML Kit。ML Kit 在底层使用 TFLite,应该足以满足大多数 OCR 使用场景,但有些情况下您可能需要使用 TFLite 构建自己的 OCR 解决方案。以下是一些示例
- 您有自己的文本检测/识别 TFLite 模型,您希望使用这些模型
- 您有特殊的业务需求(例如,识别倒置的文本)并且需要自定义 OCR 管道
- 您希望支持 ML Kit 未涵盖的语言
- 您的目标用户设备不一定安装了 Google Play 服务
参考资料
- OpenCV 文本检测/识别示例:https://github.com/opencv/opencv/blob/master/samples/dnn/text_detection.cpp
- 社区贡献者提供的 OCR TFLite 社区项目:https://github.com/tulasiram58827/ocr_tflite
- OpenCV 文本检测:https://www.pyimagesearch.com/2018/08/20/opencv-text-detection-east-text-detector/
- 基于深度学习的 OpenCV 文本检测:https://learnopencv.com/deep-learning-based-text-detection-using-opencv-c-python/