大家好,我是本期栏目编辑小友,现在为大家讲解如何使用TensorFlow Lite从Android设备图像提取文本问题。
俗话说:“一幅画胜过千言万语”。图像包含丰富的视觉信息,但有时关键信息位于图像的文本中。虽然识字的人很容易理解图像中嵌入的文字,但我们如何利用计算机视觉和机器学习来教计算机做到这一点呢?
今天,我们将向您展示如何在安卓设备上使用TensorFlow Lite从图像中提取文本。我们将指导您完成最近开源的光学字符识别(OCR)安卓参考应用的关键步骤,完整代码可以参考。在下面的动画中,我们可以看到应用程序是如何从三张谷歌产品徽标图片中提取产品名称的。
那个地方
https://github.com/tensorflow/examples/tree/master/lite/examples/optical _ character _ recognition/Android
从图像中识别文本的过程被称为光学字符识别,广泛应用于许多领域。例如,谷歌地图使用光学字符识别技术从地理位置图像中提取信息,然后改进谷歌地图。
谷歌地图使用光学字符识别技术
https://ai . googleblog.com/2017/05/updating-Google-maps-with-deep-learning . html
一般来说,OCR是一个多步骤的流水线。相关步骤通常包括文本检测和文本识别:
使用文本检测模型找到文本周围的边界框;
执行一些后处理操作来变换边界框;
这些包围盒中的图像被转换成灰色图像,这样文本识别模型就可以绘制单词和数字。
在示例中,我们将使用TensorFlow Hub中的文本检测和文本识别模型。几个不同的模型版本可以用来权衡速度和准确性之间的平衡;我们在这里使用浮动量化模型。有关模型量化的更多信息,请参考TensorFlow Lite量化文档。
文本检测
https://hub . tensorflow . Google.cn/sayak Paul/lite-model/east-text-detector/fp16/1
文本识别
https://hub . tensorflow . Google.cn/tulashiram 58827/lite-model/keras-ocr/float 16/2
TensorFlow Lite量化
https://tensorflow . Google.cn/lite/performance/model _ optimization
我们还将使用OpenCV,一个广泛使用的计算机视觉库,它适用于非最大值抑制(NMS)和透视变换(我们将在后面讨论)来对检测结果进行后处理。此外,我们还将使用TFLite支持库对图像进行灰度化和标准化。
非最大抑制
https://www . coursera . org/讲座/卷积-神经网络/非最大抑制-dvrjH
TFLite支持库
https://tensorflow . Google.cn/lite/conference _ with _ metadata/lite _ support
对于文本检测,由于检测模型支持320x320固定像素,我们将使用TFLite支持库来调整输入图像的大小并对其进行标准化:
检测模型
https://hub.t
ensorflow.google.cn/sayakpaul/lite-model/east-text-detector/fp16/1val 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 功能的旅程。
责任