侧边栏壁纸
博主头像
suke

ah?

  • 累计撰写 54 篇文章
  • 累计创建 38 个标签
  • 累计收到 103 条评论

目 录CONTENT

文章目录

PaddleOCR v4部署到rknn注意事项

suke
2023-12-18 / 0 评论 / 3 点赞 / 607 阅读 / 1,428 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-12-19,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前提

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

3

评论区