一、”这是哪里的发票?”——医保审核员的困惑
2024 年 11 月,某市医保中心,审核员小李面对一张发票犯了难。
“这是哪里的发票?” “XX 县人民医院。” “怎么没有财政监制章?” “县医院自己印的……” “那这个能报销吗?”
小李拿不准,叫来科长。科长看了半天,说:”打电话问县医院财务科。”
一个电话打过去,对方说:”哦,我们医院从 2023 年开始用电子发票了,这个是系统自动生成的,没有监制章,但可以在财政部网站查验。”
虚惊一场。但这样的”虚惊”,每天都在上演。
中国有多少种医疗票据?
没人知道确切数字。国家财政部规定的标准票据只有几种(住院发票、门诊发票、电子发票),但实际执行中:
- 31 个省份,每个省份的财政监制章版式不同
- 3000+ 三级医院,大部分有自己的票据格式
- 10000+ 二级医院,票据格式五花八门
- 30000+ 基层医疗机构,票据更加不规范
这还不包括:
- 历史票据(2010 年前的老版式)
- 军队医院票据(特殊版式)
- 民营医院票据(自制格式)
- 药店购药小票(热敏纸、格式各异)
某省医保局统计:省内有效医疗票据版式超过 300 种,跨省票据超过 1000 种。
让审核员记住 1000 种票据格式,不可能。但让机器记住,可以。
二、技术方案:版式识别的”三层架构”
处理百种票据格式,核心是”版式识别”——先判断这是什么类型的票据,再用对应的模板识别。
第一层:粗分类(5 大类)
类别 1:财政监制住院发票
特征:红色财政监制章、固定版式、有发票代码/号码
识别方法:检测财政监制章(红色圆形/椭圆形)
类别 2:财政监制门诊发票
特征:与住院发票类似,但标题为"门诊收费票据"
识别方法:OCR 识别标题文字
类别 3:医院自制发票
特征:无财政监制章、医院 LOGO、自定义版式
识别方法:检测医院名称 + 发票关键字
类别 4:费用明细清单
特征:表格形式、多行项目、无金额合计(或有)
识别方法:表格检测 + 表头识别
类别 5:电子发票(PDF/OFD)
特征:电子版式文件、有电子签章、可查验
识别方法:文件格式检测 + 电子签章验证
粗分类准确率目标:>98%
第二层:细分类(按省份/医院)
粗分类后,进一步细分:
住院发票
├── 北京市财政监制
├── 上海市财政监制
├── 广东省财政监制
├── ...(31 省份)
└── 军队医院专用
门诊发票
├── 北京市财政监制
├── 上海市财政监制
└── ...
细分方法:
- 检测财政监制章文字(”XX 省财政厅监制”)
- 检测医院名称(与医院库匹配)
- 检测发票代码前缀(按地区编码)
细分类准确率目标:>95%
第三层:字段模板匹配
确定具体版式后,加载对应的字段模板:
{
"template_id": "BJ_INPATIENT_2023",
"template_name": "北京市住院发票 2023 版",
"fields": [
{"name": "invoice_code", "type": "text", "bbox": [450, 80, 580, 100]},
{"name": "invoice_no", "type": "text", "bbox": [450, 105, 580, 125]},
{"name": "date", "type": "date", "bbox": [350, 150, 480, 170]},
{"name": "total_amount", "type": "currency", "bbox": [400, 400, 550, 425]},
...
]
}
模板匹配优势:
- 识别速度快(直接裁剪指定区域)
- 准确率高(避免全文识别干扰)
- 可维护(新增版式只需添加模板)
三、关键技术:如何应对”非标”票据
问题 1:无模板票据怎么办?
即使有 1000 种模板,还是会遇到”从未见过”的票据。
解决方案:零样本字段提取
步骤 1:使用通用 OCR 识别全文
步骤 2:使用 NLP 模型识别字段语义
<ul>
<li>"发票代码"、"发票号码"、"日期"、"金额"等关键词</li>
<li>关键词附近的数字即为目标字段</li>
</ul>
步骤 3:输出结构化数据
步骤 4:人工校验后,加入模板库
某省实测:零样本提取准确率 82%,足够支撑人工快速校验。
问题 2:表格型费用清单如何处理?
费用清单是典型的”行数不定”表格,传统 OCR 模板无法处理。
解决方案:表格结构化提取
步骤 1:表格检测(使用 TableNet 模型)
<ul>
<li>输出:表格区域坐标</li>
</ul>
步骤 2:行列检测
<ul>
<li>使用投影法检测行线、列线</li>
<li>输出:单元格坐标矩阵</li>
</ul>
步骤 3:单元格识别
<ul>
<li>对每个单元格执行 OCR</li>
<li>输出:单元格文本</li>
</ul>
步骤 4:表头语义标注
<ul>
<li>识别第一行(表头)</li>
<li>标注每列类型:药品名称、规格、数量、单价、金额</li>
<li>使用 NLP 模型(如 BERT)理解表头语义</li>
</ul>
步骤 5:数据提取
<ul>
<li>按列类型提取数据</li>
<li>输出结构化列表</li>
</ul>
某省实测:表格提取准确率 94%,支持最多 50 行×15 列的表格。
问题 3:手写体票据如何处理?
部分基层医疗机构仍使用手写票据。
解决方案:手写体专用模型
模型架构:CRNN + Attention
训练数据:50 万 + 手写医疗票据样本
数据增强:
<ul>
<li>随机旋转、倾斜</li>
<li>添加噪声、模糊</li>
<li>模拟不同笔迹</li>
</ul>
后处理:
<ul>
<li>医疗术语词典校正</li>
<li>数字格式校验</li>
<li>上下文语义校验</li>
</ul>
实测:手写体识别准确率 85%(打印体 98%)。
四、系统架构:支撑日均 10 万张票据识别
硬件架构
图像接入层
├── 窗口高拍仪(实时拍摄)
├── 扫描仪(批量扫描)
├── 手机 APP(拍照上传)
└── 邮件/传真(历史票据)
OCR 处理层
├── 版式分类集群(CPU,4 节点)
├── 模板匹配集群(CPU,8 节点)
├── 深度学习集群(GPU,4 卡 A10)
└── 表格处理集群(CPU+GPU 混合,4 节点)
数据存储层
├── 原始图像(对象存储,50TB)
├── OCR 结果(Elasticsearch,全文检索)
├── 模板库(MySQL,1000+ 模板)
└── 样本库(用于持续训练)
性能指标
某省医保平台实测:
- 单张票据识别时间:P50=1.8 秒,P95=4.2 秒
- 并发处理能力:200 张/秒
- 日处理量:10 万 + 张
- 服务可用性:99.95%
持续学习机制
票据版式会不断更新,系统需要持续学习:
新票据到来
↓
版式分类
↓
是否有匹配模板?
├→ 有:使用模板识别
└→ 无:零样本提取 + 人工校验
↓
加入模板库
↓
定期批量训练更新模型
某省数据:每月新增模板 15-20 个,模型季度更新一次。
五、实战效果:识别率与效率双提升
识别准确率
某省医保局测试数据(10000 张票据样本):
| 票据类型 | 样本数 | 识别准确率 |
|---|---|---|
| 财政监制住院发票 | 3500 | 98.7% |
| 财政监制门诊发票 | 2800 | 98.2% |
| 医院自制发票 | 1500 | 95.3% |
| 费用明细清单 | 1800 | 94.1% |
| 电子发票 | 400 | 99.5% |
| 综合 | 10000 | 97.2% |
效率提升
| 环节 | 传统人工 | OCR 自动 | 提升 |
|---|---|---|---|
| 票据分类 | 30 秒/张 | 0.1 秒/张 | 300 倍 |
| 字段提取 | 2 分钟/张 | 2 秒/张 | 60 倍 |
| 数据录入 | 3 分钟/张 | 0 秒/张 | – |
| 合计 | 5.5 分钟/张 | 2.1 秒/张 | 157 倍 |
业务价值
- 审核员人力释放:从 120 人降至 35 人
- 审核时效提升:从 3 天降至 4 小时
- 差错率降低:从 4.5% 降至 0.9%
- 参保人满意度:从 72% 提升至 93%
六、踩过的坑
坑 1:热敏纸褪色 部分药店小票使用热敏纸,时间久了字迹褪色。 解决:图像增强(对比度提升、边缘锐化);严重褪色的转人工。
坑 2:多页票据分页 费用清单多页时,扫描可能漏页或重复。 解决:检测页码连续性;金额合计校验。
坑 3:印章遮挡 医院公章、财务章遮挡关键字段。 解决:印章检测 + 去除(颜色分割);严重遮挡的转人工。
坑 4:电子发票重复报销 同一张电子发票可能被多次打印报销。 解决:发票代码 + 号码去重;与财政部查验平台对接。
七、结语
处理百种票据格式,听起来是个”脏活累活”——没有高深的算法,只有无尽的模板和细节。
但正是这些”脏活累活”,支撑着医保报销的顺畅运行。当审核员不再需要为”这是哪里的发票”而困惑,当参保人不再需要等待数天才能拿到报销款——技术的价值,就体现在这些平凡的细节里。
OCR 识别医疗票据,只是医保数字化的基础设施。但基础设施的价值,不在于炫技,而在于稳定、可靠、持续地提供服务。
让机器做机器擅长的事(识别、计算),让人做人擅长的事(判断、决策)——这才是人机协作的正确姿势。