【旭日x3派】部署官方yolov5全流程

地平线旭日x3派部署yolov5--全流程

    • 前言
    • 一、深度学习环境安装
    • 二、安装docker
    • 三、部署
      • 3.1、安装工具链镜像
      • 3.2、配置天工开物OpenExplorer工具包
      • 3.3、创建深度学习虚拟空间,安装依赖:
      • 3.4、下载yolov5项目源码并运行
      • 3.5、pytorch的pt模型文件转onnx
      • 3.6、最重要且最难的部分:ONNX模型转换成bin模型
    • 四、上板运行

前言

原文参考:https://blog.csdn.net/Zhaoxi_Li/article/details/125516265
https://blog.csdn.net/Zhaoxi_Li/article/details/126651890?spm=1001.2014.3001.5502

这次部署的过程在windows下进行,深度学习环境和docker都是安装在windows中。
系统:win10
gpu:NVIDIA GeForce GTX 1650
在这里插入图片描述
简单来说就是一块性能拉跨点的笔记本电脑,可以直接插入鼠标、键盘、显示屏,当作电脑使用。这使得可以部署深度学习算法到这块板子上。

一、深度学习环境安装

如果只是想体验一下部署,不使用自己的模型的话,其实深度学习的环境都不用安装。
1、安装anaconda
anaconda的介绍看这篇:https://blog.csdn.net/weixin_56197703/article/details/124630222
下载一般两个选择,一个是官网,另一个是国内镜像网站。
①官网下载:直接下载最新就好了
在这里插入图片描述
②镜像网站下载:可以下载下面圈起来的其中之一
在这里插入图片描述

安装过程: 建议直接安装c盘,避免不必要的错误,前提是c盘名称是英文。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面这里,第一个选项意思就是将安装路径填入到系统环境变量中,这里勾选,后面使用着可能会出现问题,如果这里不勾选的话,就要自己区设置环境变量。
在这里插入图片描述
如果前面这个没勾选的话就进行环境变量设置:
此电脑----->属性----->高级系统设置----->环境变量----->path----->编辑----->新建。
在这里插入图片描述
将如下指令添加到环境变量:这里要根据自己的安装位置进行更改。

E:\Anaconda 
E:\Anaconda\Scripts 
E:\Anaconda\Library\mingw-w64\bin
E:\Anaconda\Library\usr\bin 
E:\Anaconda\Library\bin

在这里插入图片描述
配置完成之后测试安装是否成功:
搜索cmd或者win+r键入cmd:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果报错大概率是环境变量问题,认真弄。

2、安装cuda与cudnn
①查看显卡支持的最高CUDA的版本,以便下载对应的CUDA安装包:
win+R输入cmd进入命令提示符,输入:nvidia-smi
在这里插入图片描述
我这里在未安装之前显示的是11.6,表示最高支持11.6,不是只能下载11.6。由于电脑比较拉跨,这里选择10.2版本,在NVIDIA官方网站即可下载,地址为:https://developer.nvidia.com/cuda-toolkit-archive
在这里插入图片描述
安装包下载完成之后先安装第一个最大的哪个:基本就是一路向下,问你啥都勾选。
在这里插入图片描述
再安装两个比较小的补丁,这个补丁直接精简安装就行。

②确定CUDA版本对应的cuDNN版本并安装:
cudnn下载地址:https://developer.nvidia.com/rdp/cudnn-archive (需要注册NV账号),这里面直接写着有对应版本,我这里cuda10.2对应的有挺多版本,任选一个:
在这里插入图片描述
③安装pytorch
首先看pytorch与cuda的对应版本关系:
在这里插入图片描述
GPU版本的pytorch建议离线安装,安装包地址:https://download.pytorch.org/whl/torch_stable.html。
找到对应的cuda版本,python版本,系统版本进行安装,我这里安装anaconda时python版本是3.7,cuda是10.2,Pytorch版本选择1.9.0,所以最终下载的安装包是:
在这里插入图片描述
其中cu代表了cuda版本,cp代表了python版本,torch代表要安装的pytorch版本。
安装过程直接参考b站视频:https://www.bilibili.com/video/BV1Cr4y1u76N/?p=6&spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=2a10d30b8351190ea06d85c5d0bfcb2a。
后续的torchvision和pycharm的安装都直接看视频来的快。

二、安装docker

进入Docker Desktop下载桌面版的docker
在这里插入图片描述
下载完成之后双击打开安装包进行安装,安装完成之后双击打开,如果此时报错:Docker Desktop is unable to detect a Hypervisor
解决:进入控制面板->程序->启用或关闭windows功能->勾选Hyper-V,此时应该会自动重启电脑,如果没有的话手动重启。
此时再次双击打开docker,如果报另一个错,类似下面这样的:
在这里插入图片描述
解决:以管理员权限打开powershell,输入wsl --update更新wsl,此时应该就可以了。
打开docker之后,界面应该如下:
在这里插入图片描述

三、部署

3.1、安装工具链镜像

从地平线天工开物cpu docker hub获取部署所需要的CentOS Docker镜像。使用最新的镜像v1.13.6(实测需要梯子才能进这个网站)
在这里插入图片描述
以管理员模式运行CMD,输入docker,可以显示出docker的帮助信息:
在这里插入图片描述
在cmd中输入命令docker pull openexplorer/ai_toolchain_centos_7:v1.13.6,之后会自动开始镜像的安装。安装成功之后,即可在docker中看到成功安装的工具链镜像:
在这里插入图片描述

3.2、配置天工开物OpenExplorer工具包

OpenExplorer工具包的下载,需要wget支持,wget的下载链接为:https://eternallybored.org/misc/wget/。下载x64对应的压缩包。
在这里插入图片描述
下载完成解压之后如下图:
在这里插入图片描述
然后将wget.exe复制到C:\Windows\System32下:
在这里插入图片描述
这样就可以了。然后win+R→cmd,输入wget,出现如下的界面说明安装成功:
在这里插入图片描述
安装好之后即可在cmd中通过如下命令下载OpenExplorer工具包:也可以自己选择其他版本(https://developer.horizon.ai/forumDetail/136488103547258769)

wget -c ftp://vrftp.horizon.ai/Open_Explorer_gcc_9.3.0/2.2.3/horizon_xj3_open_explorer_v2.2.3a_20220701.tar.gz

3.3、创建深度学习虚拟空间,安装依赖:

①创建虚拟环境:
打开anaconda prompt,创建虚拟环境
在这里插入图片描述
在这里插入图片描述
创建完成之后进入虚拟环境:conda activate test
②安装ONNX:
由于需要将Pytorch模型是可以转为ONNX模型,所以需要这一步

# 安装关键包ONNX
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple onnx

③安装yolov5需要的一些包:
安装之前最好去搜一搜版本对应关系,这里是python3.7,如果版本不兼容后面会报错。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib>=3.2.2 numpy>=1.18.5 opencv-python>=4.1.1 Pillow>=7.1.2 PyYAML>=5.3.1 requests>=2.23.0 scipy>=1.4.1 tqdm>=4.64.0 tensorboard>=2.4.1 pandas>=1.1.4 seaborn>=0.11.0 ipython psutil thop>=0.1.1

3.4、下载yolov5项目源码并运行

本篇博客大部分参考https://blog.csdn.net/Zhaoxi_Li/article/details/126651890?spm=1001.2014.3001.5502,使用的也是他分享的源码,直接进百度网盘下载项目:https://pan.baidu.com/share/init?surl=K4WhC9vaA7p__uWS-ovn8A,提取码:0A09。
在这里插入图片描述
流程如下,可以看到对应目录和操作,需要进入虚拟空间:
在这里插入图片描述
这样测试成功之后环境大概率没问题,可以进行后续,本篇不自己训练模型,直接使用原始模型进行部署。

3.5、pytorch的pt模型文件转onnx

旭日x3派当前BPU支持onnx的opset版本为11,不用这个版本就会报错:
注意所在目录,需要在yolov5-master下。

python .\export.py --weights .\models\yolov5s.pt --include onnx --opset 11

在这里插入图片描述

3.6、最重要且最难的部分:ONNX模型转换成bin模型

1、启动docker,将需要用到的文件夹挂载到docker中:
在进入docker之前,先确定几个内容:
******天工开物OpenExplorer根目录:我的环境下是"G:\bushu_xiangguan\horizon_xj3_open_explorer_v2.2.3a_20220701",记得加双引号防止出现空格,该目录要挂载在docker中/open_explorer目录下。
******dataset根目录(放数据集的地方,这里没用到):我的环境下是"G:\bushu_xiangguan\Codes\dateset",记得加双引号防止出现空格,该目录需要挂载在docker中的/data/horizon_x3/data目录下。
******辅助文件夹根目录:官方教程其实是没有这个过程的,把这个挂载在docker里,就是充当个类似U盘的介质。比如在我的环境下是"G:\bushu_xiangguan\BPUCodes",我可以在windows里面往这个文件夹拷贝数据,这些数据就可以在docker中使用,该目录需要挂载在docker中的/data/horizon_x3/codes目录下。
上面这些目录都需要自己建。

win+R→cmd,进入命令符,输入如下指令即可进入docker:
CMD不支持换行,记得删掉后面的\然后整理为一行

docker run -it --rm \
-v "G:\bushu_xiangguan\horizon_xj3_open_explorer_v2.2.3a_20220701":/open_explorer \
-v "G:\bushu_xiangguan\Codes\dateset":/data/horizon_x3/data \
-v "G:\bushu_xiangguan\BPUCodes":/data/horizon_x3/codes \
openexplorer/ai_toolchain_centos_7:v1.13.6

在这里插入图片描述
两个箭头是挂载的目标目录:其中天工开物OpenExplorer根目录挂载到了open_explorer目录下;dataset根目录和辅助文件夹根目录挂载到了data/horizon_x3下的codes和data目录下。

2、开启模型转换主流程:
首先在BPUcodes下新建yolov5目录,在yolov5中再新建一个bpucodes,将前面转换好的onnx模型放进去。
2.1、onnx模型检查:
docker中进入bpucodes目录:
在这里插入图片描述
输入hb_mapper checker --model-type onnx --march bernoulli2 --model yolov5s.onnx开始模型检查。如下图即检查成功。
在这里插入图片描述
检查指令的各个参数含义如下:
在这里插入图片描述
实际上在天工开物工具包里提供了脚本进行模型转换各个步骤,以yolov5为例子,路径如下:
G:\bushu_xiangguan\horizon_xj3_open_explorer_v2.2.3a_20220701\ddk\samples\ai_toolchain\horizon_model_convert_sample\04_detection\03_yolov5s\mapper
在这里插入图片描述
上面进行模型验证的命令实际上也就是01_check.sh执行的主要内容。
2.2、准备校准数据
这步实际上就是运行02_preprocess.sh这个脚本,这个脚本的核心调用的是python文件data_preprocess.py。它位于:
G:\bushu_xiangguan\horizon_xj3_open_explorer_v2.2.3a_20220701\ddk\samples\ai_toolchain\horizon_model_convert_sample。
如果要部署自己训练的模型的话,这个工具包里没有对应的脚本去准备校准数据,所以这个py是比较好的选择,将写完的prepare_calibration_data.py文件也放进自己建的bpucodes文件夹中,这里面的src_root就是待校准的图片100张,这里使用coco数据集里的。dst_root就是保存校准完的图片的文件夹。

# prepare_calibration_data.py
import os
import cv2
import numpy as npsrc_root = '/open_explorer/ddk/samples/ai_toolchain/horizon_model_convert_sample/01_common/calibration_data/coco'
cal_img_num = 100  # 想要的图像个数
dst_root = '/data/horizon_x3/codes/yolov5/bpucodes/calibration_data'## 1. 从原始图像文件夹中获取100个图像作为校准数据
num_count = 0
img_names = []
for src_name in sorted(os.listdir(src_root)):if num_count > cal_img_num:breakimg_names.append(src_name)num_count += 1# 检查目标文件夹是否存在,如果不存在就创建
if not os.path.exists(dst_root):os.system('mkdir {0}'.format(dst_root))## 2 为每个图像转换
# 参考了OE中/open_explorer/ddk/samples/ai_toolchain/horizon_model_convert_sample/01_common/python/data/下的相关代码
# 转换代码写的很棒,很智能,考虑它并不是官方python包,所以我打算换一种写法## 2.1 定义图像缩放函数,返回为np.float32
# 图像缩放为目标尺寸(W, H)
# 值得注意的是,缩放时候,长宽等比例缩放,空白的区域填充颜色为pad_value, 默认127
def imequalresize(img, target_size, pad_value=127.):target_w, target_h = target_sizeimage_h, image_w = img.shape[:2]img_channel = 3 if len(img.shape) > 2 else 1# 确定缩放尺度,确定最终目标尺寸scale = min(target_w * 1.0 / image_w, target_h * 1.0 / image_h)new_h, new_w = int(scale * image_h), int(scale * image_w)resize_image = cv2.resize(img, (new_w, new_h))# 准备待返回图像pad_image = np.full(shape=[target_h, target_w, img_channel], fill_value=pad_value)# 将图像resize_image放置在pad_image的中间dw, dh = (target_w - new_w) // 2, (target_h - new_h) // 2pad_image[dh:new_h + dh, dw:new_w + dw, :] = resize_imagereturn pad_image## 2.2 开始转换
for each_imgname in img_names:img_path = os.path.join(src_root, each_imgname)img = cv2.imread(img_path)  # BRG, HWCimg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # RGB, HWCimg = imequalresize(img, (640, 640))img = np.transpose(img, (2, 0, 1))  # RGB, CHW# 将图像保存到目标文件夹下dst_path = os.path.join(dst_root, each_imgname + '.rgbchw')print("write:%s" % dst_path)# 图像加载默认就是uint8,但是不加这个astype的话转换模型就会出错# 转换模型时候,加载进来的数据竟然是float64,不清楚内部是怎么加载的。img.astype(np.uint8).tofile(dst_path) print('finish')

更改src_root 和drt_root为自己的路径。执行python3 prepare_callbration_data.py
在这里插入图片描述

2.3、模型转换
模型转换的核心在于配置目标的yaml文件。官方也提供了一个yolov5s_config.yaml可供用户直接试用,每个参数都给了注释。然而模型转换的配置文件参数太多,如果想改参数都不知道如何下手。本yaml模板适用于的模型具有如下属性:无自定义层,换句话说,BPU支持该模型的所有层。输入节点只有1个,且输入是图像。
自己写的yolov5_simple.yaml文件也放到bpucodes下。

model_parameters:onnx_model: 'yolov5s.onnx'output_model_file_prefix: 'yolov5s'march: 'bernoulli2'
input_parameters:input_type_train: 'rgb'input_layout_train: 'NCHW'input_type_rt: 'nv12'norm_type: 'data_scale'scale_value: 0.003921568627451input_layout_rt: 'NHWC'
calibration_parameters:cal_data_dir: './calibration_data'calibration_type: 'max'max_percentile: 0.9999
compiler_parameters:compile_mode: 'latency'optimize_level: 'O3'debug: Falsecore_num: 2  # x3p是双核BPU,所以指定为2可以速度更快

输入:hb_mapper makertbin --config convert_yolov5s.yaml --model-type onnx即开始模型转换。转换成功后,得到model_output/yolov5s.bin,它就是上板运行所需要的模型文件。
在这里插入图片描述

四、上板运行

在这里插入图片描述
将这些文件拷贝到x3派新建的测试文件夹中,一部分是要到百度网盘中获取的。
输入sudo apt-get install libopencv-dev安装opencv库,进入这里这个test_yolov5文件夹,执行:python3 setup.py build_ext --inplace编译后处理代码,得到lib/pyyolotools.cpython-38-aarch64-linux-gnu.so文件。

输入:sudo python3 inference_model_bpu.py进行推理,推理完成之后会保存结果图片:
在这里插入图片描述
这个未优化的初始yolvv5模型还是很捞的,推理速度很慢。但是这里后处理速度很快,cython封装加速的结果。后处理就是指模型推理完成之后在图片上画出结果的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/405148.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode提升:JSON 中不允许有注释

解决方案 : 运行: json with comment 参考链接: https://blog.csdn.net/eqizhihui/article/details/134014010 人工智能学习网站 https://chat.xutongbao.top

音视频相关知识

H.264编码格式 音频 PCM就是要把声音从模拟信号转换成数字信号的一种技术,他的原理简单地说就是利用一个固定的频率对模拟信号进行采样。 pcm是无损音频音频文件格式 每秒15帧 一秒钟300kb 单位:像素

K8S的统一访问入口-Service

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

金山云Q2调整后EBITDA率提升至3.2% 高质量发展驱动经营质效双增

8月20日,金山云公布了2024年第二季度业绩。 季度内,金山云整体业绩延续向好态势,实现收入规模、盈利能力、经营现金流的联动共赢。财报显示,金山云Q2营收18.9亿元,公有云实现收入12.3亿元,行业云实现收入6…

GATK ReadLikelihoodCalculationEngine接口介绍

ReadLikelihoodCalculationEngine 是 GATK(Genome Analysis Toolkit)中的一个接口,用于计算不同等位基因(haplotypes 或 alleles)下的测序读数的似然值。这些似然值在变异检测过程中起着关键作用,帮助确定哪…

【C++ 第十四章】红黑树

前言: 学习本章,需要先学习 AVL树的 旋转,因为 红黑树也需要旋转调整来平衡,下面讲解将不赘述 旋转的原理和操作 红黑树的旋转 和 AVL树的旋转 唯一不同的是:旋转的判断使用逻辑 AVL树的旋转 可以通过 平衡因子 判断…

第3章处理机调度与死锁

一、处理机调度的层次和调度算法的目标 调度的实质是一种资源分配,处理机调度是对处理机资源进行分配。 1. 处理机调度的层次 (1)高级调度(作业调度)。 (2)中级调度(内存调度)。 (3)低级调度(进程调度)。 2. 处理机调度算法的目标 (1)资源利用率。 (2)公平性。 (3)平…

csrf漏洞(三)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 本文依靠phpstudy以及dvwa靶场进行操作,具体搭建流程参考:xss漏洞(二,xss靶场搭建以及简单利用) 前篇…

ArcGIS10.8 安装教程

目录 一、环境及安装包准备 二、安装流程 1、解压安装包ArcGIS_108.rar 2、安装 三、汉化 四、激活 五、自定义菜单(可选) 六、打开软件按查看 七、安装过程中出现的报错 八、其他 一、环境及安装包准备 安装环境:win7 安装包下载…

集团数字化转型方(五)

集团数字化转型方案通过全面整合人工智能(AI)、大数据分析、云计算和物联网(IoT)等前沿技术,构建了一个高度智能化的业务平台,从而实现业务流程的自动化、数据驱动的决策支持、精准的市场预测、以及个性化的…

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(一)---UnrealCV获取深度+分割图像

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程使用的环境: ubuntu 22.04 ros2 humblewindows11 UE5.4.3python8 本系列教程将涉及以…

Leetcode JAVA刷刷站(58)最后一个单词的长度

一、题目概述 二、思路方向 要解决这个问题,你可以通过遍历字符串 s 并从后往前计数的方式来实现。但更简洁且易于理解的方法是,首先去除字符串尾部的空格(如果有的话),然后找到最后一个单词的起始位置,并计…

XSS反射型和DOM型+DOM破坏

目录 第一关 源码分析 payload 第二关 源码分析 payload 第三关 源码分析 payload 第四关 源码分析 payload 第五关 源码分析 payload 第六关 源码分析 第七关 源码分析 方法一:构造函数 方法二:parseInt 方法三:locat…

【C语言】冒泡排序保姆级教学

C语言冒泡排序保姆级教学 直奔主题&#xff1a; 拿排升序举例子 第一步&#xff1a; 将想要排序的数组中数值最大的那个数排到该数组的最后 具体实现如下图&#xff1a; 第一步代码实现 for (int i 1; i < n ; i)//n为数组大小此处为4 {if (a[i - 1] > a[i])//注意越…

【java基础】IDEA 的断点调试(Debug)

目录 1.为什么需要 Debug 2.Debug的步骤 2.1添加断点 2.2单步调试工具介绍 2.2.1 Step Over 2.2.2 Step Into 2.2.3 Force Step Into 2.2.4 Step Out 2.2.5 Run To Cursor 2.2.6 Show Execution Poiint 2.2.7 Resume Program 3.多种 Debug 情况介绍 3.1行断点 3.2方…

[数据集][目标检测]锤子检测数据集VOC+YOLO格式1510张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1510 标注数量(xml文件个数)&#xff1a;1510 标注数量(txt文件个数)&#xff1a;1510 标注…

美团外卖新版 web mtgsig 1.2 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、 敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业 用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像或私信联…

Pcie学习笔记(24)

Ordering and Receive Buffer Flow Control 流量控制(FC)用于防止接收端缓冲区溢出&#xff0c;并使其符合定义的排序规则。请注意&#xff0c;请求者使用流量控制机制来跟踪代理中可用的队列/缓冲区空间&#xff0c;如图2-48所示。也就是说&#xff0c;流控制是点对点的(跨一…

集团数字化转型方案(六)

集团数字化转型方案旨在通过引入前沿技术&#xff0c;如人工智能&#xff08;AI&#xff09;、大数据分析、云计算和物联网&#xff08;IoT&#xff09;&#xff0c;全面提升业务运营效率和市场竞争力。该方案首先实现业务流程的自动化&#xff0c;减少人工干预&#xff0c;通过…

学习C语言 第十八天

第一项 C 强制类型转换 强制类型转换是把变量从一种类型转换为另一种数据类型。可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型 (type_name) expression 一个整数变量除以另一个整数变量&#xff0c;得到一个浮点数&#xff1a; eg: #include <st…