8f231da3bc
- 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升级
|