文章目录
前言
Atlas 200I DK A2基础使用配置方法。准备好键鼠、显示器、网线、USB拓展器。
一、快速开始
下载最新官方Windows版本昇腾开发者套件一键制卡工具:
https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Atlas%20200I%20DK%20A2/DevKit/tools/latest/Ascend-devkit-imager_latest_win-x86_64.exe
登入网页,按步骤完成<快速开始>内容。其中连接外部网络看第二节内容。
https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/23.0.RC1/pd/pd_0001.html
![](https://i-blog.csdnimg.cn/blog_migrate/1fa202bf4274d43c469b8a8593aca134.png)
![](https://i-blog.csdnimg.cn/blog_migrate/79b5e0361b6538c2963d27bf655c7b1e.png)
二、通过路由器联网
网线连接好Atlas的eth0网口
![](https://i-blog.csdnimg.cn/blog_migrate/8957782e39ad2c4038ef1ccd8173550a.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/fc566a58d80734276720125e1ccdaaa2.png)
打开基本设置的WAN设置,连接方式为 自动获取IP地址 。
![](https://i-blog.csdnimg.cn/blog_migrate/4e1069ae3a2a8160638e91a0e232d72a.png)
打开LAN设置的DHCP服务,状态为 启用 。
![](https://i-blog.csdnimg.cn/blog_migrate/0837c5ff3e290b52d1fae93713895a01.png)
![](https://img-blog.csdnimg.cn/5ae159068feb455ab69f1a149c2eb0f7.jpeg)
打开LAN设置的客户端列表,找到对应的MAC地址并复制(2C-52-AF-45-08-5D)
打开LAN设置的静态地址分配,如图新增:
确定后重启板子,打开终端 ,ping 192.168.1.107, 能通即可上网。
![](https://i-blog.csdnimg.cn/blog_migrate/7a4d23644967c766eefe6208e2561aff.png)
四、CANN和Ascend C等名词解释
CANN是AI场景的异构计算架构,对上承接多种AI框架,对下服务AI处理器与编程,是提升昇腾AI处理器计算效率的关键。
Ascend C是CANN针对算子开发场景推出的编程语言,原生支持C和C++标准规范,最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算子开发效率,助力AI开发者低成本完成算子开发和模型调优部署。
CANN 和Ascend C的关系:
在华为昇腾计算架构CANN中,Ascedn C作为其计算语言,具有三大开发模式,分别为:算子开发,模型开发,应用开发。除了计算语言外,CANN还包括了昇腾计算服务层、编译层、执行层、基础层,这些层级可以进一步帮助开发者自定义算子,然后将算子移植到不同的模型里面,使模型在NPU上训练,最后推出神经网路模型或者大型人工智能应用程序。
首先认识什么一个概念:AICore
NPU是华为AI加速卡,而AICore是NPU的计算核心,每个NPU内部有多个AICore,开发者可以将不同的任务分发到AICore上执行。
AICore内部支持三种核心计算:标量、向量、矩阵运算
标量就是简单的两个数进行相加:x+y=z
而向量好比一维矩阵,是两个矢量相加,每个矢量里面可能包含多个数据。
矩阵运算就是二维矩阵,两个二维矩阵之间进行运算
SIMD,翻译为单指令多数据计算,表示一条指令可以处理多个数据,可以进行多个AICore计算。
在Ascend C编程语言中,计算API主要使用向量计算和矩阵运算,且都遵循SIMD样式。
![](https://i-blog.csdnimg.cn/blog_migrate/5a1db2cd4a61d1393806538481320c26.png)
五、USB相机
相机选择了海康USB直插相机。
![](https://i-blog.csdnimg.cn/blog_migrate/9361d03d3d244369e519985e49f79b46.jpeg)
六、CANN环境部署
对应着版本,把每个环境配置都做好:
七、使用模型适配工具生成推理应用
https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/23.0.RC1/Getting%20Started%20with%20Application%20Development/iaqd/iaqd_0001.html
例如:构建目标检测跟踪应用,下载ascend,自己制作一些数据集
![](https://i-blog.csdnimg.cn/blog_migrate/93c2ee139d9d78d8e1cbfd6fc4d8c972.png)
按照推理可以生成 infer_project.tar.gz
八、部署YOLOV5 6.2
克隆代码:
git clone https://github.com/ultralytics/yolov5.git
下载yolov5 6.2预训练模型:
https://link.zhihu.com/?target=https%3A//github.com/ultralytics/yolov5/releases/download/v6.2/yolov5m.pt
1、将pt模型转换为onnx格式并运行
ONNX,全称Open Neural Network Exchange,是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型。ONNX官网:https://onnx.ai/
在下载的yolov5工程源码目录执行命令,注意考虑后面转换om模型时Ascend CANN对onnx算子的支持度,在转换onnx的脚本填写opset参数,
查看CANN的版本方法为:
进入软件包安装信息文件目录。cd /usr/local/Ascend/ascend-toolkit/latest/{arch}-linux
其中/usr/local/Ascend为root用户默认安装路径,用户根据实际安装路径替换。{arch}表示CPU架构(arm64或x86_64),此为我为arrch64-liunx。打开图中文件,看版本。
![](https://img-blog.csdnimg.cn/dd28a5432c5a46f09e69838e2e390169.jpeg)
这里使用Ascend CANN ,所以将opset设置为11。
python export.py --weights yolov5m.pt --include onnx --opset 11 --img 640
2、利用onnxruntime检查onnx模型效果
在下载的yolov5工程源码目录执行命令:
python detect.py --weights yolov5m.onnx
![](https://i-blog.csdnimg.cn/blog_migrate/f68b3cdcce3d8e48b1a856b924010945.jpeg)
九、将onnx转换为om
OM,全称Offline Model,华为Ascend AI处理器支持的离线模型,实现算子调度的优化,权值数据重排、压缩,内存使用优化等可以脱离设备完成的预处理功能。
1、精度性能要求
om模型推理的精度与PyTorch模型相比,精度下降不要不超过1%;
npu单颗芯片吞吐率×4要大于gpu T4吞吐率性能才达标。
2、设置环境变量
export install_path=/usr/local/Ascend/ascend-toolkit/latest
export PATH=/usr/local/python3.7.5/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH
export PYTHONPATH=${install_path}/atc/python/site-packages:$PYTHONPATH
export LD_LIBRARY_PATH=${install_path}/atc/lib64:${install_path}/acllib/lib64:$LD_LIBRARY_PATH
export ASCEND_OPP_PATH=${install_path}/opp
export ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest/
如果直接在命令行中使用的话,环境变量只对当前窗口有效,如果想要始终有效可以直接将环境变量添加到bashrc中去。
vim ~/.bashrc
export install_path=/usr/local/Ascend/ascend-toolkit/latest
export PATH=/usr/local/python3.7.5/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH
export PYTHONPATH=${install_path}/atc/python/site-packages:$PYTHONPATH
export LD_LIBRARY_PATH=${install_path}/atc/lib64:${install_path}/acllib/lib64:$LD_LIBRARY_PATH
export ASCEND_OPP_PATH=${install_path}/opp
export ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest/
source ~/.bashrc
3、使用atc将onnx模型转换为om模型文件
使用ATC(Ascend Tensor Compiler,简称ATC)工具进行模型转换,得到适配昇腾AI处理器的离线模型。教程链接:
https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/23.0.RC1/Appendices/tmuacop/atctool_000003.html
![](https://i-blog.csdnimg.cn/blog_migrate/695fad59242d03f0456c881d5fe5b1ee.png)
具体方法:
Ascend CANN版本为:Ascend cann toolkit 6.2.RC2
通过netron查看onnx模型输入信息和输出信息。
netron官网:https://netron.app/
import netron
path = 'yolov5m.onnx'
netron.start(path)
输入节点名称和尺寸:images,1*3*640*640
输出节点名称和尺寸:output0,1*25200*85
通过Ascend CANN平台提供的ATC命令完成onnx到om转换
atc --model=yolov5m.onnx --framework=5 --input_shape="images:1,3,640,640" --output=./model/yolov5m --soc_version=Ascend310
目前的yolov5s.om模型的效果:
第一张是yolov5m.onnx模型,第二个是yolov5s.om模型:
![](https://i-blog.csdnimg.cn/blog_migrate/f68b3cdcce3d8e48b1a856b924010945.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/6ca5ea8d99624780c2cd9e78d3f589f0.jpeg)
yolov5s.om模型的速度:
![](https://i-blog.csdnimg.cn/blog_migrate/4beead257e9b69c0afaba040a7bfe198.jpeg)
yolov5s.onnx模型的速度:
![](https://i-blog.csdnimg.cn/blog_migrate/aee9538e4ab13ebea28c9f2b12327333.jpeg)
通过npu-smi info watch监控npu占用率。
一个转换成功的OM模型放在我们面前,怎么应用这个模型呢?
三板斧: 首先,确定模型的输入/输出信息;其次,按照输入shape构造模型的输入数据,将输入数据送给模型去推理;最后,根据模型的输出shape 以及输出shape的含义,解析推理结果。
MindStudio工具查看模型网络拓扑结构参考:
https://ascend.huawei.com/doc/Mind%20Studio/2.1.0(beta)/zh/zh-cn_topic_0192773098.html
模型调优?还不会
目前学习链接:https://zhuanlan.zhihu.com/p/393169777
十、MindX SDK应用开发介绍
1、样例介绍,目标检测应用
目标检测模型推理流程如图所示。
本例中使用的是pytorch框架的yolov5模型。可以直接使用训练好的开源模型,也可以基于开源模型的源码进行修改、重新训练,还可以基于算法、框架构建适合的模型。
输入数据:RGB格式图片,分辨率为 640*640,输入形状为(1,3,640,640),即(batchsize,channel,height,width),对应每个batch的图片数量、图片的RGB维度、图片高度、图片宽度。
输出数据:目标检测框的坐标值、置信度、类别。
可以下载样例:
wget https://ascend-devkit-tool.obs.cn-south-1.myhuaweicloud.com/models/yolo_sdk_python_sample.zip
代码目录结构如下所示,按照正常开发流程,需要将框架模型文件转换成昇腾AI处理器支持推理的om格式模型文件,用户可直接获取已转换好的om模型进行推理,也可以自己生成om模型,都可以测试。
yolo_sdk_python_sample
├── main.py # 运行程序的脚本
├── coco_names.txt # coco数据集所有类别名
├── det_utils.py # 模型相关前后处理函数
├── world_cup.jpg # 测试图片
├── model
│ ├── yolov5s_bs1.om # 已有om模型
开发代码过程中,在“yolo_sdk_python_sample/main.py”文件中已包含读入数据、前处理、推理、后处理等功能,串联整个应用代码逻辑,此处仅对代码进行解析。
- 在“main.py”文件的开头有如下代码,用于导入需要的第三方库以及MindX SDK推理所需文件。
import cv2 # 图片处理三方库,用于对图片进行前后处理
import numpy as np # 用于对多维数组进行计算
import torch # 深度学习运算框架,此处主要用来处理数据
from mindx.sdk import Tensor # mxVision 中的 Tensor 数据结构
from mindx.sdk import base # mxVision 推理接口
from det_utils import get_labels_from_txt, letterbox, scale_coords, nms, draw_bbox # 模型前后处理相关函数
- 初始化资源、定义模型相关变量,如图片路径、模型路径、设备id等。
# 初始化资源和变量
base.mx_init() # 初始化 mxVision 资源
DEVICE_ID = 0 # 设备id
model_path = 'model/yolov5s_bs1.om' # 模型路径
image_path = 'world_cup.jpg' # 测试图片路径
- 对输入数据进行前处理。先使用opencv读入图片,再进行相应的图片大小缩放填充、通道转换等处理,并将其转化为mindx sdk推理所需要的数据集格式(Tensor类)。
# 数据前处理
img_bgr = cv2.imread(image_path, cv2.IMREAD_COLOR) # 读入图片
img, scale_ratio, pad_size = letterbox(img_bgr, new_shape=[640, 640]) # 对图像进行缩放与填充,保持长宽比
img = img[:, :, ::-1].transpose(2, 0, 1) # BGR to RGB, HWC to CHW,将形状转换为 channel first
img = np.expand_dims(img, 0).astype(np.float32) # 得到(1, 3, 640, 640),即扩展第一维为 batchsize
img = np.ascontiguousarray(img) / 255.0 # 转换为内存连续存储的数组
img = Tensor(img) # 将numpy转为转为Tensor类
- 使用MindX SDK接口进行模型推理,得到模型输出结果。
# 模型推理, 得到模型输出
model = base.model(modelPath=model_path, deviceId=DEVICE_ID) # 初始化 base.model 类
output = model.infer([img])[0] # 执行推理。输入数据类型:List[base.Tensor], 返回模型推理输出的 List[base.Tensor]
- 对模型输出进行后处理。将 base.tensor类并转换为利于处理的numpy数组,再进行非极大值抑制、缩放图片、画出检测框等步骤(所涉及到的 nms、scale_coords及draw_bbox函数都可参见 det_utils.py ),得到最终可以用于显示的的目标检测结果,最后保存图片文件。
# 后处理
output.to_host() # 将Tensor数据转移到内存
output = np.array(output) # 将数据转为 numpy array 类型
boxout = nms(torch.tensor(output), conf_thres=0.4, iou_thres=0.5) # 利用非极大值抑制处理模型输出,conf_thres 为置信度阈值,iou_thres 为iou阈值
pred_all = boxout[0].numpy() # 转换为numpy数组
scale_coords([640, 640], pred_all[:, :4], img_bgr.shape, ratio_pad=(scale_ratio, pad_size)) # 将推理结果缩放到原始图片大小
labels_dict = get_labels_from_txt('./coco_names.txt') # 得到类别信息,返回序号与类别对应的字典
img_dw = draw_bbox(pred_all, img_bgr, (0, 255, 0), 2, labels_dict) # 画出检测框、类别、概率
# 保存图片到文件
cv2.imwrite('result.png', img_dw)
print('save infer result success')
运行时先配置环境变量
source /usr/local/Ascend/mxVision/set_env.sh
在运行主程序即可。
python main.py
以上代码包括以下几个步骤:
-
前处理:对图片进行 缩放填充,维度转换、连续内存排列、以及转化为base.Tensor操作。
-
推理:利用Model或者base.model 初始化模型,并用infer进行推理。
-
后处理:用 非极大值抑制函数 处理模型输出结果,并将检测框坐标对应到原图上,再将结果画到原图上并保存。
MindX SDK接口分类总结:
base.model(model_path, device_id)为初始化模型
model.infer([img])为通过输入Tensor列表进行模型推理。
用摄像头进行测试代码如下:
# coding=utf-8
import cv2 # 图片处理三方库,用于对图片进行前后处理
import numpy as np # 用于对多维数组进行计算
import torch # 深度学习运算框架,此处主要用来处理数据
from mindx.sdk import Tensor # mxVision 中的 Tensor 数据结构
from mindx.sdk import base # mxVision 推理接口
from det_utils import get_labels_from_txt, letterbox, scale_coords, nms, draw_bbox # 模型前后处理相关函数
# 变量初始化
base.mx_init() # 初始化 mxVision 资源
DEVICE_ID = 0 # 设备id
model_path = 'model/yolov5s_bs1.om' # 模型路径
# image_path = 'world_cup.jpg' # 测试图片路径
# 利用手机ip摄像头
#url = 'rtsp://admin:password@192.168.0.102:8554/live' # 这里需要替换为自己的链接
cap = cv2.VideoCapture(l)
# 获取保存视频相关变量
#fps = 5 # 使用rtsp推流时,不能使用cap.get(cv2.CAP_PROP_FPS)来获取帧率,且由于延迟较高,手动指定帧率,可以根据实际情况调节
fps = video.get(cv2.CV_CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
outfile = 'video_result.mp4'
video_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
video_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
writer = cv2.VideoWriter(outfile, fourcc, fps, (video_width, video_height))
try:
while(cap.isOpened()): # 在摄像头打开的情况下循环执行
ret, frame = cap.read() # 此处 frame 为 bgr 格式图片
# 数据前处理
# img_bgr = cv2.imread(image_path, cv2.IMREAD_COLOR) # 读入图片
# img, scale_ratio, pad_size = letterbox(img_bgr, new_shape=[640, 640]) # 对图像进行缩放与填充,保持长宽比
img, scale_ratio, pad_size = letterbox(frame, new_shape=[640, 640]) # 对图像进行缩放与填充,保持长宽比
img = img[:, :, ::-1].transpose(2, 0, 1) # BGR to RGB, HWC to CHW
img = np.expand_dims(img, 0).astype(np.float32) # 将形状转换为 channel first (1, 3, 640, 640),即扩展第一维为 batchsize
img = np.ascontiguousarray(img) / 255.0 # 转换为内存连续存储的数组
img = Tensor(img) # 将numpy转为转为Tensor类
# 模型推理, 得到模型输出
model = base.model(modelPath=model_path, deviceId=DEVICE_ID) # 初始化 base.model 类
output = model.infer([img])[0] # 执行推理。输入数据类型:List[base.Tensor], 返回模型推理输出的 List[base.Tensor]
# 后处理
output.to_host() # 将 Tensor 数据转移到 Host 侧
output = np.array(output) # 将数据转为 numpy array 类型
boxout = nms(torch.tensor(output), conf_thres=0.4, iou_thres=0.5) # 利用非极大值抑制处理模型输出,conf_thres 为置信度阈值,iou_thres 为iou阈值
pred_all = boxout[0].numpy() # 转换为numpy数组
scale_coords([640, 640], pred_all[:, :4], frame.shape, ratio_pad=(scale_ratio, pad_size)) # 将推理结果缩放到原始图片大小
labels_dict = get_labels_from_txt('./coco_names.txt') # 得到类别信息,返回序号与类别对应的字典
img_dw = draw_bbox(pred_all, frame, (0, 255, 0), 2, labels_dict) # 画出检测框、类别、概率
# 将推理结果写入视频
writer.write(img_dw)
except KeyboardInterrupt:
cap.release()
writer.release()
finally:
cap.release()
writer.release()
# 保存图片到文件
print('save infer result success')
测试结果如视频:
2、MindX SDK应用开发指南
MindX SDK致力于简化基于昇腾AI处理器的推理业务开发过程,降低使用昇腾AI处理器进行AI开发的门槛。
MindX SDK提供接口式的开发方式,类似于OpenCV、Numpy,兼具易用性和性能。提供了基于AscendCL接口封装的高级API接口,并且将一些典型的业务流程(编解码、图像处理等)封装为函数,大大降低了编程难度。基于AscendCL和MindX SDK开发的典型特点如图所示,用户可以根据自己需求或喜好选择学习实践。