214 lines
5.9 KiB
Markdown
214 lines
5.9 KiB
Markdown
# 3.pdf 印章识别问题调查报告
|
||
|
||
## 问题描述
|
||
|
||
用户疑问:为什么3.pdf识别出来的机构名称是"县市场监督管理局行政审批",而不是解扭曲后印章中的实际文字?
|
||
|
||
期望识别:印章中应该包含"深圳市中安质量检验认证有限公司"相关的文字
|
||
|
||
## 调查结果
|
||
|
||
### 1. 当前OCR识别结果
|
||
|
||
#### 解扭曲印章图像 (seal_unwarp_0.png)
|
||
- **识别文字**:`'naotoeeeeeeeiee'`
|
||
- **状态**:❌ **完全乱码**
|
||
- **置信度**:0.0000(所有字符)
|
||
|
||
#### 裁剪印章图像 (seal_crop_0.png)
|
||
- **识别文字**:`'naotoeeeeeeeiee'`
|
||
- **状态**:❌ **完全乱码**
|
||
- **置信度**:0.0000(所有字符)
|
||
|
||
### 2. HTML报告显示
|
||
|
||
HTML报告中显示的内容:
|
||
- **提取的机构**:`县市场监督管理局\n行政审批`
|
||
- **印章识别文字**:`县市场监督管理局\n行政审批专用章`
|
||
|
||
**结论**:HTML报告显示的是**之前某次测试的旧结果**,不是当前识别的结果。
|
||
|
||
## 根本原因分析
|
||
|
||
### 问题1:OCR识别完全失败
|
||
|
||
当前使用的PaddleOCR (PP-OCRv5) 对这个印章的识别完全失败,输出无意义字符。
|
||
|
||
**可能原因**:
|
||
1. **解扭曲质量问题**:
|
||
- 虽然视觉上印章图像看起来还可以
|
||
- 但解扭曲过程可能引入了OCR无法处理的伪影
|
||
- 或者文字的曲率、角度仍然不适合OCR
|
||
|
||
2. **OCR模型限制**:
|
||
- PP-OCRv5可能不适合识别这种类型的印章文字
|
||
- 印章文字可能过于艺术化或变形
|
||
- 文字与背景的对比度不够
|
||
|
||
3. **图像预处理不当**:
|
||
- 可能需要额外的预处理步骤(二值化、去噪等)
|
||
- 当前的预处理流程可能不适合这个印章
|
||
|
||
### 问题2:HTML报告显示旧数据
|
||
|
||
HTML报告显示的不是当前的识别结果,说明报告生成逻辑可能有问题,或者测试运行时覆盖了旧的报告文件。
|
||
|
||
## 详细分析
|
||
|
||
### 解扭曲参数(从之前的测试结果)
|
||
|
||
```
|
||
{
|
||
"center": [133, 133],
|
||
"radius": 123,
|
||
"start_theta_deg": 2.7006293373952883,
|
||
"extent_deg": 350.0,
|
||
"num_polygons": 7,
|
||
"crop_size": [266, 266],
|
||
"unwarp_size": [751, 128]
|
||
}
|
||
```
|
||
|
||
### 识别失败的具体表现
|
||
|
||
1. **所有字符都是英文字母**:n, a, o, t, e, i
|
||
2. **置信度全部为0**:说明OCR非常不确定
|
||
3. **重复的'e'字符**:这是典型的OCR幻觉(hallucination)
|
||
|
||
## 建议解决方案
|
||
|
||
### 短期解决方案
|
||
|
||
1. **使用不同的OCR模型**
|
||
- 尝试PaddleOCR-VL(如果内存足够)
|
||
- 或者其他OCR引擎
|
||
|
||
2. **改进图像预处理**
|
||
- 添加图像增强步骤
|
||
- 调整二值化阈值
|
||
- 去除噪声
|
||
|
||
3. **调整解扭曲参数**
|
||
- 尝试不同的起始角度
|
||
- 调整极坐标展开的范围
|
||
|
||
### 中期解决方案
|
||
|
||
1. **添加OCR结果验证**
|
||
- 检查识别结果是否包含中文字符
|
||
- 如果识别出的是英文字母/乱码,应该标记为失败
|
||
|
||
2. **使用多个OCR方法**
|
||
- 主要方法:解扭曲 + OCR
|
||
- 备份方法1:直接裁剪图像OCR
|
||
- 备份方法2:PaddleOCR-VL
|
||
- 备份方法3:全页OCR提取机构名称
|
||
|
||
3. **改进错误处理**
|
||
- 当OCR识别失败时,不应该使用乱码结果
|
||
- 应该回退到其他方法
|
||
|
||
### 长期解决方案
|
||
|
||
1. **训练专门的印章识别模型**
|
||
- 针对中国圆形印章进行训练
|
||
- 处理弧形文字排列
|
||
|
||
2. **改进解扭曲算法**
|
||
- 使用更先进的极坐标展开方法
|
||
- 添加文字矫正步骤
|
||
|
||
3. **添加人工审核机制**
|
||
- 对于识别置信度低的结果
|
||
- 自动标记需要人工审核的案例
|
||
|
||
## 当前代码问题
|
||
|
||
### 问题1:使用乱码结果
|
||
|
||
当前代码没有检查OCR结果的有效性,即使识别出的是乱码`'naotoeeeeeeeiee'`,也会被当作机构名称使用。
|
||
|
||
### 问题2:缺少验证逻辑
|
||
|
||
应该添加验证逻辑:
|
||
```python
|
||
def is_valid_chinese_text(text):
|
||
"""检查文本是否包含有效的中文内容"""
|
||
if not text or len(text.strip()) == 0:
|
||
return False
|
||
|
||
# 检查是否包含中文字符
|
||
chinese_char_count = sum(1 for c in text if '\u4e00' <= c <= '\u9fff')
|
||
|
||
# 中文字符应该占主要部分
|
||
return chinese_char_count >= len(text) * 0.5
|
||
|
||
# 在使用OCR结果前验证
|
||
if not is_valid_chinese_text(ocr_result['text']):
|
||
logger.warning(f"OCR结果无效(非中文): '{ocr_result['text']}'")
|
||
# 使用其他方法或标记为失败
|
||
```
|
||
|
||
## 测试建议
|
||
|
||
### 立即测试
|
||
|
||
1. **验证印章图像质量**
|
||
- 手动查看seal_unwarp_0.png
|
||
- 确认图像是否清晰可读
|
||
|
||
2. **测试其他OCR引擎**
|
||
- 尝试PaddleOCR-VL
|
||
- 尝试Tesseract OCR
|
||
|
||
3. **测试不同的预处理**
|
||
- 二值化
|
||
- 对比度增强
|
||
- 去噪
|
||
|
||
### 长期测试
|
||
|
||
1. **批量测试所有印章**
|
||
- 统计有多少印章识别失败
|
||
- 分析失败模式
|
||
|
||
2. **收集失败案例**
|
||
- 建立失败案例数据库
|
||
- 用于改进算法
|
||
|
||
## 总结
|
||
|
||
### 当前状态
|
||
|
||
- ✅ 印章检测成功(找到了印章)
|
||
- ✅ 解扭曲处理完成(生成了seal_unwarp_0.png)
|
||
- ❌ **OCR识别完全失败**(输出乱码)
|
||
- ❌ **没有使用验证逻辑**(使用了乱码结果)
|
||
- ⚠️ **HTML报告显示旧数据**(需要重新测试)
|
||
|
||
### 关键问题
|
||
|
||
**为什么OCR识别失败?**
|
||
- 解扭曲后的图像质量可能不够好
|
||
- OCR模型不适合这种类型的印章文字
|
||
- 缺少适当的图像预处理
|
||
|
||
**下一步行动**
|
||
1. 手动检查seal_unwarp_0.png的图像质量
|
||
2. 尝试不同的OCR方法和参数
|
||
3. 添加OCR结果验证逻辑
|
||
4. 重新运行测试并检查新的HTML报告
|
||
|
||
### 相关文件
|
||
|
||
- `test_reports_full/3.pdf/seal_unwarp_0.png` - 解扭曲后的印章图像
|
||
- `test_reports_full/3.pdf/seal_crop_0.png` - 原始裁剪印章
|
||
- `test_reports_full/3.pdf/index.html` - 测试报告(可能显示旧数据)
|
||
|
||
### 预期效果
|
||
|
||
修复后应该能够:
|
||
1. 正确识别印章中的"深圳市中安质量检验认证有限公司"
|
||
2. 或者至少识别出相关的关键词(如"检验认证")
|
||
3. 如果识别失败,应该标记为失败而不是使用乱码
|