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

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

3天内不再提示

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

地瓜机器人 2022-12-14 10:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

环境配置

安装依赖包

如果在当前python环境下能利用pip install onnx轻松安装onnx,直接配置YOLOv5的环境即可;如果环境安装有一些限制,建议跑模型的python环境为3.10。

# 在指定路径下创建虚拟环境,我的anaconda安装在c盘,但我想把环境放在d盘,所以利用--prefix D:\Anaconda3\envs\yolov5指定路径 conda create --prefix D:\Anaconda3\envs\yolov5 python=3.10 # 切换虚拟环境 conda activate D:\Anaconda3\envs\yolov5 # 安装关键包ONNX pip install -i https://pypi.tuna.tsinghua.edu.cn/simple onnx # 安装yolov5依赖的pytorch pip install "torch-1.11.0+cu113-cp310-cp310-win_amd64.whl" "torchaudio-0.11.0+cu113-cp310-cp310-win_amd64.whl" "torchvision-0.12.0+cu113-cp310-cp310-win_amd64.whl" -i https://pypi.tuna.tsinghua.edu.cn/simple # 安装yolov5需要的包 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

运行YOLOv5

下载文件,参照如下流程操作:

①解压yolov5-master.zip;

②将zidane.jpg放到yolov5-master文件夹中;

③将yolov5s.pt放到yolov5-master/models文件夹中;

④进入yolov5-master文件夹,输入python .\detect.py --weights .\models\yolov5s.pt --source zidane.jpg,代码会输出检测结果保存路径(以我为例:Results saved to runs\detect\exp9)检测结果如下所示。

1.png

PyTorch的pt模型文件转onnx

注意:BPU的工具链没有支持onnx的所有版本的算子,即当前BPU支持onnx的opset版本为10和11。

# 错误的转换指令 python .\export.py --weights .\models\yolov5s.pt --include onnx # 正确的转换指令 python .\export.py --weights .\models\yolov5s.pt --include onnx --opset 11

转换后,控制台会输出一些log信息,转换后的模型文件在.\models\yolov5s.pt。

export: data=D:\05 - \01 - x3\BPUCodes\yolov5\yolov5-master\data\coco128.yaml, weights=['.\\models\\yolov5s.pt'], imgsz=[640, 640], batch_size=1, device=cpu, half=False, inplace=False, train=False, keras=False, optimize=False, int8=False, dynamic=False, simplify=False, opset=12, verbose=False, workspace=4, nms=False, agnostic_nms=False, topk_per_class=100, topk_all=100, iou_thres=0.45, conf_thres=0.25, include=['onnx'] YOLOv5 2022-9-1 Python-3.10.4 torch-1.11.0+cu113 CPU Fusing layers... YOLOv5s summary: 213 layers, 7225885 parameters, 0 gradients PyTorch: starting from models\yolov5s.pt with output shape (1, 25200, 85) (14.1 MB) ONNX: starting export with onnx 1.12.0... ONNX: export success 3.6s, saved as models\yolov5s.onnx (28.0 MB) Export complete (4.2s) Results saved to D:\05 - \01 - x3\BPUCodes\yolov5\yolov5-master\models Detect: python detect.py --weights models\yolov5s.onnx Validate: python val.py --weights models\yolov5s.onnx PyTorch Hub: model = torch.hub.load('ultralytics/yolov5', 'custom', 'models\yolov5s.onnx') Visualize: https://netron.app

模型转换

新建一个文件夹bpucodes(可根据喜好自行命名),把前面转好的yolov5s.onnx放进这个文件夹里,在docker中,进入bpucodes文件夹,开始我们的模型转换。

(PS:模型转换需在docker中转换,怎么安装docker,怎么进入OE,怎么挂载硬盘等相关问题可在系列一中进行查看)

模型检查

模型检测的目的是检测有没有不支持的算子,输入指令hb_mapper checker --model-type onnx --march bernoulli2 --model yolov5s.onnx,开始检查模型,显示如下内容表示模型检查通过。这时可以发现网络的后端部分存在一些层是运行在CPU上的,这会导致耗时多一些。

2.png

准备校准数据

校准数据的代码参考系列一中的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派上使用,它也是我们上板运行所需要的模型文件。

3.png

上板运行

文件准备

下载百度云的文件,拷贝到旭日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文件。

4.png

运行推理代码

模型推理的代码如下所示,其中yolotools.pypostprocess_yolov5为C++实现的后处理功能,推理代码在我这里保存为inference_model_bpu.py。

import numpy as np import cv2 import os from hobot_dnn import pyeasy_dnn as dnn from bputools.format_convert import imequalresize, bgr2nv12_opencv # lib.pyyolotools为封装的库 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)] # 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 imgOri = cv2.imread(img_path) 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())) cv2.imwrite('res.png', imgOri)

输入sudo python3 inference_model_bpu.py,推理结果保存为res.png,相关结果如下所示,可以看出,后处理部分耗时为7ms,C++和Python混编有效提升了代码的运行速度。

5.png

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

本文转自地平线开发者社区
原作者:小玺玺

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

    关注

    57

    文章

    4857

    浏览量

    89585
  • BPU
    BPU
    +关注

    关注

    0

    文章

    4

    浏览量

    2175
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    迅为如何在RK3576上部署YOLOv5;基于RK3576构建智能门禁系统

    迅为如何在RK3576开发板上部署YOLOv5;基于RK3576构建智能门禁系统
    的头像 发表于 11-25 14:06 1066次阅读
    迅为如何在RK3576上<b class='flag-5'>部署</b><b class='flag-5'>YOLOv5</b>;基于RK3576构建智能门禁系统

    迅为Hi3403开发板极速启航 | 手把手带你玩转核心例程,轻松上手AI视觉!

    迅为Hi3403开发板极速启航 | 手把手带你玩转核心例程,轻松上手AI视觉!
    的头像 发表于 11-19 13:56 1272次阅读
    迅为Hi3403开发板极速启航 | <b class='flag-5'>手把手</b><b class='flag-5'>带你</b>玩转核心例程,轻松上手AI视觉!

    【RK3568 NPU实战】别再闲置你的NPU!手把手带你用迅为资料跑通Android AI检测Demo,附完整流程与效果

    【RK3568 NPU实战】别再闲置你的NPU!手把手带你用迅为资料跑通Android AI检测Demo,附完整流程与效果
    的头像 发表于 11-10 15:58 864次阅读
    【RK3568 NPU实战】别再闲置你的NPU!<b class='flag-5'>手把手</b><b class='flag-5'>带你</b>用迅为资料跑通Android AI检测Demo,附完整流程与效果

    基于瑞芯微RK3576的 yolov5训练部署教程

    1.Yolov5简介 YOLOv5 模型是 Ultralytics 公司于 2020 年 6 月 9 日公开发布的。YOLOv5 模型是基于 YOLOv3 模型基础上改进而来的,有
    的头像 发表于 09-11 16:43 2396次阅读
    基于瑞芯微RK3576的 <b class='flag-5'>yolov5</b>训练<b class='flag-5'>部署</b>教程

    yolov5训练部署全链路教程

    1.Yolov5简介YOLOv5模型是Ultralytics公司于2020年6月9日公开发布的。YOLOv5模型是基于YOLOv3模型基础上改进而来的,有
    的头像 发表于 07-25 15:22 1343次阅读
    <b class='flag-5'>yolov5</b>训练<b class='flag-5'>部署</b>全链路教程

    RT-Thread Nano硬核移植指南:手把手实现VGLite图形驱动适配 | 技术集结

    VGLite是NXP提供的轻量级2D图形API,本文将手把手带你实现VGLite图形驱动适配RT-Thread。文章分为上、下两篇,将手把手教您移植。上篇对RT-ThreadNano内核与Finsh组件进行移植,下篇则教您改写S
    的头像 发表于 07-17 14:40 3041次阅读
    RT-Thread Nano硬核移植指南:<b class='flag-5'>手把手</b>实现VGLite图形驱动适配 | 技术集结

    在K230上部署yolov5时 出现the array is too big的原因?

    重现步骤 1将yolov5的kmodel放入k230的data数据 2使用yolo大作战里的视频流推理代码 3运行 期待结果和实际结果 期待的结果 将目标检测的框圈起来 实际看到的结果
    发表于 05-28 07:47

    RV1126 yolov8训练部署教程

    YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的基于YOLOV5进行更新的 下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,鉴于Yolov5的良好表现,
    的头像 发表于 04-16 14:53 1140次阅读
    RV1126 <b class='flag-5'>yolov</b>8训练<b class='flag-5'>部署</b>教程

    OrinNano yolov11训练部署教程

    ORinNano yolov11训练部署教程
    的头像 发表于 04-10 15:26 2227次阅读
    OrinNano  <b class='flag-5'>yolov</b>11训练<b class='flag-5'>部署</b>教程

    请问如何在imx8mplus上部署和运行YOLOv5训练的模型?

    我正在从事 imx8mplus yocto 项目。我已经在自定义数据集上的 YOLOv5 上训练了对象检测模型。它在 ubuntu 电脑上运行良好。现在我想在我的 imx8mplus 板上运行该模型
    发表于 03-25 07:23

    yolov5转onnx在cubeAI进行部署部署失败的原因?

    第一个我是转onnx时 想把权重文件变小点 就用了半精度 --half,则说17版本不支持半精度 后面则是没有缩小的单精度 但是显示哪里溢出了···· 也不说是哪里、、。。。 到底能不能部署yolov5这种东西啊?? 也没看见几个部署
    发表于 03-07 11:38

    【ELF 2学习板试用】ELF2开发板(飞凌嵌入式)部署yolov5s的自定义模型

    /rknn_model_zoo-2.1.0/examples/yolov5/python# python3 ./convert.py ../model/yolov5s_hat.onnx rk3588 I
    发表于 02-04 18:15

    【ELF 2学习板试用】ELF2开发板(飞凌嵌入式)搭建深度学习环境部署(RKNN环境部署

    使用的是WSL2系统,当然使用虚拟机也是可以的,本人主要教学搭建yolov5模型转换为rknn的环境搭建,以及基本步骤,从该文章您可以学习到rk3588等瑞芯微芯片的所有模型环境部署 安装docker
    发表于 02-04 14:15

    手把手教你做星闪无人机》即将开播,锁定15日晚七点!

    KaihongOS手把手系列直播课再度来袭为助力开发者迅速掌握『KaihongOS轻量系统开发技术』与『星闪无线通信技术』,实现快速上手与深度体验,“开鸿Developer社区”携手“手电子发烧友
    的头像 发表于 01-13 19:42 879次阅读
    《<b class='flag-5'>手把手</b>教你做星闪无人机》即将开播,锁定15日晚七点!

    采用华为云 Flexus 云服务器 X 实例部署 YOLOv3 算法完成目标检测

    一、前言 1.1 开发需求 这篇文章讲解: 采用华为云最新推出的 Flexus 云服务器 X 实例部署 YOLOv3 算法,完成图像分析、目标检测。 随着计算机视觉技术的飞速发展,深度学习模型如
    的头像 发表于 01-02 12:00 1026次阅读
    采用华为云 Flexus 云服务器 <b class='flag-5'>X</b> 实例<b class='flag-5'>部署</b> <b class='flag-5'>YOLOv3</b> 算法完成目标检测