超市小票、餐饮收据、打车票——非标票据OCR为什么那么难
ocr吧
全部回复
仅看楼主
level 7
出差回来报销,包里掏出一把票据:超市购物小票卷成一团、餐饮收据字迹快褪没了、出租车票皱巴巴的、停车缴费小票只有巴掌大。财务看了一眼就头疼——这些票据格式千奇百怪,根本不像增值税发票那样有统一模板。
非标票据的OCR识别,是票据识别领域里最难啃的骨头。
非标票据”非”在哪里?
和增值税发票的”全国统一版式”不同,非标票据的”非”体现在方方面面:
格式不统一。 每家超市、餐厅、停车场的收据格式都不一样——字段位置不同、字体不同、纸张宽度不同。同一家连锁店不同门店的小票都可能不一样。没法像增值税发票那样预定义模板。
纸张质量差。 热敏纸打印的小票(超市、餐厅、出租车)容易褪色,放几天字迹就模糊了。纸张窄(通常只有58mm或80mm宽),字小而密,拍照时容易对焦不准。
保存状态差。 小票揉在口袋里、塞在包里,拿出来时皱巴巴的、有折痕、甚至撕破了。OCR面对的输入质量参差不齐。
字段定义模糊。 增值税发票上”金额”“税额”清清楚楚,但小票上可能是”合计”“应付”“实收”“找零”——同一个概念有N种叫法,模型要理解”哪个数字才是我要报销的金额”。
手写内容混入。 部分餐饮收据上有手写的消费金额、日期或签字,手写体和印刷体混排,增加识别难度。
传统方案的困境
模板匹配方法在非标票据上几乎完全失效——因为根本没有固定模板可言。
早期的替代方案是”规则引擎”:针对每种已知的小票格式(如某连锁超市、某出租车公司),预定义字段提取规则。问题是小票格式种类太多,规则维护成本极高,而且商家随时可能更换小票格式,规则就失效了。
另一条路是”通用OCR+后处理”:先用通用OCR识别出小票上所有文字,再用规则从文字里提取金额、日期等关键信息。问题是通用OCR在小票这种低质量图像上识别率不高,再加上小票文字排列紧密,行检测容易出错。
深度学习:从”找位置”到”找语义”
现代非标票据识别的思路,从”按位置找字段”转向了”按语义找字段”。
文本检测。 用文本检测模型(如DBNet)找到小票图像中所有文字行的位置和内容,不依赖预定义模板。
实体识别。 对识别出的文字序列做命名实体识别(NER),标记出哪些是日期、哪些是金额、哪些是商家名称、哪些是商品明细。这和自然语言处理里的NER任务类似——”2024年3月15日”被标记为日期,”¥35.50”被标记为金额。
关键信息抽取。 从所有实体中筛选出报销需要的关键字段:消费日期、消费金额、商家名称、消费类型。这一步需要理解上下文——”合计”后面的数字是总金额,”实付”后面的数字是实际支付金额,两者可能不同。
大模型:非标票据的”终极解法”
大模型的出现,让非标票据识别有了根本性的突破。
多模态大模型(如GPT-4o、Qwen-VL)直接接受小票图片输入,用自然语言提问:
“请提取这张小票的消费日期、商家名称、消费总金额、消费类型。”
大模型凭借对文本和图像的联合理解能力,能从任何格式的小票中提取关键信息,不依赖模板,不依赖预定义规则。对于字迹模糊、格式怪异、中英文混排的小票,大模型的语义推断能力远超传统方法。
实际效果:一张皱巴巴的出租车票,传统OCR可能把”¥28.00”识别成”¥2800”(小数点丢了),大模型则知道出租车费用通常是几十元,会推断”28.00”更合理。
局限在于速度和成本。大模型推理比传统OCR慢10倍以上,API调用费用也不低。对于日均处理量上万张的大企业,全量用大模型不现实。实际方案是混合架构:传统OCR做主力(快且便宜),置信度低的疑难票据再交给大模型二次识别。
报销场景的实际应用
非标票据识别的最大应用场景是员工报销:
拍照报销。 员工用手机拍下小票,App自动识别消费日期、金额、商家,自动填入报销单。员工只需确认,不用手填。
自动分类。 系统根据小票内容自动判断消费类型——餐饮、交通、住宿、办公用品——匹配对应的报销科目和报销标准。
合规检查。 识别结果和公司差旅标准比对:住宿费是否超标?餐饮费是否在工作日?是否有同行人重复报销?
电子归档。 小票图片和识别结果一起存档,方便审计时调取。
某发票管理平台支持”员工发票拍照报销”功能,覆盖了增值税发票和各种非标小票的识别,把原来填报销单要20分钟的工作压缩到2分钟。
非标票据虽然难,但它们是日常消费的真实记录。把这些记录准确数字化,财务才能看到完整的费用全貌。
2026年07月06日 09点07分 1
1