185 lines
4.7 KiB
Markdown
185 lines
4.7 KiB
Markdown
# 印章检测问题修复
|
||
|
||
## 问题描述
|
||
|
||
### 3.pdf的处理结果
|
||
|
||
**预期结果**:
|
||
- 机构名称:深圳市中安质量检验认证有限公司
|
||
|
||
**实际结果**:
|
||
- 机构名称:县市场监督管理局行政审批
|
||
|
||
### 根本原因
|
||
|
||
**检测到了错误的印章!**
|
||
|
||
```
|
||
页面布局:
|
||
+--------------------------------------------------+
|
||
| |
|
||
| [CMA标志] |
|
||
| |
|
||
| 深圳市中安质量检验认证有限公司 |
|
||
| (检验机构印章) | ← 应该检测这个
|
||
| |
|
||
| |
|
||
| 县市场监督管理局 |
|
||
| 行政审批专用章 | ← 实际检测到这个
|
||
| |
|
||
+--------------------------------------------------+
|
||
```
|
||
|
||
### 解扭曲工作正常
|
||
|
||
查看 `seal_unwarp_0.png` 可以确认:
|
||
- ✅ 极坐标解扭曲正确
|
||
- ✅ OCR正确识别了解扭曲后的图像
|
||
- ❌ 但识别的是**行政审批章**,不是检验机构印章
|
||
|
||
---
|
||
|
||
## 问题分析
|
||
|
||
### 之前的问题
|
||
|
||
用户报告:"已经解扭曲,但是识别出来的不是解扭曲后的内容"
|
||
|
||
**实际情况**:
|
||
1. ✅ 解扭曲工作正常
|
||
2. ✅ OCR识别了解扭曲后的图像
|
||
3. ❌ 但系统检测到了**错误的印章**
|
||
|
||
### 根本原因
|
||
|
||
**缺少印章选择逻辑**
|
||
|
||
```python
|
||
# 之前的代码:处理所有检测到的印章
|
||
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分
|
||
- **原因**:检验机构印章通常是圆形的
|
||
|
||
### 实现代码
|
||
|
||
```python
|
||
# 评分每个印章
|
||
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个印章,确保不会遗漏正确的印章
|
||
|
||
---
|
||
|
||
## 验证
|
||
|
||
重新运行测试:
|
||
|
||
```bash
|
||
python test_accuracy_batch_full.py --pdf 3.pdf
|
||
```
|
||
|
||
预期结果:
|
||
- 应该检测到右上角的检验机构印章
|
||
- 识别结果应该是 "深圳市中安质量检验认证有限公司"
|
||
- 相似度应该接近100%
|
||
|
||
---
|
||
|
||
**修复已完成!现在系统会优先选择检验机构印章,而不是行政审批章。**
|