b7efe734be
新文件: "AI\346\212\200\346\234\257/cc-switch&claude-code.md" 重命名: hermes-agent.md -> "AI\346\212\200\346\234\257/hermes-agent.md" 删除: "AI\346\212\200\346\234\257/\345\207\206\345\244\207.md" 重命名: "\347\224\265\345\255\220\347\247\244\345\233\276\347\211\207\350\257\206\345\210\253\347\263\273\347\273\237\350\256\276\350\256\241.md" -> "AI\346\212\200\346\234\257/\347\224\265\345\255\220\347\247\244\345\233\276\347\211\207\350\257\206\345\210\253\347\263\273\347\273\237\350\256\276\350\256\241.md"
12 KiB
12 KiB
电子秤图片识别系统设计文档
版本:v1.0
最后更新:2026-05-20
状态:草案(待迭代)
1. 项目背景
1.1 业务场景
用户拍摄电子秤显示器图片,需自动提取**读数(数字 + 单位)**用于数据录入或核对。
图片来源包括家用体重秤、台秤、智能手机 App 截图等。
1.2 现状
- 现有脚本
preprocess.py仅完成 ROI 裁剪 + 对比度增强,无识别能力 - 122 张样本通过人工 + 多模态模型识别,准确率约 80%,主要误差来源见 §2
1.3 目标
- 短期:将自动识别准确率提升至 ≥85%,剩余由人工核对
- 中期:达到 ≥95%,仅极端模糊/异常显示需要人工
- 长期:支持任意品牌秤的型号自动识别 + 单位歧义消除
2. 问题分析(基于 122 张样本)
2.1 误差来源分布
| 误差类型 | 占比 | 典型样例 | 严重性 |
|---|---|---|---|
| 拍摄方向倒置 | ~25% | 倒着读"119.35"识别为反向 | 🔴 高 |
| ROI 裁切过紧 | ~12% | 只剩"6"丢失其余数字 | 🔴 高 |
| 7段数码管字符混淆 | ~16% | 7↔L、2↔5、6↔9 |
🟡 中 |
| 显示器反光/模糊 | ~8% | 粉色秤小屏幕 | 🟡 中 |
| 单位歧义(kg/斤) | ~5% | 小米秤同显示两种模式 | 🟢 低 |
| 显示异常(启动/出错) | ~2% | 段笔画不完整 | 🟢 低 |
2.2 设备类型分布
| 设备类型 | 占比 | 显示特征 | 难点 |
|---|---|---|---|
| 蓝背光 LCD 体重秤 | ~40% | 黑字蓝底 | 反光、自适应阈值难 |
| LED 数码管秤(橙/白) | ~20% | 高对比度发光数字 | 易倒置拍摄 |
| 香山台秤(多屏) | ~10% | 黑底白字三段 LCD | 多窗口干扰 |
| App 截图 | ~25% | 高清,多字段 | 需要定位"主体重"字段 |
| 其他(粉色、HUAWEI、LEFU 等) | ~5% | 各异 | 长尾问题 |
3. 技术方案
3.1 整体 Pipeline
┌─────────┐ ┌──────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│ 原始图片 │ → │ EXIF校正 │ → │ ROI检测 │ → │ 方向校正│ → │ 增强 │ → │ OCR识别 │
└─────────┘ └──────────┘ └────────┘ └────────┘ └────────┘ └────────┘
↓
┌──────────────────┐
│ 数值+单位解析 │
│ 合理性校验 │
└──────────────────┘
↓
┌──────────────────┐
│ 输出:值/单位/置信│
└──────────────────┘
3.2 各阶段技术选型
Step 1 — EXIF 方向校正
目的:手机拍摄的 JPG 自带 Orientation 元数据,可零成本转正。
方案:PIL.ExifTags 读取 Orientation 标签,按 3/6/8 三种 case 旋转。
预期收益:解决约 30% 的方向问题,几乎无成本。
Step 2 — ROI 检测(屏幕区域定位)
目的:从全图裁出显示器矩形,降低 OCR 干扰。
方案:4 策略加权打分:
- 策略 A:LED 高亮 + 低饱和(白/黄数码管)— boost ×1.3
- 策略 B:蓝色背光 LCD(HSV: H∈[85,140])
- 策略 C:白色/浅色 LCD(V>180, S<60)
- 策略 D:Canny 边缘 + 横向膨胀(用于黑底白字台秤)— boost ×0.8
打分维度:面积比、宽高比、对比度、亮度。
风险:当前 margin 15% 偏紧,新版调至 20%;仍需观察。
Step 3 — 方向校正(4 向暴力 + 评分)
目的:解决倒置/侧拍。
评分项:
- 形状先验:显示器一般
w>h(横向) → +1 - 7段重力特征:水平投影下 1/3 行 ≥ 上 1/3 行 → +1(数字朝上的典型分布)
- Tesseract OSD:若返回
rotate=0→ +2(强证据)
选择:取 0°/90°/180°/270° 中评分最高的方向。
优势:即使 OSD 失败,仍有 7段特征兜底。
Step 4 — 图像增强
目的:让 OCR 识别 7 段数码管。
关键步骤:
- CLAHE(自适应直方图均衡化)
- 极性自动判断:若图像均值<127 视为暗背景,反转
- 自适应阈值(Gaussian, blockSize=25)
- 关键:2×2 核膨胀 1 次 — 连接 7 段间隙,否则 Tesseract 会把一个数字切成多字符
Step 5 — OCR 识别(多后端)
| 后端 | 优势 | 劣势 | 推荐场景 |
|---|---|---|---|
| Tesseract | 易部署、有 LCD 字模 | 7段需调参 | 默认 |
| SSOCR | 专为 7段设计 | 仅命令行、需手编译 | 干净 LED 显示 |
| PaddleOCR | 中文+数字皆强 | 体积大 | App 截图 |
| 自训 CNN | 准确率天花板高 | 需训练数据 | 长期投入 |
当前默认:Tesseract,PSM=7(单行),whitelist 限制为数字 + 单位字符。
Step 6 — 数值合理性校验
正则提取:(\d{1,3}\.?\d{0,2})\s*(kg|KG|公斤|千克|斤|两|lb)?
合理范围:
- kg / 公斤 / 千克:10–200
- 斤 / 两:20–400
- lb:20–440
作用:拦截 OCR 典型错误(如把 1 错认 7 得到 170kg 时直接 reject)。
4. 文件结构
新建文件夹 1/
├── 未识别/ # 待处理原图
├── 预处理/ # 旧版输出(v1)
├── 预处理v2/ # 新版输出
│ ├── *.png # 各图的二值化预处理结果
│ └── _results.csv # 识别汇总(文件名/旋转/OCR/置信度/解析值)
├── preprocess_v2.py # 新版(预处理 + 识别 + 校验)
└── 设计文档.md # 本文档
5. 评估指标
5.1 准确率指标
- Top-1 准确率:单次识别完全正确(数字 + 单位都对)的比例
- 数字准确率:仅数字正确(容忍单位错误)
- ±5% 容忍准确率:识别值与真值相对误差 ≤5%(避免小数位识别错带来的负面感受)
5.2 召回率 / 拒识率
- 拒识率:合理性校验后输出"无效"的比例(高拒识率好过错误识别)
- 置信度阈值:建议 Tesseract conf > 60 才接受,否则降级人工
5.3 性能
- 单图处理时间 < 1s(CPU 单线程)
- 122 张全量处理 < 2 分钟
6. 已知局限与待解决
| # | 问题 | 当前对策 | 长期改进 |
|---|---|---|---|
| L1 | 粉色秤显示器尺寸过小(占图 <1%) | margin 放宽 | 改用超分辨率(ESRGAN)预处理 |
| L2 | 启动画面/异常显示误识 | 合理性校验拦截 | 加一个"是否合法读数"的分类器 |
| L3 | 香山台秤三屏,只需重量栏 | ROI 取最大 LCD | 训练专用检测器,按字段标签裁切 |
| L4 | 小米秤 kg/斤 模式无法从显示判断 | 默认按区间猜单位 | 加品牌+型号识别(CNN 或 logo 匹配) |
| L5 | OCR 把"6/9"反向识别 | 4向暴力旋转 | 训练朝向检测器 |
| L6 | App 截图字段繁多 | 暂用通用 OCR + 选最大数字 | 训练 App 截图专用 layout 模型 |
7. 改进路线图
v2.0(当前)— 通用 Pipeline
- ✅ EXIF 方向校正
- ✅ 4 策略 ROI 检测
- ✅ 4 向暴力旋转 + 评分
- ✅ Tesseract / SSOCR / PaddleOCR 三选一
- ✅ 数值合理性校验
- ✅ CSV 汇总输出
v2.1 — 兜底机制
- 低置信度自动转人工:置信度 <60 时输出标记
- 多 OCR 后端投票(Tesseract + PaddleOCR 投票)
- 单位上下文推断:根据数字范围反推(如 50–100 多半是 kg,120+ 多半是斤)
v2.2 — 专项优化
- App 截图分支:检测到 App UI 元素时走专用路径(直接定位"目标数字"色块)
- 秤品牌识别:用图中 logo(mi、SENSSUN、HUAWEI、LEFU、HCS 等)辅助选择 OCR 参数
- 超分辨率增强:粉色秤等小显示器先 4× 超分再识别
v3.0 — 深度学习
- 用现有 122 张 + 持续累积构建训练集(目标 ≥1000 张)
- Fine-tune 7 段专用 CNN(参考 Seven-Segment-OCR)
- 端到端 YOLO 检测+识别一体模型(参考 Goodfellow 多位数字识别论文)
v4.0 — 工程化
- 提供 HTTP API(FastAPI)
- 提供 Web UI 标注 + 校验工具
- 主动学习:被人工修正过的样本自动加入训练集
8. 测试与验证
8.1 当前测试集
- 122 张样本图(位于
未识别/,已按"识别结果.jpg"命名作为 ground truth) - 真值来源:人工 + 多模态模型双校
- 注意:约 10 张倒置图的真值仍可能有误差,需后续校对
8.2 验证流程
# 1. 跑识别
python preprocess_v2.py --backend tesseract
# 2. 对照真值(文件名即真值)
python evaluate.py # 待实现:从文件名提取真值,与 _results.csv 比对
8.3 验收标准(v2.0)
- Top-1 准确率 ≥ 70%
- 数字准确率 ≥ 80%
- ±5% 容忍准确率 ≥ 85%
- 拒识率 ≤ 20%(剩余转人工)
9. 依赖
必装
pip install opencv-python pillow pytesseract imutils numpy
系统依赖(Linux)
sudo apt install tesseract-ocr tesseract-ocr-chi-sim
# 可选:下载 LCD 专用字模
wget https://github.com/Shreeshrii/tessdata_ssd/raw/master/ssd.traineddata
sudo mv ssd.traineddata /usr/share/tesseract-ocr/4.00/tessdata/
可选(更强后端)
pip install paddlepaddle paddleocr # PaddleOCR
sudo apt install ssocr # 7段专用 OCR(Debian/Ubuntu 自带)
10. 参考资料
论文
- Goodfellow et al., Multi-digit Number Recognition from Street View Imagery using Deep CNNs
开源项目
- SSOCR — 专用 7段 OCR(C)
- tessdata_ssd — Tesseract 7段字模
- LCD-OCR — Tesseract + OpenCV 流水线
- Seven-Segment-OCR — CNN/MNIST 风格
- seven-segment-ocr — TensorFlow Lite
工程文章
- PyImageSearch — Correcting Text Orientation with Tesseract
- Medium — Correct image orientation using Pytesseract + Imutils
11. 维护与协作
11.1 文档维护
- 每次方案变更需在 §7 路线图打勾,并写明版本号
- 新增已知问题加入 §6 已知局限表
- 重大架构调整需更新 §3 Pipeline 图
11.2 代码维护
preprocess.py保留作为 v1 基准(不再改动)- 新增功能在
preprocess_v2.py上演进,重大版本切到preprocess_v3.py - 实验性功能放
experiments/子目录
11.3 数据维护
- 新增的真值样本放
未识别/目录,文件名即真值 - 误识别的样本单独标记,作为难例集合(后续训练用)