Files
pdf_signature_extraction/PP_OCRV5_RESEARCH_FINDINGS.md
gbanyan 21df0ff387 Complete PP-OCRv5 research and v4 vs v5 comparison
## 研究成果

### PP-OCRv5 API 測試
- 成功升級到 PaddleOCR 3.3.2 (PP-OCRv5)
- 理解新 API 結構和調用方式
- 驗證基礎檢測功能

### 關鍵發現
 PP-OCRv5 **沒有內建手寫分類功能**
- text_type 字段是語言類型,不是手寫/印刷分類
- 仍需要 OpenCV Method 3 來分離手寫和印刷文字

### 完整 Pipeline 對比測試
- v4 (2.7.3): 檢測 14 個文字 → 4 個候選區域
- v5 (3.3.2): 檢測 50 個文字 → 7 個候選區域
- 主簽名區域:兩個版本幾乎相同 (1150x511 vs 1144x511)

### 性能分析
優點:
- v5 手寫識別準確率 +13.7% (文檔承諾)
- 可能減少漏檢

缺點:
- 過度檢測(印章小字等)
- API 完全重寫,不兼容
- 仍無法替代 OpenCV Method 3

### 文件
- PP_OCRV5_RESEARCH_FINDINGS.md: 完整研究報告
- signature-comparison/: v4 vs v5 對比結果
- test_results/: v5 測試輸出
- test_*_pipeline.py: 完整測試腳本

### 建議
當前方案(v2.7.3 + OpenCV Method 3)已足夠穩定,
除非遇到大量漏檢,否則暫不升級到 v5。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 11:21:55 +08:00

282 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PP-OCRv5 研究發現
**日期**: 2025-01-27
**分支**: pp-ocrv5-research
**狀態**: 研究完成
---
## 📋 研究摘要
我們成功升級並測試了 PP-OCRv5以下是關鍵發現
### ✅ 成功完成
1. PaddleOCR 升級2.7.3 → 3.3.2
2. 新 API 理解和驗證
3. 手寫檢測能力測試
4. 數據結構分析
### ❌ 關鍵限制
**PP-OCRv5 沒有內建的手寫 vs 印刷文字分類功能**
---
## 🔧 技術細節
### API 變更
**舊 API (2.7.3)**:
```python
from paddleocr import PaddleOCR
ocr = PaddleOCR(lang='ch', show_log=False)
result = ocr.ocr(image_np, cls=False)
```
**新 API (3.3.2)**:
```python
from paddleocr import PaddleOCR
ocr = PaddleOCR(
text_detection_model_name="PP-OCRv5_server_det",
text_recognition_model_name="PP-OCRv5_server_rec",
use_doc_orientation_classify=False,
use_doc_unwarping=False,
use_textline_orientation=False
# ❌ 不再支持: show_log, cls
)
result = ocr.predict(image_path) # ✅ 使用 predict() 而不是 ocr()
```
### 主要 API 差異
| 特性 | v2.7.3 | v3.3.2 |
|------|--------|--------|
| 初始化 | `PaddleOCR(lang='ch')` | `PaddleOCR(text_detection_model_name=...)` |
| 預測方法 | `ocr.ocr()` | `ocr.predict()` |
| `cls` 參數 | ✅ 支持 | ❌ 已移除 |
| `show_log` 參數 | ✅ 支持 | ❌ 已移除 |
| 返回格式 | `[[[box], (text, conf)], ...]` | `OCRResult` 對象 with `.json` 屬性 |
| 依賴 | 獨立 | 需要 PaddleX >=3.3.0 |
---
## 📊 返回數據結構
### v3.3.2 返回格式
```python
result = ocr.predict(image_path)
json_data = result[0].json['res']
# 可用字段:
json_data = {
'input_path': str, # 輸入圖片路徑
'page_index': None, # PDF 頁碼(圖片為 None
'model_settings': dict, # 模型配置
'dt_polys': list, # 檢測多邊形框 (N, 4, 2)
'dt_scores': list, # 檢測置信度
'rec_texts': list, # 識別文字
'rec_scores': list, # 識別置信度
'rec_boxes': list, # 矩形框 [x_min, y_min, x_max, y_max]
'rec_polys': list, # 識別多邊形框
'text_det_params': dict, # 檢測參數
'text_rec_score_thresh': float, # 識別閾值
'text_type': str, # ⚠️ 'general' (語言類型,不是手寫分類)
'textline_orientation_angles': list, # 文字方向角度
'return_word_box': bool # 是否返回詞級框
}
```
---
## 🔍 手寫檢測功能測試
### 測試問題
**PP-OCRv5 是否能區分手寫和印刷文字?**
### 測試結果:❌ 不能
#### 測試過程
1. ✅ 發現 `text_type` 字段
2. ❌ 但 `text_type = 'general'` 是**語言類型**,不是書寫風格
3. ✅ 查閱官方文檔確認
4. ❌ 沒有任何字段標註手寫 vs 印刷
#### 官方文檔說明
- `text_type` 可能的值:'general', 'ch', 'en', 'japan', 'pinyin'
- 這些值指的是**語言/腳本類型**
- **不是**手寫 (handwritten) vs 印刷 (printed) 的分類
### 結論
PP-OCRv5 雖然能**識別**手寫文字,但**不會標註**某個文字區域是手寫還是印刷。
---
## 📈 性能提升(根據官方文檔)
### 手寫文字識別準確率
| 類型 | PP-OCRv4 | PP-OCRv5 | 提升 |
|------|----------|----------|------|
| 手寫中文 | 0.706 | 0.803 | **+13.7%** |
| 手寫英文 | 0.249 | 0.841 | **+237%** |
### 實測結果full_page_original.png
**v3.3.2 (PP-OCRv5)**:
- 檢測到 **50** 個文字區域
- 平均置信度:~0.98
- 示例:
- "依本會計師核閱結果..." (0.9936)
- "在所有重大方面有違反..." (0.9976)
**待測試**: v2.7.3 的對比結果(需要回退測試)
---
## 💡 升級影響分析
### 優勢
1.**更好的手寫識別能力**+13.7%
2.**可能檢測到更多手寫區域**
3.**更高的識別置信度**
4.**統一的 Pipeline 架構**
### 劣勢
1.**無法區分手寫和印刷**(仍需 OpenCV Method 3
2. ⚠️ **API 完全不兼容**(需重寫服務器代碼)
3. ⚠️ **依賴 PaddleX**(額外的依賴)
4. ⚠️ **OpenCV 版本升級**4.6 → 4.10
---
## 🎯 對我們項目的影響
### 當前方案v2.7.3 + OpenCV Method 3
```
PDF → PaddleOCR 檢測 → 遮罩印刷文字 → OpenCV Method 3 分離手寫 → VLM 驗證
↑ 86.5% 手寫保留率
```
### PP-OCRv5 方案
```
PDF → PP-OCRv5 檢測 → 遮罩印刷文字 → OpenCV Method 3 分離手寫 → VLM 驗證
↑ 可能檢測更多手寫 ↑ 仍然需要!
```
### 關鍵發現
**PP-OCRv5 不能替代 OpenCV Method 3**
---
## 🤔 升級建議
### 升級的理由
1. 更好地檢測手寫簽名(+13.7% 準確率)
2. 可能減少漏檢
3. 更高的識別置信度可以幫助後續分析
### 不升級的理由
1. 當前方案已經穩定86.5% 保留率)
2. 仍然需要 OpenCV Method 3
3. API 重寫成本高
4. 額外的依賴和複雜度
### 推薦決策
**階段性升級策略**
1. **短期(當前)**
- ✅ 保持 v2.7.3 穩定方案
- ✅ 繼續使用 OpenCV Method 3
- ✅ 在更多樣本上測試當前方案
2. **中期(如果需要優化)**
- 對比測試 v2.7.3 vs v3.3.2 在真實簽名樣本上的性能
- 如果 v5 明顯減少漏檢 → 升級
- 如果差異不大 → 保持 v2.7.3
3. **長期**
- 關注 PaddleOCR 是否會添加手寫分類功能
- 如果有 → 重新評估升級價值
---
## 📝 技術債務記錄
### 如果決定升級到 v3.3.2
需要完成的工作:
1. **服務器端**
- [ ] 重寫 `paddleocr_server.py` 適配新 API
- [ ] 測試 GPU 利用率和速度
- [ ] 處理 OpenCV 4.10 兼容性
- [ ] 更新依賴文檔
2. **客戶端**
- [ ] 更新 `paddleocr_client.py`(如果 REST 接口改變)
- [ ] 適配新的返回格式
3. **測試**
- [ ] 10+ 樣本對比測試
- [ ] 性能基準測試
- [ ] 穩定性測試
4. **文檔**
- [ ] 更新 CURRENT_STATUS.md
- [ ] 記錄 API 遷移指南
- [ ] 更新部署文檔
---
## ✅ 完成的工作
1. ✅ 升級 PaddleOCR: 2.7.3 → 3.3.2
2. ✅ 理解新 API 結構
3. ✅ 測試基礎功能
4. ✅ 分析返回數據結構
5. ✅ 測試手寫分類功能(結論:無)
6. ✅ 查閱官方文檔驗證
7. ✅ 記錄完整研究過程
---
## 🎓 學到的經驗
1. **API 版本升級風險**:主版本升級通常有破壞性變更
2. **功能驗證的重要性**:文檔提到的「手寫支持」不等於「手寫分類」
3. **現有方案的價值**OpenCV Method 3 仍然是必需的
4. **性能 vs 複雜度權衡**:不是所有性能提升都值得立即升級
---
## 🔗 相關文檔
- [CURRENT_STATUS.md](./CURRENT_STATUS.md) - 當前穩定方案
- [NEW_SESSION_HANDOFF.md](./NEW_SESSION_HANDOFF.md) - 研究任務清單
- [PADDLEOCR_STATUS.md](./PADDLEOCR_STATUS.md) - 詳細技術分析
---
## 📌 下一步
建議用戶:
1. **立即行動**
- 在更多 PDF 樣本上測試當前方案
- 記錄成功率和失敗案例
2. **評估升級**
- 如果當前方案滿意 → 保持 v2.7.3
- 如果遇到大量漏檢 → 考慮 v3.3.2
3. **長期監控**
- 關注 PaddleOCR GitHub Issues
- 追蹤是否有手寫分類功能的更新
---
**結論**: PP-OCRv5 提升了手寫識別能力,但不能替代 OpenCV Method 3 來分離手寫和印刷文字。當前方案v2.7.3 + OpenCV Method 3已經足夠好除非遇到性能瓶頸否則不建議立即升級。