c ++ opencv dnn详解编写yolov5 onnx推理代码

本文详细介绍了如何使用OpenCV的DNN模块编写C++代码来运行Yolov5的ONNX模型进行推理。内容包括数据加载、模型加载、硬件加速、网络构建、数据对象转换、推理输出以及后处理和结果可视化的步骤。提供的代码经过验证,可正常运行。
摘要由CSDN通过智能技术生成

opencv dnn编写yolov5推理代码详解

代码可以跑通的。

1、数据加载和模型加载

net = dnn::readNetFromONNX(onnxfile);
Mat src = imread(testfile);

2、使用硬件推理

// 采用cpu推理
net.setPreferableBackend(dnn::DNN_BACKEND_OPENCV);
net.setPreferableTarget(dnn::DNN_TARGET_CPU);
// 采用gpu推理
net.setPreferableBackend(dnn::DNN_BACKEND_CUDA);
net.setPreferableTarget(dnn::DNN_TARGET_CUDA_FP16);

3、网络建立以及数据对象转换

// 是将输入的图像转换成一个blob对象,该对象里对图像的数据结构进行了封装,可以用于深度学习输入
Mat inputBlob = dnn::blobFromImage(src, 1.0 / 255, Size(640, 640), Scalar(), true, false);
net.setInput(inputBlob);    //net模型里输入blob对象
Mat output = net.forward();  //预测结果 

4、推理结果输出以及后处理

vector<Rect> boxes;  //建立一个rect类型数据,存放bbox
vector<float> confidences;
vector<int> classIds;
vector<int> indexs;
void deal_pred(Mat& img, Mat& preds, vector<Rect>& boxes, vector<float>& confidences, vector<int>& classIds, vector<int>& indexs)
{
   
    float w_ratio = img.cols / 640.0; //图像归一化
    float h_ratio = img.rows / 640.0;
    cout << "size1:" << preds.size[1] << endl;
    cout << "size2:" << preds.size[2] << endl;
    //创建一个矩阵,类型是CV_32F,存储85类的数据 85行*25200列
    Mat data(preds.size[1], preds.size[2], CV_32F, preds.ptr<float>());
    // data.rows=data(preds.size[2]), 25200= (20 * 20 + 40 * 40 + 80 * 80) * 3(其中,3指的是每个格子有3个不同大小anchor,20,40,80划分区域尺寸)
    for (int i = 0; i < data.rows; i++)
    {
   
    	//每一行的,前五个是需要的xywh score
    	// Mat.at(i,j) mat矩阵第i行第j列
        float conf = data.at<float>(i, 4);  //每一行的第5个是score(一共是(85*25200个数据))
        if (conf < 0.45)
        {
   
            continue;
        }
        //第一个参数是x、y、w、h、score(5个),第二个参数是类别数目,所以后面参数为5+80=85
        Mat clsP = data.row(i).colRange(5, 85);  // 为指定列创建一个新的矩阵()
        Point IndexId;
        double score;
     
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值