基于 TensorFlow Lite 的 OCR:一款崭新的示例应用

2021 年 10 月 28 日 TensorFlow


发布人:TensorFlow 技术推广工程师 魏巍


俗话说:“一图胜千言”。图像包含丰富的视觉信息,但有时关键信息位于图像的文本当中。虽然识字的人可以轻松理解图像中嵌入的文字,但我们如何利用计算机视觉和机器学习来教计算机做到这一点呢?


今天,我们将向您展示如何使用 TensorFlow Lite 从 Android 设备上的图像中提取文本。我们将引导您完成最近开源的光学字符识别 (OCR) Android 参考应用的关键步骤,您可参考该处获取完整代码。在下方动画中,可以看到该应用如何从三款 Google 产品徽标图片中提取产品名称。

  • 该处

    https://github.com/tensorflow/examples/tree/master/lite/examples/optical_character_recognition/android



从图像中识别文本的过程即为 OCR,该技术在多个领域中广泛使用。例如,Google 地图运用 OCR 技术从地理定位图像中提取信息,进而完善 Google 地图。

  • Google 地图运用 OCR 技术

    https://ai.googleblog.com/2017/05/updating-google-maps-with-deep-learning.html


一般来说,OCR 是一个包含多个步骤的流水线。相关步骤通常包含文本检测和文本识别:


  • 使用文本检测模型查找文本周围的边界框;

  • 执行一些后处理操作,以转换边界框;

  • 将这些边界框内的图像转换为灰度图像,如此一来,文本识别模型便可绘制出文字和数字。


在示例中,我们将利用 TensorFlow Hub 中的文本检测文本识别模型。多个不同的模型版本可用来权衡速度/准确率的取舍;我们在此使用的是 float16 量化模型。如需有关模型量化的更多信息,请参阅 TensorFlow Lite 量化文档。

  • 文本检测

    https://hub.tensorflow.google.cn/sayakpaul/lite-model/east-text-detector/fp16/1

  • 文本识别

    https://hub.tensorflow.google.cn/tulasiram58827/lite-model/keras-ocr/float16/2

  • TensorFlow Lite 量化

    https://tensorflow.google.cn/lite/performance/model_optimization


我们还会使用 OpenCV,这是一款广泛使用的计算机视觉库,适用于非极大值抑制 (NMS) 和透视变换(我们稍后会对此展开讨论),以对检测结果进行后处理。此外,我们还会使用 TFLite 支持库对图像进行灰度和标准化处理。

  • 非极大值抑制

    https://www.coursera.org/lecture/convolutional-neural-networks/non-max-suppression-dvrjH

  • TFLite 支持库

    https://tensorflow.google.cn/lite/inference_with_metadata/lite_support


从文本检测、透视变换到识别的 OCR 流水线


对于文本检测,由于检测模型支持 320x320 的固定像素,我们会使用 TFLite 支持库调整输入图像的大小并对其进行标准化处理:

  • 检测模型

    https://hub.tensorflow.google.cn/sayakpaul/lite-model/east-text-detector/fp16/1


val imageProcessor =
ImageProcessor.Builder()
.add(ResizeOp(height, width, ResizeOp.ResizeMethod.BILINEAR))
.add(NormalizeOp(means, stds))
.build()
var tensorImage = TensorImage(DataType.FLOAT32)

tensorImage.load(bitmapIn)
tensorImage = imageProcessor.process(tensorImage)


接下来,我们使用 TFLite 运行检测模型:

detectionInterpreter.runForMultipleInputsOutputs(detectionInputs, detectionOutputs)


检测模型的输出是一些经过旋转且图像内包含文本的边界框。我们会运行非极大值抑制,借助 OpenCV 为每个文本块确定一个边界框:

NMSBoxesRotated(
boundingBoxesMat,
detectedConfidencesMat,
detectionConfidenceThreshold.toFloat(),
detectionNMSThreshold.toFloat(),
indicesMat
)


有些时候,图像内的文本会出现变形(例如,我的笔记本电脑上的“kubernetes”贴纸),并伴随一个透视角度:


透视变换演示


如果我们只是将原始旋转边界框直接“喂”给识别模型,则该模型不太可能正确识别字符。在本例中,我们需要使用 OpenCV 来进行透视变换:

val rotationMatrix = getPerspectiveTransform(srcPtsMat, targetPtsMat)

warpPerspective(
srcBitmapMat,
recognitionBitmapMat,
rotationMatrix,
Size(recognitionImageWidth.toDouble(), recognitionImageHeight.toDouble())
)


之后,我们会再次使用 TFLite 支持库,在边界框内调整变换图像的大小,并对其进行灰度和归一化处理:

val imageProcessor =
ImageProcessor.Builder()
.add(ResizeOp(height, width, ResizeOp.ResizeMethod.BILINEAR))
.add(TransformToGrayscaleOp())
.add(NormalizeOp(mean, std))
.build()


最后,我们会运行文本识别模型、根据模型输出绘制出字符与数字,然后更新应用界面:

recognitionInterpreter.run(recognitionTensorImage.buffer, recognitionResult)

var recognizedText = ""
for (k in 0 until recognitionModelOutputSize) {
var alphabetIndex = recognitionResult.getInt(k * 8)
if (alphabetIndex in 0..alphabets.length - 1)
recognizedText = recognizedText + alphabets[alphabetIndex]
}
Log.d("Recognition result:", recognizedText)
if (recognizedText != "") {
ocrResults.put(recognizedText, getRandomColor())
}


这样就完成了,就是这么简单。此时,我们可以在我们的应用中使用 TFLite 来提出输入图像中的文本。


最后我想指出的是,如果您只是需要一个即用型 OCR SDK,您可以直接使用 Google ML Kit 的文字识别功能。ML Kit 底层使用了 TFLite,并且对于大多数 OCR 用例而言足矣。在以下情况下,您可以使用 TFLite 来构建专属 OCR 解决方案:


  • 您有自己想要使用的专属文本检测/识别 TFLite 模型;

  • 您有特殊的业务需求(例如识别颠倒的文本),并且需要自定义 OCR 流水线;

  • 您希望支持 ML Kit 没有覆盖的语言;

  • 您的目标用户设备不一定要安装 Google Play 服务

  • 您想要控制用于运行模型的硬件后端(CPU、GPU 等)。

  • ML Kit

    https://developers.google.cn/ml-kit/vision/text-recognition

  • Google Play 服务

    https://developers.google.cn/android/guides/overview


在这些情况下,我希望本教程和我们的实现示例可以助您开启在您的应用中构建专属 OCR 功能的旅程。

  • 实现示例

    https://github.com/tensorflow/examples/tree/master/lite/examples/optical_character_recognition/android


您还可以通过下方资源了解更多 OCR 的信息。


  • OpenCV 文本检测/识别示例

    https://github.com/opencv/opencv/blob/master/samples/dnn/text_detection.py

  • @Tulasi123789 和 @risingsayak 的 

    OCR TFLite 社区项目

    https://github.com/tulasiram58827/ocr_tflite

  • OpenCV 文本检测(EAST 文本检测器)

    https://www.pyimagesearch.com/2018/08/20/opencv-text-detection-east-text-detector/

  • Keras OCR

    https://github.com/faustomorales/keras-ocr

  • 使用 OpenCV 进行基于深度学习的文本检测

    https://learnopencv.com/deep-learning-based-text-detection-using-opencv-c-python/

  • 用于借助 Keras 读取验证码的 OCR 模型

    https://keras.io/examples/vision/captcha_ocr/


致谢


作者感谢 Tian Lin 提供的有用反馈,感谢社区贡献者 @Tulasi123789 和 @risingsayak 使用 TFLite 开展的前期 OCR 工作(创建模型并将其上传至 TF Hub、提供对应的python notebooks等)。


点击“阅读原文”访问 TensorFlow 官网



不要忘记“一键三连”哦~

分享

点赞

在看

登录查看更多
1

相关内容

OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。
【经典书】《学习OpenCV 3》,1018页pdf
专知会员服务
128+阅读 · 2021年2月28日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
68+阅读 · 2020年1月17日
计算机视觉最佳实践、代码示例和相关文档
专知会员服务
17+阅读 · 2019年10月9日
TensorFlow 2.0 学习资源汇总
专知会员服务
66+阅读 · 2019年10月9日
使用 MediaPipe 和 TensorFlow.js 进行人体分割
TensorFlow
0+阅读 · 2022年2月14日
一个新的 TensorFlow Lite 示例应用:棋盘游戏
TensorFlow
0+阅读 · 2021年12月23日
TensorFlow Lite 设备端训练
TensorFlow
4+阅读 · 2021年12月20日
使用 TensorFlow Lite 简化移动端目标检测
TensorFlow
0+阅读 · 2021年8月4日
tensorflow LSTM + CTC实现端到端OCR
机器学习研究会
26+阅读 · 2017年11月16日
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
4+阅读 · 2011年12月31日
国家自然科学基金
2+阅读 · 2009年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
Arxiv
0+阅读 · 2022年4月20日
Arxiv
0+阅读 · 2022年4月15日
VIP会员
相关资讯
使用 MediaPipe 和 TensorFlow.js 进行人体分割
TensorFlow
0+阅读 · 2022年2月14日
一个新的 TensorFlow Lite 示例应用:棋盘游戏
TensorFlow
0+阅读 · 2021年12月23日
TensorFlow Lite 设备端训练
TensorFlow
4+阅读 · 2021年12月20日
使用 TensorFlow Lite 简化移动端目标检测
TensorFlow
0+阅读 · 2021年8月4日
tensorflow LSTM + CTC实现端到端OCR
机器学习研究会
26+阅读 · 2017年11月16日
相关基金
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
4+阅读 · 2011年12月31日
国家自然科学基金
2+阅读 · 2009年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
Top
微信扫码咨询专知VIP会员