基于MindStudio 的YOLACT推理开发项目
——MindX SDK边缘开发
目录
BILIBILI视频链接:YOLACT边缘套件开发经验分享_哔哩哔哩_bilibili
1.MindStudio介绍
MindStudio是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,该IDE上功能很多,涵盖面广,可以进行包括网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任务。MindStudio除了具有工程管理、编译、调试、运行等一般普通功能外,还能进行性能分析,算子比对,可以有效提高工作人员的开发效率。除此之外,MindStudio具有远端环境,运行任务在远端实现,对于近端的个人设备的要求不高,用户交互体验很好,可以让我们随时随地进行使用。
2.模型介绍
YOLACT是2019年发表在ICCV上面的一个实时实例分割的模型,它主要是通过两个并行的子网络来实现实例分割的。(1)Prediction Head分支生成各个anchor的类别置信度、位置回归参数以及mask的掩码系数;(2)Protonet分支生成一组原型mask。然后将原型mask和mask的掩码系数相乘,从而得到图片中每一个目标物体的mask。论文中还提出了一个新的NMS算法叫Fast-NMS,和传统的NMS算法相比只有轻微的精度损失,但是却大大提升了分割的速度。
3.环境搭建
3.1开发环境安装
Windows版本MindStudio。按照官方安装步骤进行Windows平台MindStudio环境配置。
[参考链接](昇腾社区-官网丨昇腾万里 让智能无所不及)
在下载界面中选择软件包下载,根据系统和习惯选择相应包进行下载。
如果下载的.exe文件,下载后进行安装。
3.2远端环境配置
3.2.1 安装CANN
CANN(Compute Architecture for Neural Networks)是华为公司针对AI场景推出的异构计算架构,通过提供多层次的编程接口,支持用户快速构建基于昇腾平台的AI应用和业务。
首先下载CANN安装包,选择并下载平台开发套件软件包。
[参考链接](昇腾社区-官网丨昇腾万里 让智能无所不及)
下载完成后按照如下步骤进行安装,详细说明参考昇腾社区。
[参考链接]
- 以软件包的安装用户登录安装环境。
若安装依赖中安装依赖的用户为root用户,则软件包的安装用户可自行指定;若安装依赖中安装依赖的用户为非root用户,请确保软件包的安装用户与该用户保持一致。
- 将获取到的开发套件包上传到安装环境任意路径(如“/home/package”)。
- 进入软件包所在路径。
- 增加对软件包的可执行权限。
chmod +x 软件包名.run
软件包名.run表示开发套件包Ascend-cann-toolkit_{version}_linux-{arch}.run,请根据实际包名进行替换。
- 执行如下命令校验软件包安装文件的一致性和完整性。
./软件包名.run --check
- 执行以下命令安装软件(以下命令支持--install-path=<path>等参数,具体参数说明请参见参数说明)。
./软件包名.run –install
CANN软件提供进程级环境变量设置脚本,供用户在进程中引用,以自动完成环境变量设置。用户进程结束后自动失效。示例如下(以root用户默认安装路径为例):
. /usr/local/Ascend/ascend-toolkit/set_env.sh
用户也可以通过修改~/.bashrc文件方式设置永久环境变量,操作如下:
- 以运行用户在任意目录下执行vi ~/.bashrc命令,打开.bashrc文件,在文件最后一行后面添加上述内容。
- 执行:wq!命令保存文件并退出。
- 执行source ~/.bashrc命令使其立即生效。
3.3创建项目
3.3.1新建项目
点击New Project。
选择Ascend App,配置好项目名称,如果没有同步CANN,请点击Change按钮。
第一次使用需要配置远端服务器,点击+号进行配置。
输入远程服务器信息,测试连接成功后点击OK。
回到Remote CANN Setting界面,在Remote CANN location行右边选择CANN位置。
选择CANN所在位置
选择后点击finish
等待同步文件
同步完成后点击Next,继续创建工程
选择MindX SDK project(Python),然后点击finish。
3.3.2配置Deployment
点击Tools->Deployment,选择Configuration。
可以在Deployment中点击+号,输入名字添加。
然后再Connection中点击SSH configuration右边的…,添加服务器。
完成后可以在Connection中看到已经成功添加服务器,并可以通过Test Connection测试连接是否成功。
点击Mappings,在Deployment Path下方的路径选择,选择远程代码路径。
右侧Excluded Path可以选择不拉取的文件,比如不需要把数据集拉取到本地,就选择Mappings路径中的无需拉取的文件。
右击Project,选择Deployment,选择Download from,选择刚才所设置的源,等待代码拉取。
3.3.3配置远端解释器
点击File->Project Structrue ->SDK 配置python SDK。
点击加号添加Python SDK。
选择SSH Interpreter,选择deployment,Interpreter和Name会自动填充,如果需要自定远端Python版本,则点击Interpreter后面的按钮(如下图所示),打开远端目录,选择需要的Python
点击Project,如图所示,选择刚刚配置好的远端SDK,点击OK使配置生效。
3.3.4配置MindX SDK
打开MindStudio,在File中选择File > Settings > Appearance & Behavior > System Settings > MindX SDK,进入MindX SDK管理页面,点击Install进入远程配置界面。在配置前,请确保远端环境已经配置好MindX SDK和CANN Toolkits。
- 在Remote Connection一栏配置远程连接,输入申请的账号密码等相关信息。
- 在Remote CANN Location 一栏选择远端安装CANN Toolkits的路径,具体到版本,这里选择的是5.0.4版本。
- 在Remote SDK Location 一栏选择远端安装MindSDK的路径,这里选择的时Mxvision 2.0.4 版本。
- Local SDK location为本地默认的xSDK安装位置,会将远端的SDK同步过来。
点击ok后开始同步,配置完成后,如果界面如下图所示,则表示成功。
4. 本地Git clone代码
点击最下方的Terminal,打开本地终端。
可以看到左下角已经打开本地终端。
复制Github代码链接:https://github.com/bubbliiiing/yolact-pytorch.git, 在本地终端输入git clone https://github.com/bubbliiiing/yolact-pytorch.git并运行。
5. 项目开发
5.1onnx转om离线模型转换
我使用的是Pytorch模型,他的权重是一个pth文件,而Mind SDK里面支持的是om模型,所以我们需要进行一个转换。首先我们要把我们的pth文件转换成onnx文件,然后再转换成om模型。
5.2.1 pth转换成onnx
pth转换成onnx模型首先就是要加载权重,然后用权重来初始化自己的模型,随后调用torch自带的转onnx函数就可以完成模型的转换。代码仓库链接如下:
GitHub - bubbliiiing/yolact-pytorch: 这是一个yolact-pytorch的库,可用于训练自己的数据集
pth模型我们直接下载,链接如下:
https://github.com/bubbliiiing/yolact-pytorch/releases/download/v1.0/yolact_weights_coco.pth
在om转onnx时,需要将predict.py中21行代码改为mode = "export_onnx",然后运行python3 predict.py就可以得到onnx模型。
5.2.2 onnx转om模型
选择Ascend->Model Converter
在Model File中选择需要转换的onnx模型路径,选择后会自动分析模型,分析后得到如下。
这里软件自动解析模型,将模型的输入形状填写到了Shape下,在Type下也自动填写了精度类型。具体ACT模型转换时所有可以用到的参数,可以在此链接中详细查询https://www.hiascend.com/document/detail/zh/mindstudio/50RC3/msug/msug_000394.html。
点击Select选择输出结点。
找到模型的所有输出节点,右击后选择select
选择所有输出结点后点击OK,返回界面后点击Next
由于本模型中未使用AIPP,继续点击Next。
这一步无需修改,点击Finish。
可以看到ATC工具开始运行转换模型。
模型转换成功后得到如下输出
5.2pipeline编写
绘制整个流程的流程图,画出流程图如下。
图像读取步骤中我选择使用cv2完成。据流程图编写完整的pipeline,创建yolact.pipline文件,打开后进行插件编排。
首先选择输入插件,我选择使用appsrc插件,将其拖出来。
之后使用推理插件mxpi_tensorinfer0,两者之间拖动连线连接起来。
点击mxpi_tensorinfer0插件,在modelPath中选择推理使用的om模型路径,如何转换得到om模型会在下文讲到。
以此类推,完成所有插件编排后结果如下。
点击Text,可以看到想要插件流程的代码。
5.3main函数编写
创建流:若创建失败则退出。
运用StreamManagerApi 读取pipeline。
载入图片,进行推理。
对推理结果进行后处理。
推理结果保存并计算精度
至此主函数编写完毕,命名为main.py,放到主目录下。
6. 运行推理
放入一张生活场景的图片,点击Run下的Edit Configuration
Deployment选择我们所在服务器,Executable选择执行文件,即main.py,Command Arguments中可以输入我们想要输入的参数。比如我们在执行图像可视化时,就输入—image=”street.jpg”。
点击OK完成设置,然后点击工具类的三角形图标,开始运行。
可以看到文件夹中已经生成了img.jpg输出结果。
可视化结果图像如下。
7. 精度测评
基于coco数据集进行精度测评,coco数据集放置目录结构如下。
├── data
│ ├── coco_test
│ │ ├── annotations
│ │ ├── images
├── convert
│ └── -----
├── model_data
│ └── -----
├── utils
│ └── -----
├── images
│ └── -----
├── main.py
├── README.md
执行精度评估,同理在Run下的Edit Configuration中配置运行设置。
配置如下,设置main.py为执行文件,不需要添加任何参数。点击OK完成配置并点击运行。
运行精度结果如下
得到精度结果如下:
精度指标 | 精度 |
bbox mAP 0.5:0.95 | 30.4% |
bbox mAP 0.5 | 52.0% |
segm mAP 0.5:0.95 | 27.3% |
segm mAP 0.5 | 47.7% |
对比原代码仓库的精度如下:
可见精度结果对比完全一致。