PaddleOCR v4部署到rknn指南(py版)

前提

  1. 使用FastDeploy部署,如果原生部署也可以,但是不如这个简洁,当然他们都是飞桨的。
  2. Paddle 版本,测试到在 Paddle 2.4.x版本,PaddleOCRv3版本识别率快且准,但是Paddle 2.5版本的时候 PaddleOCR v3 准确率下降了很多(截至目前2023十二月),因此这这也是我直接使用 FastDeploy 的原因。
  3. 使用 FastDeploy 切换模型参数真的是太方便了,而且部署也方便。
  4. 使用原生模型 PaddleOCRv4 版本非GPU耗时太长(40S以上),因此转为固定 shape 的onnx模型可以在CPU上秒级识别。
  5. FastDeploy 加载使用 onnx 模型或者其他的比如标题中提到的 RKNN 平台的部署测试也方便。

PaddleOCR 转 onnx精度降低的问题

  1. 下载V4模型和转换工具,工具使用 Paddle2ONNX,模型请自己下载。
python 复制代码
pip install paddle2onnx
  1. 先将模型转为动态的,但是动态的转rknn的模型暂不支持,因此还需要固定 shape。
python 复制代码
paddle2onnx --model_dir ./models-v4/ch_PP-OCRv4_det_infer --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./models-v4/ch_PP-OCRv4_det_infer/ch_PP-OCRv4_det_infer.onnx --opset_version 12 --input_shape_dict="{'x':[-1,3,-1,-1]}" --enable_onnx_checker True

paddle2onnx --model_dir ./models-v4/ch_PP-OCRv4_rec_infer --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./models-v4/ch_PP-OCRv4_rec_infer/ch_PP-OCRv4_rec_infer.onnx --opset_version 12 --input_shape_dict="{'x':[-1,3,-1,-1]}" --enable_onnx_checker True

paddle2onnx --model_dir ./models-v4/ch_ppocr_mobile_v2.0_cls_infer --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./models-v4/ch_ppocr_mobile_v2.0_cls_infer/ch_ppocr_mobile_v2.0_cls_infer.onnx --opset_version 12 --input_shape_dict="{'x':[-1,3,-1,-1]}" --enable_onnx_checker True
  1. 固定shape
python 复制代码
python -m paddle2onnx.optimize --input_model ./models-v4/ch_PP-OCRv4_det_infer/ch_PP-OCRv4_det_infer.onnx --output_model ./models/fix-shape/ch_PP-OCRv4_det_infer.onnx --input_shape_dict "{'x':[1,3,960,960]}"


python -m paddle2onnx.optimize --input_model ./models-v4/ch_PP-OCRv4_rec_infer/ch_PP-OCRv4_rec_infer.onnx --output_model ./models/fix-shape/ch_PP-OCRv4_rec_infer.onnx --input_shape_dict "{'x':[1,3,48,320]}"



python -m paddle2onnx.optimize --input_model ./models/ch_ppocr_mobile_v2.0_cls_infer/ch_ppocr_mobile_v2.0_cls_infer.onnx --output_model ./models/fix-shape/ch_ppocr_mobile_v2.0_cls_infer.onnx --input_shape_dict "{'x':[1,3,48,192]}"

用上面转换完的模型去识别,如果是小图片则没问题,但是大图文本太长的基本识别不出来,原因就在前面固定shape的时候尺寸只有 48,320,遇到大的图片比如1080的,长文本识别就是空的,这是大图图片压缩到该尺寸的时候文本基本变形到无法识别了。(前提使用模型是pp-V4,如果是v3,则文本精度远不如v4)。

fastdeploy 在rknn端侧编译问题

最需要注意的还是RKNN2_TARGET_SOC了,我分别在python3.6python3.8python3.9版本编译过,每次耗时基本在几个小时,但是在3.8编译后安装whl文件后运行demo没通过,在3.63.9没问题,我也没继续纠结了,因此优先3.9环境

ini 复制代码
cd python
export ENABLE_ORT_BACKEND=ON
export ENABLE_RKNPU2_BACKEND=ON
export ENABLE_VISION=ON

# 请根据你的开发版的不同,选择RK3588和RK356X
export RKNN2_TARGET_SOC=RK356X

# 如果你的核心板的运行内存大于等于8G,我们建议您执行以下命令进行编译。
python3 setup.py build
# 值得注意的是,如果你的核心板的运行内存小于8G,我们建议您执行以下命令进行编译。
python3 setup.py build -j1

python3 setup.py bdist_wheel

onnx模型转rknn模型问题

  1. 转换工具rknn-toolkit2版本选择和安装,如果你选的 OCR 版本是ppocr-v3,用 python3.6的工具没问题的,最后rknn平台加载也没问题,但是如果是 ppocr-v4在3.6转换则到rknn加载的时候会提示 shape 缺失的,所以推荐环境是在 python3.8.
  2. 转换和部署平台是不一样的,转换在x86ubuntu,这也是官方建议的,而部署平台rknn板子一般都是arm64,请区分转换和部署平台不同,转换完成测试将模型导入到终端板子即可。
  3. 转换前还需要知道的是最后你需要部署的平台,是 rk356x还是rk3588,这个时候就需要你看板子的型号和输出了,下面是获取当前平台的代码。
python 复制代码
# decice tree for rk356x/rk3588
DEVICE_COMPATIBLE_NODE = '/proc/device-tree/compatible'

def get_host():
    # get platform and device type
    system = platform.system()
    machine = platform.machine()
    os_machine = system + '-' + machine
    if os_machine == 'Linux-aarch64':
        try:
            with open(DEVICE_COMPATIBLE_NODE) as f:
                device_compatible_str = f.read()
                if 'rk3588' in device_compatible_str:
                    host = 'RK3588'
                elif 'rk3562' in device_compatible_str:
                    host = 'RK3562'
                else:
                    host = 'RK3566_RK3568'
        except IOError:
            print('Read device node {} failed.'.format(DEVICE_COMPATIBLE_NODE))
            exit(-1)
    else:
        host = os_machine
    return host
  1. 最后转换为rknn模型的时候填写具体需要的平台版本型号

导出python文件

python 复制代码
python export.py --config_path ppocrv4_det.yaml --target_platform rk3566
python export.py --config_path ppocrv4_rec.yaml --target_platform rk3566

rknn 模型部署注意事项

  1. 板子侧安装的rknn python API,rknn_toolkit_lite2中选择安装即可,但是安装完后需要到rknpu2找到对应的环境libso文件即可,然后拷贝到/usr/lib目录
shell 复制代码
sudo cp ./aarch64/* /usr/lib

最后

借助rknnNPUPaddleOCR v4在端侧检测速度小图片基本在500毫秒以内,大图文字多的1秒多一点。

相关推荐
可触的未来,发芽的智生11 分钟前
触摸未来2025-10-18:生成文字的小宇宙矩阵溯源
人工智能·python·神经网络·程序人生·自然语言处理
_码力全开_12 分钟前
P1005 [NOIP 2007 提高组] 矩阵取数游戏
java·c语言·c++·python·算法·矩阵·go
墨染点香16 分钟前
LeetCode 刷题【124. 二叉树中的最大路径和、125. 验证回文串】
算法·leetcode·职场和发展
Camel卡蒙16 分钟前
红黑树详细介绍(五大规则、保持平衡操作、Java实现)
java·开发语言·算法
jerryinwuhan20 分钟前
机器人模拟器(python)
开发语言·python·机器人
AhriProGramming28 分钟前
Flask-SQLAlchemy精读-双语精选文章
python·算法·flask
列兵阿甘31 分钟前
知微传感Dkam系列3D相机SDK例程篇:Python获取内外参
python·数码相机·3d
孤廖42 分钟前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
Full Stack Developme1 小时前
java.net 包详解
java·python·.net
BanyeBirth1 小时前
C++动态规划——LIS(最长不下降子序列)
算法·动态规划