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秒多一点。

相关推荐
SEEONTIME4 分钟前
python-24-一篇文章彻底掌握Python HTTP库Requests
开发语言·python·http·http库requests
Bearnaise4 分钟前
PointMamba: A Simple State Space Model for Point Cloud Analysis——点云论文阅读(10)
论文阅读·笔记·python·深度学习·机器学习·计算机视觉·3d
shymoy9 分钟前
Radix Sorts
数据结构·算法·排序算法
风影小子18 分钟前
注册登录学生管理系统小项目
算法
黑龙江亿林等保20 分钟前
深入探索哈尔滨二级等保下的负载均衡SLB及其核心算法
运维·算法·负载均衡
lucy1530275107923 分钟前
【青牛科技】GC5931:工业风扇驱动芯片的卓越替代者
人工智能·科技·单片机·嵌入式硬件·算法·机器学习
哇咔咔哇咔35 分钟前
【科普】conda、virtualenv, venv分别是什么?它们之间有什么区别?
python·conda·virtualenv
杜杜的man39 分钟前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang
小沈熬夜秃头中୧⍤⃝1 小时前
【贪心算法】No.1---贪心算法(1)
算法·贪心算法
CSXB991 小时前
三十四、Python基础语法(文件操作-上)
开发语言·python·功能测试·测试工具