转换paddleocr v4到瑞芯微rk3588

转换paddleocr到瑞芯微rk3588

1 使用fastdeploy+python SDK方式移植padleocr到rk3588

padocr的模型是基于paddlepaddle框架的,因此需要先将paddlepaddle的模型转为onnx后再将onnx转为rknn模型。获得rknn模型后,可以直接借助百度的FastDeploy框架使用文字识别模型。整体思路如下:

  • 步骤1:服务端环境搭建(rknn-toolkit2 1.5.0),用于转换RKNN模型。由于rknn-toolkit2-1.5.2转换paddle-ocr的模型之后,会出现推理错乱的情况,因此将onnx转rknn时,需要使用rknn-toolkit2-1.5.0版本,但可以使用rknn-toolkit2-1.5.2进行推理。
  • 步骤2:边缘端环境搭建:安装rknpu2/编译FastDeploy/编译FastDeploy Python SDK
  • 步骤3:使用FastDeploy Python SDK进行模型推理。

1.1 安装模型转换环境

1.1.1 服务器环境安装

下载rknn-toolkit2-1.5.0,然后根据需要安装其他依赖即可。

wget https://github.com/rockchip-linux/rknn-toolkit2/blob/v1.5.0/packages/rknn_toolkit2-1.5.0%2B1fa95b5c-cp38-cp38-linux_x86_64.whl

# numpy的版本过高是会出现 module 'numpy' has no attribute 'bool'
pip3 install numpy==1.23.1  -i https://mirror.baidu.com/pypi/simple

# 安装rknn-toolkit2-1.5.0
pip3 install --no-dependencies rknn_toolkit2-1.5.0+1fa95b5c-cp38-cp38-linux_x86_64.whl

1.1.2 板端环境rknpu2安装

参考:https://doc.embedfire.com/linux/rk356x/Ai/zh/latest/lubancat_ai/example/pp_ocrv3.html#id3

1.1.3 板端编译FastDeploy安装

板端编译FastDeploy C++ SDK

git clone https://github.com/PaddlePaddle/FastDeploy.git
cd FastDeploy

mkdir build && cd build
cmake ..  \
-DENABLE_ORT_BACKEND=OFF \
-DENABLE_RKNPU2_BACKEND=ON \
-DENABLE_VISION=ON \
-DRKNN2_TARGET_SOC=RK3588 \
-DCMAKE_INSTALL_PREFIX=${PWD}/fastdeploy-0.0.0

# build if soc is RK3588
make -j8

make install

** 配置环境变量**

# 永久配置
source PathToFastDeploySDK/fastdeploy_init.sh
sudo cp PathToFastDeploySDK/fastdeploy_libs.conf /etc/ld.so.conf.d/
sudo ldconfig

** 编译FastDeploy Python SDK**

git clone https://github.com/PaddlePaddle/FastDeploy.git
cd FastDeploy

# 如果您使用的是develop分支输入以下命令
git checkout develop

cd python
export ENABLE_ORT_BACKEND=ON
export ENABLE_RKNPU2_BACKEND=ON
export ENABLE_VISION=ON
export RKNN2_TARGET_SOC=RK3588

# 如果你的核心板的运行内存大于等于8G,我们建议您执行以下命令进行编译。
python3 setup.py build

python3 setup.py bdist_wheel
cd dist
pip3 install fastdeploy_python-0.0.0-cp39-cp39-linux_aarch64.whl

1.2 模型转换

1.2.1 下载paddleocr v4模型

官网地址:https://github.com/PaddlePaddle/PaddleOCR

wget https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_infer.tar
wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar
wget https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_rec_infer.tar

1.2.2 paddle转onnx转rknn

文字检测模型转换

# paddle模型转onnx
paddle2onnx --model_dir ./model/ch_PP-OCRv4_det_infer \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
--save_file ./model/ch_PP-OCRv4_det_infer/model.onnx \
--opset_version 12 \
--enable_onnx_checker True \
--enable_dev_version True

# 固定输出尺寸
python -m paddle2onnx.optimize \
--input_model ./model/ch_PP-OCRv4_det_infer/model.onnx \
--output_model ./model/ch_PP-OCRv4_det_infer/model_fix.onnx \
--input_shape_dict "{'x':[1,3,960,960]}"

# 模型一些类型缺少“shape”,可以使用onnxruntime的工具重新推理下onnx的shape,参考:https://doc.embedfire.com/linux/rk356x/Ai/zh/latest/lubancat_ai/example/pp_ocrv3.html#pp-ocrv3
python3 /opt/virtualenvs/feiran/lib/python3.8/site-packages/onnxruntime/tools/symbolic_shape_infer.py \
--input ./models/ocr/ch_PP-OCRv4_det_infer/model_fix.onnx \
--output ./models/ocr/ch_PP-OCRv4_det_infer/model_fix_new.onnx 

# 编写脚本将onnx转为rknn,参考:https://github.com/PaddlePaddle/FastDeploy/blob/develop/tools/rknpu2/export.py

文字方向判别模型

# paddle模型转onnx
paddle2onnx --model_dir ./model/ch_ppocr_mobile_v2.0_cls_infer \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
--save_file ./model/ch_ppocr_mobile_v2.0_cls_infer/model.onnx \
--opset_version 12 \
--enable_onnx_checker True \
--enable_dev_version True

# 固定输出尺寸
python -m paddle2onnx.optimize \
--input_model ./model/ch_ppocr_mobile_v2.0_cls_infer/model.onnx \
--output_model ./model/ch_ppocr_mobile_v2.0_cls_infer/model_fix.onnx \
--input_shape_dict "{'x':[1,3,48,192]}"

# 模型一些类型缺少“shape”,可以使用onnxruntime的工具重新推理下onnx的shape,参考:https://doc.embedfire.com/linux/rk356x/Ai/zh/latest/lubancat_ai/example/pp_ocrv3.html#pp-ocrv3
python3 /opt/virtualenvs/feiran/lib/python3.8/site-packages/onnxruntime/tools/symbolic_shape_infer.py \
--input ./models/ocr/ch_ppocr_mobile_v2.0_cls_infer/model_fix.onnx \
--output ./models/ocr/ch_ppocr_mobile_v2.0_cls_infer/model_fix_new.onnx 

# 编写脚本将onnx转为rknn,参考:https://github.com/PaddlePaddle/FastDeploy/blob/develop/tools/rknpu2/export.py 

文字识别模型转换

# paddle模型转onnx
paddle2onnx --model_dir ./model/ch_PP-OCRv4_rec_infer \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
--save_file ./model/ch_PP-OCRv4_rec_infer/model.onnx \
--opset_version 12 \
--enable_onnx_checker True \
--enable_dev_version True

# 固定输出尺寸
python -m paddle2onnx.optimize \
--input_model ./model/ch_PP-OCRv4_rec_infer/model.onnx \
--output_model ./model/ch_PP-OCRv4_rec_infer/model_fix.onnx \
--input_shape_dict "{'x':[1,3,48,320]}"

# 模型一些类型缺少“shape”,可以使用onnxruntime的工具重新推理下onnx的shape,参考:https://doc.embedfire.com/linux/rk356x/Ai/zh/latest/lubancat_ai/example/pp_ocrv3.html#pp-ocrv3
python3 /opt/virtualenvs/feiran/lib/python3.8/site-packages/onnxruntime/tools/symbolic_shape_infer.py \
--input ./models/ocr/ch_PP-OCRv4_rec_infer/model_fix.onnx \
--output ./models/ocr/ch_PP-OCRv4_rec_infer/model_fix_new.onnx 

# 编写脚本将onnx转为rknn,参考:https://github.com/PaddlePaddle/FastDeploy/blob/develop/tools/rknpu2/export.py 

1.3 模型推理

参考:https://github.com/PaddlePaddle/FastDeploy/blob/develop/examples/vision/ocr/PP-OCR/rockchip/python/infer.py

import os
import cv2
import fastdeploy as fd
from pathlib import Path

if __name__ == "__main__":
    rec_option = fd.RuntimeOption()
    rec_option.use_rknpu2()
    rec_format = fd.ModelFormat.RKNN

    det_option = fd.RuntimeOption()
    det_option.use_rknpu2()
    det_format = fd.ModelFormat.RKNN

    det_model = fd.vision.ocr.DBDetector(
        "../model/ocr/ch_PP-OCRv4_det_infer/model_fix.rknn",
        "",
        runtime_option=det_option,
        model_format=det_format)
    det_model.preprocessor.static_shape_infer = True
    det_model.preprocessor.disable_normalize()
    det_model.preprocessor.disable_permute()

    rec_model = fd.vision.ocr.Recognizer(
        "../model/ocr/ch_PP-OCRv4_rec_infer/model_fix.rknn",
        "",
        "../model/ocr/dicts/ppocr_keys_v1.txt",
        runtime_option=rec_option,
        model_format=rec_format)
    rec_model.preprocessor.static_shape_infer = True
    rec_model.preprocessor.disable_normalize()
    rec_model.preprocessor.disable_permute()

    ppocr_v3 = fd.vision.ocr.PPOCRv4(
        det_model=det_model, cls_model=None, rec_model=rec_model)
    ppocr_v3.cls_batch_size = 1
    ppocr_v3.rec_batch_size = 1

    for file in Path("../data/src_ocr_images/license_plate").rglob("*.png"):
        im = cv2.imread(file.as_posix())
        result = ppocr_v3.predict(im)
        vis_im = fd.vision.vis_ppocr(im, result)
        cv2.imwrite(os.path.join("../data/dst_ocr_images/license_plate", os.path.basename(file)), vis_im)

        # result = rec_model.predict(im)

        print(file.as_posix(), result)

1.4 问题

问题1:文字识别模型推理后解析的结果与图片中的文字不一样?

解决方法:参考https://github.com/PaddlePaddle/FastDeploy/issues/2218

“1.5.2的toolkit2转换rknn模型有问题,最后支持的版本是1.5.1b19,你可以用1.5.1b19的工具转换模型。但是这个问题还是看下吧,因为板子已经支持半自动的动态输入了,目前的静态resize输入识别率很低,估计变形太严重都丢了”。使用1.5.1b19版本的rknn导出模型。

找不到对应版本的模型,使用1.5.0可以正常推理,下载地址https://github.com/rockchip-linux/rknn-toolkit2/blob/v1.5.0/packages/rknn_toolkit2-1.5.0%2B1fa95b5c-cp38-cp38-linux_x86_64.whl

问题2:rknn-toolkit2降低到1.5.0版本后,出现下面错误

E load_onnx: onnx.onnx_cpp2py_export.checker.ValidationError: Field 'shape' of 'type' is required but missing.

模型一些类型缺少“shape”,可以使用onnxruntime的工具重新推理下onnx的shape:

python symbolic_shape_infer.py --input ch_ppocr_mobile_v2.0_cls_infer/ch_ppocr_mobile_v2.0_cls_infer_old.onnx 
--output ch_ppocr_mobile_v2.0_cls_infer/ch_ppocr_mobile_v2.0_cls_infer.onnx

symbolic_shape_infer.py位于onnxruntime的安装目录中/opt/virtualenvs/feiran/lib/python3.8/site-packages/onnxruntime/tools/symbolic_shape_infer.py

问题3:转换cls和rec模型时报错

E build: AttributeError: module 'numpy' has no attribute 'bool'.

降低numpy的版本:pip3 install numpy==1.23.1 -i https://mirror.baidu.com/pypi/simple

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容