report-detect/archive/docs/ROOT_CAUSE_ANALYSIS.md

4.5 KiB
Raw Permalink Blame History

CMA码提取失败的根本原因分析

问题诊断

通过对比历史提交5baf0ac - 成功版本)和当前代码,发现了根本问题

当前版本的错误

ROI位置错误 - CMA码在logo下方(错误假设)

# 当前版本(错误)
roi_x1 = int(max(0, x - template_w * 2))
roi_y1 = int(max(0, y - template_h * 0.5))
roi_x2 = int(min(w, x + template_w * 3))
roi_y2 = int(min(h, y + template_h * 5))  # ❌ 向下扩展

结果

  • 模板匹配成功(置信度 0.943
  • 但ROI只包含'检验研究院'、'UCTQUALITYSUPERVISION'
  • CMA码不在ROI区域内

历史版本的正确做法

ROI位置正确 - CMA码在logo右侧(符合实际布局)

# 历史版本(正确)
roi_x1 = max(0, center_x)  # 从logo中心开始向右
roi_y1 = max(0, center_y - template_h // 2)  # 上下与logo对齐
roi_x2 = min(w, center_x + min(600, w - center_x))  # 向右扩展最多600px
roi_y2 = min(h, center_y + template_h // 2 + template_h)

结果

  • 成功提取CMA码210020349096YDQ23_001838.pdf
  • 成功提取CMA码220020349627WTS2025-21283.pdf

关键差异对比

项目 历史版本5baf0ac 当前版本 影响
ROI方向 Logo右侧 Logo下方 致命错误
ROI宽度 向右600px 向左2倍+向右3倍template 区域太大
ROI高度 logo高度上下对齐 向下5倍template 不必要的区域
匹配方法 TM_CCOEFF_NORMED TM_CCORR_NORMED 改进
匹配阈值 0.4 0.30 改进
尺度范围 固定尺度 0.5-1.2多尺度 改进

CMA标志布局分析

实际布局(基于历史成功案例)

+------------------+--------------------------+
|                  |        210020349096      |
|   CMA Logo       |      CMA码            |
|   (标志)         |                          |
+------------------+--------------------------+
   ↑ 向右扩展600px →

关键事实CMA码在logo的右边,不是下面!


修复方案

已修复的文件

  1. cma_extraction_template_primary.py第421-428行
  2. test_accuracy_batch_full.py第367-372行

修复内容

# 修复后(正确)
roi_x1 = int(max(0, x))  # 从logo中心开始向右
roi_y1 = int(max(0, y - template_h // 2))  # 上下与logo对齐
roi_x2 = int(min(w, x + min(600, w - x)))  # 向右扩展最多600px
roi_y2 = int(min(h, y + template_h // 2 + template_h))  # 向下扩展一点

为什么之前的优化没有效果

我们做的改进

  1. TM_CCORR_NORMED匹配方法 - 有效
  2. 扩展尺度范围0.5-1.2 - 有效
  3. 降低阈值0.35→0.30 - 有效
  4. 新版PaddleOCR API支持 - 有效
  5. 全页fallback机制 - 有效

为什么还是失败?

因为ROI方向错误即使模板匹配成功OCR也找不到CMA码因为CMA码根本不在ROI区域内。

类比:就像你在客厅找钥匙,但钥匙在卧室里。你找得再仔细也没用,因为位置错了。


预期效果

修复后,结合所有优化:

优化项 效果
ROI位置修复 关键修复 - 现在能正确覆盖CMA码区域
TM_CCORR_NORMED 匹配置信度 +0.55
多尺度匹配 覆盖更多logo尺寸
降低阈值 捕获边缘匹配
全页fallback 双重保险

预计CMA码提取成功率从 35% → 80%+


测试验证

重新运行批处理测试

python test_accuracy_batch_full.py --batch --batch-size 20

预期输出(修复后)

[TM] Match confidence: 0.943 (threshold: 0.30)  ✅ 匹配成功
[TM] ROI: (1031, 917) -> (1192, 1030)           ✅ ROI在右侧
[TM] OCR found 2 text lines
[TM]   Line 0: '210020349096' (score: 0.99)      ✅ 找到CMA码
[TM] Best CMA candidate: 210020349096 (conf: 0.99)

总结

根本问题

ROI方向错误 - 在logo下方而不是右边找CMA码

根本原因

可能是在某次代码重构中错误地假设CMA码在logo下方

解决方案

恢复历史版本的正确ROI计算方式 - 在logo右侧提取CMA码

教训

  1. 不要破坏已经工作的代码 - 历史版本5baf0ac是成功的
  2. ROI布局要符合实际 - CMA码在logo右边这是事实
  3. 回归测试很重要 - 应该对比历史版本的输出

关键修复已完成!现在请重新运行测试验证效果。