既然手工录入太慢,我就写了个 OCR 识别录入系统

这 OCR 系统最后能跑起来,全靠我晚上那半小时的硬拉。肌肉酸得发抖的时候,脑子里那些乱七八糟的接口文档、正则匹配规则反而像被熨平了一样,一条线捋得清清楚楚。

客户扔过来三千多张纸质订单,全是手写的,要在一周内录进他们的 ERP。团队里两个小孩一听就蔫了,说这得通宵手动敲键盘。我一看那字迹,有的跟鬼画符似的,但仔细看还是有规律——地址无非是省市区街道,商品名也就那几十个 SKU。纯手动?那是用人力去填无底洞。我让他们先手工录一百张试试,同时我打开 Pycharm。

第一版想法太天真了。直接用 Tesseract 怼整张图片,识别率不到三成。那些连笔字和潦草的数字,对通用 OCR 来说就是天书。得拆解。我把扫描件用 OpenCV 做预处理,灰度、二值化、降噪,把表格线先提取出来,按坐标把每个填写框单独切分成小图。这步就卡了我一天——扫描件有倾斜,有阴影,每个框的像素位置不是绝对固定的。用了轮廓检测,但有些框线太淡,跟背景糊在一起。最后是用了自适应阈值分割加上形态学操作,才勉强把框线稳定地抠出来。

框切出来了,识别还是烂。特别是数字“7”和“1”,客户写得跟树枝似的,Tesseract 老是认错。这时候就得用笨办法了:规则引擎。我写了个识别后处理器,针对数字和常见中文做了映射纠错。比如,识别结果是“l”但上下文是金额,大概率是“1”;“十”和“十”分不清,就看它前后有没有其他量词。这招有点用,但纠错规则越写越多,像打补丁,代码成了一座屎山。

真正的转折点是在健身房。那天练背,最后一个引体向上死活拉不上去,小臂和背阔肌烧得厉害,脑子却异常清醒。我忽然想到,为什么非要用通用OCR去硬刚所有字体?这些单据格式是固定的啊。我可以先用少量手工录入的数据作为训练样本,去微调一个专门的模型。对,用 PaddleOCR,它支持自定义训练。我需要的不是认识天下所有字,我只需要认识这三千张单子上的字。

思路通了,剩下的就是体力活。我让团队把那已经手工录入的几百张数据,图片和文本对应好,做成数据集。自己则开始啃 PaddleOCR 的文档,搞明白怎么准备数据、修改配置文件、启动训练。训练过程倒是简单,扔到服务器上跑就是了,但等结果的时候最煎熬。第一轮训练完,准确率从30%提到了65%,有戏。我根据识别错误的样本,专门针对那些鬼画符的字,又补充了一百多张数据,做了第二轮训练。这次到了82%。够了,剩下的可以用规则和人工复核来兜底。

我把流程串了起来:扫描件批量上传 -> 自动切分单元格 -> 调用自训练OCR模型识别 -> 规则引擎纠错 -> 输出结构化的 JSON。最后一步写了个脚本,把 JSON 映射到 ERP 的数据库字段,模拟表单提交。原来预估要三个人干一周的活,最后系统跑了两天,加上半天的人工复核和补漏,全部搞定。

交付那天,肌肉还是酸的,但看着自动滚动的日志和一条条成功写入数据库的记录,有种奇怪的踏实感。之前总迷信脑力,觉得代码能解决一切。但这几个月被管理和交付压得喘不过气,身体先垮了,注意力根本集中不了。现在明白了,你思考问题的“算法”再精妙,跑在濒临蓝屏的“硬件”上,全是白搭。深蹲架旁边流的汗,和屏幕前敲的代码,本质上是一回事:都是把混乱无序的东西,通过可重复的、正确的发力模式,变成有序的输出。

© 版权声明
THE END
喜欢就支持一下吧
点赞71 分享