收据数字化一直是财务管理和个人记账中的痛点。相比银行账户中的数字交易记录,纸质收据能提供更详细的商品级消费信息,但处理起来却麻烦得多。我最近用计算机视觉和语言模型搭建了一套收据自动识别系统,效果相当不错。这个方案不仅能提取收据上的所有文字信息,还能回答特定问题(比如"某件商品花了多少钱"),甚至计算税费。下面分享我的完整实现过程。
传统OCR技术虽然能识别文字,但缺乏理解收据结构的能力。经过对比测试,我发现多模态视觉语言模型(如GPT-4V、Claude 3等)具有三大优势:
Roboflow Workflows是我最终选择的编排工具,主要因为:
提示:如果处理敏感财务数据,建议使用支持本地部署的模型如Florence-2,避免数据外泄。
需要提前准备好:
bash复制# 安装Python SDK
pip install inference-sdk
关键技巧是预先定义JSON输出结构,引导模型规范返回数据。这是我的模板:
json复制{
"location": "",
"time": "",
"date": "",
"transactions": [
{
"item": "",
"cost": ""
}
],
"total_cost": "",
"tax_amount": ""
}
在GPT配置中加入以下提示词能显著提升准确率:
code复制你是一个专业的收据解析系统,请从图片中提取以下信息:
1. 商家地址填在location字段
2. 时间格式统一为HH:MM AM/PM
3. 商品列表需包含完整品名和单价
4. 税费单独计算
建议准备三类测试收据:
我遇到的典型问题及解决方案:
| 问题现象 | 原因分析 | 解决方法 |
|---|---|---|
| 商品名称被截断 | 模型过度简化 | 在提示词中强调"完整品名" |
| 税费计算错误 | 未区分含税价 | 添加"区分税前税后价"提示 |
| 时间格式混乱 | 各国格式差异 | 强制规定输出格式 |
对于同时拍摄多张收据的情况,我增加了YOLOv8检测模型作为预处理:
python复制# 伪代码示例
receipts = detect_receipts(image)
for receipt in receipts:
cropped = crop(image, receipt.bbox)
result = query_gpt4v(cropped)
通过Slack Incoming Webhook发送通知:
注意:建议对金额等敏感信息进行脱敏处理后再发送到Slack。
经过两周的实际使用,我总结出这些提升效率的方法:
python复制# 图像预处理示例
def preprocess(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return thresh
收据反光问题:在光线不均匀的环境下拍摄时,建议:
特殊字符处理:遇到"¥"、"€"等符号时,模型可能混淆货币单位。解决方法是在提示词中明确指定货币类型。
验证机制:对关键字段添加合理性检查,比如:
这套系统目前已经处理了我三个月的各类收据,准确率稳定在92%以上。最大的惊喜是模型对非标准格式的适应能力——连加油站的手写收据都能正确识别。不过建议对重要财务数据还是进行人工复核,毕竟AI偶尔会有意想不到的误识别。