将PaddleOCR 转为 ONNX 运行

PaddleOCR 是目前最好的开源OCR框架, 但paddle框架的兼容性实在不怎么好, 部署的时候容易出现各种各样的问题. 如果能把PaddleOCR转成ONNX, 就可以跳过paddle框架坑的同时, 又可以白嫖PaddleOCR的强大检测性能.

本文会介绍一下, 如何把最新的PP_OCRv4模型转成onxx格式, 并正确运行.

步骤1: PaddleOCR模型转ONNX

  1. 原始网络权重下载
    在PaddleOCR的项目主页 https://github.com/PaddlePaddle/PaddleOCR 下载最新的v4版检测与识别模型.

  2. 模型权重转ONNX
    用pip安装PaddlePaddle到ONNX的模型转换工具: https://github.com/PaddlePaddle/Paddle2ONNX.
    参照如下命令转换paddle格式模型到ONNX格式.

    复制代码
    paddle2onnx --model_dir /mnt/d/Downloads/202406/paddelocr/pp/ch_PP-OCRv4_det_infer/ --model_filename inference.pdmodel --params_filename inference.pdiparams --opset_version 11 --save_file /mnt/d/Downloads/202406/paddelocr/onnx/ch_PP-OCRv4_det_infer.onnx
    
    paddle2onnx --model_dir /mnt/d/Downloads/202406/paddelocr/pp/ch_PP-OCRv4_rec_infer/ --model_filename inference.pdmodel --params_filename inference.pdiparams --opset_version 11 --save_file /mnt/d/Downloads/202406/paddelocr/onnx/ch_PP-OCRv4_rec_infer.onnx

步骤2: ONNX推理运行

转换格式成功后得到的ONNX模型可以进行推理。若要用于识别任务,还需补充输入图片的预处理和检测结果的输出等外围数据处理步骤。

https://github.com/jingsongliujing/OnnxOCR

该项目基于转换后的ppocr_server_v2.0模型,已经完成了文本识别所需的外围数据处理部分。

经过测试,pp_ocr系列模型的预处理和后处理部分是通用的。只需在此代码基础上集成转换好的ONNX模型即可。

https://github.com/CKboss/pp_onnx

这是基于原项目fork后的修改版,支持运行PP_OCRv4,并能调用v4版本的det和rec OCR模型。旋转检测部分的cls模型保持不变,仍使用server_v2.0版本。此外,还修改了可能导致引用冲突的包名和部分模型输入参数。

注:

转换为ONNX格式后的模型精度损失情况尚不明确,但从简单的demo来看,模型能够正常进行推理。