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

news2024/11/15 21:25:56

地平线旭日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 np

src_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:
        break
    img_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_size
    image_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) // 2
    pad_image[dh:new_h + dh, dw:new_w + dw, :] = resize_image

    return 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, HWC
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # RGB, HWC
    img = 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.003921568627451
  input_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: False
  core_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.coloradmin.cn/o/1510271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb--Maven

一:概述 1.简介 Maven 是专门用于管理和构建 Java 项目的工具,它的主要功能有: 提供了一套标准化的项目结构 提供了一套标准化的构建流程(编译,测试,打包,发布 …… ) 提供了一套…

这个学习Python的神仙网站,后悔没早点发现

Python 作为时下最流行的编程语言,很多初学者都将它作为自学编程的首选。不管是有编程经验的开发者,还是新手小白,在这个 AIGC 时代, Python 都可以带你探索新世界。 入门 Python 绝非难事,但如何让自己坚持学下去是如…

图及图的存储

目录 1.图的相关概念 2.图的存储 2.1.直接存法 1.查询是否存在某条边 2.遍历一个点的所有出边 3..遍历整个图 应用 2.2.邻接矩阵 1.查询是否存在某条边 2.遍历一个点的所有出边 3..遍历整个图 应用 2.3.邻接表 1.查询是否存在某条边 2.遍历一个点的所有出边 3..遍…

数据库不应放在容器中?- B站Kubernetes有状态服务实践(Elasticsearch/Clickhouse)

本期作者 前言 云原生时代下, Kubernetes已成为容器技术的事实标准, 使得基础设施领域应用下自动化运维管理与编排成为可能。对于无状态服务而言, 业界早已落地数套成熟且较完美的解决方案。可对于有状态的服务, 方案的复杂度就以…

Spring Cloud Alibaba微服务从入门到进阶(一)

Springboot三板斧 1、加依赖 2、写注解 3、写配置 Spring Boot Actuator Spring Boot Actuator 是 Spring Boot 提供的一系列用于监控和管理应用程序的工具和服务。 SpringBoot导航端点 其中localhost:8080/actuator/health是健康检查端点,加上以下配置&#xf…

关于yolov8文档的记录,补充一些整理的知识点

2023年由Ultralytics 提供了YOLOv8开源项目。YOLOv8 支持全方位的视觉 AI 任务,包括检测、分割、姿态估计、跟踪和分类。这种多功能性使用户能够在各种应用和领域中利用YOLOv8 的功能。安装yolov8开源项目 pip install githttps://github.com/ultralytics/ultralyti…

什么是防静电晶圆隔离膜?一分钟让你了解抗静电晶圆隔离纸

防静电晶圆隔离膜,也被称为防静电蓄积纸、硅片纸、半导体晶圆盒内缓冲垫片等多种名称,是半导体制造和运输过程中的一种重要辅助材料。 该隔离膜具备多种特性,如防静电、无尘、不掉屑、强韧耐用等,这些特性使其在半导体制造和运输中…

YOLOv8改进 | 注意力机制 | 添加YOLO-Face提出的SEAM注意力机制优化物体遮挡检测(附代码 + 修改教程)

一、本文介绍 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM,SEAM(Spatially Enhanced Attention Module)注意力网络模块旨在补偿被遮挡面部的响应损失,通过增强未遮挡面部的响应来实现这一目标,其希望通过学习遮挡面和未遮挡面之间的…

腾轩科技传媒讲解百度百科词条品牌怎么创建?

品牌百度百科是为企业或个人创建的一个专门展示品牌信息、活动、产品等内容的百度百科页面。通过品牌百度百科,企业可以向用户展示其核心价值、产品特色,提升品牌知名度,并在互联网上建立一个权威的品牌形象。本文腾轩科技传媒讲解百度百科词…

VMware Workstation Pro17 详细安装步骤

VMware Workstation(中文名“威睿工作站”)是一款功能强大的桌面虚拟计算机软件,提供用户可在单一的桌面上同时运行不同的操作系统,和进行开发、测试 、部署新的应用程序的最佳解决方案。VMware Workstation可在一部实体机器上模拟…

力扣--动态规划/深度优先算法/回溯算法93.复原IP地址

这题主要用了动态规划和回溯算法。 动态规划数组初始化(DP数组): 首先,创建一个二维数组dp,用于记录字符串中哪些部分是合法的IP地址。对字符串进行遍历,同时考虑每个可能的IP地址部分(每部分由1到3个字符组…

Android中ANR机制

Android中的ANR分为两种,前台ANR和后台ANR。 前台ANR,是指ANR时对用户可感知,比如拥有当前前台可见的activity的进程,或者拥有前台通知的fg-service的进程,这些是用户可感知的场景。前台ANR,会出现一个系统…

岩土工程监测中振弦采集仪的选型指南与市场概况

岩土工程监测中振弦采集仪的选型指南与市场概况 振弦采集仪是岩土工程监测中常用的一种设备,用于测量土体的振动特性。它的选型指南和市场概况如下: 选型指南: 1. 测量参数:振弦采集仪可用于测量土体的振动振幅、频率、相位等参数…

Android中单例模式正确实现方式

1. 饿汉模式 -线程安全 在类加载时进行实例化, 线程安全,但会导致类加载时间变长。饿汉模式如果使用过多,可能会对App启动耗时带来不利影响。 2. 懒汉模式 -线程不安全 没有加锁, 因此线程不安全。 3. 两次判空 加同步锁 -线程不…

go语言基础 -- goroutine与管道

go协程特点 一个线程上可以起多个goroutine,goroutine有以下特点: 有独立的栈空间共享程序堆空间调度由用户控制 下面是一个简单的协程使用案例: package main import("fmt""strconv" )func test() {for i : 0; i &l…

18-任务管理常用API函数

任务挂起函数 void vTaskSuspend(TaskHandle_t xTaskToSuspend) void vTaskSuspendAll(void)——挂起所有任务 其实就是将调度器锁定,直白点挂起所有的任务,就是挂起任务调度器,调度器被挂起后,就不可以进行上下文的切换&#xf…

java中数组的定义与使用

Java中的数组跟c语言的数组几乎不一样,我们要区分对待。在之后你就能理解到我为什么说这句话了。 1.java中数组的创建与初始化 数组的创建 如下,皆为数组的创建。 double[] a; int[] b; 创建时的[]里面绝对不能填数字。 数组的初始化 主要分为动态…

【Python】一文带你了解如何获取 Python模块 安装路径

【Python】一文带你了解如何获取 Python模块 安装路径 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅…

MyBatis进阶篇

MyBatis MyBtias工具类参数入参参数是单个参数参数是多个参数入参是POJO对象入参是Map类型 自动主键增长#{}和${}两种获取参数方式结果映射动态SQLMyBatis多表查询MyBatis注解开发 MyBtias工具类 SessionUtils.java import org.apache.ibatis.io.Resources; import org.apache…

当HR问你:“什么事会让你有成就感”你该怎么回答?【文章底部添加进大学生就业交流群】

当HR问你“什么事会让你有成就感”时,你可以通过以下方式回答: 强调目标实现: 表达你在达成挑战性目标时感到的满足感。举例说明你在过去的工作或项目中如何设定并成功实现了目标。 强调对团队成功的贡献: 谈论你与团队合作取得成…