【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署

【Atlas 200DK】YOLOv3和YOLOv5部署

  • 数据集介绍
  • 开发板环境搭建
  • YOLOv3的部署
    • 模型训练转换
    • 服务器上的结果
    • 开发板上的结果
      • python部署
      • c++部署
  • YOLOv5的部署
    • 模型训练转换
    • 服务器上的结果
    • 开发板上的结果
      • python部署
      • c++部署
  • 遇到的问题

数据集介绍

无论什么数据集开发版移植的流程是差不多的,我们使用的数据集是NWPU VHR-10 Dataset,这是由西工大标注的航天遥感目标检测数据集,该数据集有650张包含目标的图像和150张背景图像,共计800张,目标种类包括飞机、船舰、油罐、棒球场、网球场、篮球场、田径场、港口、桥梁和汽车一共10个类别,为了满足项目要求,将四个篮球场归为一类,所以本项目实际类别有7个类别。我们进行数据增强扩充后总共有2130张,训练集有1420张,下面统计了每一个类别的个数:

类别 飞机 船只 油库 操场 港口 桥梁 车辆
数量 3378 930 718 2418 798 374 2254

开发板环境搭建

我们所使用的版本是C73,这个版本是和20.1.rc1兼容的,华为推出了1.3.0.0、1.32.0.0、20.0.RC1、20.1.rc1四个版本。20.1.rc1版本是华为基于全新架构打造的最新版本,更易于开发者阅读、了解、开发属于自己的AI代码。按照以下链接可以完成环境的搭建:
环境搭建教程

YOLOv3的部署

模型训练转换

YOLOv3 source code
因为目前开发板只支持caffe和tensorflow训练的模型的转换,所以我先选用yolov3先训练了一个基础模型并且进行部署和测试。将训练好的模型用freeze_graph.py转换成.pb文件,再利用mindstudio将.pb(大概有246.6MB)转成.om(124.2MB)模型,没有经过量化。(界面中Tools下面Model Converter进行模型转换)

可参考mindstudio官方手册

转换参数设置
【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第1张图片
【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第2张图片
这里的R是255的倒数,通过这些步骤可以将图片自己归一化。

服务器上的结果

显卡型号:Nvidia GTX 1080 ti
cuda版本:9.0
(测试参数设置使用的都是默认的,比如score阈值是0.3,IoU阈值是0.45)
【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第3张图片

开发板上的结果

部署到开发板上的过程,前期图方便为完成任务主要用python部署,但是很慢很慢离实时还差得远,之后只能用c++部署,其实从一开始就应该用c++部署的,官方给提供了c++示例代码(但是是基于caffe训练的模型),应该先把流程过一遍先明白开发的顺序是怎样的。整个过程遇到了很多困难但也学到了很多,但回顾总体过程,其实在部署的过程中需要完善的代码主要就是前处理和后处理部分,模型推理部分直接可以用芯片的acl接口完成。用python和c++写的代码都放在了我的github上,欢迎给个star✨,谢谢。

python部署

python部署是真的慢,先上速度的结果。10帧每秒图片大小为1024x768左右
【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第4张图片
上精度。总AP有所提高,说是转成的om模型对算子有一定的优化作用。
【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第5张图片

c++部署

上速度,65帧每秒,依然是图片大小为1024x768左右。
【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第6张图片
上精度(测精度时图方便我还是用的是python的脚本,把c++处理好的结果存成.txt,我已经写好了会自动生成。然后将这些txt文件放到python那个代码里,用mAP/main.py来计算精度。)

  1. 先登录到板子上
  2. 然后进入~/HIAI_PROJECTS/workspace_mind_studio这个目录
  3. 里面有个文件,再进去,txt文件就在out文件夹下面
  4. 把这些txt文件移到python那个mAP/predicted目录下
  5. 在mAP/下运行python3 main.py就可以得到结果
    【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第7张图片
    部署代码链接

YOLOv5的部署

模型训练转换

YOLOv5 source code
项目选用的是YOLOv5s,分支选择的是v2.0,因为该分支训练的模型已经满足我们的精度要求。

  • 噩梦的开始:pytorch->onnx->tensorflow->om

为了确保转模型成功,主要修改3点:

  1. 因为开发板不支持focus操作,所以在训练的时候,将focus操作写在数据处理里面(如果不想掉精度,就不要直接用卷积去替换)。
    【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第8张图片
  2. 固定上采样参数
    yolov5.yaml中将nn.upsample的参数写死成上采样后的大小;
    yolo.py中,构建模块的时候要对nn.upsample单独处理一下;
    【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第9张图片
  3. 修改detect层,将解码的部分放在后处理。
    【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第10张图片

服务器上的结果

【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第11张图片
损失函数改成focal loss精度的确会有所低。

开发板上的结果

python部署

  • 精度
    【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第12张图片
  • 速度
    【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第13张图片
    YOLOv5s的模型要经过pytorch->onnx->tensorflow->om的转换,转换过程可能会出现不必要的算子,导致执行效率和v3相比较低。

c++部署

  • 精度
    【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第14张图片
  • 速度
    【深度学习】【Atlas 200DK】YOLOv3和YOLOv5部署_第15张图片
    感觉很奇怪,前后处理反而变得更慢了,前处理我主要用opencv来实现focus,具体效率差异还有待研究。

部署代码链接

遇到的问题

  • 用Mindstudio进行编译的时候,有libascendcl.so: cannot open shared object file的错误。
    解决方法:
  1. 使用Mind Studio的安装用户(比如为ascend), 登录到设备
    ssh [email protected]
    密码默认为Mind@123

  2. 输入ps -ef | grep ada,会显示两个进程
    在这里插入图片描述

  3. kill掉/var/ada的进程

  4. cd /var 然后输入./ada &重启ada服务

你可能感兴趣的:(深度学习,深度学习)