广汽埃安那个“续航1000公里”的PPT我看了,底下评论吵成一锅粥。这让我想起今天下午,我盯着桌上那堆供应商的纸质送货单,血压直接上来了。团队里两个小孩还在手动往ERP里敲数据,键盘敲得噼里啪啦,我算了一下,一张单子平均耗时三分钟,这堆两百多张,就是十个小时的人工。十个小时,够我写个自动化脚本把这事儿彻底解决了,但他们还在用时间换钱,而我的时间正在被他们的低效一点点耗干。
这就是2019年扩张到现在的毒打。你以为组了团队能解放自己,结果发现最大的成本不是工资,是沟通成本和效率损耗。你教他们用Python写个简单脚本,他们觉得不如手动来得“踏实可靠”。你火急火燎,他们不紧不慢。最后往往变成,要么我亲自动手,要么眼睁睁看着项目在琐碎流程里烂掉。今天这堆单据就是最后一根稻草,我决定自己下场,用技术把这块成本彻底轧平。
核心就一个:开源OCR引擎的实战调优。别信那些商业OCR API吹得天花乱坠,碰到这种格式不固定、有复写纸痕迹、印章干扰的脏数据,识别率直接扑街,关键是贵,量一大根本用不起。我选了Tesseract,但直接用就是找死。你得为你的特定场景做预处理,这步才是灵魂。
首先,扫描质量是底线。我让行政去借了台好点的扫描仪,统一调成300dpi灰度模式,背景噪声先降一波。接着是图像预处理流水线,用OpenCV:先高斯模糊去毛刺,再用自适应阈值二值化,对付那些复写纸背面透过来的字影特别有效。这里有个坑,阈值参数不能照搬网上案例,我写了个循环,用不同的块大小和常数C去试,打印中间结果图片,肉眼比对,选出一组让印章颜色和文字对比度差异最大的参数。这花了大概四十分钟,但值得,这是后面所有步骤的基础。
然后是最麻烦的版面分析。送货单不是标准表格,有的项目横着排,有的竖着排。Tesseract默认按行识别,会串行。我的办法是,先用轮廓检测找到所有文字块的边界框,然后根据业务逻辑,用坐标去硬编码规则。比如,“物料编码”后面的那个框,一定在它右侧固定像素范围内;“数量”通常在右下角区域。我写了个函数,把识别出的文本块按坐标映射到一个字典结构里,相当于重建了一个逻辑表单。这里必须处理多线程,因为单张处理太慢,我开了个线程池,控制并发数,避免把办公电脑搞崩。
识别后的后处理是另一个战场。Tesseract会把“0”和“O”、“1”和“I”搞混。我根据字段类型写规则:编码字段里出现字母“O”,大概率是数字“0”;描述字段里则可以放宽。再用一个简单的词典(比如物料编码前缀列表)做纠错。最后对接ERP的录入接口,用requests模拟POST,这里要处理网络异常和重试,我加了个指数退避的重试机制。
从下午三点搞到晚上九点,六个小时。脚本跑起来,处理完那两百多张单子,导入ERP,总共用了不到二十分钟。校验了一下,准确率大概在95%以上,剩下的错误集中在极度模糊的笔迹上,可以接受。我把脚本和配置说明丢到团队群里,说了句“以后这类单据都按这个流程走,扫描仪旁边贴了操作指南”。
没有欢呼,群里一片沉默。可能他们觉得我又用技术“碾压”了他们,或者觉得自己的工作被替代了。但我算的是另一笔账:这六个小时的投入,换来了未来每个月可能几十个小时的人力释放,以及几乎为零的数据错误率。在管理陷入泥潭的当下,这是我为数不多能直接抓住的“确定性”。PPT可以画一千公里的饼,但真实的商业世界,是一张张油腻的送货单、一行行冰冷的代码和一分一秒抠出来的效率。当老板们在高谈阔论“颠覆”时,我正蹲在地上,把散落的单据一张张捋齐,塞进扫描仪。这大概就是我的“续航”方式。














