1 Star 0 Fork 10

chen / mindocr

forked from MindSpore Lab / mindocr 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
convert_tutorial.md 12.30 KB
一键复制 编辑 原始数据 按行查看 历史

推理 - 模型转换教程

MindOCR支持MindOCR训练模型以及三方模型(PaddelOCR和mmOCR)的推理。

1. MindOCR模型

MindOCR模型的推理使用MindSpore Lite后端。

graph LR;
    A[MindOCR models] -- export --> B[MindIR] -- converter_lite --> C[MindSpore Lite MindIR];

1.1 模型导出

在推理之前,需要先把训练端的ckpt文件导出为MindIR文件,请执行tools/export.py

# 在线下载模型参数,导出`dbnet_resnet50` 模型的MindIR
python tools/export.py --model_name_or_config dbnet_resnet50 --data_shape 736 1280

# 使用本地ckpt文件,导出`dbnet_resnet50` 模型的MindIR
python tools/export.py --model_name_or_config dbnet_resnet50 --data_shape 736 1280 --local_ckpt_path /path/to/local_ckpt

# 使用本地ckpt文件和参数yaml文件,导出`dbnet_resnet50` 模型的MindIR
python tools/export.py --model_name_or_config configs/rec/crnn/crnn_resnet34.yaml --local_ckpt_path ~/.mindspore/models/crnn_resnet34-83f37f07.ckpt --data_shape 32 100

更多参数使用详情,请执行 `python tools/export.py -h`.

部分模型提供了MIndIR导出文件的下载链接,见模型列表,可跳转到对应模型的介绍页面进行下载。

1.2 模型转换

需要使用converter_lite工具,将上述导出的MindIR文件进行离线转换,从而用于MindSpore Lite的推理。

converter_lite的详细教程见推理模型离线转换

假设输入模型为input.mindir,经过converter_lite工具转换后的输出模型为output.mindir,则模型转换命令如下:

converter_lite \
    --saveType=MINDIR \
    --fmk=MINDIR \
    --optimize=ascend_oriented \
    --modelFile=input.mindir \
    --outputFile=output \
    --configFile=config.txt

其中,config.txt可以设置转换模型的Shape和推理精度。

1.2.1 模型Shape配置
  • 静态Shape

如果导出模型的输入名为x,输入Shape为(1,3,736,1280),则config.txt如下:

[ascend_context]
input_format=NCHW
input_shape=x:[1,3,736,1280]

转换生成的output.mindir为静态shape版,推理时的输入图像需要Resize到该input_shape以满足输入要求。

在某些推理场景,如检测出目标后再执行目标识别网络,由于目标个数和大小不固定,如果每次推理都按照最大的BatchSize或最大ImageSize进行计算,会造成计算资源浪费。

假设导出模型输入Shape为(-1, 3, -1, -1),NHW这3个轴是动态的,所以可以在模型转换时设置一些可选值,以适应推理时各种Shape大小的输入图像。

converter_lite通过configFile配置[ascend_context]dynamic_dims参数来实现,详细信息可参考动态shape配置,下文简称”分档“。

所以,转换时有2种选择,通过设置不同的config.txt实现:

  • 动态Image Size

N使用固定值,HW使用多个可选值,config.txt如下:

[ascend_context]
input_format=NCHW
input_shape=x:[1,3,-1,-1]
dynamic_dims=[736,1280],[768,1280],[896,1280],[1024,1280]
  • 动态Batch Size

N使用多个可选值,HW使用固定值,config.txt如下:

[ascend_context]
input_format=NCHW
input_shape=x:[-1,3,736,1280]
dynamic_dims=[1],[4],[8],[16],[32]

在转换动态Batch Size/Image Size模型时,NHW值的选择可以由用户根据经验值设定,也可以从数据集中统计而来。

如果模型转换时需要同时支持动态Batch Size和动态Image Size,可以组合多个不同Batch Size的模型,每个模型使用相同的动态Image Size。

为了简化模型转换流程,我们开发了自动分档工具,可以从数据集中统计选择动态值和模型转换,详细教程请参考模型Shape分档

注意:

如果导出的模型是静态Shape版的,则无法分档,需确保导出动态Shape版的模型。

1.2.2 模型精度模式配置

对于模型推理的精度,需要在转换模型时通过converter_lite设置。

请参考Ascend转换工具功能说明,在配置文件的表格中描述了precision_mode参数的使用方法,可选择enforce_fp16enforce_fp32preferred_fp32enforce_origin等。

故而,可以在上述config.txt[ascend_context]中增加precision_mode参数来设置精度:

[ascend_context]
input_format=NCHW
input_shape=x:[1,3,736,1280]
precision_mode=enforce_fp32

如不设置,默认为enforce_fp16

2. PaddleOCR模型

PaddleOCR模型的推理可以使用MindSpore LiteACL两种后端,分别对应MindSpore Lite MindIR模型和OM模型。

graph LR;
    PaddleOCR训练模型 -- export --> PaddleOCR推理模型 -- paddle2onnx --> ONNX;
    ONNX -- converter_lite --> o2(MindSpore Lite MindIR);
    ONNX -- atc --> o1(OM);

涉及到2种格式的Paddle模型,训练模型和推理模型,区别如下:

模型类型 模型格式 简介
训练模型 .pdparams、.pdopt、.states PaddlePaddle训练模型,可保存的模型的权重、优化器状态等信息
推理模型 inference.pdmodel、inference.pdiparams PaddlePaddle推理模型,可由其训练模型导出得到,保存了模型的结构和参数

下载模型文件并解压,请根据模型格式来区别是训练模型还是推理模型。

2.1 训练模型 -> 推理模型

在PaddleOCR模型的下载链接中,有训练模型和推理模型两种格式,如果提供的是训练模型,则需要将其转换为推理模型的格式。

在每个训练模型的原PaddleOCR介绍页面,一般会有转换脚本样例,只需要传入训练模型的配置文件、模型文件和保存路径即可。 示例如下:

# git clone https://github.com/PaddlePaddle/PaddleOCR.git
# cd PaddleOCR
python tools/export_model.py \
	-c configs/det/det_r50_vd_db.yml \
	-o Global.pretrained_model=./det_r50_vd_db_v2.0_train/best_accuracy  \
	Global.save_inference_dir=./det_db

2.2 推理模型 -> ONNX

安装模型转换工具paddle2onnx:pip install paddle2onnx==0.9.5

详细使用教程请参考Paddle2ONNX模型转化与预测

执行转换命令,生成onnx模型:

paddle2onnx \
    --model_dir det_db \
    --model_filename inference.pdmodel \
    --params_filename inference.pdiparams \
    --save_file det_db.onnx \
    --opset_version 11 \
    --input_shape_dict="{'x':[-1,3,-1,-1]}" \
    --enable_onnx_checker True

参数中input_shape_dict的值,一般可以通过Netron工具打开推理模型查看,或者在上述tools/export_model.py的代码中找到。

2.3 ONNX -> MindIR

使用converter_lite工具可以将ONNX模型转换为MindSpore Lite MindIR模型。工具的详细教程见MindSpore Lite云侧推理离线模型转换

转换命令如下:

converter_lite \
    --saveType=MINDIR \
    --fmk=ONNX \
    --optimize=ascend_oriented \
    --modelFile=det_db.onnx \
    --outputFile=det_db_output \
    --configFile=config.txt

转换流程和MindOCR模型完全相同,仅有区别是--fmk需指定输入是ONNX模型,这里不再赘述。

2.4 ONNX -> OM

使用ATC工具可以将ONNX模型转换为OM模型。

昇腾张量编译器(Ascend Tensor Compiler,简称ATC)是异构计算架构CANN体系下的模型转换工具,它可以将开源框架的网络模型转换为昇腾AI处理器支持的.om格式离线模型,详细教程见ATC模型转换

2.4.1 模型Shape配置

上述示例中导出的ONNX模型输入Shape为(-1, 3,-1,-1)。

  • 静态Shape

可以转换为静态Shape版的模型,NHW都使用固定值,命令如下:

atc --model=det_db.onnx \
	--framework=5 \
	--input_shape="x:1,3,736,1280" \
	--input_format=ND \
	--soc_version=Ascend310P3 \
	--output=det_db_static \
	--log=error

ATC工具通过设置参数 dynamic_dims来支持Shape的分档,可以在模型转换时设置一些可选值,以适应推理时各种Shape大小的输入图像,如下两种选择:

  • 动态Image Size

N使用固定值,HW使用多个可选值,命令如下:

atc --model=det_db.onnx \
	--framework=5 \
	--input_shape="x:1,3,-1,-1" \
	--input_format=ND \
	--dynamic_dims="736,1280;768,1280;896,1280;1024,1280" \
	--soc_version=Ascend310P3 \
	--output=det_db_dynamic_bs \
	--log=error
  • 动态Batch Size

N使用多个可选值,HW使用固定值,命令如下:

atc --model=det_db.onnx \
	--framework=5 \
	--input_shape="x:-1,3,736,1280" \
	--input_format=ND \
	--dynamic_dims="1;4;8;16;32" \
	--soc_version=Ascend310P3 \
	--output=det_db_dynamic_bs \
	--log=error

在转换动态Batch Size/Image Size模型时,NHW值的选择可以由用户根据经验值设定,也可以从数据集中统计而来。

如果模型转换时需要同时支持动态Batch Size和动态Image Size,可以组合多个不同Batch Size的模型,每个模型使用相同的动态Image Size。

为了简化模型转换流程,我们开发了自动分档工具,可以一键式完成动态值选择和模型转换过程,详细教程请参考模型Shape分档

注意:

如果导出的模型是静态Shape版的,则无法分档,需确保导出动态Shape版的模型。

2.4.2 模型精度模式配置

对于模型推理的精度,需要在转换模型时通过ATC设置。

请参考参数precision_mode的说明,可选择force_fp16force_fp32allow_fp32_to_fp16must_keep_origin_dtypeallow_mix_precision等。

故而,可以在上述atc命令中增加precision_mode参数来设置精度:

atc --model=det_db.onnx \
	--framework=5 \
	--input_shape="x:1,3,736,1280" \
	--input_format=ND \
	--precision_mode=force_fp32 \
	--soc_version=Ascend310P3 \
	--output=det_db_static \
	--log=error

如不设置,默认为force_fp16

3. MMOCR模型

MMOCR使用Pytorch,其模型文件一般是pth格式。

需要先把它导出为ONNX格式,再转换为ACL/MindSpore Lite支持的OM/MindIR格式。

graph LR;
    MMOCR_pth -- export -->  ONNX;
    ONNX -- converter_lite --> o2(MindSpore Lite MindIR);
    ONNX -- atc --> o1(OM);

3.1 MMOCR模型 -> ONNX

MMDeploy提供了MMOCR模型导出ONNX的命令,详细教程见如何转换模型

对于参数deploy_cfg需选择目录mmdeploy/configs/mmocr下的*_onnxruntime_dynamic.py文件,从而导出为动态Shape版ONNX模型。

3.2 ONNX -> MindIR

请参考上文PaddleOCR小节的ONNX -> MIndIR

3.3 ONNX -> OM

请参考上文PaddleOCR小节的ONNX -> OM

1
https://gitee.com/zhenling2023/mindocr.git
git@gitee.com:zhenling2023/mindocr.git
zhenling2023
mindocr
mindocr
main

搜索帮助