前提
- 使用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,模型请自己下载。
python
pip install paddle2onnx
- 先将模型转为动态的,但是动态的转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
- 固定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.6
、python3.8
、python3.9
版本编译过,每次耗时基本在几个小时,但是在3.8
编译后安装whl文件后运行demo没通过
,在3.6
和3.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模型问题
- 转换工具rknn-toolkit2版本选择和安装,如果你选的 OCR 版本是
ppocr-v3
,用python3.6
的工具没问题的,最后rknn
平台加载也没问题,但是如果是ppocr-v4
在3.6转换则到rknn
加载的时候会提示shape 缺失
的,所以推荐环境是在python3.8
. - 转换和部署平台是不一样的,转换在
x86
的ubuntu
,这也是官方建议的,而部署平台rknn
板子一般都是arm64
,请区分转换和部署平台不同,转换完成测试将模型导入到终端板子即可。 - 转换前还需要知道的是最后你需要部署的平台,是 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
- 最后转换为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
目录
shell
sudo cp ./aarch64/* /usr/lib
最后
借助rknn
的NPU
,PaddleOCR
v4
在端侧检测速度小图片基本在500毫秒以内,大图文字多的1秒多一点。