- Implemented comprehensive feature analysis based on size, stroke length, and regularity - Size-based scoring: height >50px indicates handwriting - Stroke length ratio: >0.4 indicates handwriting - Irregularity metrics: low compactness/solidity indicates handwriting - Successfully tested on sample PDF with 2 signatures (楊智惠, 張志銘) - Created detailed documentation: CURRENT_STATUS.md and NEW_SESSION_HANDOFF.md - Stable PaddleOCR 2.7.3 configuration documented (numpy 1.26.4, opencv 4.6.0.66) - Prepared research plan for PP-OCRv5 upgrade investigation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
253 lines
5.9 KiB
Markdown
253 lines
5.9 KiB
Markdown
# 项目当前状态
|
||
|
||
**更新时间**: 2025-10-29
|
||
**分支**: `paddleocr-improvements`
|
||
**PaddleOCR版本**: 2.7.3 (稳定版本)
|
||
|
||
---
|
||
|
||
## 当前进度总结
|
||
|
||
### ✅ 已完成
|
||
|
||
1. **PaddleOCR服务器部署** (192.168.30.36:5555)
|
||
- 版本: PaddleOCR 2.7.3
|
||
- GPU: 启用
|
||
- 语言: 中文
|
||
- 状态: 稳定运行
|
||
|
||
2. **基础Pipeline实现**
|
||
- ✅ PDF → 图像渲染 (DPI=300)
|
||
- ✅ PaddleOCR文字检测 (26个区域/页)
|
||
- ✅ 文本区域遮罩 (padding=25px)
|
||
- ✅ 候选区域检测
|
||
- ✅ 区域合并算法 (12→4 regions)
|
||
|
||
3. **OpenCV分离方法测试**
|
||
- Method 1: 笔画宽度分析 - ❌ 效果差
|
||
- Method 2: 连通组件基础分析 - ⚠️ 中等效果
|
||
- Method 3: 综合特征分析 - ✅ **最佳方案** (86.5%手写保留率)
|
||
|
||
4. **测试结果**
|
||
- 测试文件: `201301_1324_AI1_page3.pdf`
|
||
- 预期签名: 2个 (楊智惠, 張志銘)
|
||
- 检测结果: 2个签名区域成功合并
|
||
- 保留率: 86.5% 手写内容
|
||
|
||
---
|
||
|
||
## 技术架构
|
||
|
||
```
|
||
PDF文档
|
||
↓
|
||
1. 渲染 (PyMuPDF, 300 DPI)
|
||
↓
|
||
2. PaddleOCR检测 (识别印刷文字)
|
||
↓
|
||
3. 遮罩印刷文字 (黑色填充, padding=25px)
|
||
↓
|
||
4. 区域检测 (OpenCV形态学)
|
||
↓
|
||
5. 区域合并 (距离阈值: H≤100px, V≤50px)
|
||
↓
|
||
6. 特征分析 (大小+笔画长度+规律性)
|
||
↓
|
||
7. [TODO] VLM验证
|
||
↓
|
||
签名提取结果
|
||
```
|
||
|
||
---
|
||
|
||
## 核心文件
|
||
|
||
| 文件 | 说明 | 状态 |
|
||
|------|------|------|
|
||
| `paddleocr_client.py` | PaddleOCR REST客户端 | ✅ 稳定 |
|
||
| `test_mask_and_detect.py` | 基础遮罩+检测测试 | ✅ 完成 |
|
||
| `test_opencv_separation.py` | OpenCV方法1+2测试 | ✅ 完成 |
|
||
| `test_opencv_advanced.py` | OpenCV方法3(最佳) | ✅ 完成 |
|
||
| `extract_signatures_paddleocr_improved.py` | 完整Pipeline (Method B+E) | ⚠️ Method E有问题 |
|
||
| `PADDLEOCR_STATUS.md` | 详细技术文档 | ✅ 完成 |
|
||
|
||
---
|
||
|
||
## Method 3: 综合特征分析 (当前最佳方案)
|
||
|
||
### 判断依据
|
||
|
||
**您的观察** (非常准确):
|
||
1. ✅ **手写字比印刷字大** - height > 50px
|
||
2. ✅ **手写笔画长度更长** - stroke_ratio > 0.4
|
||
3. ✅ **印刷体规律,手写潦草** - compactness, solidity
|
||
|
||
### 评分系统
|
||
|
||
```python
|
||
handwriting_score = 0
|
||
|
||
# 大小评分
|
||
if height > 50: score += 3
|
||
elif height > 35: score += 2
|
||
|
||
# 笔画长度评分
|
||
if stroke_ratio > 0.5: score += 2
|
||
elif stroke_ratio > 0.35: score += 1
|
||
|
||
# 规律性评分
|
||
if is_irregular: score += 1 # 不规律 = 手写
|
||
else: score -= 1 # 规律 = 印刷
|
||
|
||
# 面积评分
|
||
if area > 2000: score += 2
|
||
elif area < 500: score -= 1
|
||
|
||
# 分类: score > 0 → 手写
|
||
```
|
||
|
||
### 效果
|
||
|
||
- 手写像素保留: **86.5%** ✅
|
||
- 印刷像素过滤: 13.5%
|
||
- Top 10组件全部正确分类
|
||
|
||
---
|
||
|
||
## 已识别问题
|
||
|
||
### 1. Method E (两阶段OCR) 失效 ❌
|
||
|
||
**原因**: PaddleOCR无法区分"印刷"和"手写",第二次OCR会把手写也识别并删除
|
||
|
||
**解决方案**:
|
||
- ❌ 不使用Method E
|
||
- ✅ 使用Method B (区域合并) + OpenCV Method 3
|
||
|
||
### 2. 印刷名字与手写签名重叠
|
||
|
||
**现象**: 区域包含"楊 智 惠"(印刷) + 手写签名
|
||
**策略**: 接受少量印刷残留,优先保证手写完整性
|
||
**后续**: 用VLM最终验证
|
||
|
||
### 3. Masking padding 矛盾
|
||
|
||
**小padding (5-10px)**: 印刷残留多,但不伤手写
|
||
**大padding (25px)**: 印刷删除干净,但可能遮住手写边缘
|
||
**当前**: 使用 25px,依赖OpenCV Method 3过滤残留
|
||
|
||
---
|
||
|
||
## 下一步计划
|
||
|
||
### 短期 (继续当前方案)
|
||
|
||
- [ ] 整合 Method B + OpenCV Method 3 为完整Pipeline
|
||
- [ ] 添加VLM验证步骤
|
||
- [ ] 在10个样本上测试
|
||
- [ ] 调优参数 (height阈值, merge距离等)
|
||
|
||
### 中期 (PP-OCRv5研究)
|
||
|
||
**新branch**: `pp-ocrv5-research`
|
||
|
||
- [ ] 研究PaddleOCR 3.3.0新API
|
||
- [ ] 测试PP-OCRv5手写检测能力
|
||
- [ ] 对比性能: v4 vs v5
|
||
- [ ] 评估是否升级
|
||
|
||
---
|
||
|
||
## 服务器配置
|
||
|
||
### PaddleOCR服务器 (Linux)
|
||
|
||
```
|
||
Host: 192.168.30.36:5555
|
||
SSH: ssh gblinux
|
||
路径: ~/Project/paddleocr-server/
|
||
版本: PaddleOCR 2.7.3, numpy 1.26.4, opencv-contrib 4.6.0.66
|
||
启动: cd ~/Project/paddleocr-server && source venv/bin/activate && python paddleocr_server.py
|
||
日志: ~/Project/paddleocr-server/server_stable.log
|
||
```
|
||
|
||
### VLM服务器 (Ollama)
|
||
|
||
```
|
||
Host: 192.168.30.36:11434
|
||
模型: qwen2.5vl:32b
|
||
状态: 未在当前Pipeline中使用
|
||
```
|
||
|
||
---
|
||
|
||
## 测试数据
|
||
|
||
### 样本文件
|
||
|
||
```
|
||
/Volumes/NV2/PDF-Processing/signature-image-output/201301_1324_AI1_page3.pdf
|
||
- 页面: 第3页
|
||
- 预期签名: 2个 (楊智惠, 張志銘)
|
||
- 尺寸: 2481x3510 pixels
|
||
```
|
||
|
||
### 输出目录
|
||
|
||
```
|
||
/Volumes/NV2/PDF-Processing/signature-image-output/
|
||
├── mask_test/ # 基础遮罩测试结果
|
||
├── paddleocr_improved/ # Method B+E测试 (E失败)
|
||
├── opencv_separation_test/ # Method 1+2测试
|
||
└── opencv_advanced_test/ # Method 3测试 (最佳)
|
||
```
|
||
|
||
---
|
||
|
||
## 性能对比
|
||
|
||
| 方法 | 手写保留 | 印刷去除 | 总评 |
|
||
|------|---------|---------|------|
|
||
| 基础遮罩 | 100% | 低 | ⚠️ 太多印刷残留 |
|
||
| Method 1 (笔画宽度) | 0% | - | ❌ 完全失败 |
|
||
| Method 2 (连通组件) | 1% | 中 | ❌ 丢失太多手写 |
|
||
| Method 3 (综合特征) | **86.5%** | 高 | ✅ **最佳** |
|
||
|
||
---
|
||
|
||
## Git状态
|
||
|
||
```
|
||
当前分支: paddleocr-improvements
|
||
基于: PaddleOCR-Cover
|
||
标签: paddleocr-v1-basic (基础遮罩版本)
|
||
|
||
待提交:
|
||
- OpenCV高级分离方法 (Method 3)
|
||
- 完整测试脚本和结果
|
||
- 文档更新
|
||
```
|
||
|
||
---
|
||
|
||
## 已知限制
|
||
|
||
1. **参数需调优**: height阈值、merge距离等在不同文档可能需要调整
|
||
2. **依赖文档质量**: 模糊、倾斜的文档可能效果变差
|
||
3. **计算性能**: OpenCV处理较快,但完整Pipeline需要优化
|
||
4. **泛化能力**: 仅在1个样本测试,需要更多样本验证
|
||
|
||
---
|
||
|
||
## 联系与协作
|
||
|
||
**主要开发者**: Claude Code
|
||
**协作方式**: 会话式开发
|
||
**代码仓库**: 本地Git仓库
|
||
**测试环境**: macOS (本地) + Linux (服务器)
|
||
|
||
---
|
||
|
||
**状态**: ✅ 当前方案稳定,可继续开发
|
||
**建议**: 先在更多样本测试Method 3,再考虑PP-OCRv5升级
|