yolo系列的ONNX部署(C++)【适用于v4\v5\v5-6.1\v7】

简介: yolo系列的ONNX部署(C++)【适用于v4\v5\v5-6.1\v7】

前言


  首先感谢bubbliiiing博主提供的训练代码! 整个部署程序分为四步(C++):


  1. 下载bubbliiiing博主项目更改predict 为 export_onnx\


  1. 更改文件夹nets下的yolo.py代码\


  1. 生成onnx文件


  1. 下载此项目进行cmake&make 经测试,可以对(pytorch版本的)yolov4 -- yolov5 -- yolov5-6.1 yolov7 进行转换测试 由于bubbliiiing博主已经将网络结构和如何训练,我这边就不再过多的讲述如何训练。




如何使用?


  这里我以yolov7为例子向大家展示如何得到onnx以及运行onnx进行部署(bubbliiiing博主v4>>v5>>v5-6.1同理)



Step1:


git clone github.com/bubbliiiing…cd yolov7-pytorch

pip install -r requirements.txt

vim predict.py


line24: mode = "export_onnx" ## predict >> 'export_onnx'
复制代码




Step2:


cd /nets


vim yolo.py


line300 ----line316:
        #---------------------------------------------------#
        #   第三个特征层
        #   y3=(batch_size, 75, 80, 80)
        #---------------------------------------------------#
        out2 = self.yolo_head_P3(P3)
        #---------------------------------------------------#
        #   第二个特征层
        #   y2=(batch_size, 75, 40, 40)
        #---------------------------------------------------#
        out1 = self.yolo_head_P4(P4)
        #---------------------------------------------------#
        #   第一个特征层
        #   y1=(batch_size, 75, 20, 20)
        #---------------------------------------------------#
        out0 = self.yolo_head_P5(P5)
        return [out0, out1, out2]
复制代码


如下图为bubbliiiing博主源码生成的onnx输入输出信息截取

image.png


 bubbliiiing 这里的return[out0, out1, out2] 在经过"export_onnx"后并没有torch.cat,我们需要将输出的结果进行torch.cat操作, 在进行torch.cat操作之前需要将输出结果进行转换一下维度,详见如下代码:


out2 = self.yolo_head_P3(P3)
        bs, _, ny, nx = out2.shape  
        # 这里的 no = 85[类别数nc(80) + 目标坐标和置信度(4+1)]
        out2 = out2.view(bs, 3, 85, ny, nx).permute(0, 1, 3, 4, 2).contiguous() # no = 85
        out2 = out2.view(bs * 3 * ny * nx, 85, 1).contiguous() #  no = 85
        # ---------------------------------------------------#
        #   第二个特征层
        # ---------------------------------------------------#
        out1 = self.yolo_head_P4(P4)
        bs, _, ny, nx = out1.shape
        out1 = out1.view(bs, 3, 85, ny, nx).permute(0, 1, 3, 4, 2).contiguous() #  no = 85
        out1 = out1.view(bs * 3 * ny * nx, 85, 1).contiguous() #  no = 85
        # ---------------------------------------------------#
        #   第一个特征层
        # ---------------------------------------------------#
        out0 = self.yolo_head_P5(P5)
        bs, _, ny, nx = out0.shape
        out0 = out0.view(bs, 3, 85, ny, nx).permute(0, 1, 3, 4, 2).contiguous() #  no = 85
        out0 = out0.view(bs * 3 * ny * nx, 85, 1).contiguous() #  no = 85
        output = torch.cat((out2, out1, out0))
        output = output.permute(2, 0, 1)
        # return [out0, out1, out2]
        return output
复制代码


  使用上述的代码部分替代源代码的line300 至 line316: 更换后得到的信息下图所示


image.png


大家在更换自己的数据集进行训练得到的权重进行pth2onnx时需要注意:上述代码注释部分的更换85(coco数据集的类别数+5), 在这里需要更换为自己的数据集的类别数再加上5。例如自己的数据集是10个类别(nc=10),那么这里的no=10+5 ;也就是85需要更改为15(no = nc + 5)



Step3:


cd ..

python predict.py

这样我们就可以得到C++调用onnx需要的权重



step4:


git clone github.com/kivenyangmi…
cd yolo-bubbliiiing-onnx
mkdir build
cd build
cmake ..
cmake --build .    (或者:make)






相关文章
|
2月前
|
存储 计算机视觉 异构计算
使用python&C++对bubbliiiing的yolo系列进行opencv.dnn进行推理部署
使用python&C++对bubbliiiing的yolo系列进行opencv.dnn进行推理部署
36 0
|
2月前
|
缓存 并行计算 C++
实践教程|旋转目标检测模型-TensorRT 部署(C++)
实践教程|旋转目标检测模型-TensorRT 部署(C++)
37 0
|
3月前
|
人工智能 Shell 编译器
C/C++编译工具:makefile | AI工程化部署
Makefile是一种用于管理和组织源代码的工具,通常用于构建和编译软件项目。它由一系列规则组成,每个规则指定如何生成一个或多个目标文件。Makefile也包括变量和注释,使得用户能够灵活地配置和定制构建过程。【1月更文挑战第3天】
136 3
|
1月前
|
存储 C++ Python
C++版本netCDF在Visual Studio中的部署
【2月更文挑战第20天】本文介绍在Windows电脑的Visual Studio软件中,配置C++语言最新版netCDF库的方法~
C++版本netCDF在Visual Studio中的部署
|
3月前
|
文字识别 编译器 C++
win10 PaddleOCR c++ cpu部署
win10 PaddleOCR c++ cpu部署
112 0
|
3月前
|
人工智能 C++ 计算机视觉
C/C++编译工具:cmake | AI工程化部署
CMake 是一个跨平台的开源构建工具,用于管理软件构建流程。它使用一个名为 CMakeLists.txt 的文本文件来描述构建过程。【1月更文挑战第4天】
154 0
|
4月前
|
存储 人工智能 Java
c++类 | AI工程化部署
在面向对象的编程语言中,类是一种用来描述对象的模板或蓝图。它定义了对象的属性和行为,并可以用来创建对象实例
54 0
|
4月前
|
存储 程序员 C语言
C/C++内存操作 | AI工程化部署
在C/C++语言开发中,内存管理是非常重要的,大多Segmentation fault core问题都是因为内存操作不当导致的
28 0
|
11月前
|
机器学习/深度学习 编解码 Go
YOLOv5-Face | 原理超精细讲解、训练步骤还原、C++边缘部署(就要这么学!!!)(一)
YOLOv5-Face | 原理超精细讲解、训练步骤还原、C++边缘部署(就要这么学!!!)(一)
270 0
|
9月前
|
C++
C++采用Daemon进行后台程序部署
在C++中,如果要让一个程序一直在后台运行并且和终端会话分离,我们可以将其作为守护进程运行,以下是创建C++守护进程的一般步骤。
65 0

热门文章

最新文章