移动端神经 OCR:CRAFT、CRNN、EasyOCR 与 ExecuTorch
光学字符识别(OCR)已经由传统的图像滤波方法转入了深度神经网络。在移动应用中,常见的做法是分两阶段完成:先用检测模型找到网页中文本的位置,再用识别模型读出文字。EasyOCR 使这类工作流变得广受欢迎,而现在我们可以借助 ExecuTorch 将同样的流程放到手机本地执行。本文将说明 CRAFT 和 CRNN 如何配合,移动端会遇到哪些图像大小限制,以及类 worm 的方法如何用 ExecuTorch 完成移植。
CRAFT 与 CRNN:经典的神经网络组合
CRAFT,全名是 Character Region Awareness for Text Detection,负责文本检测。它不会直接给出整个词或行级的边界,而是输出一个字符区域图和一个字符亲和力图。前一张图标出每个字符落在哪里,后一张图则判断相邻字符是否属于同一单词。这种基于字符级别的设计能更好地适应、弯曲、倾斜或不规范的排列。
接下来,由 CRNN 完成识别。CRNN 是卷积循环神经网络,前面的卷积部分(通常基于 VGG 或 ResNet)负责提取视觉特征,中间的 Bi-LSTM 学习字符出现的顺序关系,最后由 CTC 解码器把概率输出转换成最终字符序列。整个过程无需对字符做一一分割,非常适合手机上的短文本识别。
移动端的图像尺寸限制与性能瓶颈
手机的内存、电池和散热资源都有限。如果把 1200 万像素的照片直接送进 CRAFT,中间张量会变得巨大,等待时间会明显增加。因此,移动端 OCR 往往会限制输入图片的最大边,例如将边长调整到 512、768 或 960 像素,同时保持宽高比,再对空余区域进行填零。
另一个重要限制是推理运行时的静态输入尺寸。ExecuTorch 在很多场景下编译模型时会固定输入的张量形状。若运行时改变宽高,模型需要重新编译。臣常见做法是:让 CRAFT 接收固定 B×768 的正方形输入,而让 CRNN 在高 baseline 固定为某个数值,比如 32 像素,宽度则在 128、256、512 像素之间选择。
为了进一步减少热度计算,还可以在进入 CRAFT 之前加入一个轻量级提醒步骤,比如轮廓检测。先找出可能是文字的区域,然后只对这些小区域执行重型 OCR 网络。这样实际参与计算和像素数量大幅下降,内存占用和延迟都能得到明显控制。
将 EasyOCR 思路移植到 ExecuTorch
EasyOCR 是一个基于 PyTorch 的 Python 库,它使用 CRAFT 作为语言检测器,使用一种接近 CRNN 的结构作为识别器。由于 ExecuTorch 是 PyTorch 的端侧运行时,移植过程比 ONNX 或 TFLite 更加顺畅。无需额外转换,模型文件基本可以直接被端侧运行库加载,错误概率也会比转换方式低很多。
具体实现时,先按固定输入大小导出 CRAFT,并将其权重量化到 float16 或 int8,这样可以显著减少体积并提升 NPU 上的计算速度。随后,针对 CRNN 分别准备 128、256 和 512 三种宽度的模型,供应用在文本区域长度不同时灵活选择。最后,把 CRAFT 检测出的矩形图片裁剪并传给 CRNN。
这套流程完全可以离线运行。手机取法、预处理、CRAFT 检测、BBox 解码、CRNN 识别和 CTC 解码都在本地完成,不需要将图片传到服务器,因此既节省了时间,也保护了用户隐私。在常见的旗舰机型上,一次识别可以在一两秒内完成,甚至更快。
| 对比项 | CRAFT | CRNN |
|---|---|---|
| 角色 | 文本检测 | 文本识别 |
| 输出 | 字符区域图+亲和力图 | 字符序列 |
| 移动输入 | 固定正方形 | 固定高度,可变宽度 |
| 典型开销 | 较高 | 在缩略区域上中等 |
总之,CRAFT 与 CRNN 是移动端OCR领域中可靠的一套底层模型。图像尺寸的限制是客观存在的,但可以通过 ROI 检测、缩放、边值填充和量化等技术加以克服。以 EasyOCR 为参考做法,用 ExecuTorch 将这些模型带到手机本地,已经可以打造快速、安全且无需联网的 OCR 会话应用。
