# 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)已經足夠好,除非遇到性能瓶頸,否則不建議立即升級。