当前位置:   article > 正文

Yolov5目标检测+Unet多类别分割C++(onnx联合部署)详细教程_yolov5c++部署

yolov5c++部署

这篇主要内容就是yolo目标检测网络和Unet语义分割网络的联合C++部署。用到yolo主要是为了节省Unet部分的计算资源和分割精度,因为检测框会将非目标物删除,这样分割网络只需分割目标框内的二维信息即可。

开始吧,

计划已经制定,那就分四步走:

1、数据标注和yolo训练

这个网上有很多优秀的教程,可以借鉴参考,此处不赘述。

2、yolo的C++部署

我使用的是yolov5训练的,yolov7也是大致相同的部署方式。yolov7和yolov5差距并不大,且yolov5部署后的速度更快一些,精度的话yolov7更优,看自己的需求了。

首先,将训练好的yolo权重文件(也就是.pt文件)转成onnx,这一步官方代码的export.py可实现,其他的优化、剪枝等操作本篇不做介绍,这些网上也有很多教程,感兴趣的可以多多学习,在网络模型部署时(尤其是终端部署)会用到。

好了,这时候我们有了一个yolo的onnx文件,可以放到Netron查看输入输出的维度,看看结构也有助于对神经网络的理解。这时候我们就可以开始创建一个新的C++项目,新建一个头文件和源文件。这里需要用到Opencv里面的图片读写和Dnn模块(支持对神经网络的调用),我使用的时opencv455(也可以使用其他更高的版本)。

头文件代码如下:

  1. #include<iostream>
  2. #include<opencv2/opencv.hpp>
  3. struct Output {
  4. int id; //结果类别id
  5. float confidence; //结果置信度
  6. cv::Rect box; //矩形框
  7. };
  8. class Yolo {
  9. public:
  10. Yolo() {
  11. }
  12. ~Yolo() {}
  13. bool readModel(cv::dnn::Net& net, std::string& netPath, bool isCuda);
  14. bool Detect(cv::Mat& SrcImg, cv::dnn::Net& net, std::vector<Output>& output);
  15. void drawPred(cv::Mat& img, std::vector<Output> result, int i);
  16. private:
  17. float sigmoid_x(float x)
  18. {
  19. return static_cast<float>(1.f / (1.f + exp(-x)));
  20. }
  21. const float netAnchors[3][6] = { { 10, 13, 16, 30, 33, 23 }, { 30, 61, 62, 45, 59, 119 }, { 116, 90, 156, 198, 373, 326 } };//yolo anchors
  22. const int netWidth = 640; //ONNX图片输入宽度
  23. const int netHeight = 640; //ONNX图片输入高度
  24. const int strideSize = 3; //stride size
  25. const float netStride[4] = { 8, 16.0,32,64 };
  26. float boxThreshold = 0.75;
  27. float classThreshold = 0.65;
  28. float nmsThreshold = 0.55;
  29. float nmsScoreThreshold = boxThreshold * classThreshold;
  30. std::vector<std::string> className = { "yolo类别"};
  31. };

其中的anchor在训练的时候,网络会给到你,将你的anchor替换即可。

源文件如下:

  1. #include "头文件.h"
  2. #include <iostream>
  3. #include<opencv2//opencv.hpp>
  4. #include<math.h>
  5. #include <opencv2/dnn.hpp>
  6. #include <fstream>
  7. #define USE_CUDA false //可以使用cuda加速
  8. using namespace std;
  9. using namespace cv;
  10. using namespace dnn;
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/311659
推荐阅读
相关标签
  

闽ICP备14008679号