前提
- 运用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 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秒多一点。