前提

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