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

前提

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

PaddleOCR 转 onnx精度降低的问题

下载V4模型和转换工具,工具使用 Paddle2ONNX,模型请自己下载。
pip install paddle2onnx

先将模型转为动态的,但是动态的转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

固定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.6、python3.8、python3.9版本编译过,每次耗时基本在几个小时,但是在3.8编译后安装whl文件后运行demo没通过,在3.6和3.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模型问题

转换工具rknn-toolkit2版本选择和安装,如果你选的 OCR 版本是ppocr-v3,用 python3.6的工具没问题的,最后rknn平台加载也没问题,但是如果是 ppocr-v4在3.6转换则到rknn加载的时候会提示 shape 缺失的,所以推荐环境是在 python3.8.
转换和部署平台是不一样的,转换在x86 的ubuntu,这也是官方建议的,而部署平台rknn板子一般都是arm64,请区分转换和部署平台不同,转换完成测试将模型导入到终端板子即可。
转换前还需要知道的是最后你需要部署的平台,是 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

最后转换为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 模型部署注意事项

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

最后

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

​ 

Read More 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *