在浏览器中使用TensorFlow.js

TensorFlow.js简介

介绍

光学字符识别(OCR)是指能够从图像或文档中捕获文本元素,并将其转换为机器可读的文本格式的技术。如果您想了解更多关于这个主题的内容,本文是一个很好的介绍。

TensorFlow.js是一个库,用于使用JavaScript开发和训练机器学习模型,并将其部署在浏览器中或Node.js上。您可以使用现有模型、转换Python TensorFlow模型、使用迁移学习用您自己的数据重新训练现有模型以及从头开始开发模型。

前言

在Mindee,TensorFlow团队开发了一种基于python的开源OCR,DocTR,希望能在70%的开发者使用JavaScript的情况下,能够选择将它部署在浏览器中,以确保所有开发者都能使用。

深入架构

OCR模型可以分为两部分:检测模型文本识别模型。在DocTR中,检测模型是一个CNN(卷积神经网络),它对输入图像进行分割以找到文本区域,然后在每个检测到的单词周围裁剪文本框,并将文本框发送给识别模型。第二种模型是卷积递归神经网络(CRNN),它从文字图像中提取特征,然后用递归层(LSTM)对图像上的字母序列进行解码。

检测模型

DocTR中可以实现了不同的体系结构,但TensorFlow团队选择了一个非常轻的体系结构用于客户端,因为设备硬件可能因人而异。DocTR使用了一个带有DB(可微分二值化)头的mobilenetV2主干。实现细节可以在DocTR Github中找到。团队人员训练这个模型的输入大小为(512,512,3),以减少延迟和内存使用。DocTR其有一个私有数据集,由130,000个带注释的文档组成,用于训练这个模型。

识别模型

DocTR使用的识别模型也是较轻的架构:具有mobilenetV2骨干的CRNN(卷积循环神经网络)。关于这个架构的更多信息可以在这里找到。它基本上是由前半部分的mobilenetV2层来提取特征,然后是2个bi- lstm来解码视觉特征为字符序列(单词)。它利用亚历克斯·格雷夫斯(Alex Graves)引入的CTC损耗来高效解码序列。在该模型中,文字图像的输入尺寸为(32,128,3),使用填充来保持作物的纵横比。它在私有数据集上训练,该数据集由1100万个从不同文档中提取的文本框组成。这个数据集有各种各样的字体,因为它由来自许多不同数据源的文档组成。DocTR使用了数据增强,这样就可以很好地概括不同的字体、背景和渲染。只要是人类可读的手写文本,它也会给出不错的结果。

模型转换和代码实现

由于最初模型是使用TensorFlow实现的,因此需要进行Python转换才能在web浏览器中大规模运行。为此,团队为每个经过训练的Python模型导出了一个tensorflow SavedModel,并使用tensorflowjs_converter命令行工具快速将保存的模型转换为浏览器中执行所需的tensorflow .js JSON格式。

转换后的模型被集成到React.js前端应用程序中,为演示的用户界面提供支持:用MUI来设计内部的前端SDK react-mindee-js(提供计算机视觉工具)的接口组件,用OpenCV.js来进行检测模型的后期处理。这个后期处理步骤使用OpenCV.js函数将原始的二值分割贴图转换为多边形列表。然后,我们可以从源图像中裁剪这些盒子,最终获得准备发送到识别mo的单词图像。

速度 & 性能

必须有效地处理速度和性能之间的权衡。OCR模型非常慢,因为有两个不能并行化的任务(文本区域分割+单词识别),所以必须使用轻量级模型来确保在大多数设备上的快速执行

在一台带有RTX 2060和i7 9th Gen的现代计算机上,检测任务每幅图像大约需要750毫秒,使用WebGL后端识别模型每批32个农作物(单词)大约需要170毫秒,使用TensorFlow.js基准测试工具进行基准测试。将这两个模型和视觉操作(检测后处理)包装起来,在小文档(不到100个单词)的端到端OCR运行时间不到2秒,而对单词非常密集的文档运行预测时间只需要几秒。

发表评论

相关文章