本次实验在Mindstudio上开展,本实验对应的 CANN 版本为 5.0.3,请先按照官网教程,配置好 Mindstudio 与其所需依赖。本文使用Mindstudio中的ATC工具,对OSNet的pytorch模型转换成适配昇腾AI处理器的离线模型,并进行精度分析。Mindstudio是一款华为旗下的含算子、模型、开发一体的工具,内部集成了众多开发与推理功能模块,可以使我们更方便的进行开发推理等工作。
一、概述
参考论文:[OSNet 论文](https://arxiv.org/abs/1905.00953) 作为一个实例级的识别问题,行人再识别(ReID)依赖于具有识别能力的特征,它 不仅能捕获不同的空间尺度,还能封装多个尺度的任意组合。这些同构和异构尺度的 特征为全尺度特征。本文设计了一种新颖的深度 CNN,称为全尺度网络(OSNet),用于 ReID 的全尺度特征学习。这是通过设计一个由多个卷积特征流组成的残差块来实现的, 每个残差块检测一定尺度的特征。重要的是,引入了一种新的统一聚合门用输入依赖 的每个通道权重进行动态多尺度特征融合。为了有效地学习空间通道相关性,避免过 拟合,构建块同时使用点卷积和深度卷积。通过逐层叠加这些块,OSNet 非常轻量,可 以在现有的 ReID 基准上从零开始训练。尽管 OSNet 模型很小,但其在 6 个 Reid 数据 集上到达了 SOTA 结果。
二、推理环境准备
1、配置conda环境、安装依赖包
依赖名称 | 版本 |
ONNX | 1.7.0 |
torch | 1.8.1 |
TorchVision | 0.9.1 |
numpy | 1.18.5 |
Pillow | 7.2.0 |
Opencv-python | 4.2.0.34 |
protobuf | 3.13.0 |
onnx-simplifiler | 0.3.6 |
isort | 4.3.21 |
三、执行推理
注:本实验的脚本来源:https://www.hiascend.com/zh/software/modelzoo/detail/1/43a754e306c6461d86dafced5046121f
用户可以下载获取。
3.1创建工程
点击File->New->Project:
进入以下界面:
Name为自己的项目名称,CANN Version为本机Mindstudio所对应的CANN版本,Project Location为项目地址,读者根据自己实际情况进行填写。
选择Pytorch Project,点击Finish完成项目创建。
3.2从开源代码仓获取OSNet源码:
在终端输入代码:
git clone https://github.com/KaiyangZhou/deep-person-reid.git
获取源码,并cd进入文件夹:
cd deep-person-reid/
安装源码所需依赖:
pip install -r requirements.txt
运行setup脚本下载torchreid:
python3.7 setup.py develop
3.3数据预处理
从网上下载数据集压缩包,本文提供百度网盘下载地址:
[Market1501数据集(百度网盘下载,提取码:me3q)](https://pan.baidu.com/s/1Nl8tMEvq-MwNGd1pG4_6bg)
本步骤是为了把输入格式从图片形式转为二进制info文件,用于om模型的输入。
把数据集解压到deep-person-reid文件夹里,随后运行脚本:market1501_torch_preprocess.py,主要过程解释如下:
对bounding_box_test测试集与query数据集进行处理,把原始输入的图片的JPG格式,输出为二进制文件格式—bin文件。
选中所执行脚本,点击鼠标右键,进入Modify Run configuration
对bounding_box_test测试集处理
对query数据集处理
运行框内主要参数解释:
参数名称 | 解释 |
Script path | 从文件夹中选中需要执行的脚本文件 |
Parameters | 脚本运行所需参数,本例中分别为bounding_box_test文件夹相对路径,bin文件存放文件夹gallery_prep_dataset相对路径;对query数据集处理时的参数为query文件夹的相对路径和bin文件存放的文件夹query_pre_data的相对路径 |
Python interpreter | 运行脚本所使用的Python解释器 |
运行成功后:
运行结果显示
接下来执行生成数据集信息脚本,生成数据集信息文件。即分别一步所生成的gallery_prep_dataset文件夹与query_prep_dataset的bin文件转换为数据集信息文件。
对gallery_prep_dataset文件夹处理
对query_prep_dataset文件夹处理
Parameters里的参数为:第一个参数为模型输入的类型,第二个参数为生成的bin文件路径,第三个为输出的info文件,第四、第五个为宽高信息。脚本运行结果生成info文件。
3.4模型转换
本文模型需要做两步转换,即先有path->onnx,再有onnx->om
3.4.1由path转换onnx
本文提供两种方式下载训练好的权重文件如下:
[OSNet训练pth权重文件(google下载)](https://drive.google.com/file/d/1vduhq5DpN2q1g4fYEZfPI17MJeh9qyrA/view?usp=sharing)
[OSNet训练pth权重文件(百度网盘下载,提取码:gcfe)](https://pan.baidu.com/s/1Xkwa9TCZss_ygkC8obsEMg)
此步由pytorch完成转换,执行转换脚本:pth2onnx.py
Paremeters内填入参数分别为参数文件名与生成的onnx模型文件名:
osnet_x1_0_market_256x128_amsgrad_ep150_stp60_lr0.0015_b64_fb10_softmax_labelsmooth_flip.pth osnet_x1_0.onnx
得到onnx模型文件后,在终端输入:
python3.7 -m onnxsim osnet_x1_0.onnx osnet_x1_0_bs1_sim.onnx –input-shape 1,3,256,128
利用之前安装的依赖onnx-simplify对onnx模型进行简化,生成batch_size=1的静态模型:onnxsim osnet_x1_0.onnx。
3.4.2onnx转换om
此步转换使用Mindstudio提供的ATC转换工具,ATC工具功能架构如下图所示:
用户可以将开源框架网络模型如本文的OSNet模型,通过ATC工具转换为适配昇腾AI处理器的离线模型也可以将开源框架网络模型转换后的离线模型转成json文件,方便文件查看。
点击导栏行的Ascend->Model Converter;或者点击Mindstudio的功能栏:
进入以下界面:
在Model File中选中需要转换的onnx模型,Model Name为模型名称,Target SoC Version为需要转换成适配的芯片类型,image为输入图片的batch_size。点击图中红框的图标,可以生成可视化模型流程框架:
用户可以在此了解每层的结构与参数。
点击ok,next,即可进行模型转换:
点击Finish完成模型转换,红框里分别是om模型存放的服务器地址与本地地址。
3.5执行离线推理
推理benchmark工具用来针对指定的推理模型运行推理程序,并能够测试推理模型的性能(包括吞吐率、时延)和精度指标。benchmark的安装包可以通过benchmark工具用户指南获取。benchmark工具有两个使用场景,分别是:
纯推理场景 | 该场景仅用来测试推理模型的性能指标,即模型执行的平均时间和平均吞吐率。 该场景无需准备推理数据及数据集文件,只需要准备经过ATC转换后的模型文件即可推理。 |
推理场景 | 该场景除了测试性能指标之外,还可以测试模型的精度指标。 该场景需要准备经过预处理的推理数据及数据集文件和经过ATC转换后的模型文件才能推理 |
本文所使用的场景是推理场景,即利用上文所处理的info数据以及转换的om模型进行推理:
在终端输入命令:
a. 设置环境变量:
source /usr/local/Ascend/ascend-toolkit/set_env.sh
b. 增加benchmark.{arch}可执行权限:
chmod u+x benchmark.x86_64
c. 执行离线推理:
#对query_prep_bin.info进行处理
./benchmark.x86_64 -model_type=vision -device_id=0 -batch_size=1 -om_path=osnet_x1_0_bs1.om -input_text_path=./query_prep_bin.info -input_width=128 -input_height=256 -output_binary=False -useDvpp=False
主要参数解释如下:
- -model:为ONNX模型文件。
- -framework:5代表ONNX模型。
- -output:输出的OM模型。
- -input_format:输入数据的格式。
- -input_shape:输入数据的shape。
- -log:日志级别。
- -soc_version:处理器型号。
执行成功后:
3.6精度验证
执行osnet_metrics_market1501_bs1.py脚本:
Parameters参数填入:result/dumpOutput_device0/ result/dumpOutput_device1/ ./ result_bs1.json,运行脚本执行精度验证,结果如下所示:
OSNet开源代码仓精度(https://kaiyangzhou.github.io/deep-person-reid/MODEL_ZOO)
osnet_x1_0 R1=94.2%,mAP=82.6%
本次实验所得代码精度:R1=94.3,mAP=82.5
R1比代码仓结果略高,mAP下降在1%范围之内,故精度达标。
F&Q
1. 在数据预处理时,执行market1501_torch_preprocess.py脚本时会出现如下错误:
原因是把脚本文件置于数据集文件夹中,把脚本文件转移到deep-person-reid文件夹下即可。
2. 在执行精度验证脚本osnet_x1_0_metrics_market1501.py时会出现如下错误
原因是没有进行环境变量的配置,在终端输入代码:
source env.sh
即可。
在项目上有其它问题的也可以登录昇腾论坛,在帖子里提出自己关于项目或者Mindstudio的疑文(https://www.huaweicloud.com/s/JU1pbmRTdHVkaW_mkK3lu7ol/t_60_p_1),会有华为内部技术人员对其进行解答,帮助你更好使用MindStudio。