使用旭日X3派的BPU部署Yolov5
本次主要介绍在旭日x3的BPU中部署yolov5。首先在ubuntu20.04安装yolov5,并运行yolov5并使用pytoch的pt模型文件转ONNX;然后将ONNX模型转换BPU模型;最后上板运行代码测试,并利用Cypython封装后处理代码。
一.安装Anaconda
Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。
a. 先去官方地址下载好对应的安装包
下载地址:https://www.anaconda.com/download/#linux
或使用国内源下载速度较快:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
b.然后安装anaconda
bash ~/Downloads/Anaconda3-2023.03-Linux-x86_64.sh (bash ~/安装包位置/安装包名称)
全部选yes,anaconda会自动将环境变量添加到PATH里面,如果后面你发现输出conda提示没有该命令,那么你需要执行命令 source ~/.bashrc 更新环境变量,就可以正常使用了。 如果发现这样还是没用,那么需要添加环境变量。 编辑~/.bashrc 文件,在最后面加上
export PATH=/home/主机名称/anaconda3/bin:$PATH
注意:路径应改为自己机器上的路径
保存退出后执行: source ~/.bashrc 再次输入 conda list 测试看看,应该没有问题。
c.添加Aanaconda国内镜像配置
添加Aanaconda国内镜
conda config —add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config —add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config —set show_channel_urls yes像配置
二.安装pytorch,onnx
首先为pytorch创建一个anaconda虚拟环境,python=3.10,环境名字可自己确定,这里本人使用yolov5作为环境名:
conda create -n yolov5 python=3.10
进入创建的yolov5环境
conda activate yolov5
安装关键包ONNX
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple onnx
安装yolov5依赖的pytorch
pip install torch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0
三.yolov5项目克隆和安装
1.克隆yolov5项目
git clone -b (下载指定版本或下载最新把-b去掉即可)https://github.com/ultralytics/yolov5.git
2.使用清华源安装所需库
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
3.下载与训练的权重文件
在https://pypi.tuna.tsinghua.edu.cn/simple 中找到下载版本的权重文件,并并放置在育yolov5文件夹下
4.安装测试
在yolov5路径下执行:python detect.py
5.pytorch的pt模型文件转onnx
BPU的工具链没有支持onnx的所有版本的算子,即当前BPU支持onnx的opset版本为10和11,执行:
python export.py —weights yolov5s.pt —include onnx —opset 11
转换成功后,控制台显示如下log信息,转换模型造yolov5文件夹下
四.ONNX模型转换
安装docker
可以使用鱼香ros一键安装Docker,安装完成之后输入命令sudo docker pull openexplorer/ai_toolchain_centos_7:v1.13.6之后自动开始docker的安装。配置天工开物OpenExplorer
OpenExplorer工具包的下载,需要wget支持,在ubuntu中安装wget, sudo apt-get install wget ,参考官网信息https://developer.horizon.ai/forumDetail/136488103547258769,
下载horizon_xj3_open_explorer
CPU Docker:
wget -c ftp://vrftp.horizon.ai/Open_Explorer_gcc_9.3.0/2.5.2/docker_openexplorer_ubuntu_20_xj3_cpu_v2.5.2_py38.tar.gz
启动docker
这一部分文件我参考https://blog.csdn.net/Zhaoxi_Li/article/details/125516265的文件
天工开物OpenExplorer根目录:
我的环境下是"/home/bingda/dd/horizon_xj3_openexplorer_v2.5.2_py38_doc"记得加双引号防止出现空格,该目录要挂载在docker中/open_explorer的目录下:
sudo docker run -it --rm -v "/home/bingda/dd/horizon_xj3_openexplorer_v2.5.2_py38_doc":/open_explorer-v "home/bingda/dd/Codes":/data/horizon_x3/codes \openexplorer/ai_toolchain_centos_7:v1.13.6已经成功通过Docker镜像进入了完整的工具链开发环境。 可以键入 hb_mapper --help命令验证下是否可以正常得到帮助信息。其中hb_mapper --help是工具链的一个常用工具。
创建一个文件(我这里角yolo)中,,把前面转好的yolov5s.onnx放进这个文件夹里,输入:
sudo docker run -it --rm -v "/home/bingda/dd/yolo":/bpucodes openexplorer/ai_toolchain_centos_7:v1.13.6
在docker中,进入bpucodes
模型检查
文件夹,开始我们的模型转换。输入指令hb_mapper checker --model-type onnx --march bernoulli2 --model yolov5s.onnx
开始检查模型,显示如下内容表示模型检查通过。
校准数据参考 https://blog.csdn.net/Zhaoxi\_Li/article/details/125516265
中yolov3的校准代码,输入prepare_calibration_data.py可以得到校准数据。
# 修改输入图像大小为640x640#img = imequalresize(img, (640, 640))# 指定输出的校准图像根目录
dst_root = '/data/horizon_x3/codes/yolov5/bpucodes/calibration_data
开始转换BPU模型
输入命令hb_mapper makertbin --config convert_yolov5s.yaml --model-type onnx
开始转换我们的模型。校准过后会输出每一层的量化损失,转换成功后,得到model_output/yolov5s.bin,这个文件拿出来,拷贝到旭日X3派上使用,它也是我们上板运行所需要的模型文件。
五.上板运行
文件准备
下载百度云的文件,拷贝到旭日X3派开发板中,其中yolov5s.bin就是我们转换后的模型,coco_classes.names仅用在画框的时候,如果用自己的数据集的话,参考coco_classes.names创建个新的名字文件即可。
输入sudo apt-get install libopencv-dev安装opencv库,之后进入代码根目录,输入python3 setup.py build_ext —inplace,编译后处理代码,得到lib/pyyolotools.cpython-38-aarch64-linux-gnu.so文件。
运行推理代码
模型推理的代码可参考https://blog.csdn.net/Zhaoxi\_Li/article/details/126651890
其中yolotools.pypostprocess_yolov5为C++实现的后处理功能。
这里补充旭日x3通过opencv调用摄像头,对每个图像进行实时处理
import numpy as npimport cv2import osfrom hobot_dnn import pyeasy_dnn as dnnfrom bputools.format_convert import imequalresize, bgr2nv12_opencvimport lib.pyyolotools as yolotoolsdef get_hw(pro):if pro.layout == "NCHW":return pro.shape[2], pro.shape[3]else:return pro.shape[1], pro.shape[2]def format_yolov5(frame):row, col, _ = frame.shape_max = max(col, row)result = np.zeros((_max, _max, 3), np.uint8)result[0:row, 0:col] = framereturn result# # img_path 图像完整路径# img_path = '20220904134315.jpg'# model_path 量化模型完整路径model_path = 'yolov5s.bin'# 类别名文件classes_name_path = 'coco_classes.names'# 设置参数thre_confidence = 0.4thre_score = 0.25thre_nms = 0.45# 框颜色设置colors = [(255, 255, 0), (0, 255, 0), (0, 255, 255), (255, 0, 0)]#利用opencv读取摄像头,对每个图像进行实时处理cap = cv2.VideoCapture(0)i = 0while (1):ret, imgOri = cap.read()# 1. 加载模型,获取所需输出HWmodels = dnn.load(model_path)model_h, model_w = get_hw(models[0].inputs[0].properties)print(model_h, model_w)# 2 加载图像,根据前面模型,转换后的模型是以NV12作为输入的# 但在OE验证的时候,需要将图像再由NV12转为YUV444inputImage = format_yolov5(imgOri)img = imequalresize(inputImage, (model_w, model_h))nv12 = bgr2nv12_opencv(img)# 3 模型推理t1 = cv2.getTickCount()outputs = models[0].forward(nv12)t2 = cv2.getTickCount()outputs = outputs[0].buffer # 25200x85x1print('time consumption {0} ms'.format((t2-t1)*1000/cv2.getTickFrequency()))# 4 后处理image_width, image_height, _ = inputImage.shapefx, fy = image_width / model_w, image_height / model_ht1 = cv2.getTickCount()class_ids, confidences, boxes = yolotools.pypostprocess_yolov5(outputs[0][:, :, 0], fx, fy,thre_confidence, thre_score, thre_nms)t2 = cv2.getTickCount()print('post consumption {0} ms'.format((t2-t1)*1000/cv2.getTickFrequency()))# 5 绘制检测框with open(classes_name_path, "r") as f:class_list = [cname.strip() for cname in f.readlines()]t1 = cv2.getTickCount()for (classid, confidence, box) in zip(class_ids, confidences, boxes):color = colors[int(classid) % len(colors)]cv2.rectangle(imgOri, box, color, 2)cv2.rectangle(imgOri, (box[0], box[1] - 20), (box[0] + box[2], box[1]), color, -1)cv2.putText(imgOri, class_list[classid], (box[0], box[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, .5, (0,0,0))t2 = cv2.getTickCount()print('draw rect consumption {0} ms'.format((t2-t1)*1000/cv2.getTickFrequency()))# print('draw rect consumption {0} inputImage = format_yolov5(imgOri)')img = imequalresize(inputImage, (model_w, model_h))nv12 = bgr2nv12_opencv(img)k = cv2.waitKey(1)if k == 27: # 按下ESC退出窗口breakelif k == ord('s'): # 按下s保存图片cv2.imwrite('./' + str(i) + '.jpg', imgOri)i += 1cv2.imshow("capture", imgOri)cap.release()
输入sudo python3 inference_bpu.py,效果演示如下图
六.利用Cython封装后处理代码
①写后处理的C++代码
首先,创建头文件yolotools.h,用来记录函数声明,方便其他代码调用。因为Cython调用时,调用C++的一些类并不方便,所以写成C语言接口更方便调用。后处理的函数名为postprocess_yolov5,创建 yolov5postprocess.cpp来对后处理函数进行实现。
②写Cython所需的Pyx文件
同级目录下创建pyyolotools.pyx,切记文件名不要跟某个CPP重复了,因为cython会将pyyolotools.pyx转为pyyolotools.cpp,如果有重复的话可能会导致文件被覆盖掉。
③写编译Pyx所需的python代码
创建setup.py文件,将下面代码放进去,配置好opencv的头文件目录、库目录、以及所需的库文件。在Extension中配置封装的函数所依赖的文件,然后在控制台输入python3 setup.py build_ext —inplace即 。
参考链接:
- 分享
- 举报
暂无数据-
浏览量:2593次2023-12-19 16:06:28
-
浏览量:2794次2024-02-23 17:41:04
-
浏览量:1516次2023-06-02 17:42:09
-
浏览量:3901次2024-01-18 18:05:38
-
浏览量:4202次2022-11-22 09:58:36
-
浏览量:3650次2022-11-22 09:26:53
-
浏览量:5196次2022-10-31 15:07:27
-
浏览量:4419次2022-11-22 10:37:11
-
浏览量:2399次2022-03-16 09:00:14
-
浏览量:5252次2024-02-05 10:41:25
-
浏览量:4237次2024-01-22 17:46:51
-
浏览量:2843次2024-03-06 16:15:59
-
浏览量:1805次2023-07-20 11:05:58
-
浏览量:5580次2023-10-13 17:55:36
-
浏览量:4398次2020-12-28 10:36:15
-
浏览量:3191次2024-01-05 16:46:11
-
浏览量:8528次2022-07-29 18:09:52
-
浏览量:4101次2024-02-20 13:54:36
-
浏览量:5975次2021-02-18 16:03:22
-
20篇
- 华为HMS Core 5.0上线,麒麟平台开放能力再次升级
- 运行海思 sample 代码
- [python opencv 计算机视觉零基础到实战] 十四 直方图颜色提鲜
- 海思固定IP
- 使用 OpenCV 的 SIFT 图像特征提取和匹配
- [python opencv 计算机视觉零基础到实战] 二、 opencv文件格式与摄像头读取
- 用OpenCV进行USB摄像头调用,并解决1080p下延迟卡顿问题的学习笔记
- 海思3531A解码this is a field stream and vdec do not support! chn 3
- YUV420SP图像char*与OpenCV的Mat格式的相互转换
- 六大主流语言代码漏洞分析报告出炉,C++开发居然漏洞这么多!
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
Tony
微信支付举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明

微信扫码分享
QQ好友