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

620 阅读4分钟

前提

  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,模型请自己下载。
pip install paddle2onnx
  1. 先将模型转为动态的,但是动态的转rknn的模型暂不支持,因此还需要固定 shape。
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 -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环境

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,这个时候就需要你看板子的型号和输出了,下面是获取当前平台的代码。
# 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 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目录
sudo cp ./aarch64/* /usr/lib

最后

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