在VS2019环境下使用Opencv调用GPU版本YOLOv4算法的详细过程

以下是在VS2019环境下使用OpenCV调用GPU版本YOLOv4算法的详细攻略。

一、环境配置

  1. 安装Visual Studio 2019,选择C++工作负载并安装。
  2. 安装CUDA,推荐版本为CUDA 10.2。
  3. 安装cuDNN,需要与CUDA版本相对应。
  4. 安装OpenCV 4.x版本,需要包含CUDA、cuDNN的支持。
  5. 下载YOLOv4的代码和网络模型:https://github.com/AlexeyAB/darknet
  6. 下载相应配置文件yolov4.cfg和网络模型yolov4.weights,并放到darknet目录下。

二、VS2019项目配置

  1. 新建一个C++项目。在项目属性中进行如下设置:

  2. 将生成选项中的平台选项设置为x64。

  3. 配置属性->C/C++->常规->附加包含目录中,添加OpenCV和CUDA的include目录。
  4. 配置属性->连接器->常规->附加库目录中,添加OpenCV和CUDA的lib目录。
  5. 配置属性->连接器->输入->附加依赖项中,添加opencv_world4xx.lib、cudart_static.lib、cublas.lib、curand.lib、cudnn.lib、yolo_cpp_dll.lib。

  6. 将darknet目录下的src和include文件夹下所有源文件和头文件,添加到VS2019项目中,并在项目中生成yolo_cpp_dll.dll文件。

  7. 在项目中添加demo.cpp文件,并在其中编写调用YOLOv4算法的代码,以下为示例代码:

#include "YOLOv4.h"

int main()
{
    // 初始化YOLOv4
    YOLOv4 yolo;
    if (!yolo.Init())
        return -1;

    // 读取图片
    cv::Mat img = cv::imread("test_img.jpg");

    // 调用YOLOv4算法进行目标检测
    std::vector<BoundingBox> boxes = yolo.Detect(img);

    // 输出检测结果
    for (auto box : boxes)
    {
        std::cout << "class: " << box.class_id << ", confidence: " << box.confidence
            << ", bbox: (" << box.x << ", " << box.y << ", " << box.width << ", " << box.height << ")" << std::endl;
    }

    return 0;
}
  1. 在项目中添加YOLOv4.h和YOLOv4.cpp文件,以下为示例代码:

YOLOv4.h

#pragma once
#include <opencv2/opencv.hpp>
#include <vector>
#include <string>

struct BoundingBox
{
    int class_id;
    float x, y, width, height;
    float confidence;
};

class YOLOv4
{
public:
    bool Init();
    std::vector<BoundingBox> Detect(cv::Mat& img);
private:
    std::vector<std::string> m_class_names; // 目标类别的名称
};

YOLOv4.cpp

#include "YOLOv4.h"
#include "yolo_v4_class.hpp"
#include <iostream>

bool YOLOv4::Init()
{
    try
    {
        // 加载模型权重文件
        Detector detector("yolov4.cfg", "yolov4.weights");

        // 加载目标类别名称文件
        m_class_names = detector.get_names();

        return true;
    }
    catch (std::exception& e)
    {
        std::cerr << "Error: " << e.what() << std::endl;
        return false;
    }
}

std::vector<BoundingBox> YOLOv4::Detect(cv::Mat& img)
{
    std::vector<BoundingBox> boxes;

    try
    {
        // 调用算法进行目标检测
        Detector detector("yolov4.cfg", "yolov4.weights");
        auto results = detector.detect(img);

        // 处理检测结果
        for (auto result : results)
        {
            BoundingBox box;
            box.class_id = result.ClassID;
            box.x = result.Center.x - result.Width / 2;
            box.y = result.Center.y - result.Height / 2;
            box.width = result.Width;
            box.height = result.Height;
            box.confidence = result.Confidence;
            boxes.push_back(box);
        }
    }
    catch (std::exception& e)
    {
        std::cerr << "Error: " << e.what() << std::endl;
    }

    return boxes;
}

三、测试运行

编译并运行项目,在控制台中可以看到目标检测的结果。使用相应的配置文件和网络模型,可进行不同类别的物体检测。

以上便是在VS2019环境下使用OpenCV调用GPU版本YOLOv4算法的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在VS2019环境下使用Opencv调用GPU版本YOLOv4算法的详细过程 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 循环码、卷积码及其python实现

    摘要:本文介绍了循环码和卷积码两种编码方式,并且,作者给出了两种编码方式的编码译码的python实现 关键字:循环码,系统编码,卷积码,python,Viterbi算法 循环码的编码译码 设 (C) 是一个 (q) 元 ([n,n-r]) 循环码,其生成多项式为(g(x), text{deg}(g(x))=r)。显然,(C) 有 (n-r) 个信息位,(r)…

    2023年4月6日
    00
  • MATLAB中空间滤波卷积有什么作用 – @梅子

    MATLAB中空间滤波卷积有什么作用 空间的卷积相当于频域的乘积。 可以用来提取边缘,如利用sobel 拉普拉斯算子等,这种相当于频域中的高通滤波器。还有可以滤除噪声,如中值滤波,这种相当于频域中低通滤波器。 发表于 2009-12-25 14:23  @梅子  阅读(577)  评论(0)  编辑  收藏  举报  

    卷积神经网络 2023年4月8日
    00
  • 使用 Estimator 构建卷积神经网络

    1,tf.layers基础函数 conv2d(). Constructs a two-dimensional convolutional layer. Takes number of filters, filter kernel size, padding, and activation function as arguments. max_pooling2…

    卷积神经网络 2023年4月6日
    00
  • (Convolutional Neural Networks)CNN-卷积神经网络学习

    参考:http://blog.csdn.net/zouxy09/article/details/8781543 ( 但其中有部分错误)             http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial 卷积的引入,基于三方面考量:一是为了减少全连接网络对于large scale图像的计算复…

    2023年4月6日
    00
  • 卷积神经网络CNN识别MNIST数据集

    这次我们将建立一个卷积神经网络,它可以把MNIST手写字符的识别准确率提升到99%,读者可能需要一些卷积神经网络的基础知识才能更好的理解本节的内容。 程序的开头是导入TensorFlow: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data 接下…

    2023年4月8日
    00
  • Tensorflow之CNN卷积层池化层padding规则

    padding的规则 ·          padding=‘VALID’时,输出的宽度和高度的计算公式(下图gif为例)            输出宽度:output_width = (in_width-filter_width+1)/strides_width  =(5-3+1)/2=1.5【向上取整=2】     输出高度:output_height …

    2023年4月6日
    00
  • Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 – legendsun

    Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 zouxy09@qq.com http://blog.csdn.net/zouxy09            自 己平时看了一些论文,但老感觉看完过后就会慢慢的淡忘,某一天重新拾起来的时候又好像没有看过一样。所以想习…

    2023年4月8日
    00
  • 如何理解二维卷积

    我们知道一维卷积是f[z]=sum A[x]*B[y] z=x+y 那么二维卷积不就是f[n,m]=sum A[q,w]*B[e,r] 其中n=q+e,m=w+r 那么最终结果会是? 好像有点不对。。明天再想 对于数字图像处理中的矩阵卷积。。一般情况下我们不care原图像大小之外的像素

    卷积神经网络 2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部