使用Vitis AI 部署YOLOv5至KV260

这篇具有很好参考价值的文章主要介绍了使用Vitis AI 部署YOLOv5至KV260。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、相关介绍

二、相关链接参考

三、模型训练

四、环境部署

五、量化编译

六、上机KV260


一、相关介绍

如题,此博客记录初步使用Vitis-AI 部署YOLOv5目标检测网络至KV260边缘设备中。

由于整个过程需要注意环境、软件包等之间的版本匹配,我给出所使用的相关版本:

名称 ubantu GPU GPU-Driver cuda cudnn pytorch docker YOLOv5 vitis-ai python
HOST部署版本 20.04 4060 535.161.07  12.2 8.9.7 1.13

26.0.0

6.2 3.0 3.7

vitis3.0推荐

20.04 ----- 520.61.05 or higher  11.8 or higher ----- ----- 19.03 or higher ----- ----- -----

二、相关链接参考

官方文档链接:

1. Vitis AI

2. Vitis AI 3.0 Documentation

3. Vitis AI Repository(github)

4. Vitis AI Tutorials Repository (github)

5. Vitis AI 3.0 用户指南 (UG1414)

6. Vitis AI Library 3.0 用户指南 (UG1354)

7. KV260

8. KV260 Introduction

9. AMD自适应计算文档门户

以下链接(不分先后顺序嗷~)都详细记录并分享了其量化部署过程,对于我本人的初步学习十分友好,对此特别感谢!

参考博客链接:

1. YOLOv5 Quantization & Compilation with Vitis AI 3.0 for Kria

2. 基于Vitis-AI的yolov5目标检测模型在ZCU102开发板上的部署过程分享

3. YOLOv5源代码使用Xilinx Vitis AI进行量化并部署到DPU上的全流程

4. Vitis-AI量化编译YOLOv5(Pytorch框架)并部署ZCU104(一)

三、模型训练

在块引用中的文字是注意事项或者提示,可以略过。

 在yolov5的训练中发现pytorch=1.12会报错:

nvrtc: error: invalid value for --gpu-architecture (-arch)

折腾很多种方法还是无法解决,这个问题可能是因为我的环境上有未发现的矛盾。于是我不得不使用pytorch=1.13 or 1.11来避开这个问题,但是后续预构建的vai-q-pytorch-gpu的docker含pytorch=1.12,以至于我不得不使用vitis-AI3.5构建的vai-q-pytorch-gpu:3.5

如果有解决办法还望告知,谢谢!

模型训练这一阶段网络上有很多教程,此外参考博客1注意到vitis-ai不支持SiLU(在官方文档UG1414中有介绍):

yolo kv260,YOLO,ubuntu

图源 参考博客1

故在训练阶段,我们将原SiLU更改为Leaky ReLU。在models/common.py与modles/experimental.py 更改三处:

# commom.py Line 43
# self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
self.act = nn.LeakyReLU(26/256,inplace=True) if act is True else (act if isinstance(act, nn.Module) else nn.Identity())

# commom.py Line 123
# self.act = nn.SiLU()
self.act = nn.LeakyReLU(26/256,inplace=True)

# experimental.py Line 55
# self.act = nn.SiLU()
self.act = nn.LeakyReLU(26/256,inplace=True)

更改后使用coco数据集训练,此处我们使用vitis-ai-library支持的模型yolov5n.pt作为初始模型训练(详见官方文档UG1354)。

得到训练好的best.pt文件后,在官方文档UG1414中提及:

yolo kv260,YOLO,ubuntu

图源 官方文档UG1414

 于是在models/yolo.py中需要删除后续处理。

#yolo.py Line 55
def forward(self, x):
    z = []  # inference output
    for i in range(self.nl):
        x[i] = self.m[i](x[i])  # conv

    return  x
    #     bs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)
    #     -----------

如果需要可在后处理中实现。以detect.py为例可访问参考博客1。

此时我们已经做好量化前的准备。

四、环境部署

环境部署官方文档UG1414中已经非常详尽地介绍,此处罗列以下重要步骤。

对于ubantu、cuda、GPU-Driver、anaconda、docker等的安装不再介绍。

1.克隆Vitis AI 3.0 存储库至/home/HOST

2.pull docker 映像文件,包括CPU、GPU两种

对于CPU,可直接pull:

docker pull xilinx/vitis-ai-pytorch-cpu:latest

对于GPU,需使用存储库内脚本,详情请参考官方文档UG1414:

其中带优化器由于需要商业许可证,无许可证不能使用,不必构建。

cd /Vitis-AI/docker
./docker_build.sh -t gpu -f opt_pytorch     #带优化器
./docker_build.sh -t gpu -f pytorch         #不带优化器

后续如果需要保存docker容器内更改,不建议直接在原镜像上保存,而是另存一个镜像。保存运行中的容器为一个新镜像的操作如下:参考链接

  • 新开一个终端查看正在运行的容器id
docker ps 
  • commit容器为新镜像,镜像名称需要带有[ gpu / cpu / rocm],docker_run.sh带有判断
docker commit d81abcfd2e3b my_vai_pytorch_gpu:1.1

同时建议docker容器的访问使用vscode,图形化的界面方面更改脚本与运行。

  • 详情请访问:使用VS Code访问docker容器

验证GPU版本是否安装成功:

#确保docker内部可访问GPU
sudo apt purge nvidia* libnvidia*
sudo apt install nvidia-driver-xxx
sudo apt install nvidia-container-toolkit
#运行GPU映像
docker run --gpus all nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu20.04 nvidia-smi

3.安装交叉编译环境

cd  Vitis-AI/board_setup/mpsoc
sudo chmod u+r+x host_cross_compiler_setup.sh
./host_cross_compiler_setup.sh  
unset LD_LIBRARY_PATH# if need
source ~/petalinux_sdk_2022.2/environment-setup-cortexa72-cortexa53-xilinx-linux
#验证交叉编译环境,编译通过未报错并生成可执行文件
cd Vitis-AI/examples/vai_runtime/resnet50_pt
bash -x build.sh

 之后每一次需要编译文件都需要使用以下命令更新path

unset LD_LIBRARY_PATH# if need
source ~/petalinux_sdk_2022.2/environment-setup-cortexa72-cortexa53-xilinx-linux

 4.设置目标KV260

  (1)下载映像文件并使用BalenaEtcher等工具上传到内存卡

(2)连接KV260键鼠、显示器、内存卡以及HOST与KV260之间的网线

(3)打开ubantu系统的网络分享

yolo kv260,YOLO,ubuntu

  (4)进入KV260系统并使用其终端ifconfig 得到HOST分配的地址

  (5)HOST下载putty 使用ip地址连接KV260 (名称:root       密码:root)

(6)下载运行时文件至KV260,解压后使用scp移动文件

[HOST]$ scp -r vitis-ai-runtime-3.0.0/2022.2/aarch64/centos root@ip_address:~/

[KV260]$ cd ~/centos
[KV260]$ bash setup.sh

5.运行时示例

HOST下载模型文件(Vitis-AI/model_zoo/model_list对于每个预置模型.yaml处均有下载地址)

以resnet50为例,下载后scp至KV260

[HOST]$ scp resnet50-zcu102_zcu104_kv260-r3.0.0.tar.gz root@ip_address:~/

[KV260]$ tar -xzvf resnet50-zcu102_zcu104_kv260-r3.0.0.tar.gz
[KV260]$ cp resnet50 /usr/share/vitis_ai_library/models -r

KV260安装示例图片视频运行时

[HOST]$ scp vitis_ai_runtime_r3.0.0_image_video.tar.gz root@ip_address:~/

[KV260]$ tar -xzvf vitis_ai_runtime_r3.0.0_image_video.tar.gz -C Vitis-AI/examples/vai_runtime
[KV260]$ cd ~/Vitis-AI/examples/vai_runtime/resnet50
[KV260]$ resnet50 /usr/share/vitis_ai_library/models/resnet50_pruned_0_5_pt/resnet50_pruned_0_5.xmodel
#出现分类结果即可

注意:

模型位于目标上的 /usr/share/vitis_ai_library/models 

库文件存储在 /usr/lib 

图像视频包存储在Vitis-AI/examples/vai_library 

6.vitis-ai-library示例

以resnet18网络、使用pytorch示例

cd ~/Vitis-AI
mkdir -p resnet18/model

下载imagnet1000数据集并解压至~/Vitis-AI/resnet18,

从开源社区或者model zoo下载浮点模型resnet18.pth并存储于/resnet18/model/

cd resnet18/model
wget https://download.pytorch.org/models/resnet18-5c106cde.pth -O resnet18.pth

复制官方量化脚本至/resnet18

cp ~/Vitis-AI/examples/vai_quantizer/pytorch/resnet18_quant.py ./

run docker

cd ~/Vitis-AI
./docker_run.sh xilinx/vitis-ai-pytorch-cpu
conda activate vitis-ai-pytorch

评估浮点模型的准确性 float:

python resnet18_quant.py --quant_mode float --data_dir imagenet-mini --model_dir model

确定模型与目标DPU体系结构是否兼容:

python resnet18_quant.py --quant_mode float --inspect --target DPUCZDX8G_ISA1_B4096 --model_dir model
#生成txt文件

开始量化 calib:

python resnet18_quant.py --quant_mode calib --data_dir imagenet-mini --model_dir model --subset_len 200

# 如果量化成功将会有以下文件生成 
# quantize_result/ResNet.py       量化vai_q_pytorch模型
# quantize_result/Quant_info.json  张量的量化步骤
# quantize_result/bias_corr.pth

评估量化模型准确性 test:

python resnet18_quant.py --model_dir model --data_dir imagenet-mini --quant_mode test

 生成DPU量化文件:

python resnet18_quant.py --quant_mode test --subset_len 1 --batch_size=1 --model_dir model --data_dir imagenet-mini --deploy

#可以在quantize_result中找到resnet_int.xmodel

编译模型:

vai_c_xir -x ./quantize_result/resnet_int.xmodel -a /opt/vitis_ai/compiler/arch/DPUCZDX8G/KV260/arch.json -o resnet -n resnet
# 生成resnet18_pt文件夹 包含resnet18_pt.xmodel等文件

新建文件 resnet18_pt.prototxt并移动至resnet_18

model {
   name : "resnet18_pt"
   kernel {
         name: "resnet18_pt_0"
         mean: 103.53
         mean: 116.28
         mean: 123.675
         scale: 0.017429
         scale: 0.017507
         scale: 0.01712475
   }
   model_type : CLASSIFICATION
   classification_param {
          top_k : 5
          test_accuracy : false
          preprocess_type : VGG_PREPROCESS
   }

接下来可部署至KV260

在HOST上:

#传输量化文件
scp -r resnet18_pt root@ip_address:/usr/share/vitis_ai_library/models/
#下载图像和视频测试文件
wget https://www.xilinx.com/bin/public/openDownload?filename=vitis_ai_library_r3.0.0_images.tar.gz -O vitis_ai_library_r3.0.0_images.tar.gz
wget https://www.xilinx.com/bin/public/openDownload?filename=vitis_ai_library_r3.0.0_video.tar.gz -O vitis_ai_library_r3.0.0_video.tar.gz
scp  -r vitis_ai_library_r3.0.0_images.tar.gz root@ip_address:~/
scp  -r vitis_ai_library_r3.0.0_video.tar.gz root@ip_address:~/

 接下来的操作在KV260上:

#解压测试文件
tar -xzvf vitis_ai_library_r3.0.0_images.tar.gz -C ~/Vitis-AI/examples/vai_library/
tar -xzvf vitis_ai_library_r3.0.0_video.tar.gz -C ~/Vitis-AI/examples/vai_library/
#编译
cd ~/Vitis-AI/vai_library/samples/classification
./build.sh
#单图片测试
./test_jpeg_classification resnet18_pt ~/Vitis-AI/examples/vai_library/samples/classification/images/002.jpg
#单视频测试
./test_video_classification resnet18_pt ~/Vitis-AI/examples/vai_library/apps/seg_and_pose_detect/pose_960_540.avi -t 8
#实时推理
./test_video_classification resnet18_pt 0 -t 8

在使用HOST连接KV260之后,视频测试等需要实时输出画面,需要开启X11转发:

  • HOST与KV260安装VSCODE插件 remote x11
  • HOST config配置
  • KV260 bashrc配置

我遇到一个问题是插件找不到 /home/host/.shh/id_rsa 不能转发,于是重新生成了密钥

[HOST]$ ssh-keygen
[HOST]$ scp ~/.ssh/id_rsa.pub root@ip_address:~/.ssh/
[KV260]$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

默认会生成在~/.ssh/下

然后将id_rsa.pub 复制到KV260 ~/.ssh下,并重命名为authorized_keys

[HOST]$ vim /home/host/.shh/config
#Add
Host KV260
    HostName ip_address_KV260
    User root
    ForwardX11 yes
    ForwardX11Trusted yes
    ForwardAgent yes
    IdentityFile  "~/.ssh/id_rsa"

[KV260]$ vim ~/.bashrc
#Add
DISPLAY=ip_address_HOST:0.0

[KV260]$ source ~/.bashrc

如果不出意外,那么使用vitis-ai-library的示例已经让从我们将浮点模型量化后并在FPGA上运行!


五、量化编译

在完成相关环境部署和示例之后,我们可以开始将模型训练这一阶段得到浮点模型量化并部署到KV260平台中。

在官方文档UG1414中,VAI量化器工作流程如下图:

yolo kv260,YOLO,ubuntu

在量化器的安装上,可以根据自己需要调整pytorch版本(1.2~1.12)。

而CPU版本发布的docker内部含pytorch=1.13,由于我多次尝试更换GPU的pytorch版本失败,不得不使用CPU版本。(并且即使我成功将vai-q-pytorch-gpu安装在HOST的conda环境中,尝试calib(with fast_fintune)在HOST,test(需要xir工具,无力构建)在docker(CPU),仍然会报错,这里要求calib和test使用同一个平台(CPU or GPU)。解决办法可能还是需要在docker内使用脚本更换pytorch版本。

其余详情内容请参考官方文档UG1414, 量化脚本请参考博客1。

需要注意的是在编译完成之后,传输到KV260的文件夹内应含以下四个文件:

yolo kv260,YOLO,ubuntu

对于.prototxt文件内容需要做相应的修改,使用netron导入.xmodel文件查看网络结构,更改输出层名。此处可参考KV260内 /usr/share/vitis_ai_library/models/yolov5_nano_pt 内 .prototxt 文件内容

这里需要注意每个output_layer_name的顺序,可以对照官方prototxt文件的顺序和xmodel的三个输出层的对应关系,更改自己模型对应的名字。不然检测结果依托答辩。

model {
  kernel {
     mean: 0.0
     mean: 0.0
     mean: 0.0
     scale: 0.00392156
     scale: 0.00392156
     scale: 0.00392156
  }
  model_type : YOLOv3
  yolo_v3_param {
    num_classes: 80         #number of class
    anchorCnt: 3
    layer_name: "ip_fix"  #output layer name
    layer_name: "ip2_fix"  #output layer name
    layer_name: "ip3_fix"  #output layer name
    conf_threshold: 0.5     #change if need
    nms_threshold: 0.65     #change if need
    biases: 10              #anchors
    biases: 13
    biases: 16
    biases: 30
    biases: 33 
    biases: 23
    biases: 30
    biases: 61
    biases: 62
    biases: 45 
    biases: 59
    biases: 119
    biases: 116
    biases: 90
    biases: 156
    biases: 198
    biases: 373 
    biases: 326  
    test_mAP: false
    type: YOLOV5
  }
  is_tf: true 
}

(网络结构太复杂,只截了一段结构)

yolo kv260,YOLO,ubuntuyolo kv260,YOLO,ubuntu

 在这之后便可移动量化模型文件至KV260

scp -r yolov5n_cus root@ip_address:/usr/share/vitis_ai_library/models/

六、上机KV260

如同四(6)教程所示,如果我们不需要更改test源码,只需要输出检测框等基本功能,那么便可以在HOST上交叉编译或者在KV260上编译C++源码生成可执行文件,其源码位置在:

[HOST] $ cd ~/Vitis-AI/examples/vai_library/samples/yolov5
#or
[KV260]$ cd ~/Vitis-AI/examples/vai_library/samples/yolov5

进入源码文件后,可以直接编译生成可执行文件:

[HOST] $ unset LD_LIBRARY_PATH  #if need
[HOST] $ source ~/petalinux_sdk_2022.2/environment-setup-cortexa72-cortexa53-xilinx-linux
[HOST] $ bash -x build.sh
#or
[KV260] $ bash -x build.sh

在顺利生成可执行文件后,即可完成简单的预设检测任务。

#单图片测试
./test_jpeg_classification yolov5_cus ~/Vitis-AI/examples/vai_library/samples/classification/images/002.jpg
#单视频测试
./test_video_classification yolov5_cus ~/Vitis-AI/examples/vai_library/apps/seg_and_pose_detect/pose_960_540.avi -t 8
#实时推理
./test_video_classification yolov5_cus 0 -t 8

还在学习中~文章来源地址https://www.toymoban.com/news/detail-860730.html

到了这里,关于使用Vitis AI 部署YOLOv5至KV260的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vitis-AI量化编译YOLOv5(Pytorch框架)并部署ZCU104(一)

    文章目录 前言  一、Vitis-AI Pytorch框架量化(vai_q_pytorch)  二、编写量化脚本并进行量化  三、模型编译 总结 许多私信想要源码工程,近期会上传到Github仓库,大家有需要自己拿就就可以。 https://github.com/sususjysjy/Vitis-ai-zcu104-yolov5 --------------------------------------------         虽

    2024年02月02日
    浏览(36)
  • YOLO系列梳理(三)YOLOv5

    前言   YOLOv5 是在 YOLOv4 出来之后没多久就横空出世了。今天笔者介绍一下 YOLOv5 的相关知识。目前 YOLOv5 发布了新的版本,6.0版本。在这里,YOLOv5 也在5.0基础上集成了更多特性,同时也对模型做了微调,并且优化了模型大小,减少了模型的参数量。那么这样,就更加适合移动

    2024年02月05日
    浏览(43)
  • [yolov5] yolo的数据标签格式

    yolov5 的标签格式 https://github.com/ultralytics/yolov5/issues/9816 你好!。感谢您询问YOLOv5🚀数据集格式。用于分割的XY坐标与用于长方体中心的标准坐标相同。 为了正确训练,您的数据必须为YOLOv5格式。有关数据集设置的完整文档以及开始培训您的第一个模型所需的所有步骤,请参阅

    2024年02月04日
    浏览(49)
  • 【YOLO】yolov5训练自己的数据集

    【Python】朴实无华的yolov5环境配置(一)   上面前期教程中,大致介绍了yolov5开发环境的配置方法和yolov5项目的基本结构,下一步就是基于yolov5预训练模型来训练自己的数据集,这对于只是想要使用yolov5这个工具的人,还是想要深入研究yolov5类似的目标识别算法的人,都是

    2024年02月11日
    浏览(47)
  • [ZCU102嵌入式开发]基于Vitis-AI的yolov5目标检测模型在ZCU102开发板上的部署过程分享

    之前本来想要做基于ZCU106的Vitis-AI开发,但是官方对106缺少相关文档说明,而我需要移植的yolov5模型需要使用Vitis-AI的2.0往后的版本来支持更新的pytorch版本,相对应的也需要更新Vitis等工具的版本,所以在缺少参考资料的情况下我选择找实验室换成了ZCU102开发板先把基本流程走

    2024年01月16日
    浏览(48)
  • 【YOLO系列】YOLOv5超详细解读(网络详解)

    吼吼!终于来到了YOLOv5啦! 首先,一个热知识:YOLOv5没有发表正式论文哦~ 为什么呢?可能YOLOv5项目的作者Glenn Jocher还在吃帽子吧,hh 前言 一、YOLOv5的网络结构  二、输入端 (1)Mosaic数据增强 (2)自适应锚框计算 (3)自适应图片缩放 三、Backbone (1)Focus结构 (2)CSP结构

    2023年04月09日
    浏览(69)
  • 【YOLO】Windows 下 YOLOv8 使用 TensorRT 进行模型加速部署

    本文全文参考文章为 win10下 yolov8 tensorrt模型加速部署【实战】 本文使用的代码仓库为 TensorRT-Alpha 注:其他 Yolov8 TensorRT 部署项目:YOLOv8 Tensorrt Python/C++部署教程 安装Visual Studio 2019或者Visual Studio 2022、Nvidia驱动 安装cuda,cudnn、opencv、tensorrt并进行相应的环境配置,这里不做配

    2024年02月11日
    浏览(34)
  • 改进YOLO系列 | YOLOv5 更换骨干网络之 ConvNeXt

    🍀2023/6/30 更新源代码 ,并追加结构对应的超参数文件 论文地址:https://arxiv.org/pdf/2201.03545.pdf 代码地址:https://github.com/facebookresearch/ConvNeXt 视觉识别的“Roaring 20年代”始于视觉变换器(ViTs)的引入,它很快取代了ConvNets,成为最先进的图像分类模型。另一方面,普通ViTs在应

    2024年02月04日
    浏览(44)
  • 【YOLO系列】YOLOv5超详细解读(源码详解+入门实践+改进)

    吼吼!终于来到了YOLOv5啦! 首先,一个热知识:YOLOv5没有发表正式论文哦~ 为什么呢?可能YOLOv5项目的作者Glenn Jocher还在吃帽子吧,hh 前言 一、YOLOv5的网络结构  二、输入端 (1)Mosaic数据增强 (2)自适应锚框计算 (3)自适应图片缩放 三、Backbone (1)Focus结构 (2)CSP结构

    2024年02月07日
    浏览(44)
  • YOLOv5目标检测学习(1):yolo系列算法的基础概念

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 关于深度学习目标检测,有许多概念性的东西需要先了解一下。这里主要以基于深度学习的目标检测算法的部署实现来学习。 以yolov5为例: 使用YOLOv5进行车辆和行人的目标检测通常涉及以下步骤: 数据

    2024年04月09日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包