Charles Gaillard,Mindee的客座文章
简介
光学字符识别(OCR)是指能够从图像或文件中捕获文本元素并将其转换为机器可读的文本格式的技术。如果你想了解更多关于这个主题的信息,这篇文章是一个很好的介绍。
在Mindee,我们已经开发了一个开源的基于Python的OCR,叫做DocTR,但是我们也想把它部署在浏览器中,以确保所有的开发者都能使用它--特别是当70%的开发者选择使用JavaScript时。
我们设法使用TensorFlow.js API实现了这一目标,从而产生了一个网络演示,你现在可以使用你自己的图片自己尝试。
![]() |
演示界面上有一张正在被OCR解析的2张收据的图片:这里发现了89个单词 |
这个演示被设计成使用非常简单,并能在大多数电脑上快速运行,因此我们提供了一个单一的预训练模型,我们用一个小的(512 x 512)输入尺寸来训练,以节省内存。图像被调整为正方形,因此它能很好地概括大多数长宽比接近1的文件:卡片、较小的收据、门票、A4等。对于长宽比很高的矩形,分割结果可能没有那么好,因为我们在文本检测步骤中没有保留长宽比(有填充)。它被优化为适用于具有相当大字数的文件(例如收据、卡片等)。请记住,这些模型被设计成在浏览器中运行时提供性能。因此,在文字大小与文档大小相比非常小的文档或长宽比非常高的图像上,性能可能不是最佳的。
深入了解架构
OCR模型可以分为两部分。一个检测模型和一个文本识别模型。在DocTR中,检测模型是一个CNN(卷积神经网络),它对输入图像进行分割以找到文本区域,然后在每个检测到的字周围裁剪文本框,并将其发送到识别模型。第二个模型是卷积递归神经网络(CRNN),它从单词图像中提取特征,然后用递归层(LSTM)对图像上的字母序列进行解码。
![]() |
本演示中使用的OCR模型的整体架构 |
检测模型
我们在DocTR中实现了不同的架构,但我们选择了一个非常轻的架构在客户端使用,因为设备硬件可以因人而异。在这里,我们使用了一个带有DB(可差异化二值化)头的mobilenetV2主干网。实施细节可以在DocTRGithub中找到。我们用(512,512,3)的输入大小来训练这个模型,以减少延迟和内存使用。我们有一个由13万个注释文档组成的私人数据集,用来训练这个模型。
识别模型
我们使用的识别模型也是我们较轻的架构:一个带有mobilenetV2主干的CRNN(卷积递归神经网络)。关于这个架构的更多信息可以在这里找到。它基本上由mobilenetV2层的前半部分组成,用于提取特征,然后由2个bi-LSTMs将视觉特征解码为字符序列(单词)。它使用Alex Graves提出的CTC损失来有效解码一个序列。在这个模型中,我们对单词图像的输入大小为(32,128,3),并且我们使用填充物来保留作物的长宽比。它是在我们的私人数据集上训练的,数据集由从不同文件中提取的1100万个文本框组成。这个数据集有各种各样的字体,因为它是由来自许多不同数据源的文档组成的。我们使用了数据增强,这样它就能在不同的字体、背景和渲染上有很好的概括性。只要手写文本是人类可读的,它也应该给出体面的结果。
模型转换和代码实现
由于我们的模型最初是用TensorFlow实现的,因此需要进行Python转换以在网络浏览器中大规模地运行所产生的模型。为了做到这一点,我们为每个Python模型训练导出了一个tensorflowSavedModel
,并使用 [tensorflowjs_converter command line tool](https://www.tensorflow.org/js/guide/conversion)
来快速将我们保存的模型转换为在浏览器中执行所需的TensorFlow.js JSON格式。
转换后的模型随后被整合到我们的React.js前端应用程序中,该应用程序为演示的用户界面提供动力。更确切地说,我们使用MUI为我们的内部前端SDKreact-mindee-js(提供计算机视觉工具)和OpenCV.js的检测模型后处理设计界面组件。这个后处理步骤采用了原始的二进制分割图,并用OpenCV.js函数将其转换为多边形列表。 然后,我们可以从源图像中裁剪这些方块,最终得到准备好的单词图像,并发送给识别模型。
速度与性能
我们必须有效地管理速度和性能之间的权衡。OCR模型相当慢,因为你有两个任务(文本区域分割+单词识别),不能并行化,所以我们必须使用轻量级的模型,以确保在大多数设备上快速执行。
在配备RTX 2060和i7第九代的现代计算机上,检测任务每张图片需要750毫秒左右,识别模型每批32个作物(单词)需要170毫秒左右,采用WebGL后端,用TensorFlow.js基准工具进行测试。
将2个模型和视觉操作(检测后处理)总结起来,端到端的OCR在小文件(少于100个字)上的运行时间不到2秒,预测时间在字数很多的非常密集的文件上运行只能多花几秒钟。
![]() |
一个演示界面的截图,一个非常密集的旧A4文件被OCR解析:738个单词被识别。 |
结论
这个由TensorFlow.js驱动的演示是让几乎所有人都能获得一个在线的、相对快速和强大的文档OCR,这是第一个完全在浏览器中由TensorFlow.js驱动的演示之一。
由于我们是在客户端执行该模型,确切的性能将取决于它所运行的设备的硬件。然而,这里的目标更多的是为了证明,即使是复杂的、最先进的深度学习模型也可以部署在浏览器中,并以有效的方式在几乎每台机器上运行,这可能是非常有用的,特别是对于潜在的敏感文件信息,你不想把文件发送到云端进行分析。
我们很高兴能提供这个解决方案供大家使用,并热衷于关注Web ML行业的未来,随着WebGPU等新的网络标准成为主流并在现代网络浏览器上默认启用,事情无疑会随着时间的推移变得越来越快。