0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用旭日X3派的BPU部署Yolov5

新机器视觉 来源:新机器视觉 2023-04-26 14:20 次阅读

本次主要介绍在旭日x3的BPU中部署yolov5。首先在ubuntu20.04安装yolov5,并运行yolov5并使用pytoch的pt模型文件转ONNX;

然后将ONNX模型转换BPU模型;最后上板运行代码测试,并利用Cypython封装后处理代码。

一. 安装Anaconda

Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。

a. 先去官方地址下载好对应的安装包

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文件夹下

0da5cf94-e352-11ed-ab56-dac502259ad0.jpg

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文件夹下

0dc00b0c-e352-11ed-ab56-dac502259ad0.jpg

四. 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是工具链的一个常用工具。

0ddc96a0-e352-11ed-ab56-dac502259ad0.jpg

创建一个文件(我这里角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,

开始检查模型,显示如下内容表示模型检查通过。

0df39a30-e352-11ed-ab56-dac502259ad0.jpg

校准数据参考以下的yolov3校准代码:

https://blog.csdn.net/Zhaoxi_Li/article/details/125516265

输入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文件。

0e07960c-e352-11ed-ab56-dac502259ad0.jpg

运行推理代码

模型推理的代码可参考https://blog.csdn.net/Zhaoxi_Li/article/details/126651890,其中yolotools.pypostprocess_yolov5为C++实现的后处理功能。

这里补充旭日x3通过opencv调用摄像头,对每个图像进行实时处理

import numpy as np
import cv2
import os
from hobot_dnn import pyeasy_dnn as dnn
from bputools.format_convert import imequalresize, bgr2nv12_opencv


import lib.pyyolotools as yolotools


def 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] = frame
  return result


# # img_path 图像完整路径
# img_path = '20220904134315.jpg'


# model_path 量化模型完整路径
model_path = 'yolov5s.bin'
# 类别名文件
classes_name_path = 'coco_classes.names'
# 设置参数
thre_confidence = 0.4
thre_score = 0.25
thre_nms = 0.45
# 框颜色设置
colors = [(255, 255, 0), (0, 255, 0), (0, 255, 255), (255, 0, 0)]


#利用opencv读取摄像头,对每个图像进行实时处理
cap = cv2.VideoCapture(0)
i = 0
while (1):
  ret, imgOri = cap.read()


  # 1. 加载模型,获取所需输出HW
  models = dnn.load(model_path)
  model_h, model_w = get_hw(models[0].inputs[0].properties)
  print(model_h, model_w)
  # 2 加载图像,根据前面模型,转换后的模型是以NV12作为输入的
  # 但在OE验证的时候,需要将图像再由NV12转为YUV444
  inputImage = 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 # 25200x85x1 
  print('time consumption {0} ms'.format((t2-t1)*1000/cv2.getTickFrequency()))


  # 4 后处理
  image_width, image_height, _ = inputImage.shape
  fx, fy = image_width / model_w, image_height / model_h
  t1 = 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退出窗口
    break
  elif k == ord('s'): # 按下s保存图片
    cv2.imwrite('./' + str(i) + '.jpg', imgOri)
    i += 1
  cv2.imshow("capture", imgOri)
cap.release()

输入sudo python3 inference_bpu.py,效果演示如下图

0e1c01be-e352-11ed-ab56-dac502259ad0.jpg

六. 利用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即 。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11236

    浏览量

    209024
  • Ubuntu
    +关注

    关注

    5

    文章

    562

    浏览量

    29616
  • 模型
    +关注

    关注

    1

    文章

    3184

    浏览量

    48763
  • python
    +关注

    关注

    56

    文章

    4784

    浏览量

    84502
  • 镜像
    +关注

    关注

    0

    文章

    164

    浏览量

    10701

原文标题:使用旭日X3派的BPU部署Yolov5

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【地平线旭日X3试用体验】开箱与板载资源介绍视频

    本视频为地平线旭日X3的开箱视频,讲解板载资源.
    发表于 07-10 00:14

    【地平线旭日X3试用体验】开箱篇硬件介绍

    的GPIO信号,基本可以满足各种各样的机器人开发啦。旭日X3的硬件资源,CPU配置:不是树莓,胜似树莓。CPU是四核A53,频率1.2Hz,在系统内还可以进行超频,BPU就是硬件级的
    发表于 07-26 19:13

    【 地平线旭日X3试用体验】01. X3开箱及上手

    1、开箱突然一天接到地平线官方小姐姐的电话说我的X3申请试用通过了,确实让我有点意外被选中成为试用者,非常感谢地平线官方和电子发烧友开展本次旭日X3
    发表于 08-09 17:32

    #旭日X3首百尝鲜# 用solidworks画了一个旭日X3的模型

    前几天突然看到了一个树莓的炫酷电脑机箱外壳,想着也给旭日X3安排一个。在设计机箱之前需要先有旭日X3
    发表于 08-31 11:18

    【 地平线旭日X3试用体验】地平线旭日X3AGV智能车设计

    本项目是做一个基于地平线旭日X3ROS-SLAM激光雷达自主导航AGV机器人原型设计。地平线旭日X3
    发表于 09-12 19:25

    解决旭日X3串口登陆时,控制窗口小的情况

    一键解决旭日X3串口登陆控制窗口过小……
    的头像 发表于 07-13 15:02 715次阅读
    解决<b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>串口登陆时,控制窗口小的情况

    旭日X3烧录最小启动固件

    手把手烧录旭日X3开发板最小启动镜像
    的头像 发表于 07-18 14:24 646次阅读
    <b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>烧录最小启动固件

    #旭日X3首百尝鲜#旭日x3移植mjpg-streamer

    「地平线旭日X3,开启你的嵌入式开发之旅」,欢迎正在阅读的你一起交流开发心得
    的头像 发表于 08-10 14:17 1081次阅读
    #<b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>首百尝鲜#<b class='flag-5'>旭日</b><b class='flag-5'>x3</b><b class='flag-5'>派</b>移植mjpg-streamer

    旭日,从地平线升起——地平线旭日X3开箱试用

    地平线旭日X3,开启你的嵌入式开发之旅
    的头像 发表于 11-08 15:22 1600次阅读
    <b class='flag-5'>旭日</b>,从地平线升起——地平线<b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>开箱试用

    旭日X3更新最小启动固件

    本文介绍通过更新旭日X3的最小启动固件的方式来提高SD卡的兼容性
    的头像 发表于 11-10 10:27 768次阅读
    <b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>更新最小启动固件

    旭日X3首百尝鲜 | 借助旭日X3玩转智能家居

    、自动化等。考虑到智能家居的实用性和经济型,一直开机、永远在线、低功耗、高性能的地平线旭日®X3是开发者的不二选择……
    的头像 发表于 11-28 17:29 638次阅读
    <b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>首百尝鲜 | 借助<b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>玩转智能家居

    旭日X3BPU部署教程系列之带你轻松走出模型部署新手村

    BPU,是地平线自主研发的可编程AI加速引擎,相比GPU昂贵的价格,使用地平线旭日®X3BPU进行推理
    的头像 发表于 11-29 14:37 1143次阅读
    <b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b><b class='flag-5'>BPU</b><b class='flag-5'>部署</b>教程系列之带你轻松走出模型<b class='flag-5'>部署</b>新手村

    旭日X3BPU部署教程系列之手把手带你成功部署YOLOv5

    平线旭日X3BPU进行推理部署,在地平线“芯片+算法+工具链+开发平台”的模式基础之上,使之成为经济有效、高效开源的推理方案之一……
    的头像 发表于 12-14 10:57 1405次阅读
    <b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b><b class='flag-5'>BPU</b><b class='flag-5'>部署</b>教程系列之手把手带你成功<b class='flag-5'>部署</b><b class='flag-5'>YOLOv5</b>

    平平无奇纵享丝滑,旭日X3高速网络新体验

    地平线旭日®X3(下文简称旭日X3)作为一款用于机器人的板子,在应用中除了需要高性能
    的头像 发表于 02-21 14:43 801次阅读
    平平无奇纵享丝滑,<b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>高速网络新体验

    旭日X3遇上ChatGPT,我们能「chat」什么

    地平线旭日®X3(下文简称旭日X3)是一款拥有着高算力,面向生态开发者的嵌入式开发板,可用于
    的头像 发表于 02-24 11:07 754次阅读
    当<b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>遇上ChatGPT,我们能「chat」什么