ARTICLE · 1084792
从250ms到5ms:一套产线视觉检测软件的OCR提速实录
一、场景:350ms 节拍里的 250ms
我们给一条包装产线做喷码检测:每件产品上有一行生产日期喷码,软件要识别它、和当前时间比对、超出容差判 NG、结果通过硬线信号回给 PLC 剔除。
产线节拍 350ms 一件。留给视觉的预算只有一半——另外一半要给相机曝光、传输和 PLC 动作。
第一版跑起来,日志很诚实:
det 加 rec 一共 240ms 左右,加上前后处理,整链 CT 直接奔 300ms 去了。**识别是对的,但太快的产品来了就漏检。**
这篇文章就讲我们怎么把它压下来的。最终效果:常见场景 5ms,最坏场景 40ms 以内。

二、优化一:变的内容不该每次都"认",该"记"
第一版用的是标准 OCR 流程:DB 文本检测(det)找出文字在哪,CRNN(rec)逐行认字。这是通用方案,但它有个天然浪费——**产线上的喷码格式几乎不变,变的只有数字**。
于是我们加了"学习匹配":质检员框好区域后点一次"一键学习",软件把当前的识别结果记下来。下次触发时先做一次模板相似度匹配:
- 图像内容和学习时基本一致(格式没变)→ **直接输出记录的文本,跳过 det+rec 全流程,5ms 完事**
- 匹配不上(换班了、日期跳了)→ 自动回落完整 OCR,结果不受影响
这招对"固定格式喷码"几乎是无解的快。但很快遇到新问题:**日期类内容每单都在变**,NCC 相似度匹配永远命中不了,还是每次都走 200ms 的完整流程。
所以学习匹配只解决了"重复"的问题,没解决"变化"的问题。

三、优化二:别在全图上找字——先问"字大概在哪"
看日志发现一个更隐蔽的问题:明明只在画面右上角框了一小块检测区域,日志却写着 `OCR det: 整图 1504x1080`。
原因在稳健性设计上:局部检测万一检不出(喷码靠近边缘、点阵字符对比度低),就回退到全图检测"保命"。而现场喷码恰恰经常贴着 ROI 边缘,局部 32px 的外扩根本兜不住——**于是每一帧都在回退,每一帧都在跑整图 det**,38ms 就这么花掉了。
三个改动:
**1. 外扩加大**:局部检测的搜索窗口从 ROI 外扩 32px 加到 64px。喷码贴边时也能在局部范围内检出来,回退率大幅下降。
**2. 低阈值重试**:点阵喷码在局部小图上对比度低,det 的 0.3 标准阈值经常漏检。局部检测失败时先用 0.18 的低阈值在局部重试一次——局部推理本来只要几毫秒,重试几乎白赚。实测大部分"回退整图"的帧都被这一步救回来了。
**3. 同帧共享**:一个流程里经常有两个 OCR 步骤(比如一个框日期、一个框时间)。回退整图后,把检测结果按帧缓存——第二个 OCR 步骤直接复用,不再重复跑一次全图 det。
38ms 的 det,多数时候降到了 8ms 以内。

四、优化三:别让预处理吃掉推理省下的时间
Profiler 显示 det 从 38ms 降到 8ms 后,整体却没有等比例变快。再查,预处理在拖后腿:
- det 的张量填充用的是逐像素 `Mat.At` 访问,改成一次性 `Marshal.Copy` 拷出再填,**快了好几倍**(OpenCV 的 Mat.At 每次调用都有边界检查和跨层开销,批量内存操作才是正确姿势);
- rec 同样处理,归一化合并成 `v/127.5 - 1` 一步完成;
- 界面显示链路也顺手优化了:相机回调线程直接把 Mat 转 Bitmap,UI 忙时丢帧只显最新画面——检测期间界面不卡了,画面也不会"回放式追赶"。
经验就一句话:**推理引擎省下的毫秒,很容易被一处处"每像素一次函数调用"吃回去。**

五、效果与遗留
学习匹配 命中 ... 5ms(固定格式场景)
固定格式喷码(学习命中):~5ms
日期变化喷码(局部检测成功):~20ms
最坏情况(局部失败回退整图):~40ms,且只发生一次
对比最初的 250ms,常规场景快了一个数量级,产线 350ms 节拍下裕量充足。

三条可以带走的经验:
先看日志再优化。这次最大的 38ms 不是花在"识别"上,而是花在一个自以为"几乎不会发生"的回退路径上——不打好耗时日志,根本看不见。
产线视觉和通用 OCR 的诉求完全不同。通用方案追求"什么都认识",产线要的是"这一种又快又稳"。格式固定就利用格式固定。
快路径要有兜底。所有提速手段都必须保留回落完整流程的能力,否则现场一个边缘 case 就是整批误判。
写在最后
这套能力最终长成了我们自研的产线视觉检测软件:ROI 跟随、旋转框检测、PLC 硬线对接、Win7 到 Win11 全覆盖,都是围绕"现场能用、工程师好配"做的。
接下来这个号会连载这个系列:产品在传送带上会动,检测框怎么跟着走?包装上 45° 的斜管怎么检?不改客户 PLC 程序怎么接入施耐德产线?——都是实战里磨出来的方案,欢迎关注追更。
如果你的产线也有喷码、外观、定位类检测的难题,欢迎留言或私信交流。关注后回复【视觉】,送你一份《产线视觉检测改造自查清单》。