該文章主要摘取記錄RapidOCR集成PP-OCRv5_mobile_det記錄,涉及模型轉換,模型精度測試等步驟。原文請前往官方博客:
https://rapidai.github.io/RapidOCRDocs/main/blog/2025/05/26/rapidocr%E9%9B%86%E6%88%90pp-ocrv5_det%E6%A8%A1%E5%9E%8Bmobileserver%E8%AE%B0%E5%BD%95/
引言
來自PaddleOCR官方文檔:
PP-OCRv5 是PP-OCR新一代文字識別解決方案,該方案聚焦于多場景、多文字類型的文字識別。在文字類型方面,PP-OCRv5支持簡體中文、中文拼音、繁體中文、英文、日文5大主流文字類型,在場景方面,PP-OCRv5升級了中英復雜手寫體、豎排文本、生僻字等多種挑戰性場景的識別能力。在內部多場景復雜評估集上,PP-OCRv5較PP-OCRv4端到端提升13個百分點。
以下代碼運行環境
- OS: macOS Sequoia 15.5
- Python: 3.10.14
- PaddlePaddle: 3.0.0
- paddle2onnx: 2.0.2.rc1
- paddlex: 3.0.0
- rapidocr: 2.1.0
1. 模型跑通
該步驟主要先基于PaddleX可以正確使用PP-OCRv5_mobile_det模型得到正確結果。
該部分主要參考文檔:docs
安裝paddlex
:
pip install "paddlex[ocr]==3.0.0"
測試PP-OCRv5_mobile_det模型能否正常識別:
運行以下代碼時,模型會自動下載到 /Users/用戶名/.paddlex/official_models 下。
測試圖:link
from paddlex import create_model# mobile
model = create_model(model_name="PP-OCRv5_mobile_det")# server
model = create_model(model_name="PP-OCRv5_server_det")output = model.predict(input="images/general_ocr_001.png", batch_size=1)
for res in output:res.print()res.save_to_img(save_path="./output/")res.save_to_json(save_path="./output/res.json")
預期結果如下,表明成功運行:
2. 模型轉換
該部分主要參考文檔: docs
轉換PP-OCRv5_mobile_det
PaddleX官方集成了paddle2onnx的轉換代碼:
paddlex --install paddle2onnx
pip install onnx==1.16.0paddlex --paddle2onnx --paddle_model_dir models/official_models/PP-OCRv5_mobile_det --onnx_model_dir models/PP-OCRv5_mobile_det
輸出日志如下,表明轉換成功:
Input dir: models/official_models/PP-OCRv5_mobile_det
Output dir: models/PP-OCRv5_mobile_det
Paddle2ONNX conversion starting...
[Paddle2ONNX] Start parsing the Paddle model file...
[Paddle2ONNX] Use opset_version = 14 for ONNX export.
[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.
2025-05-26 21:53:00 [INFO] Try to perform constant folding on the ONNX model with Polygraphy.
[W] 'colored' module is not installed, will not use colors when logging. To enable colors, please install the 'colored' module: python3 -m pip install colored
[I] Folding Constants | Pass 1
[I] Total Nodes | Original: 925, After Folding: 502 | 423 Nodes Folded
[I] Folding Constants | Pass 2
[I] Total Nodes | Original: 502, After Folding: 502 | 0 Nodes Folded
2025-05-26 21:53:08 [INFO] ONNX model saved in models/PP-OCRv5_mobile_det/inference.onnx.
Paddle2ONNX conversion succeeded
Copied models/official_models/PP-OCRv5_mobile_det/inference.yml to models/PP-OCRv5_mobile_det/inference.yml
Done
3. 模型推理驗證
驗證PP-OCRv5_mobile_det模型
該部分主要是在RapidOCR項目中測試能否直接使用onnx模型。要點主要是確定模型前后處理是否兼容。從PaddleOCR config文件中比較PP-OCRv4和PP-OCRv5 mobile det文件差異:
從上圖中可以看出,配置基本一模一樣,因此現有rapidocr
前后推理代碼可以直接使用。
from rapidocr import RapidOCRmodel_path = "models/PP-OCRv5_mobile_det/inference.onnx"
engine = RapidOCR(params={"Det.model_path": model_path})img_url = "https://img1.baidu.com/it/u=3619974146,1266987475&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=516"
result = engine(img_url)
print(result)result.vis("vis_result.jpg")
4. 模型精度測試
測試集text_det_test_dataset包括卡證類、文檔類和自然場景三大類。其中卡證類有82張,文檔類有75張,自然場景類有55張。缺少手寫體、繁體、日文、古籍文本、拼音、藝術字等數據。因此,該基于該測評集的結果僅供參考。
歡迎有興趣的小伙伴,可以和我們一起共建更加全面的測評集。
該部分主要使用TextDetMetric和測試集text_det_test_dataset來評測。
相關測試步驟請參見TextDetMetric的README,一步一步來就行。我這里簡單給出關鍵代碼:
其中,計算 pred.txt 代碼如下:(僅列出了Exp1的代碼,Exp2和Exp3的代碼請前往官方博客閱讀)
(Exp1)RapidOCR框架+ONNXRuntime格式模型:
import cv2
import numpy as np
from datasets import load_dataset
from tqdm import tqdmfrom rapidocr import EngineType, ModelType, OCRVersion, RapidOCRengine = RapidOCR(params={"Det.ocr_version": OCRVersion.PPOCRV5,"Det.engine_type": EngineType.ONNXRUNTIME,"Det.model_type": ModelType.MOBILE,}
)dataset = load_dataset("SWHL/text_det_test_dataset")
test_data = dataset["test"]content = []
for i, one_data in enumerate(tqdm(test_data)):img = np.array(one_data.get("image"))img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)ocr_results = engine(img, use_det=True, use_cls=False, use_rec=False)dt_boxes = ocr_results.boxesdt_boxes = [] if dt_boxes is None else dt_boxes.tolist()elapse = ocr_results.elapsegt_boxes = [v["points"] for v in one_data["shapes"]]content.append(f"{dt_boxes}\t{gt_boxes}\t{elapse}")with open("pred.txt", "w", encoding="utf-8") as f:for v in content:f.write(f"{v}\n")
計算指標代碼:
from text_det_metric import TextDetMetricmetric = TextDetMetric()
pred_path = "pred.txt"
metric = metric(pred_path)
print(metric)
指標匯總如下(以下指標均為CPU下計算所得):
Exp | 模型 | 推理框架 | 模型格式 | Precision↑ | Recall↑ | H-mean↑ | Elapse↓ |
---|---|---|---|---|---|---|---|
1 | PP-OCRv5_mobile_det | PaddleX | PaddlePaddle | 0.7864 | 0.8018 | 0.7940 | 0.1956 |
2 | PP-OCRv5_mobile_det | RapidOCR | PaddlePaddle | 0.7861 | 0.8266 | 0.8058 | 0.5328 |
3 | PP-OCRv5_mobile_det | RapidOCR | ONNXRuntime | 0.7861 | 0.8266 | 0.8058 | 0.1653 |
4 | PP-OCRv4_mobile_det | RapidOCR | ONNXRuntime | 0.8301 | 0.8659 | 0.8476 | - |
5 | PP-OCRv5_server_det | PaddleX | PaddlePaddle | 0.8347 | 0.8583 | 0.8463 | 2.1450 |
6 | PP-OCRv5_server_det | RapidOCR | PaddlePaddle | ||||
7 | PP-OCRv5_server_det | RapidOCR | ONNXRuntime | 0.7394 | 0.8442 | 0.7883 | 2.0628 |
8 | PP-OCRv4_server_det | RapidOCR | ONNXRuntime | 0.7922 | 0.8128 | 0.7691 | - |
從以上結果來看,可以得到以下結論:
-
Exp1和Exp2相比,H-mean差異不大,說明文本檢測 前后處理代碼可以共用 。
-
Exp2和Exp3相比,mobile模型轉換為ONNX格式后,指標幾乎一致,說明 模型轉換前后,誤差較小,推理速度也有提升 。
-
Exp3和Exp4相比,mobile整體指標弱于PP-OCRv4的。因為測評集集中在中英文的印刷體,手寫體少些,因此僅供參考。
-
Exp6直接跑,會報以下錯誤,暫時沒有找到原因。如有知道的小伙伴,歡迎留言告知。
5%|████████▏ | 11/212 [00:42<13:11, 3.94s/it][1] 61275 bus error python t.py/Users/xxxxx/miniconda3/envs/py310/lib/python3.10/multiprocessing/resource_tracker.py:224: UserWarning: resource_tracker: There appear to be 1 leaked semaphore objects to clean up at shutdown warnings.warn('resource_tracker: There appear to be %d '
-
因為Exp6暫時沒有找到原因,粗略將Exp5和Exp7相比,可以看到PP-OCRv5 server模型轉換為ONNX格式后,H-mean下降了5.8% ,但是轉換方式和mobile的相同,具體原因需要進一步排查。如有知道的小伙伴,歡迎留言告知。
-
Exp7和Exp8相比,PP-OCRv5 server模型提升很大(H-mean提升7.72%)。不排除用到了測評集數據。
最終建議:
- 如果是單一中英文場景,建議用PP-OCRv4系列
- 如果是中英日、印刷和手寫體混合場景,建議用PP-OCRv5系列
上述表格中基于ONNXRuntime的結果已經更新到開源OCR模型對比中。
5. 集成到rapidocr中
該部分主要包括將托管模型到魔搭、更改rapidocr代碼適配等。
托管模型到魔搭
該部分主要是涉及模型上傳到對應位置,并合理命名。注意上傳完成后,需要打Tag,避免后續rapidocr whl包中找不到模型下載路徑。
我這里已經上傳到了魔搭上,詳細鏈接參見:link
更改rapidocr代碼適配
該部分主要涉及到更改default_models.yaml和paddle.py的代碼來適配。
同時,需要添加對應的單元測試,在保證之前單測成功的同時,新的針對性該模型的單測也能通過。
我這里已經做完了,小伙伴們感興趣可以去看看源碼。
寫在最后
至此,該部分集成工作就基本完成了。這部分代碼會集成到rapidocr==3.0.0
中。版本號之所以從v2.1.0到v3.0.0,原因是:語義化版本號。
我在集成過程中,發現v2.1.0中字段不太合理,做了一些改進,動了外部API,因此只能升大版本號。請大家在使用過程中,注意查看最新文檔→ docs 。