安卓端部署PPOCR的ncnn模型——模型轉(zhuǎn)換

最近在研究ocr模型(包括文本檢測和文本識別)在安卓端的部署,由于工作中用到的算法是基于百度研發(fā)的PPOCR算法,最終需要在安卓端落地應(yīng)用,部署框架使用的是ncnn框架,中間涉及模型轉(zhuǎn)換和部署的問題,所以特意在此做一個記錄,本文主要講一下模型轉(zhuǎn)換的問題。

說到模型轉(zhuǎn)換,自然會涉及原模型(訓(xùn)練模型)、中間模型(onnx)和目標模型(ncnn模型),原模型對應(yīng)訓(xùn)練框架、目標模型對應(yīng)部署框架。首先是訓(xùn)練框架(模型):我們用到的是百度的飛槳(PaddlePaddle),它包含了從訓(xùn)練到部署的全套工具,由于公司之前一直用ncnn作為部署框架的,也不方便為了這個算法去直接換框架,所以要保持原有部署框架不變只能從模型轉(zhuǎn)換作為突破口了。其次是中間模型:我們選擇的是微軟開發(fā)的onnx,它也是原模型與目標模型的中間橋梁,目前市面上絕大多數(shù)深度學(xué)習(xí)訓(xùn)練框架都支持訓(xùn)練模型到onnx模型的轉(zhuǎn)換,同時絕大多數(shù)部署框架也支持onnx到部署模型的轉(zhuǎn)換。最后是部署框架:我們用到的是騰訊優(yōu)圖實驗室開發(fā)的ncnn,它主要是移動端深度學(xué)習(xí)模型的部署工具,提升深度學(xué)習(xí)模型的推理性能。

廢話不多說,開始正題

準備工作:

模型:原模型這里用的是百度開源的PPOCR模型下載地址(model_list
具體用到的是文本檢測的ch_ppocr_mobile_v2.0_det(推理模型)和文本識別的ch_ppocr_mobile_v2.0_rec(推理模型)。

轉(zhuǎn)換環(huán)境:

OS:Ubuntu 18.04
Python 3.6
Paddle2ONNX
ONNXRuntime
ncnn
PaddleOCR

構(gòu)建環(huán)境命令:

$ pip3 install onnxruntime==1.9.0 --user
$ pip3 install paddle2onnx --user
$ sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libvulkan-dev vulkan-utils libopencv-dev

部署框架模型轉(zhuǎn)換工具編譯命令:

$ git clone https://github.com/Tencent/ncnn.git
$ cd {Your_Path}/ncnn/
$ mkdir -p build
$ cd build
$ cmake ..
$ make -j4

轉(zhuǎn)換操作:

paddlepaddle->onnx

# 文本檢測
$ paddle2onnx--model_dir {your_ocr_det_paddlepaddle_model_root_path} \
--model_filename {your_ocr_det_pdmodel_file_name} \
--params_filename {your_ocr_det_pdiparams_file_name} \
--save_file {your_ocr_det_onnx_file_name} \
--opset_version 10 \
--input_shape_dict="{'x':[-1,3,-1,-1]}"\
--enable_onnx_checker True
# 文本識別
$ paddle2onnx--model_dir {your_ocr_rec_paddlepaddle_model_root_path} \
--model_filename {your_ocr_rec_pdmodel_file_name} \
--params_filename {your_ocr_rec_pdiparams_file_name} \
--save_file {your_ocr_rec_onnx_file_name} \
--opset_version 10 \
--input_shape_dict="{'x':[-1,3,-1,-1]}"\
--enable_onnx_checker True

如若使用訓(xùn)練模型進行轉(zhuǎn)換,則需要下載PaddleOCR
具體操作如下:

$ git clone https://github.com/PaddlePaddle/PaddleOCR.git
# 文本檢測訓(xùn)練模型->推理模型
$ python3 {your_path}/PaddleOCR/tools/export_model.py -c {your_path}/configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0.yml -o Global.pretrained_model={your_path}/ch_ppocr_mobile_v2.0_det_train/best_accuracy Global.save_inference_dir={your_path}/inference/det_db/
# 文本識別訓(xùn)練模型->推理模型
$ python3 {your_path}/tools/export_model.py -c {your_path}/configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml -o Global.pretrained_model={your_path}/ch_ppocr_mobile_v2.0_rec_train/best_accuracy  Global.save_inference_dir={your_path}/inference/rec_crnn/

最后得到的det_db和rec_crnn目錄文件如下:
inference/{model_root_path}/
├── inference.pdiparams # 檢測inference模型的參數(shù)文件
├── inference.pdiparams.info # 檢測inference模型的參數(shù)信息,可忽略
└── inference.pdmodel # 檢測inference模型的program文件
接下來再回到上一步進行轉(zhuǎn)換操作。

onnx->ncnn

$ cd {Your_Path}/ncnn/build/onnx/
# 文本檢測
$ python3 -m onnxsim {your_ocr_det_onnx_file_path} {your_ocr_det_onnx_sim_file_path} --dynamic-input-shape --input-shape "1,3,640,640"
$ ./onnx2ncnn {your_ocr_det_onnx_file_path} {your_ocr_det_ncnn_param_file_path} {your_ocr_det_ncnn_bin_file_path}
# 文本識別
$ python3 -m onnxsim {your_ocr_rec_onnx_file_path} {your_ocr_rec_onnx_sim_file_path} --input-shape "1,3,32,320"
$ ./onnx2ncnn {your_ocr_rec_onnx_sim_file_path} {your_ocr_rec_ncnn_param_file_path} {your_ocr_rec_ncnn_bin_file_path}

注意:文本檢測與文本識別的onnxsim命令區(qū)別,雖然兩者的輸入shape都是-1,3,-1,-1,但是仍然需要指定一個shape,否則進行onnx2ncnn時會報錯。

這樣我們就得到了完整的PPOCR文本檢測算法和文本識別算法里的對應(yīng)ncnn模型,可以進行進一步的部署與推理了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容