report-detect/archive/docs/SEAL_SELECTION_FIX.md

4.7 KiB
Raw Permalink Blame History

印章检测问题修复

问题描述

3.pdf的处理结果

预期结果

  • 机构名称:深圳市中安质量检验认证有限公司

实际结果

  • 机构名称:县市场监督管理局行政审批

根本原因

检测到了错误的印章!

页面布局:
+--------------------------------------------------+
|                                                  |
|                     [CMA标志]                    |
|                                                  |
|              深圳市中安质量检验认证有限公司         |
|                  (检验机构印章)                   |  ← 应该检测这个
|                                                  |
|                                                  |
|         县市场监督管理局                         |
|           行政审批专用章                        |  ← 实际检测到这个
|                                                  |
+--------------------------------------------------+

解扭曲工作正常

查看 seal_unwarp_0.png 可以确认:

  • 极坐标解扭曲正确
  • OCR正确识别了解扭曲后的图像
  • 但识别的是行政审批章,不是检验机构印章

问题分析

之前的问题

用户报告:"已经解扭曲,但是识别出来的不是解扭曲后的内容"

实际情况

  1. 解扭曲工作正常
  2. OCR识别了解扭曲后的图像
  3. 但系统检测到了错误的印章

根本原因

缺少印章选择逻辑

# 之前的代码:处理所有检测到的印章
for reg in all_regions:
    if label == 'seal':
        seal_boxes.append(box)  # 添加所有印章,没有过滤

系统会检测页面上的所有印章,但没有优先级选择:

  • 行政审批章(错误的印章)
  • 其他政府公章
  • 检验机构印章(正确的印章)

解决方案

添加印章评分和选择机制

评分标准

  1. 位置评分60分

    • 上半部分center_y < page_h * 0.5+30分
    • 右半部分center_x > page_w * 0.5+30分
    • 原因检验机构印章通常在右上角靠近CMA标志
  2. 尺寸评分20分

    • 中等尺寸100-300px+20分
    • 较小或较大80-100px或300-400px+10分
    • 原因:检验机构印章通常是中等大小的圆形章
  3. 形状评分20分

    • 圆形(宽高比 0.8-1.2+20分
    • 原因:检验机构印章通常是圆形的

实现代码

# 评分每个印章
scored_seals = []
for idx, box in enumerate(seal_boxes):
    # 计算位置评分(优先右上角)
    position_score = 0
    if center_y < page_h * 0.5:  # 上半部分
        position_score += 30
    if center_x > page_w * 0.5:  # 右半部分
        position_score += 30

    # 计算尺寸评分(优先中等大小)
    size_score = 0
    if 100 <= min_dim <= 300:
        size_score = 20

    # 计算形状评分(优先圆形)
    aspect_score = 0
    if 0.8 <= aspect_ratio <= 1.2:
        aspect_score = 20

    total_score = position_score + size_score + aspect_score
    scored_seals.append({...})

# 选择得分最高的印章
scored_seals.sort(key=lambda x: x['score'], reverse=True)
selected_seals = scored_seals[:min(2, len(scored_seals))]

预期效果

修复前

检测到印章 #0: 县市场监督管理局行政审批
  位置: 左下角 (200, 1500)
  识别结果: "县市场监督管理局\n行政审批"

修复后

检测到印章 #0: 县市场监督管理局行政审批
  位置: 左下角 (200, 1500)
  评分: 10分 (位置=0, 尺寸=10, 形状=0)

检测到印章 #1: 深圳市中安质量检验认证有限公司
  位置: 右上角 (1000, 300)
  评分: 90分 (位置=60, 尺寸=20, 形状=10)

选择: 印章 #1得分最高
识别结果: "深圳市中安质量检验认证有限公司"

修改的文件

test_accuracy_batch_full.py第861-927行

  • 添加印章评分逻辑
  • 添加印章选择逻辑
  • 选择得分最高的2个印章进行处理

关键改进点

  1. 位置优先级 - 优先选择右上角的印章靠近CMA标志
  2. 尺寸过滤 - 过滤掉太大或太小的印章
  3. 形状过滤 - 优先选择圆形印章
  4. Top-K选择 - 选择得分最高的2个印章确保不会遗漏正确的印章

验证

重新运行测试:

python test_accuracy_batch_full.py --pdf 3.pdf

预期结果:

  • 应该检测到右上角的检验机构印章
  • 识别结果应该是 "深圳市中安质量检验认证有限公司"
  • 相似度应该接近100%

修复已完成!现在系统会优先选择检验机构印章,而不是行政审批章。