0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用TensorFlow Lite从Android设备图像提取文本

Tensorflowers 来源:TensorFlow 作者:魏巍 2021-11-02 15:34 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

今天,我们将向您展示如何使用 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

对于文本检测,由于检测模型支持 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 服务;

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

ML Kit

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

Google Play 服务

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

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

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 应用
    +关注

    关注

    2

    文章

    489

    浏览量

    34923
  • OCR
    OCR
    +关注

    关注

    0

    文章

    176

    浏览量

    17307
  • tensorflow
    +关注

    关注

    13

    文章

    336

    浏览量

    62444
  • TensorFlow Lite
    +关注

    关注

    0

    文章

    26

    浏览量

    850

原文标题:基于 TensorFlow Lite 的 OCR:一款崭新的示例应用

文章出处:【微信号:tensorflowers,微信公众号:Tensorflowers】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何创建运行META OIC工具的Session文件

    OIC(Occupant Injury Criteria,乘员伤害准则)工具是 META 后处理软件中用于自动提取和评估乘员损伤结果的强大功能。它支持仿真和物理实验结果中提取关键损伤指标,并生成
    的头像 发表于 05-19 16:20 316次阅读
    如何创建运行META OIC工具的Session文件

    《多模态大模型 前沿算法与实战应用 第一季》精品课程简介

    : CLIP模型 :采用双塔结构,分别用图像编码器和文本编码器提取特征,通过对比损失(Contrastive Loss)使匹配的图文对在特征空间中距离更近。例如训练时将\"猫\"
    发表于 05-01 17:46

    在 NPU 上运行了 eIQ TensorFlow Lite 示例模型报错

    我们已经在 NPU 上运行了 eIQ TensorFlow Lite 示例模型,但它们失败并出现以下错误: 信息:加载的模型 mobilenet_v1_1.0_224_quant.tflite
    发表于 03-18 06:52

    RK Android平台音频调试指南:基础到实战,解决多设备输出、声卡异常等核心问题

    Android 开发中,音频模块的调试往往是 “老大难”—— 多声卡无法区分、多设备同时输出没声音、HDMI 录音崩溃… 这些问题不仅影响用户体验,还会消耗大量开发时间。
    的头像 发表于 02-06 16:48 3378次阅读
    RK <b class='flag-5'>Android</b>平台音频调试指南:<b class='flag-5'>从</b>基础到实战,解决多<b class='flag-5'>设备</b>输出、声卡异常等核心问题

    Linux Shell文本处理神器合集:15个工具+实战例子,效率直接翻倍

    在 Linux 系统中,文本是数据交互的 “通用语言”—— 日志文件、配置文件、数据报表、程序输出几乎都以文本形式存在。手动编辑文本不仅繁琐,还容易出错,而掌握 Shell 文本处理工
    的头像 发表于 02-03 15:42 3289次阅读
    Linux Shell<b class='flag-5'>文本</b>处理神器合集:15个工具+实战例子,效率直接翻倍

    使用NORDIC AI的好处

    提升能效,适合音频、图像和高采样率传感器等更重的 AI 负载。[Axon NPU 技术页] 模型更小、更快、更省电 Neuton 模型相较 TensorFlow Lite:* 内存占用可小 10
    发表于 01-31 23:16

    图像采集卡:连接设备与数据的图像枢纽

    在机器视觉与图像传输体系中,图像采集卡是无可替代的重要枢纽——它一端承接相机、内窥镜、摄像机等前端图像设备的信号输出,另一端对接后端数据处理、存储、展示系统,通过信号转换、同步协调、高
    的头像 发表于 01-22 13:51 435次阅读
    <b class='flag-5'>图像</b>采集卡:连接<b class='flag-5'>设备</b>与数据的<b class='flag-5'>图像</b>枢纽

    深入解析rk平台Android Bootloader核心代码:启动流程到AVB验证

    android_bootloader.c的核心代码,带你读懂Android设备Bootloader到内核的完整启动逻辑,以及开发者关注这些代码的核心价值。 一、代码整体定位 这份代
    的头像 发表于 01-22 07:06 587次阅读
    深入解析rk平台<b class='flag-5'>Android</b> Bootloader核心代码:<b class='flag-5'>从</b>启动流程到AVB验证

    如何在TensorFlow Lite Micro中添加自定义操作符(1)

    相信大家在部署嵌入式端的AI应用时,一定使用过TensorFlow Lite Micro,以下简称TFLm。TFLm 是专为微控制器和嵌入式设备设计的轻量级机器学习推理框架,它通过模块化的操作符系统
    的头像 发表于 12-26 10:34 5879次阅读

    【上海晶珩睿莓1开发板试用体验】将TensorFlow-Lite物体归类(classify)的输出图片移植到LVGL9.3界面中

    既然调通了TensorFlow-Lite物体归类(classify)和LVGL9.3代码,那么把这两个东西结合起来也是没问题的,需要注意的是,TensorFlow-Lite是C++代码,而
    发表于 09-21 00:39

    【上海晶珩睿莓1开发板试用体验】TensorFlow-Lite物体归类(classify)

    目前尚未得知睿莓1开发板上面有NPU或者DPU之类的额外处理器,因此使用树莓派系列使用最广泛的TensorFlow-Lite库进行物体归类,使用CPU运行代码,因此占用的是CPU的算力。在
    发表于 09-12 22:43

    一文详解AHB-Lite协议

    总线协议,AHB_Lite只有单主机,且没有HBUSREQ和HGRANT信号,同时设备信号接口也简单许多。
    的头像 发表于 08-27 09:23 3332次阅读
    一文详解AHB-<b class='flag-5'>Lite</b>协议

    如何为 Android 操作系统/设备生成 APK ?

    如何为 Android 操作系统/设备生成 APK ?
    发表于 06-30 07:12

    无法将Tensorflow Lite模型转换为OpenVINO™格式怎么处理?

    Tensorflow Lite 模型转换为 OpenVINO™ 格式。 遇到的错误: FrontEnd API failed with OpConversionFailure:No translator found for TFLite_Detection_PostP
    发表于 06-25 08:27

    无法使用OpenVINO™在 GPU 设备上运行稳定扩散文本图像的原因?

    在OpenVINO™ GPU 设备上使用图像大小 (1024X576) 运行稳定扩散文本图像,并收到错误消息: RuntimeError: Exception from
    发表于 06-25 06:36