华为Atlas 200I DK A2开发者套件--基础使用配置


前言

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

二、通过路由器联网

网线连接好Atlas的eth0网口

打开网址 192.168.1.1 ,进入路由器设置界面,自己注册一个账号登入。
刚进入页面弹出的设置可直接跳过。

打开基本设置的WAN设置,连接方式为 自动获取IP地址 。

打开LAN设置的DHCP服务,状态为 启用 。

如下图,找到本机的MAC地址

打开LAN设置的客户端列表,找到对应的MAC地址并复制(2C-52-AF-45-08-5D)
在这里插入图片描述

打开LAN设置的静态地址分配,如图新增:
在这里插入图片描述确定后重启板子,打开终端 ,ping 192.168.1.107, 能通即可上网。

四、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样式。

五、USB相机

相机选择了海康USB直插相机。

六、CANN环境部署

对应着版本,把每个环境配置都做好:

https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/70RC1alpha003/softwareinstall/instg/instg_000004.html

七、使用模型适配工具生成推理应用

https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/23.0.RC1/Getting%20Started%20with%20Application%20Development/iaqd/iaqd_0001.html
例如:构建目标检测跟踪应用,下载ascend,自己制作一些数据集

按照推理可以生成 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。打开图中文件,看版本。

这里使用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

九、将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

具体方法:
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模型:

yolov5s.om模型的速度:

yolov5s.onnx模型的速度:

通过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”文件中已包含读入数据、前处理、推理、后处理等功能,串联整个应用代码逻辑,此处仅对代码进行解析。

  1. 在“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  # 模型前后处理相关函数
  1. 初始化资源、定义模型相关变量,如图片路径、模型路径、设备id等。
# 初始化资源和变量
base.mx_init()  # 初始化 mxVision 资源
DEVICE_ID = 0  # 设备id
model_path = 'model/yolov5s_bs1.om'  # 模型路径
image_path = 'world_cup.jpg'  # 测试图片路径
  1. 对输入数据进行前处理。先使用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类
  1. 使用MindX SDK接口进行模型推理,得到模型输出结果。
# 模型推理, 得到模型输出
model = base.model(modelPath=model_path, deviceId=DEVICE_ID)  # 初始化 base.model 类
output = model.infer([img])[0]  # 执行推理。输入数据类型:List[base.Tensor], 返回模型推理输出的 List[base.Tensor]
  1. 对模型输出进行后处理。将 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 

以上代码包括以下几个步骤:

  1. 前处理:对图片进行 缩放填充,维度转换、连续内存排列、以及转化为base.Tensor操作。

  2. 推理:利用Model或者base.model 初始化模型,并用infer进行推理。

  3. 后处理:用 非极大值抑制函数 处理模型输出结果,并将检测框坐标对应到原图上,再将结果画到原图上并保存。

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开发的典型特点如图所示,用户可以根据自己需求或喜好选择学习实践。
在这里插入图片描述

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Atlas 200I DK A2华为发布的一款AI开发套件,用于进行AI模型的训练和推理。关于Atlas 200I DK A2的详细信息可以参考华为官方文档。对于yolov5模型的适配,可以使用模型适配工具,该工具预置了一些典型模型,包括目标检测模型(VOLO V7模型)、图像分类模型(Mobilenet模型)、图像分割模型(Unet模型)和关键点检测模型(Alphapose模型)。同时,该工具还提供了UI操作界面,可以上传自己的数据集并进行标注,创建模型训练任务,并使用PC的CPU算力进行训练。训练完成后,可以对模型进行打包,然后拷贝到Atlas 200I DK A2进行推理。关于Atlas 200I DK A2的安装和使用,可以通过官网下载制卡工具,并选择在线制卡方式进行烧录,根据需要选择基础镜像或E2E镜像,其中E2E镜像包含了更多的样例应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Atlas 200I DK A2(小藤) 开箱](https://blog.csdn.net/qq_47997583/article/details/131196482)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [【2023 · CANN训练营第一季】初识新一代开发者套件Atlas 200I DK A2 第二章 安装配置Atlas 200I DK A2跑通...](https://blog.csdn.net/Lnko666/article/details/130138871)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值