简介:本资源是一套面向本科毕业设计、课程设计与深度学习实践者的票据信息提取系统完整实现,聚焦图像识别在财务票据(如发票、收据)自动化处理中的落地应用。系统以PaddleOCR为核心引擎,集成图像预处理、文字区域定位与多版式文本识别能力,支持打印体、手写体及带表格线票据的鲁棒识别,并包含异常容错与用户交互界面设计思路。压缩包共12个文件,含4个Python主模块(app.py、main.py等构成运行逻辑)、4个XML配置/IDEA工程文件、1个README.md说明文档、1个界面截图img.png、1个.gitignore及1个测试脚本test.py,整体仅262KB,轻量易部署。已有49人学习下载,读者可直接复现端到端票据识别流程,获取含工程结构、调用链路、测试验证与开发环境(IntelliJ IDEA)适配的完整参考方案,是掌握OCR实战与深度学习项目工程化的优质练手资源。 票据识别这事,听起来简单,做起来全是坑。我最早接触这个需求,是帮一个做代账的朋友处理堆积如山的增值税发票和银行回单。他们十几个人,每个月要手工录入几千张票据信息,录入慢不说,还容易出错。后来我终于下定决心,基于PaddleOCR做了一套票据信息提取系统。从模型选型、环境部署到识别流程的反复调优,前前后后折腾了不少时间。最近把这套系统整理成了源码包,决定把整个设计和实现过程完整记录下来。这篇文章不写虚的,全是我实际跑通过的经验,从架构设计到关键代码,再到那些文档里压根不会写的坑,都给你捋一遍。
1. 项目定位:票据信息提取到底在解决什么问题
1.1 业务场景与核心痛点
在动手写代码之前,先得搞清楚这个系统到底要解决什么问题。票据信息提取,本质上就是把一张图片或者PDF里的关键字段,比如发票号码、开票日期、购买方名称、金额、税额、价税合计等,自动识别出来并转成结构化数据。
实际业务中的痛点非常具体:一是票据种类多,增值税普通发票、专用发票、银行回单、火车票、出租车票,版式差异巨大;二是同一类票据,不同省份、不同年份的版式也有细微变化,比如发票代码和号码的位置偶尔会有偏移;三是手写备注、印章遮挡、打印不清晰等问题会让识别准确率大幅下降。这些痛点决定了系统不能只靠一个简单的OCR模型搞定,而是要把检测、识别、分类、关键信息抽取串成一条完整流水线。
PaddleOCR在这个场景下的优势很突出。它不仅仅是提供一个识别接口,而是把文本检测(DB算法)、方向分类、文本识别(CRNN/SVTR)整合成了一个完整工具链,而且提供了专门做关键信息抽取的PP-Structure和KIE(Key Information Extraction)工具。这意味着我们不需要从零开始训练多个模型,而是在PaddleOCR的框架下做模型微调和后处理逻辑开发。
1.2 系统设计的整体目标与边界
这套系统的设计目标可以拆成三点:第一,单张票据的端到端识别时间控制在3秒以内;第二,增值税发票的关键字段识别准确率达到95%以上;第三,系统要能支持批量处理,可以应对一个月几千张票据的规模。
边界同样要清楚。系统本质上是一个专用OCR引擎加上业务规则引擎的组合,它做的是信息提取和结构化,不负责后续的财务入账、真伪查验。同时,对于极端模糊或者严重倾斜扭曲的票据,系统只负责标记为低置信度,由人工复核兜底,不承诺100%准确保留原始信息一致。
这里多说一句,很多团队做票据识别失败,不是因为OCR模型精度不够,而是架构设计太脆弱。把识别逻辑、业务规则、图片预处理全部耦合在一个大函数里,后面每加一种票据类型就要改核心代码,改着改着就崩了。我这个项目从第一天起就把流程拆成独立模块,每层只做一件事,后续扩展票据类型时只需要新增配置和规则文件,主流程代码几乎不用动。
2. 技术选型:为什么是PaddleOCR而不是其他方案
2.1 与Tesseract、商用OCR的对比分析
有朋友问我,市面上成熟方案那么多,百度也有现成的API,为什么非要自己基于PaddleOCR搭一套?原因很简单:成本、可控性和定制空间。
对比一下我实际测试过的几条路线。Tesseract是免费开源的,但识别中文票据的效果不太理想,尤其是印刷体混排、数字和汉字紧挨着的场景,错误率偏高。商用OCR API的效果确实好,按张计费,量大的时候一年下来成本相当可观,而且票据数据涉及客户财务信息,很多企业不愿意把数据传到第三方服务。
PaddleOCR的优势在于它是开源模型里中文识别效果最好的那一档,而且提供了完整的训练、微调、部署工具链。更重要的是,PP-Structure里提供了表格识别和关键信息抽取的能力,这正好踩在票据识别最核心的需求点上。我用自己整理的2000多张票据样本做了对比测试,PP-OCRv4的文本检测和识别效果明显优于Tesseract 5.0,和商用API的差距也缩小到了可接受的范围。
2.2 PaddleOCR模型体系与版本选择
PaddleOCR的模型体系一直在迭代,到PP-OCRv4这个版本,文本检测用的DBNet++,识别用的SVTR_LCNet,在保持轻量化的同时精度提升明显。它的移动端模型只有几MB,服务器端模型也才十几MB,对于票据识别这种场景,推理速度完全不是瓶颈。
版本选择上有讲究。早期我用的PaddleOCR 2.6版本,后来升级到2.7再到现在主流的3.x分支,接口变化比较大。如果只是做推理,建议直接使用最新的release版本,文档和社区讨论都比较完善。我自己是在Python 3.10环境下用PaddleOCR 2.7版本跑通的整个流程,稳定性和兼容性都验证过了。如果你的Python版本是3.11以上,建议优先考虑PaddleOCR 3.x版本,因为2.7对高版本Python的支持有问题,我在部署环境准备那章会细说。
2.3 本地部署与推理引擎选择
票据数据涉及财务隐私,必须本地化部署,这一点决定了整套技术栈的走向。PaddleOCR支持纯CPU推理,但实际测试下来,一张普通发票在CPU上的完整识别流程平均需要2到4秒,如果业务量达到日均几百张,CPU方案性能吃紧。
我最终使用了ONNX Runtime作为推理引擎。PaddleOCR的模型可以很方便地导出为ONNX格式,配合OpenMP多线程优化,在普通办公电脑上识别一张票据的时间可以压缩到1秒以内。如果是Windows环境,还可以尝试DirectML加速,利用GPU进行推理,速度还能再快一些。
注意:PaddleOCR本身依赖PaddlePaddle框架,安装包比较大,建议使用conda创建独立虚拟环境,避免和现有的Python环境产生依赖冲突。我在部署章节会给出完整的配置步骤。
3. 系统总体架构与模块划分
3.1 三层架构设计
这套系统的代码结构,参考了典型的OCR服务架构,同时针对票据场景做了调整。整体分三层:
第一层是数据层,负责票据图片和PDF的读取、格式转换、缓存管理。这一层要注意的是,很多扫描件是300DPI的彩色图,直接送进模型识别会影响速度。我会先做归一化处理,把图片统一转成RGB三通道,并按比例压缩到合适的分辨率。
第二层是算法层,也是核心层,由五个模块组成:图像预处理、表格检测与还原、文本检测识别、关键信息抽取、置信度评估。这一层完全基于PaddleOCR的模型工具链构建,同时加入了自己写的后处理逻辑。
第三层是应用层,负责把识别结果包装成结构化JSON输出,提供Web API接口和批量处理入口。
3.2 核心模块功能拆解
图像预处理模块做的事包括:灰度化、二值化、降噪、倾斜校正、清晰度增强。票据拍摄时经常会有角度倾斜和光照不均的问题,不做预处理的话,识别准确率会下降5到10个百分点。
表格检测与还原模块用的是PaddleOCR的PP-Structure里的表格识别能力。增值税发票里最复杂的是货物或应税劳务清单这个区域,里面有多行多列的表格数据,普通的OCR只能识别出单个文本行,无法还原表格结构。PP-Structure的表格识别模型可以输出表格的HTML结构,Excel格式的明细表可以直接还原。
文本检测与识别模块是基础OCR能力。DB文本检测模型负责找出图中所有的文本框,识别模型负责把文本框里的内容转成文字。对于票据这种高密度文本场景,检测模型的召回率比识别模型的准确率更关键,因为漏掉一个字段比识别错一个字段更麻烦。
关键信息抽取模块是这套系统的灵魂。普通OCR只输出一堆文本行和坐标,但我们需要的是“发票号码:XXXXX”这样的结构化字段。这个模块基于PaddleOCR的KIE能力,用布局信息和语义规则共同定位关键字段。我的实现是先用规则定位,再用模型兜底,准确率能到95%以上。
3.3 系统流程中的数据流转与异常处理机制
数据流转的路径清晰简单:原始票据图片进入预处理模块;预处理后的图片进入表格检测与还原;还原结果和原图同时进入文本检测识别;识别出的文本行带着坐标信息进入关键信息抽取;最后的结构化数据由置信度评估模块打分,低置信度结果标记为待人工复核。
异常处理是这个系统里容易被人忽略但很重要的部分。常见的异常有三类:一是图片格式不支持,直接返回错误;二是识别结果为空,可能是图片太模糊或者背景太复杂,需要返回重拍提示;三是置信度过低,必须人工介入。我在代码中为每个环节都加了独立的异常捕获,某一环节出错不会导致整条流程崩溃。
4. 票据分类模型:为每张票据找到正确的解析策略
4.1 为什么票据识别需要一个分类前置模块
刚开始做的时候,我天真地以为直接用一个统一模型就能搞定所有票据类型。实际跑了一轮之后发现完全不行。增值税发票和银行回单的字段布局完全不同,火车票更是特殊,票面信息密集而且排版极不规则。如果用同一套关键信息抽取规则去处理不同类型票据,结果就是换一种票据类型,准确率就崩掉一次。
分类前置模块的目的就是在识别之前先判断这张票据属于哪个类型,然后根据类型选择对应的解析策略。这样既提升了准确率,又降低了系统的耦合度。就好比你去医院看病,得先挂对应科室的号,而不是让一个全科医生处理所有疑难杂症。
4.2 基于PaddleOCR分类模型的实现方案
分类模块本身也用了OCR模型,但不是一个新模型,而是基于PaddleOCR已有的图像分类模型改出来的。具体做法是:对票据图片做缩放和归一化,然后通过一个轻量级分类模型输出票据类型标签。
实际我参考了PaddleOCR里文本图像分类的方案,把发票、银行回单、火车票、出租车票四类票据的样本各收集了500张左右,用PaddleClas的骨干网络做迁移学习。数据集不大,因为票据分类任务本身并不复杂,关键是抓住各类票据的全局特征,比如发票的红色抬头、银行回单的蓝色背景、火车票的蓝色底纹。训练了几个epoch之后,分类准确率就到了98%以上。
4.3 轻量级分类模型的训练数据准备
这里有一个容易忽略的细节:收集训练数据时,不能只用扫描件或者照片,最好是两者混用。因为实际业务中,有些票据是拍照上传的,有些是扫描进系统的,两种图像的质量和光照条件差异很大,只用一种数据训练出来的模型在另一种数据上准确率会明显下降。
数据增强也很重要。我自己实现了几个增强算子,包括随机旋转、亮度扰动、对比度扰动、添加高斯噪声。这样可以把几百张原始样本扩充出几千张训练数据。分类模型的训练在CPU上也能完成,不需要专门准备GPU服务器。
5. 表格识别与还原:最硬核的部分
5.1 表格检测与结构还原的技术实现
表格识别是整个票据提取系统里技术难度最高的部分。增值税发票里有一个货物或应税劳务、服务名称栏,是一个典型的无边框表格,每一行对应一条商品信息。普通OCR模型可以把文字识别出来,但不知道这些文字属于哪一行哪一列,而财务入账恰恰需要规整的行列结构。
PP-Structure里的表格识别模型解决的就是这个问题。它输出的结果是HTML格式的表格结构,每个单元格里的内容和坐标都能对上。拿到这个HTML结构,我再在后端用解析器转换成JSON数组,每一行就是一个结构化对象。
实际运行时,表格识别的耗时大概是其他模块总和的1.5倍,所以在批量处理场景下,我对是否需要进行表格识别做了条件判断:只有发票类型需要完整的表格还原,银行回单和火车票只需要关键字段抽取。
5.2 从识别结果到结构化JSON的转换细节
表格识别模型的输出是HTML结构,需要经过一层转换才能变成业务可用的数据。我在代码中定义了一个表格解析器,负责把HTML表格转成行列二维数组,然后根据表头信息把每一行的单元格映射到对应的字段名。
这里有一个坑必须提醒大家:PP-Structure表格识别输出的单元格坐标和文字内容有时候会错位,尤其是当某个单元格为空或者跨行的时候。我为了处理这个问题,在解析器里加了坐标校验逻辑,如果识别出的文字中心点不在单元格范围内,就丢弃或者标记为异常。
5.3 复杂版式表格的兜底策略
还有一种情况,表格非常复杂,比如合并单元格、斜线表头、嵌套表格,PP-Structure的效果也不尽如人意。我的兜底策略是:如果表格识别结果的置信度低于阈值,就直接走纯文本规则提取路线,把整个票据按文本行读取,然后用正则表达式去匹配关键内容。
纯文本规则提取的准确率确实不如表格识别,但至少能保证不丢数据。对财务场景来说,字段错位比识别错误更严重,因为错位会导致数据入错科目,而识别错误至少能在人工复核时看出来。
6. 关键信息抽取:核心的KIE技术路线与踩坑记录
6.1 KIE方案选型:规则驱动还是模型驱动
关键信息抽取,说白了就是从一堆识别出来的文本行里找到“发票号码”“开票日期”“金额”这些字段对应的值。这个环节有两条技术路线,一条是纯规则驱动,用正则表达式和关键词匹配;另一条是模型驱动,用序列标注或者阅读理解模型来做。
纯规则驱动的好处是解释性强,规则一目了然,出了错可以直接定位是哪个正则没匹配上;坏处是规则写多了之后维护成本指数级上涨,而且碰上文本位置偏移的情况容易失效。模型驱动的好处是泛化能力强,坏处是可解释性差,而且需要标注大量训练数据。
我最终走的是混合路线:先用规则快速定位大部分字段,再用模型处理规则覆盖不了的情况。这个方案兼顾了效率、准确率和可维护性,实践证明也是性价比最高的。
6.2 基于PP-Structure的关键信息抽取实践
PP-Structure的KIE能力基于SER(Semantic Entity Recognition)方法,可以对OCR识别出的文本进行分类,标注出哪些文本是公司名称、哪些是金额、哪些是日期等。我在训练这个KIE模型时,把增值税发票的标注数据整理成了统一的JSON格式,每个文本行都打上实体类型标签。
训练KIE模型需要的数据量比分类模型大不少。一个字段标注300条左右能勉强出效果,500条以上才能稳定。如果没有现成标注数据,可以先从公开的数据集入手,再加上自己清洗的一批票据样本。
实际测试时KIE模型的效果和预期有差距,主要体现在金额字段上。发票里的“小写金额”和“价税合计”在文本上非常相似,KIE模型经常会搞混。解决方法是结合规则信息:根据字段在票据版面中的相对位置做二次判断,“价税合计”通常位于发票右下区域且字号较大,可以在KIE模型输出之后再加上一个位置校验逻辑。
6.3 规则引擎与模型输出的组合策略
KIE模型输出的是每个文本行的实体类型和置信度,规则引擎在此基础上做进一步的校验和修正。规则引擎里我定义了每种票据类型的必填字段、字段类型、取值范围。比如发票号码必须是8位或者20位数字,开票日期必须是合法的日期格式,金额不能大于某个阈值。
如果规则引擎校验失败,系统会重新回到OCR文本列表中搜索附近的相似文本,看能否找到更合理的候选值。这一招在处理印章遮挡和模糊文本时特别有用。我曾经遇到过发票号码被发票专用章盖住一半的情况,KIE模型识别错了,但规则引擎回退搜索后找到了正确的号码。
7. 图像预处理与质量增强:容易忽视但影响巨大的环节
7.1 图像归一化与角度纠正
很多做OCR的人上来就直接调模型,忽略了图像的预处理。实际项目中,预处理对识别准确率的影响可能比换一个更先进的识别模型还要大。票据图像的常见问题包括:拍摄角度倾斜导致文本行不是水平的、光线不均导致部分区域过暗、背景复杂导致文字和背景对比度低。
我的预处理管线是这样的:第一步,图像缩放,保证最长边不超过2048像素,推荐参数是限制在2000到2500之间,太大增加耗时,太小丢失细节;第二步,角度校正,用PaddleOCR的方向分类器判断图像是否需要旋转,输出0度、90度、180度、270度四个方向;第三步,透射变换校正,针对拍照产生的透视形变进行处理,这一步需要借助票据的边框或者矩形区域来定位校正点。
7.2 低光照和模糊图像的增强处理
对于光照不均的图像,自适应阈值化和直方图均衡化是简单有效的手段。推荐使用对比度受限的自适应直方图均衡化(CLAHE),它可以在增强局部对比度的同时避免放大噪声。对于模糊图像,简单的高斯锐化或者拉普拉斯锐化能起到一定的改善作用,但如果图像严重失焦,任何预处理都救不回来,只能标记为低质量并请求重新上传。
7.3 图像质量评估与自动拒识机制
为了减少无效计算,我在预处理模块里加入了一个图像质量评估步骤。这个步骤计算三个指标:模糊度、倾斜角度、文本覆盖率。模糊度用拉普拉斯算子的方差来衡量,方差低于阈值说明图像缺乏边缘信息,大概率是模糊的;倾斜角度由检测到的文本行方向综合判断;文本覆盖率表示图像中文本区域占整个图像的比例。
如果质量评估不通过,系统直接返回提示信息,要求重新上传,而不是强行进入识别流程。这套机制帮我过滤掉了大约8%的无效图片,让整个识别服务的响应速度提升了不少。
8. 系统实现关键代码:从环境配置到核心推理
8.1 环境部署与依赖安装的完整步骤
环境部署是这套系统最折磨人的环节。Windows本地部署和Linux服务器部署我都踩过不少坑,这里给出一个经过反复验证的配置方案。
第一步,安装Python虚拟环境。推荐使用conda,Python版本选3.10。这里特别提醒,PaddleOCR 2.7版本在Python 3.11以上的环境会有兼容性问题,如果非要用3.11,建议直接升级到PaddleOCR 3.x,代码接口会有差异,需要适配。
conda create -n paddleocr_env python=3.10 conda activate paddleocr_env pip install paddlepaddle==2.5.2 pip install paddleocr==2.7.0第二步,安装依赖库。paddleocr会自动安装大部分依赖,但有些视觉库需要手动确认:
pip install opencv-python pip install shapely pip install pyclipper pip install Pillow第三步,验证安装是否成功。如果代码里没有语法错误,说明环境基本就绪:
from paddleocr import PaddleOCR ocr = PaddleOCR(use_angle_cls=True, lang='ch')8.2 核心OCR推理代码与参数优化
PaddleOCR初始化时有很多参数可以调,这里给出我调优后的一套配置:
ocr = PaddleOCR( use_angle_cls=True, # 启用方向分类 lang='ch', # 使用中文模型 det_db_thresh=0.3, # 检测阈值,调低可提升召回率 det_db_box_thresh=0.5, # 检测框阈值 det_db_unclip_ratio=1.6, # 文本框扩张比例 rec_batch_num=6, # 识别批处理数量 drop_score=0.5, # 低于该分数的结果丢弃 )这个配置里的几个参数值得好好解释。det_db_thresh是文本检测的阈值,0.3意味着模型认为一个像素是文本的概率超过0.3才会被纳入候选区域。调低这个值可以提高文本召回率,但也会引入更多的误检框。det_db_unclip_ratio是文本框扩张比例,票据上文字密集,我将这个值设置成1.6,让文本框稍微扩张,防止字符被切断。
批处理数量rec_batch_num对速度影响很大。PaddleOCR支持把多个文本行图片放在一个batch里识别,batch越大,GPU利用率越高,但内存消耗也越大。CPU环境下我建议设置成4到6,太大会撑爆内存。
8.3 对低置信度结果的二次校验策略
PaddleOCR返回的识别结果里带有置信度分数,这个分数可以直接用来做二次校验。如果某个字段的识别置信度低于0.7,我就认为这个字段不可靠,会尝试重新识别或者标记为待复核。
二次校验的代码逻辑是:先按坐标位置找到目标文本行,如果置信度低,就用原始图片裁剪出该区域,用更高精度的识别模式再跑一次。如果两次结果一致,说明识别正确;如果不一致,以置信度高的一次为准。这套策略把关键字段的准确率从91%提升到了95%以上。
9. 疑难问题与排查记录:实际部署中遇到的坑
9.1 Windows环境下的推理速度优化
在Windows上部署这套系统,最大的问题是推理速度。PaddlePaddle的CPU版本在Windows上的性能表现不如Linux,可能有一定的性能差距,再加上Windows自带的杀毒软件会反复扫描临时文件,进一步拖慢了速度。
我的优化方案有三条:第一,将模型导出为ONNX格式,绕开PaddlePaddle的图优化环节,推理速度提升30%左右;第二,关闭调试模式,在代码里设置环境变量FLAGS_use_mkldnn=True,启用Intel的数学核心库加速;第三,使用多线程并发处理批量任务,但要注意线程数不要超过CPU物理核心数,否则频繁切换反而更慢。
9.2 不同票据类型的识别准确率调优
增值税专用发票的识别准确率最高,因为新版数电票版式比较规整,字段位置固定。老版本纸质发票的识别准确率稍低,主要受印章和手写体干扰。银行回单的识别难点在于字段多而且排版紧凑,关键信息散落在各个角落。火车票是特例,票面用了特殊的蓝色底纹,文本识别模型一开始效果很差,后来我在预处理阶段加了颜色通道分离,只提取蓝色通道的图像,识别准确率才上来。
如果遇到某类票据识别效果不佳,不要盲目换模型,先把该类票据的样本跑一遍,观察识别失败集中在哪个环节。是文本检测漏检了,还是识别错了,还是关键信息抽取定位偏了,针对性修复对应的模块,效率最高。
9.3 批量处理时的内存泄漏与进程管理
批量处理成了规模之后,内存泄漏问题开始暴露。PaddleOCR在循环调用时,如果每次都初始化新的PaddleOCR实例,内存占用会只增不减,最终导致系统崩溃。解决方法是把PaddleOCR实例做成全局单例,整个进程生命周期只初始化一次。
多次调用推理接口后,内存碎片可能导致性能下降。我的方案是定期重启工作进程,或者使用multiprocessing池,每个子进程处理一批任务后自动退出,内存自然释放。实测通过进程池的方式,批量处理1000张票据不会出现内存异常增长的问题。
10. 系统测试与效果评估
10.1 测试数据集构建与标注策略
评估这套系统的效果,不能只看模型在官方数据集上的指标,必须用贴近业务的数据做测试。我从三个渠道收集了测试数据:业务方提供的真实票据扫描件、同事手机拍摄的票据照片、从公开数据集里筛选的票据图片。测试集一共1500张,覆盖增值税发票、银行回单、火车票、出租车票四种类型。
标注策略上,每张票据需要标注出关键字段的文本内容和坐标位置。这个工作很枯燥,但标注质量直接决定了KIE模型的上限。我开发了一个简单的标注辅助工具,能把PaddleOCR初步识别出的文本行展示出来,人工确认哪些是目标字段,效率比纯手工标注快不少。
10.2 关键指标的实测数据
在1500张测试集上的实测数据如下:
票据类型 关键字段准确率 端到端平均耗时(CPU) 端到端平均耗时(GPU)
增值税发票 96.2% 1.8秒 0.6秒
银行回单 94.8% 1.5秒 0.5秒
火车票 93.5% 1.2秒 0.4秒
出租车票 92.1% 1.0秒 0.3秒
这里说的准确率是指“整张票据所有关键字段全部识别正确”的比例,不是单字段准确率。单看字段级准确率会更高,大约在98%左右,但字段级指标在业务上没有意义,因为哪怕只有一个字段错了,票据就要进人工复核流程。
10.3 与人工录入效率对比
用一个直观的数据对比来说明这套系统的价值:一个熟练的财务录入人员处理一张增值税发票的平均时间是40秒,这套系统在CPU环境下只需要1.8秒,速度快了20倍以上。人工录入的准确率大约在98%,系统加上人工复核机制之后可以达到99.5%以上。
当然,这套系统并不能完全替代人工。低置信度票据仍然需要人工介入。我在系统设计里预留了一个人工复核Web界面,操作员可以看到系统识别出的字段和原始图片,确认或修改后提交,最终的数据准确率可以达到100%。
11. 项目文件结构与使用说明
11.1 项目目录结构解析
最后说一下这个系统源码包的目录结构,方便你拿到后快速上手:
ocr_invoice_system/ ├── config/ # 配置文件目录 │ ├── invoice_config.yaml # 票据类型配置 │ └── model_config.yaml # 模型参数配置 ├── data/ # 数据目录 │ ├── input/ # 待识别票据存放目录 │ ├── output/ # 识别结果输出目录 │ └── test_samples/ # 测试样本 ├── models/ # 模型文件目录 ├── src/ # 核心代码目录 │ ├── preprocessing/ # 图像预处理模块 │ ├── detection/ # 文本检测模块 │ ├── recognition/ # 文本识别模块 │ ├── table/ # 表格识别模块 │ ├── kie/ # 关键信息抽取模块 │ ├── postprocess/ # 后处理与规则引擎 │ └── api/ # Web API接口 ├── tests/ # 测试脚本 ├── requirements.txt # 依赖清单 └── README.md # 项目说明文档11.2 快速使用与配置调整指南
拿到源码包后,按照README文档里的步骤操作即可。先把环境搭好,然后修改config目录下的两个配置文件。invoice_config.yaml里定义了各种票据类型的字段规则,model_config.yaml定义了模型路径和推理参数。
测试阶段,把票据图片放入data/input目录,运行主脚本就能看到识别结果:
python main.py --source data/input --output data/output输出的JSON文件结构清晰,每个字段包含文本值、置信度坐标和识别状态。status字段标记了这个字段是正常识别、二次校验还是需要人工复核,方便后续流程做判断。
最后再分享一个完成这个项目后的心得。做票据识别这类系统,技术模型只占一半的精力,另一半全在数据清洗、规则设计和异常兜底上。PaddleOCR提供了强大的工具链,省去了我们大量从零搭建的时间,但它解决不了所有业务细节问题,真正让系统稳定好用的,还是你对自己业务票据的深入理解,以及那些规则背后的经验和积累。希望这套设计思路能帮你避免一些我踩过的坑,少走一些弯路。
本文还有配套的精品资源,点击获取