当前位置: 首页 > news >正文

cv_resnet18_ocr-detection实战:发票信息自动提取系统搭建

cv_resnet18_ocr-detection实战:发票信息自动提取系统搭建

1. 项目背景与价值

想象一下,财务人员每天都要面对堆积如山的发票,手动录入信息不仅耗时费力,还容易出错。有没有一种方法,能让电脑自动“看懂”发票,把上面的文字信息提取出来呢?

这就是我们今天要搭建的系统——基于cv_resnet18_ocr-detection模型的发票信息自动提取系统。这个系统能帮你把发票图片变成结构化的数据,比如公司名称、税号、金额、日期等,直接导入到Excel或财务软件里。

为什么选择这个模型?

  • 精度高:基于ResNet18骨干网络,文字检测准确率很不错
  • 速度快:推理速度快,处理一张发票图片只要几秒钟
  • 易部署:提供了完整的WebUI界面,不用写代码也能用
  • 可定制:支持用自己的数据训练,适应不同格式的发票

2. 系统搭建全流程

2.1 环境准备与快速部署

首先,你需要一个能运行Python的环境。推荐使用Linux系统,但Windows和macOS也都可以。

步骤一:获取项目代码

# 克隆项目到本地 git clone https://github.com/your-repo/cv_resnet18_ocr-detection.git cd cv_resnet18_ocr-detection

步骤二:安装依赖包

# 创建虚拟环境(可选但推荐) python -m venv venv source venv/bin/activate # Linux/macOS # 或 venv\Scripts\activate # Windows # 安装依赖 pip install -r requirements.txt

步骤三:一键启动WebUI

# 进入项目目录 cd /root/cv_resnet18_ocr-detection # 运行启动脚本 bash start_app.sh

启动成功后,你会看到这样的提示:

============================================================ WebUI 服务地址: http://0.0.0.0:7860 ============================================================

现在打开浏览器,访问http://你的服务器IP:7860,就能看到漂亮的紫色渐变界面了。

2.2 界面功能快速了解

这个WebUI界面设计得很直观,主要分为四个功能区域:

单图检测:上传一张发票图片,立即看到识别结果批量检测:一次上传多张发票,批量处理提高效率训练微调:用你自己的发票数据训练模型,提高识别准确率ONNX导出:把模型导出成通用格式,方便在其他平台使用

界面顶部有开发者的版权信息,记得使用时要保留哦。

3. 发票信息提取实战

3.1 单张发票处理

让我们从最简单的开始——处理一张发票。

第一步:上传发票图片点击“单图检测”标签页,找到“上传图片”区域。你可以拖拽图片进去,或者点击选择文件。系统支持JPG、PNG、BMP格式,建议图片清晰一些,识别效果会更好。

第二步:调整检测阈值你会看到一个滑块,范围是0.0到1.0,默认是0.2。这是什么意思呢?

  • 阈值调低(比如0.1):系统会更“敏感”,可能把一些不是文字的东西也识别出来
  • 阈值调高(比如0.4):系统会更“严格”,只识别它很确定是文字的部分

对于普通发票,建议用0.2-0.3;如果发票文字比较模糊,可以调到0.1-0.2。

第三步:开始检测点击“开始检测”按钮,等待几秒钟。系统会做三件事:

  1. 检测图片中所有文字区域
  2. 识别每个区域里的文字内容
  3. 把结果展示给你看

第四步:查看结果结果会显示在三个地方:

  1. 识别文本内容:提取出来的所有文字,带编号,可以直接复制
  2. 检测结果图片:在原图上用框标出了识别到的文字区域
  3. 检测框坐标:每个文本框的具体位置信息(JSON格式)

举个例子,处理一张电商发票,你可能会看到这样的结果:

1. 100%原装正品提供正规发票 2. 华航数码专营店 3. 正品保证 4. 天猫商城 5. 电子元器件提供BOM配单

第五步:下载结果如果需要保存结果,点击“下载结果”按钮,就能把带标注框的图片保存到本地。

3.2 批量处理发票

如果你有一堆发票要处理,用批量功能就方便多了。

操作步骤:

  1. 切换到“批量检测”标签页
  2. 点击“上传多张图片”,可以按住Ctrl键多选,或者用Shift键选择连续的文件
  3. 调整检测阈值(建议先用默认值试试)
  4. 点击“批量检测”按钮

系统会按顺序处理所有图片,处理完成后在下方展示结果画廊。你可以一张张查看,也可以点击“下载全部结果”一次性保存。

小贴士:

  • 一次不要上传太多,建议不超过50张,避免内存不够
  • 如果图片大小不一,系统会自动调整,但太大的图片处理会慢一些
  • 批量处理时,所有图片使用相同的检测阈值

3.3 结果解析与整理

识别出来的文字是原始结果,我们还需要整理成结构化的信息。

常见发票信息类型:

  • 销售方信息:公司名称、纳税人识别号、地址电话
  • 购买方信息:同上
  • 发票基本信息:发票代码、发票号码、开票日期
  • 商品信息:名称、规格、数量、单价、金额
  • 合计信息:金额合计、税额、价税合计

你可以写一个简单的Python脚本来整理这些信息:

import json import re def parse_invoice_text(ocr_results): """解析OCR识别结果,提取结构化信息""" invoice_info = { 'seller': {'name': '', 'tax_id': ''}, 'buyer': {'name': '', 'tax_id': ''}, 'invoice': {'code': '', 'number': '', 'date': ''}, 'items': [], 'total': {'amount': 0, 'tax': 0, 'total_with_tax': 0} } # 假设ocr_results是识别出的文本列表 for text in ocr_results: text = text.strip() # 匹配公司名称(简单示例) if '公司' in text or '有限' in text: if '销售方' in text: invoice_info['seller']['name'] = text elif '购买方' in text: invoice_info['buyer']['name'] = text # 匹配税号(18位数字) tax_match = re.search(r'[0-9]{18}', text) if tax_match: # 根据上下文判断是销售方还是购买方 pass # 匹配金额 amount_match = re.search(r'¥?\s*(\d+(?:\.\d{2})?)', text) if amount_match: # 根据上下文判断金额类型 pass return invoice_info # 使用示例 ocr_texts = [ "销售方:北京某某科技有限公司", "纳税人识别号:91110108MA01ABCDEF", "金额:¥1,234.56", "价税合计:¥1,456.78" ] invoice_data = parse_invoice_text(ocr_texts) print(json.dumps(invoice_data, indent=2, ensure_ascii=False))

4. 模型训练与优化

4.1 为什么要训练自己的模型?

虽然预训练模型已经不错,但如果你处理的发票有特殊格式、特殊字体或者特殊背景,训练自己的模型能显著提高准确率。

什么情况下需要训练:

  • 你的发票格式比较特殊(比如医疗发票、出租车发票)
  • 发票上的字体比较特别
  • 发票背景复杂,有干扰元素
  • 需要识别手写体发票

4.2 准备训练数据

训练数据需要按照ICDAR2015格式准备,这是OCR领域的标准格式。

数据目录结构:

custom_invoice_data/ ├── train_list.txt # 训练集文件列表 ├── train_images/ # 训练图片 │ ├── invoice_001.jpg │ ├── invoice_002.jpg │ └── ... ├── train_gts/ # 训练标注 │ ├── invoice_001.txt │ ├── invoice_002.txt │ └── ... ├── test_list.txt # 测试集列表 ├── test_images/ # 测试图片 └── test_gts/ # 测试标注

标注文件格式(每个txt文件对应一张图片):

x1,y1,x2,y2,x3,y3,x4,y4,文本内容

举个例子,如果发票上有一行文字“销售方:某某公司”,它的四个角坐标是(100,200)、(300,200)、(300,220)、(100,220),那么标注就是:

100,200,300,200,300,220,100,220,销售方:某某公司

列表文件格式(每行一个图片和对应的标注):

train_images/invoice_001.jpg train_gts/invoice_001.txt train_images/invoice_002.jpg train_gts/invoice_002.txt

4.3 开始训练

在WebUI的“训练微调”标签页:

  1. 输入训练数据目录:比如/root/custom_invoice_data
  2. 设置训练参数
    • Batch Size:一次处理多少张图片,内存大可以设大点,一般8-16
    • 训练轮数:整个数据集训练多少遍,5-10轮通常够了
    • 学习率:模型学习的速度,默认0.007就行
  3. 点击“开始训练”

训练过程中,你可以在workdirs/目录下查看训练日志。训练完成后,会生成微调后的模型文件。

4.4 训练小技巧

数据量要够:至少准备100-200张标注好的发票图片数据要多样:包含不同角度、不同光照、不同格式的发票先少后多:先用少量数据训练几轮看看效果,再增加数据注意过拟合:如果训练集效果很好但测试集效果差,可能是过拟合了

5. 高级应用与集成

5.1 导出ONNX模型

如果你想把模型集成到其他系统里,可以导出为ONNX格式。

操作步骤:

  1. 切换到“ONNX导出”标签页
  2. 设置输入尺寸(默认800×800就行)
  3. 点击“导出ONNX”按钮
  4. 下载导出的模型文件

输入尺寸选择建议:

  • 640×640:速度最快,适合实时处理
  • 800×800:平衡速度和精度,推荐使用
  • 1024×1024:精度最高,但速度慢一些

导出的ONNX模型可以在很多平台上使用,比如用C++写的桌面程序、手机APP、或者嵌入式设备。

5.2 Python API调用

除了WebUI,你也可以用Python代码直接调用模型:

import cv2 import numpy as np from PIL import Image import torch def detect_invoice_text(image_path, model_path='model.pth'): """使用模型检测发票文字""" # 加载模型 from models.resnet import ResNet18_OCR model = ResNet18_OCR() model.load_state_dict(torch.load(model_path)) model.eval() # 读取和预处理图片 image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 调整大小(保持长宽比) h, w = image.shape[:2] max_size = 800 scale = max_size / max(h, w) new_h, new_w = int(h * scale), int(w * scale) image_resized = cv2.resize(image, (new_w, new_h)) # 转换为模型输入格式 input_tensor = torch.from_numpy(image_resized).permute(2, 0, 1).float() input_tensor = input_tensor.unsqueeze(0) / 255.0 # 推理 with torch.no_grad(): outputs = model(input_tensor) # 后处理:提取文本框和文字 boxes, texts, scores = postprocess_outputs(outputs) return boxes, texts, scores def postprocess_outputs(outputs, threshold=0.2): """后处理模型输出""" boxes = [] texts = [] scores = [] # 这里简化了,实际需要根据模型输出结构解析 # 通常包括文本框坐标、文字识别结果、置信度 return boxes, texts, scores # 使用示例 boxes, texts, scores = detect_invoice_text('invoice.jpg') for i, (box, text, score) in enumerate(zip(boxes, texts, scores)): print(f"{i+1}. {text} (置信度: {score:.2f})")

5.3 与财务系统集成

识别出来的发票信息,可以自动导入到财务系统里。这里有个简单的示例,展示如何把结果保存为CSV文件:

import csv from datetime import datetime def save_to_csv(invoice_data, filename='invoice_results.csv'): """将发票数据保存为CSV文件""" fieldnames = [ '发票代码', '发票号码', '开票日期', '销售方名称', '销售方税号', '购买方名称', '购买方税号', '商品名称', '数量', '单价', '金额', '合计金额', '税额', '价税合计', '识别时间' ] with open(filename, 'w', newline='', encoding='utf-8-sig') as f: writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() for invoice in invoice_data: # 这里假设invoice_data是解析后的结构化数据 row = { '发票代码': invoice.get('code', ''), '发票号码': invoice.get('number', ''), '开票日期': invoice.get('date', ''), '销售方名称': invoice.get('seller_name', ''), '销售方税号': invoice.get('seller_tax_id', ''), '购买方名称': invoice.get('buyer_name', ''), '购买方税号': invoice.get('buyer_tax_id', ''), '识别时间': datetime.now().strftime('%Y-%m-%d %H:%M:%S') } # 处理商品信息(可能有多个商品) for i, item in enumerate(invoice.get('items', [])): if i > 0: # 同一张发票的多个商品,新建一行 row = {k: '' for k in fieldnames} row['发票代码'] = invoice.get('code', '') row['发票号码'] = invoice.get('number', '') row.update({ '商品名称': item.get('name', ''), '数量': item.get('quantity', ''), '单价': item.get('unit_price', ''), '金额': item.get('amount', '') }) writer.writerow(row) print(f"数据已保存到 {filename}") # 也可以直接保存原始识别结果 def save_ocr_results(texts, image_path, output_dir='results'): """保存OCR识别结果""" import os os.makedirs(output_dir, exist_ok=True) # 获取图片文件名(不含扩展名) basename = os.path.splitext(os.path.basename(image_path))[0] # 保存为txt文件 txt_path = os.path.join(output_dir, f"{basename}.txt") with open(txt_path, 'w', encoding='utf-8') as f: for i, text in enumerate(texts, 1): f.write(f"{i}. {text}\n") # 保存为JSON文件(包含更多信息) json_path = os.path.join(output_dir, f"{basename}.json") import json result = { 'image': image_path, 'timestamp': datetime.now().isoformat(), 'text_count': len(texts), 'texts': texts } with open(json_path, 'w', encoding='utf-8') as f: json.dump(result, f, ensure_ascii=False, indent=2) return txt_path, json_path

6. 实际应用案例

6.1 案例一:企业财务自动化

场景:一家中型企业,每月要处理500+张各类发票,财务人员需要手动录入到ERP系统。

解决方案

  1. 搭建发票识别服务器,部署cv_resnet18_ocr-detection
  2. 开发一个简单的上传界面,让各部门拍照上传发票
  3. 系统自动识别发票信息,保存到数据库
  4. 财务人员只需在Web界面核对和确认,数据自动同步到ERP

效果

  • 处理时间从2小时/天减少到15分钟/天
  • 录入错误率从5%降低到0.5%
  • 支持移动端拍照上传,随时随地处理发票

6.2 案例二:出租车公司报销系统

场景:出租车司机需要提交加油发票、维修发票等报销,传统方式是纸质提交,财务手动录入。

解决方案

  1. 司机通过微信小程序拍照上传发票
  2. 后台自动识别发票关键信息(金额、日期、销售方)
  3. 系统自动匹配报销单和发票
  4. 财务在线审批,自动生成付款单

效果

  • 报销周期从7天缩短到1天
  • 减少了纸质发票的存储和管理成本
  • 司机可以实时查看报销进度

6.3 案例三:电商平台商家对账

场景:电商平台上的商家,需要处理大量平台开具的电子发票,手动对账效率低。

解决方案

  1. 商家批量下载电子发票(PDF或图片)
  2. 使用批量识别功能,一次性处理所有发票
  3. 系统提取关键信息:订单号、金额、开票日期
  4. 自动与销售订单匹配,生成对账报表

效果

  • 对账时间从3天减少到2小时
  • 自动发现差异订单,减少人工核对
  • 支持导出Excel报表,方便进一步分析

7. 性能优化建议

7.1 硬件选择

根据你的业务量,可以选择不同的硬件配置:

小规模使用(<100张/天)

  • CPU:4核以上
  • 内存:8GB
  • 存储:100GB SSD
  • 成本:约500元/月(云服务器)

中等规模(100-1000张/天)

  • CPU:8核
  • 内存:16GB
  • GPU:GTX 1060或同等
  • 存储:200GB SSD
  • 成本:约1500元/月

大规模使用(>1000张/天)

  • CPU:16核
  • 内存:32GB
  • GPU:RTX 3090或更好
  • 存储:500GB SSD + 1TB HDD
  • 成本:约5000元/月

7.2 软件优化

使用GPU加速:如果有NVIDIA GPU,确保安装了CUDA和cuDNN图片预处理:上传前压缩图片,减少传输和处理时间批量处理优化:合理设置batch size,平衡速度和内存使用缓存机制:对相同发票模板,缓存识别结果

7.3 识别准确率提升

多模型融合:可以结合其他OCR模型,取长补短后处理规则:针对发票特点,添加校验规则(如税号必须是18位)人工复核界面:重要的发票提供人工复核功能持续训练:定期用新的发票数据训练模型

8. 常见问题解决

8.1 识别效果不理想怎么办?

问题:有些文字识别不出来,或者识别错了

解决步骤:

  1. 检查图片质量:确保图片清晰,文字不模糊
  2. 调整检测阈值:尝试调低阈值(如0.1)或调高阈值(如0.4)
  3. 图片预处理:尝试调整亮度、对比度,或转为灰度图
  4. 训练专用模型:用你的发票数据训练模型
  5. 人工标注修正:重要的发票可以人工修正识别结果

8.2 处理速度太慢怎么办?

问题:识别一张发票要十几秒,太慢了

优化建议:

  1. 使用GPU:如果有GPU,确保模型在GPU上运行
  2. 减小图片尺寸:上传前把图片缩小到合适大小
  3. 批量处理:一次处理多张,比一张张处理快
  4. 升级硬件:增加CPU核心数或内存
  5. 使用ONNX Runtime:导出ONNX模型后用ONNX Runtime推理,速度更快

8.3 内存不足怎么办?

问题:处理大量图片时程序崩溃

解决方法:

  1. 减少批量大小:批量检测时少传几张图片
  2. 及时清理缓存:定期清理outputs目录
  3. 增加虚拟内存:Linux系统可以增加swap空间
  4. 分批次处理:写脚本分批处理大量图片
  5. 使用轻量模型:考虑使用更小的模型版本

8.4 特殊发票格式识别不好?

问题:某些特殊格式的发票(如手写发票、旧版发票)识别率低

解决方案:

  1. 收集样本数据:收集至少50张这种发票的图片
  2. 标注训练数据:仔细标注文字区域和内容
  3. 训练专用模型:用这些数据训练或微调模型
  4. 添加后处理规则:针对这种发票的特点添加校验规则
  5. 人工复核流程:重要的发票设置人工复核环节

9. 总结

通过cv_resnet18_ocr-detection模型,我们搭建了一个实用的发票信息自动提取系统。这个系统有几个明显优势:

上手简单:有Web界面,不用写代码也能用效果不错:对于常见发票,识别准确率能满足日常需求扩展性强:支持训练自己的模型,适应特殊需求集成方便:提供API接口,可以和其他系统对接

实际使用建议:

  1. 从小规模开始:先用几十张发票测试效果
  2. 逐步优化:根据测试结果调整阈值、训练模型
  3. 建立流程:设计合理的工作流程,结合人工复核
  4. 持续改进:定期收集问题数据,优化模型

发票信息提取只是OCR技术的一个应用场景。同样的技术,稍加调整就可以用于:

  • 身份证、驾驶证等证件识别
  • 合同、报告等文档数字化
  • 商品标签、包装文字识别
  • 街景门牌号识别

技术本身不难,难的是结合实际业务场景,设计出好用、实用的系统。希望这个实战指南能帮你快速搭建起自己的发票处理系统,让电脑帮你完成繁琐的文字录入工作。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.cnnetsun.cn/news/1256678.html

相关文章:

  • WeKnora部署教程:青云QingCloud容器平台一键部署WeKnora生产实例
  • VideoAgentTrek-ScreenFilter免配置环境:7860端口直连,无需Docker命令
  • Alexa488修饰β-环糊精,β-CD-Alexa488,Alexa647修饰β-环糊精,β-CD-Alexa647,IRDye800修饰β-环糊精,β-CD-IRDye800
  • 浦语灵笔2.5-7B教育场景实战:试卷扫描图→知识点标注+错因分析
  • 收藏!小白程序员必备:大模型核心特点解析与应用避坑指南
  • daily_stock_analysisA股智能分析系统源码调试使用指南
  • SBS《Veiled Cup》,开启超大型亚洲巡回演唱会! - 携手TOP5在亚洲9个国家举办30场巡演……扩展为音乐盛典形式
  • 华为 MetaERP 关联交易管理模块:Inside/Outside 选型及 4A 架构交互分析
  • LangGraph学习
  • 〔重庆理工大学〕计算机视觉方向实验报告【实验一 人脸检测与识别】
  • 磁盘分区与文件系统
  • 机械臂模仿学习2.1:行为克隆
  • Android tinyalsa深度解析之mixer_wait_event调用流程与实战(一百五十八)
  • 【工具开发自用】FVTracker基于Python的基金估值跟踪工具1.22更新发布
  • LLM Weekly(2026.2.23-2026.3.1)
  • Android功耗系列专题理论之十二:待机功耗问题关键分析点
  • 微信小程序开发项目搭建(保姆教程)
  • 基于上camera WIFI最小系统设计探索
  • 第一周单片机学习笔记及心得
  • 计算机毕业设计 java 新能源汽车运力管理系统 Java 智能新能源汽车运力管理平台 SpringBoot+MySQL 新能源汽车运力管理系统
  • Firefly ITX-RK3588 实战:MIPI CSI摄像头采集,FFmedia本地HDMI预览与GStreamer网络推流全链路解析
  • Linux Mint远程开发环境搭建:SSH配置与root权限管理避坑指南
  • Feign服务调用超时全解析:从Eureka注册中心到网络配置的深度排查
  • Linux网络性能实战:一键公网测速脚本在边缘设备与云服务器上的部署与应用
  • 5分钟搞定:用Docker快速部署OpenWRT镜像(附Zabbix监控配置)
  • 零基础学网络安全的难度如何?
  • LCD时序参数配置实战:从TFT-RGB接口到HSYNC/VSYNC信号调试技巧
  • Chatbot智能问诊系统架构设计与实现:从技术选型到生产环境部署
  • DeOldify开源模型对比分析:与其它图像上色项目的效果与技术差异
  • 【书生·浦语】internlm2-chat-1.8b入门指南:Ollama界面操作+提问技巧详解