## 研究成果 ### 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>
282 lines
7.5 KiB
Markdown
282 lines
7.5 KiB
Markdown
# 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)已經足夠好,除非遇到性能瓶頸,否則不建議立即升級。
|