MindStudio提供了基于华为自研昇腾AI处理器开发所需的一站式开发环境,能够在此工具上高效便捷地完成AI应用开发。本文使用MindStudio的模型转换工具将开源框架Pytorch下的AdvancedEAST网络模型转换成昇腾AI处理器支持的离线模型并进行离线推理。
AdvancedEAST是一种用于场景图像文本检测的算法,它主要基于EAST: An Efficient and Accurate Scene Text Detector,并进行了重大改进,使长文本预测更加准确。
1.参考论文:
Xinyu Zhou, Cong Yao, He Wen, Yuzhi Wang, Shuchang Zhou, Weiran He, Jiajun Liang. EAST: An Efficient and Accurate Scene Text Detector. (2017)
2.参考实现:
url=https://github.com/BaoWentz/AdvancedEAST-PyTorch
branch=master
commit_id=a835c8cedce4ada1bc9580754245183d9f4aaa17
3.适配昇腾 AI 处理器的实现:
url=https://gitee.com/ascend/ModelZoo-PyTorch
tag=v.0.4.0
code_path=ACL_PyTorch/contrib/cv/detection
4.输入输出数据
输入数据 | 大小 | 数据类型 | 数据排布格式 |
input | batchsize x 3 x 736 x 736 | RGB_FP32 | NCHW |
输出数据 | 大小 | 数据类型 | 数据排布格式 |
output_1 | batchsize x 7 x 184 x 184 | FP32 | ND |
1.运行环境:
系统:Ubuntu 18.04.5 LTS
处理器:Ascend 710
2.开发环境:
MindStudio:5.0.RC1
Ascend-cann-toolkit:5.1.RC1
官方安装指南:
https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg
3. Python环境
在Anaconda下创建Python虚拟环境,激活环境并安装必要的依赖:
conda create -n zdf python=3.7
conda activate zdf
pip3 install xxx
依赖名称 | 版本 |
onnx | 1.7.0 |
Torch | 1.8.0 |
TorchVision | 0.9.0 |
numpy | 1.20.3 |
Pillow | 8.2.0 |
opencv-python | 4.5.2.54 |
shapely | 1.7.1 |
1.获取推理源码
从以下链接获取推理所需源码,单击“立即下载”,下载源码包。https://www.hiascend.com/zh/software/modelzoo/detail/1/18c7bf3cafac447e849e53e88e2044f9。上传源码包到服务器任意目录并解压(如:/home/zdf)。解压后推理源码目录为:/home/zdf/AdvancedEAST
2.获取开源模型源码
git clone https://github.com/BaoWentz/AdvancedEAST-PyTorch -b master
cd AdvancedEAST-PyTorch
git reset a835c8cedce4ada1bc9580754245183d9f4aaa17 --hard
cd ..
把*.py文件拷贝至推理源码目录辅助推理。
3.获取原始数据集
[天池ICPR数据集](https://pan.baidu.com/s/1NSyc-cHKV3IwDo6qojIrKA ),提取码: ye9y
本模型使用天池ICPR数据集中的1000张图片作为验证集。下载ICPR_text_train_part2_20180313.zip和ICPR_text_train_part1_20180316.zip两个压缩包,在推理源码目录新建目录icpr和子目录icpr/image_10000、icpr/txt_10000,将压缩包中image_9000、image_1000中的图片文件解压至image_10000中,将压缩包中txt_9000、txt_1000中的标签文件解压至txt_10000中。
1. 打开 MindStudio, 选择 File -> New -> Project,新建Ascend App项目
2.数据预处理
执行AdvancedEAST_preprocess.py脚本对数据集进行预处理,包括图片缩放、标签转换为npy文件和图片转换为bin文件。
Command Arguments中:第一个参数为数据集的路径,第二个参数为生成bin文件的路径。
3.生成数据集info文件
使用benchmark推理需要输入图片数据集的info文件,用于获取数据集。执行gen_dataset_info脚本,输入已经获得的图片文件,输出生成图片数据集的info文件。
Command Arguments中:第一个参数为生成的数据集文件格式,第二个参数为预处理后的bin文件的路径,第三个参数为生成的数据集文件保存的路径,第四第五个参数为图片的宽和高。运行成功后,在当前目录中生成prep_bin.info。
4.模型转换
使用PyTorch将模型权重文件.pth转换为.onnx文件,再使用ATC工具将.onnx文件转为离线推理模型文件.om文件。
a. 获取权重文件。
从源码包中获取权重文件3T736_best_mF1_score.pth。
或 (https://pan.baidu.com/s/1NSyc-cHKV3IwDo6qojIrKA ),提取码: ye9y。解压后使用3T736_best_mF1_score.pth,文件sha1: 9D0C603C4AA4E955FEA04925F3E01E793FEF4045
b. 导出onnx文件。
执行AdvancedEAST_pth2onnx.py脚本,获得AdvancedEAST_dybs.onnx文件。
Command Arguments中:第一个参数为PyTorch模型的.pth权重文件的路径,第二个参数为生成.onnx文件的路径。
c. 使用MindStudio中的ATC工具将ONNX模型转为 OM模型。如下图所示,点击菜单栏Ascend->Model Converter 调用出模型转换界面。
在“Model Information” 页签中上传模型文件和权重文件后点击 Next 按钮,Data Processing 页面直接点击 Next,Model Converter中Command Preview 里的命令与在命令行运行atc 命令几乎相同,点击 Finish开始转换。
Model Information 界面参数配置如下表所示:
参数 | 说明 |
CANN Machine(仅Windows系统支持此参数) | 自动填充。远程连接ADK所在环境的 SSH 地址,格式为 |
-Model File | 模型文件。必填。该模型文件需要取消其他用户写的权限。 有两种选择方式: 1. 单击右侧的文件夹图标,在后台服务器路径选择需要转化的模型文件并上传。 2. 在参数后面的输入框中自行输入模型文件在后台服务器的路径,包括模型文件名称 |
-Weight File | 权重文件。当原始框架是 Caffe 时,该参数存在且必填: 1. 如果模型文件和权重文件存在于后台服务器同一目录下,且名称和模型文件名称相同,则选择模型文件后,权重文件会自动填充。 2. 如果模型文件和权重文件存在于后台服务器不同目录下,或者在同一目录下,但名称和模型文件名称不相同。 |
-Model Name | 模型文件名称,必填。选择模型文件后,该参数会自动填充,用户可以根据需要自行修改名称,要求如下: 1. 只支持 a-z、A-Z、0-9、下划线以及短划线的组合,最多支持 64 个字符。 2. 如果模型转换的输出路径已经存在相同名称模型文件,单击“Next”后会提示覆盖原有文件或重命名当前 Model Name 的信息,用户根据实际情况选择。 |
-Target SoC Version | 模型转换时指定芯片型号。请根据板端环境具体芯片形态进行选择。 |
-Input Format | 输入数据格式。 1. 当原始框架是 Caffe 时,取值为 NCHW、ND(表示支持任意格式,N<=4),默认为 NCHW。 2. 当原始框架是 MindSpore、ONNX 时,取值为 NCHW。 3. 当原始框架是 TensorFlow 时,取值为 NCHW、NHWC、ND、NCDHW、NDHWC,默认为 NHWC。 |
-Input Nodes | 模型输入节点信息。 1. 如果选择模型文件并且解析成功,则该参数下方会展示模型输入节点的 shape 信息以及 Type 信息。 2. 如果选择模型文件后,无法解析“Input Nodes”,该场景下,需要用户根据模型文件中的相关信息手动输入:单击该参数右侧的,在弹出界面中输入模型输入节点的 Name、Shape 信息(只支持英文逗号,数字(-1 或大于 0 的整数),不能以英文逗号开头,只能以数字结尾)和输入节点的数据类型 Type。单击删除节点信息。 3. 如果模型有多个输入,解析成功后,“Input Nodes”参数下方会展示每一个输入节点的 Shape 信息和 Type 信息。 |
-Shape | 模型输入的 shape 信息,N(模型一次处理的图片个数),C(Channel,例如彩色 RGB 图像的 Channel数为 3),H(Height),W(Width)。若开启 AIPP 功能,则此处的 H,W取值即为 AIPP 输出数据的高和宽。 |
-Type | Type:指定输入节点的数据类型。 1. 若原始框架类型为 Caffe、ONNX,支持的数据类型为 FP32、FP16、UINT8。 2. 若原始框架类型为 MindSpore,支持的数据类型为 FP32、UINT8。 3. 若原始框架类型为 TensorFlow,支持的输入数据类型为 FP32、FP16、UINT8、Int32、Int64、Bool。 |
-Output Nodes | 指定输出节点信息。 单击“Select”在弹出的网络拓扑结构中,选中某层节点,右击选择“Select”,该层变成蓝色,单击“OK”后,在“Output Nodes”参数下面会看到标记层的算子,右击选择“Deselect”取消选中。 1. Op Name:标记层的算子名称。 2. Data Type:算子输出的数据类型,包括 FP32、UINT8、FP16,通过该参数用户可以设置单个算子的输出数据类型。“Output Nodes”参数下方“Select”层的算子,默认为全部选中,用户可以自行选择将不需要输出的算子去勾选,只有选中的算子才会作为模型的输出。 某些情况下,用户想要查看某层算子参数是否合适,则需要将该层算子的参数输出,即可以通过单击“Select”按钮,在弹出网络拓扑结构中将所需层的算子标记为“Select”,然后在“Output Nodes”参数下方选中想要输出的算子,模型转换后,在相应.om 模型文件可以看到该算子的输出直接作为模型的输出。 |
-Load Configuration | 导入上次模型转换的配置文件。 如果用户之前转换过模型,无论成功与否,在$HOME/modelzoo/${Model Name}/device/路径都会生成${Model Name}_config.json 配置文件,该文件 记录用户模型转换时所选择的配置信息,包括所用模型路径、模型名称、输入输出配置,数据预处理配置等,下次重新转换模型时,通过单击“Load Configuration”选择相应路径下的配置文件,则相应的配置信息会自动填充,用户自行决定是否沿用上次配置还是修改配置后重新进行模型转换。 |
模型转换成功后会提示:Model converted successfully.如上图所示。
5. 开始推理
a. 获取Benchmark工具。
从源码包中获取Benchmark工具。
或(https://support.huawei.com/enterprise/zh/ascend-computing/cann-pid-251168373/software/) 将benchmark.x86_64或benchmark.aarch64放到当前目录。
b. 启动ssh session,切换python环境、当前工作目录、增加benchmark.{arch}可执行权限
c. 推理
Benchmark工具运行参数说明:
参数 | 说明 |
-model_type | 模型的类型。 |
-batch_size | 执行一次模型推理所处理的数据量。 |
-device_id | 运行的Device编号。 |
-om_path | 经过ATC转换后的模型OM文件所在的路径。 |
-input_text_path | 模型对应的数据集所在的路径。 |
-input_width | 输入模型的宽度。 |
-input_height | 输入模型的高度。 |
-useDvpp | 模型前处理是否使用DVPP编解码模块。 |
-output_binary | 输出结果格式是否为二进制文件(即bin文件)。 |
更多参数具体说明见:https://support.huawei.com/enterprise/zh/doc/EDOC1100191895/4de572a8 推理后的输出默认在当前目录result下。
运行结果参数说明:
参数 | 说明 | |
[e2e] | -throughputRate | 端到端总吞吐率。公式为 sample 个数/时间。 |
-latency | 端到端时延,即从处理第一个 sample 到最后一个sample 的完成时间。 | |
[data read] [preprocess] [post] | -throughputRate | 当前模块的吞吐率。 |
-moduleLatency | 执行一次当前模块的时延。 | |
[infer] | -throughputRate | 推理模块整体吞吐率,包含线程启动、数据等待、实际推理等时间。 |
-moduleLatency | 推理模块的平均时延。公式为执行一次推理的时间/batch size,其中执行一次推理的时间包含了内存申请、内存拷贝以及推理等时间。 | |
-Interface throughputRate | aclmdlExecute 接口的吞吐率。公式为 sample 个数/aclmdlExecute 接口的平均执行时间。 |
d.精度验证
执行AdvancedEAST_postprocess.py脚本对推理结果进行后处理,获得精度数据。
Command Arguments中:第一个参数为数据集路径,第二个参数为推理结果所在路径。
├── benchmark.aarch64 //离线推理工具(适用ARM架构)
├── benchmark.x86_64 //离线推理工具(适用x86架构)
├── AdvancedEAST_dybs.om //batchsize=1的om模型文件
├── AdvancedEAST_dybs.onnx //onnx模型文件
├── 3T736_best_mF1_score.pth //训练后的权重文件
├── AdvancedEAST_postprocess.py // 后处理文件,用于计算精度
├── AdvancedEAST_preprocess.py // 前处理文件,用于处理数据集和生成bin文件
├── AdvancedEAST_pth2onnx.py // 用于转换pth文件到onnx文件
├── LICENSE // LICENSE文件
├── README.md // 模型离线推理说明README
├── gen_dataset_info.py // 生成数据集info文件
├── requirements.txt // 模型离线推理用到的所有且必要的依赖库
├── cfg.py //配置文件 控制参数
├── preprocess.py //预处理数据 调整图像大小
├── imgs2LMDB.py //生成LMDB数据集
├── label.py //生成标签信息
├── model_VGG.py //定义网络
├── losses.py //定义损失函数
├── train.py //执行训练
├── dataset.py //读LMDB数据集
├── predict.py //预测
├── nms.py //预测
├── utils.py //评估模型
├── icpr //数据集目录
├── prep_dataset //bin文件目录
├── result //推理结果目录
└── test
├── pth2om.sh // pth文件转换到onnx文件和om文件的脚本
├── eval_acc_perf.sh // 测评推理精度和性能的脚本
└── parse.py // 解析结果的脚本
Q:执行AdvancedEAST_preprocess.py脚本对数据集进行预处理时提示找不到tqdm模块。
A:执行pip3 install tqdm,安装完成后再运行以上脚本。
Q:模型推理时出现输入数据大小和模型输入大小不一致的错误。
A:模型转换时,在“Model Information” 页签上数据类型默认是FP16,应选择FP32。
留言与评论(共有 0 条评论) “” |