轉(zhuǎn)換paddleocr v4到瑞芯微rk3588

轉(zhuǎn)換paddleocr到瑞芯微rk3588

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

padocr的模型是基于paddlepaddle框架的,因此需要先將paddlepaddle的模型轉(zhuǎn)為onnx后再將onnx轉(zhuǎn)為rknn模型梁钾。獲得rknn模型后跨算,可以直接借助百度的FastDeploy框架使用文字識(shí)別模型。整體思路如下:

  • 步驟1:服務(wù)端環(huán)境搭建(rknn-toolkit2 1.5.0)鼓鲁,用于轉(zhuǎn)換RKNN模型戒努。由于rknn-toolkit2-1.5.2轉(zhuǎn)換paddle-ocr的模型之后啄骇,會(huì)出現(xiàn)推理錯(cuò)亂的情況宵蛀,因此將onnx轉(zhuǎn)rknn時(shí)昆著,需要使用rknn-toolkit2-1.5.0版本,但可以使用rknn-toolkit2-1.5.2進(jìn)行推理术陶。
  • 步驟2:邊緣端環(huán)境搭建:安裝rknpu2/編譯FastDeploy/編譯FastDeploy Python SDK
  • 步驟3:使用FastDeploy Python SDK進(jìn)行模型推理凑懂。

1.1 安裝模型轉(zhuǎn)換環(huán)境

1.1.1 服務(wù)器環(huán)境安裝

下載rknn-toolkit2-1.5.0,然后根據(jù)需要安裝其他依賴即可梧宫。

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的版本過(guò)高是會(huì)出現(xiàn) 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 板端環(huán)境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

** 配置環(huán)境變量**

# 永久配置
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

# 如果你的核心板的運(yùn)行內(nèi)存大于等于8G接谨,我們建議您執(zhí)行以下命令進(jìn)行編譯。
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 模型轉(zhuǎn)換

1.2.1 下載paddleocr v4模型

官網(wǎng)地址: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轉(zhuǎn)onnx轉(zhuǎn)rknn

文字檢測(cè)模型轉(zhuǎn)換

# paddle模型轉(zhuǎn)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]}"

# 模型一些類(lèi)型缺少“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 

# 編寫(xiě)腳本將onnx轉(zhuǎn)為rknn,參考:https://github.com/PaddlePaddle/FastDeploy/blob/develop/tools/rknpu2/export.py

文字方向判別模型

# paddle模型轉(zhuǎn)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]}"

# 模型一些類(lèi)型缺少“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 

# 編寫(xiě)腳本將onnx轉(zhuǎn)為rknn,參考:https://github.com/PaddlePaddle/FastDeploy/blob/develop/tools/rknpu2/export.py 

文字識(shí)別模型轉(zhuǎn)換

# paddle模型轉(zhuǎn)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]}"

# 模型一些類(lèi)型缺少“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 

# 編寫(xiě)腳本將onnx轉(zhuǎn)為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 問(wèn)題

問(wèn)題1:文字識(shí)別模型推理后解析的結(jié)果與圖片中的文字不一樣棍厂?

解決方法:參考https://github.com/PaddlePaddle/FastDeploy/issues/2218

“1.5.2的toolkit2轉(zhuǎn)換rknn模型有問(wèn)題颗味,最后支持的版本是1.5.1b19,你可以用1.5.1b19的工具轉(zhuǎn)換模型牺弹。但是這個(gè)問(wèn)題還是看下吧浦马,因?yàn)榘遄右呀?jīng)支持半自動(dòng)的動(dòng)態(tài)輸入了,目前的靜態(tài)resize輸入識(shí)別率很低张漂,估計(jì)變形太嚴(yán)重都丟了”晶默。使用1.5.1b19版本的rknn導(dǎo)出模型。

找不到對(duì)應(yīng)版本的模型航攒,使用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

問(wèn)題2:rknn-toolkit2降低到1.5.0版本后屎债,出現(xiàn)下面錯(cuò)誤

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

模型一些類(lèi)型缺少“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

問(wèn)題3:轉(zhuǎn)換cls和rec模型時(shí)報(bào)錯(cuò)

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

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

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盆驹,隨后出現(xiàn)的幾起案子圆丹,更是在濱河造成了極大的恐慌,老刑警劉巖躯喇,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辫封,死亡現(xiàn)場(chǎng)離奇詭異硝枉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)倦微,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)妻味,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人欣福,你說(shuō)我怎么就攤上這事责球。” “怎么了拓劝?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵雏逾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我郑临,道長(zhǎng)栖博,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任厢洞,我火速辦了婚禮仇让,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躺翻。我一直安慰自己妹孙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布获枝。 她就那樣靜靜地躺著,像睡著了一般骇笔。 火紅的嫁衣襯著肌膚如雪省店。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天笨触,我揣著相機(jī)與錄音懦傍,去河邊找鬼。 笑死芦劣,一個(gè)胖子當(dāng)著我的面吹牛粗俱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虚吟,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼寸认,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了串慰?” 一聲冷哼從身側(cè)響起偏塞,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邦鲫,沒(méi)想到半個(gè)月后灸叼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體神汹,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年古今,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屁魏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捉腥,死狀恐怖氓拼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情但狭,我是刑警寧澤披诗,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站立磁,受9級(jí)特大地震影響呈队,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唱歧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一宪摧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颅崩,春花似錦几于、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至尖滚,卻和暖如春喉刘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漆弄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工睦裳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撼唾。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓廉邑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親倒谷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛛蒙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容