这个坑值得记一笔。报销单据上的手写金额走 OCR,6 和 0、1 和 7 经常混淆,两千张里有八十多张金额错误;换成更强的通用模型只降到六十张,业务侧希望再压一压,付款前不能再出这种差错。
刚开始盯着「金额栏没有后处理校验,错一位也能入库」,折腾了半个多小时,排掉了。
这类报错背后常见的原因有几处,逐个排除就行。通用 OCR 主要针对印刷体,手写笔画差异大;拍摄角度和阴影让相邻数字粘连;没有用金额大写字段做交叉验证。
第一件事是统计混淆集中在哪几组数字
python -c "import collections;print(collections.Counter(zip(open('ref.txt').read(),open('hyp.txt').read())).most_common(5))"
再往下按票据版式裁出金额栏再识别
python crop_field.py --in invoices/ --box 620,180,940,260 --out amount_crops/
接着用大写金额做一致性校验并回退
python check_amount.py --digit 648.00 --upper 陆佰肆拾捌元整
等前面都确认过,再把仍不一致的单据转人工复核
python route_review.py --in conflict.csv --queue finance
怎么算真的好了,看的是同一批现象。金额错误从八十多张降到十二张,剩余错误全部被大写校验拦下并转人工,没有再流到付款环节。
补一句。票据识别不能只靠模型,版式裁剪加字段间交叉校验,比换更大的模型划算得多。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
