Yolov5+TensorRT-生成dll-python/c++调用dll

news2025/1/13 13:46:34

YOlov5-6.0+TensorRT+dll+python/c++调用

  • 简介
    • 1.项目环境
    • 2.TensorRT验证
      • 1.在tensorrtx-yolov5-v6.0\yolov5目录下新建build目录
      • 2.编写CMake.txt,根据自己目录更改2(OpenCV_DIR)、3(TRT_DIR)、10(Dirent_INCLUDE_DIRS)
      • 3.打开Cmake工具,设置目录后,依次点击Configue、Generate、OpenProject(我自己的打不开报错,不影响)
      • 4.在build目录下查看生成的文件
      • 5.用Visual studio打开**yolov5.sln**文件,设置CUDA自定义文件
      • 6.设置**ALL_BUILD、yolov5、ZERO_CHECK**
      • 7.设置**preprocess.cu、yololayer.cu**选择项类型为**CUDA C/C++**
      • 8.在yolov5项目鼠标右键-》分析和代码清理-》仅对yolov5运行代码分析
      • 9.在当前项目目录下查看build-》Release,生成yolov5.exe
      • 10.将D:\Space\VisualStudioSpace\tensorrtx-yolov5-v6.0\yolov5\gen_wts.py放到yolov5-6.0目录下:
      • 11.将生成的yolov5s.wts文件放入tensorrtx-yolov5-v6.0\yolov5\build\Release目录下:
      • 12.创建images目录,用yolov5s.engine测试加速
    • 3.C++生成dll文件
      • 1.修改D:\Space\VisualStudioSpace\tensorrtx-yolov5-v6.0\yolov5目录下yolov5.cpp,新增Yolov5TRTContext.h在tensorrtx-yolov5-v6.0\yolov5目录下
      • 2.在tensorrtx-yolov5-v6.0\yolov5\build目录中通过Visual studio打开yolov5s.sln,设置yolov5模块-》鼠标右键-》属性-》高级-》目标扩展名-》输入**.dll**;同时设置 常规-》配置类型:**动态库(.dll)**
      • 3.yolov5编译运行
    • 4.Python调用dll文件
      • 1.将python_trt.py放入release目录下,源文件获取请参考@一笑奈何LHY[python_trt.py下载](https://gitcode.net/mirrors/Monday-Leo/yolov5_tensorrt_win10/-/blob/master/python_trt.py),修改对应的文件位置目录即可。
    • 5.C++调用dll文件
      • 1.静态dll调用
      • 2.动态dll调用

简介

通过查阅大量资料,在@Christo3、@wang-xinyu、@一笑奈何HYL等人的工作基础上,完成yolov5s通过tensort,导出为dll文件,python、c++调用dll文件。

1.项目环境

软件安装,及其环境变量配置请参考上述人员的博客,必须基于yolov5(6.0版本),如有报错请考虑软件版本、环境变量是否匹配。
(1)Windows 10、NVIDIA GeForce GTX 1050 Ti
(2)Visual Studio 2019 Community 下载地址
(3)cuda_10.2.89_441.22_win10下载地址
(4)cudnn-windows-x86_64-8.4.0.27_cuda10.2-archive下载地址
(4)TensorRT-8.4.1.5下载地址
(5)opencv4.5.1下载地址
(6)tensorrtx-yolov5-v6.0下载地址
(7)Yolov5(v6.0)下载地址
(8)CMake3.24.2下载地址

2.TensorRT验证

1.在tensorrtx-yolov5-v6.0\yolov5目录下新建build目录

在这里插入图片描述

2.编写CMake.txt,根据自己目录更改2(OpenCV_DIR)、3(TRT_DIR)、10(Dirent_INCLUDE_DIRS)

cmake_minimum_required(VERSION 2.6)

project(yolov5) 

#change to your own path
##################################################
set(OpenCV_DIR "D:\\Tool\\opencv4.5.1\\opencv\\build") #2
set(TRT_DIR "D:\\AITool\\TensorRT\\TensorRT-8.4.1.5") #3
set(Dirent_INCLUDE_DIRS "D:\\AITool\\TensorRT\\TensorRT-8.4.1.5\\include") #10
##################################################

add_definitions(-std=c++11)
add_definitions(-DAPI_EXPORTS)
option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads)

# setup CUDA
find_package(CUDA REQUIRED)
message(STATUS "    libraries: ${CUDA_LIBRARIES}")
message(STATUS "    include path: ${CUDA_INCLUDE_DIRS}")
include_directories(${CUDA_INCLUDE_DIRS})
include_directories(${Dirent_INCLUDE_DIRS}) 

#change to your GPU own compute_XX
###########################################################################################
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-std=c++11;-g;-G;-gencode;arch=compute_60;code=sm_60)
###########################################################################################

####
enable_language(CUDA)  # add this line, then no need to setup cuda path in vs
####
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${TRT_DIR}\\include)

# -D_MWAITXINTRIN_H_INCLUDED for solving error: identifier "__builtin_ia32_mwaitx" is undefined
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Ofast -D_MWAITXINTRIN_H_INCLUDED")

# setup opencv
find_package(OpenCV QUIET
    NO_MODULE
    NO_DEFAULT_PATH
    NO_CMAKE_PATH
    NO_CMAKE_ENVIRONMENT_PATH
    NO_SYSTEM_ENVIRONMENT_PATH
    NO_CMAKE_PACKAGE_REGISTRY
    NO_CMAKE_BUILDS_PATH
    NO_CMAKE_SYSTEM_PATH
    NO_CMAKE_SYSTEM_PACKAGE_REGISTRY
)

message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(${TRT_DIR}\\lib)

add_executable(yolov5 ${PROJECT_SOURCE_DIR}/yolov5.cpp ${PROJECT_SOURCE_DIR}/yololayer.cu ${PROJECT_SOURCE_DIR}/yololayer.h ${PROJECT_SOURCE_DIR}/preprocess.cu) 

target_link_libraries(yolov5 "nvinfer" "nvinfer_plugin")  
target_link_libraries(yolov5 ${OpenCV_LIBS})     
target_link_libraries(yolov5 ${CUDA_LIBRARIES})  
target_link_libraries(yolov5 Threads::Threads)     

3.打开Cmake工具,设置目录后,依次点击Configue、Generate、OpenProject(我自己的打不开报错,不影响)

在这里插入图片描述
红色Warning不影响,依次看到Configue done、Generate done即可
在这里插入图片描述

4.在build目录下查看生成的文件

在这里插入图片描述

5.用Visual studio打开yolov5.sln文件,设置CUDA自定义文件

在这里插入图片描述
如果你的Visual studio没有该选项,请点击查找现有的
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\visual_studio_integration\MSBuildExtensions 目录中添加即可
在这里插入图片描述
在这里插入图片描述

6.设置ALL_BUILD、yolov5、ZERO_CHECK

鼠标右键-》属性,设置Release、X64
在这里插入图片描述

7.设置preprocess.cu、yololayer.cu选择项类型为CUDA C/C++

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

8.在yolov5项目鼠标右键-》分析和代码清理-》仅对yolov5运行代码分析

在这里插入图片描述
在这里插入图片描述

9.在当前项目目录下查看build-》Release,生成yolov5.exe

在这里插入图片描述

10.将D:\Space\VisualStudioSpace\tensorrtx-yolov5-v6.0\yolov5\gen_wts.py放到yolov5-6.0目录下:

在这里插入图片描述
在这里插入图片描述
进入yolov5环境运行,生成yolov5s.wts

python gen_wts.py -w yolov5s.pt -o yolov5s.wts

在这里插入图片描述

11.将生成的yolov5s.wts文件放入tensorrtx-yolov5-v6.0\yolov5\build\Release目录下:

在这里插入图片描述
运行命令,生成推理所需的yolov5s.engine文件

yolov5 -s yolov5s.wts yolov5s.engine s

在这里插入图片描述
在这里插入图片描述

12.创建images目录,用yolov5s.engine测试加速

在Release目录下创建images目录,放入yolov5-6.0的图片
在这里插入图片描述

yolov5 -d yolov5s.engine ./images

在这里插入图片描述
在这里插入图片描述

可以看到tensorRT速度很明显,至此yolov5+tensort完成,开始生成dll。

3.C++生成dll文件

1.修改D:\Space\VisualStudioSpace\tensorrtx-yolov5-v6.0\yolov5目录下yolov5.cpp,新增Yolov5TRTContext.h在tensorrtx-yolov5-v6.0\yolov5目录下

Yolov5TRTContext.h文件

#pragma once
#include <iostream>
#include <chrono>
#include <cmath>
#include "cuda_utils.h"
#include "logging.h"
#include "common.hpp"
#include "utils.h"
#include "calibrator.h"
#include "preprocess.h"
#include "macros.h"
class Yolov5TRTContext {

public:
    float* data;
    float* prob;
    IRuntime* runtime;
    ICudaEngine* engine;
    IExecutionContext* context;
    void* buffers[2];
    cudaStream_t stream;
    int inputIndex;
    int outputIndex;
};
extern "C" API void* Init(char* model_path);
extern "C" API  void Detect(void* h, int rows, int cols, unsigned char* src_data, float(*res_array)[6]);
extern "C" API  void cuda_free(void* h);
   

在这里插入图片描述
修改yolo.cpp文件如下(改动部分如下,未改动部分和@一笑奈何LHY的yolov5s.cpp文件一致,请参考mirrors / Monday-Leo / yolov5_tensorrt_win10):
文件下载,可百度网盘获取
链接:https://pan.baidu.com/s/1haG2JI_WWyFkUGwb2QzJuQ?pwd=xywh
提取码:xywh

#include <iostream>
#include <chrono>
#include <cmath>
#include "cuda_utils.h"
#include "logging.h"
#include "common.hpp"
#include "utils.h"
#include "calibrator.h"
#include "preprocess.h"
#include "macros.h"

#include"Yolov5TRTContext.h"
void* Init(char* model_path)
{
    cudaSetDevice(DEVICE);
    // create a model using the API directly and serialize it to a stream
    char* trtModelStream{ nullptr };
    size_t size_e{ 0 };
    std::string engine_name = model_path;
    std::ifstream file(engine_name, std::ios::binary);
    Yolov5TRTContext* trt = new Yolov5TRTContext();
    if (file.good()) {
        file.seekg(0, file.end);
        size_e = file.tellg();
        file.seekg(0, file.beg);
        trtModelStream = new char[size_e];
        assert(trtModelStream);
        file.read(trtModelStream, size_e);
        file.close();
    }

    trt->runtime = createInferRuntime(gLogger);
    assert(trt->runtime != nullptr);
    trt->engine = trt->runtime->deserializeCudaEngine(trtModelStream, size_e);
    assert(trt->engine != nullptr);
    trt->context = trt->engine->createExecutionContext();
    assert(trt->context != nullptr);
    //delete[] trtModelStream;
    assert(trt->engine->getNbBindings() == 2);
    trt->data = new float[BATCH_SIZE * 3 * INPUT_H * INPUT_W];
    trt->prob = new float[BATCH_SIZE * OUTPUT_SIZE];
    trt->inputIndex = trt->engine->getBindingIndex(INPUT_BLOB_NAME);
    trt->outputIndex = trt->engine->getBindingIndex(OUTPUT_BLOB_NAME);
    assert(trt->inputIndex == 0);
    assert(trt->outputIndex == 1);
    // Create GPU buffers on device
    CUDA_CHECK(cudaMalloc(&trt->buffers[trt->inputIndex], BATCH_SIZE * 3 * INPUT_H * INPUT_W * sizeof(float)));
    CUDA_CHECK(cudaMalloc(&trt->buffers[trt->outputIndex], BATCH_SIZE * OUTPUT_SIZE * sizeof(float)));
    // Create stream
    CUDA_CHECK(cudaStreamCreate(&trt->stream));

    // In order to bind the buffers, we need to know the names of the input and output tensors.
    // Note that indices are guaranteed to be less than IEngine::getNbBindings()
    return (void*)trt;
}


 void Detect(void* h, int rows, int cols, unsigned char* src_data, float(*res_array)[6])
{
    Yolov5TRTContext* trt = (Yolov5TRTContext*)h;
    cv::Mat img = cv::Mat(rows, cols, CV_8UC3, src_data);
    // prepare input data ---------------------------
    cv::Mat pr_img = preprocess_img(img, INPUT_W, INPUT_H); // letterbox BGR to RGB
    int i = 0;
    for (int row = 0; row < INPUT_H; ++row) {
        uchar* uc_pixel = pr_img.data + row * pr_img.step;
        for (int col = 0; col < INPUT_W; ++col)
        {
            trt->data[0 * 3 * INPUT_H * INPUT_W + i] = (float)uc_pixel[2] / 255.0;
            trt->data[0 * 3 * INPUT_H * INPUT_W + i + INPUT_H * INPUT_W] = (float)uc_pixel[1] / 255.0;
            trt->data[0 * 3 * INPUT_H * INPUT_W + i + 2 * INPUT_H * INPUT_W] = (float)uc_pixel[0] / 255.0;
            uc_pixel += 3;
            ++i;
        }
    }

    // Run inference
    doInference(*trt->context, trt->stream, trt->buffers, trt->data, trt->prob, BATCH_SIZE);

    std::vector<std::vector<Yolo::Detection>> batch_res(1);
    auto& res = batch_res[0];
    nms(res, &trt->prob[0 * OUTPUT_SIZE], CONF_THRESH, NMS_THRESH);
    int len = res.size();
    for (size_t j = 0; j < res.size(); j++) {
        cv::Rect r = get_rect(img, res[j].bbox);
        res_array[j][0] = r.x;
        res_array[j][1] = r.y;
        res_array[j][2] = r.width;
        res_array[j][3] = r.height;
        res_array[j][4] = res[j].class_id;
        res_array[j][5] = res[j].conf;
    }
}

 void cuda_free(void* h) {
    Yolov5TRTContext* trt = (Yolov5TRTContext*)h;
    cudaStreamDestroy(trt->stream);
    CUDA_CHECK(cudaFree(trt->buffers[trt->inputIndex]));
    CUDA_CHECK(cudaFree(trt->buffers[trt->outputIndex]));
    trt->context->destroy();
    trt->engine->destroy();
    trt->runtime->destroy();
}

2.在tensorrtx-yolov5-v6.0\yolov5\build目录中通过Visual studio打开yolov5s.sln,设置yolov5模块-》鼠标右键-》属性-》高级-》目标扩展名-》输入**.dll**;同时设置 常规-》配置类型:动态库(.dll)

在这里插入图片描述
在这里插入图片描述

3.yolov5编译运行

在这里插入图片描述
运行成功
在这里插入图片描述
在Release目录下查看生成的dll文件
在这里插入图片描述
至此,yolov5+tensorRT+dll完成!!!

4.Python调用dll文件

1.将python_trt.py放入release目录下,源文件获取请参考@一笑奈何LHYpython_trt.py下载,修改对应的文件位置目录即可。

在这里插入图片描述

from ctypes import *
import cv2
import numpy as np
import numpy.ctypeslib as npct

class Detector():
    def __init__(self,model_path,dll_path):
        self.yolov5 = CDLL(dll_path)
        self.yolov5.Detect.argtypes = [c_void_p,c_int,c_int,POINTER(c_ubyte),npct.ndpointer(dtype = np.float32, ndim = 2, shape = (50, 6), flags="C_CONTIGUOUS")]
        self.yolov5.Init.restype = c_void_p
        self.yolov5.Init.argtypes = [c_void_p]
        self.yolov5.cuda_free.argtypes = [c_void_p]
        self.c_point = self.yolov5.Init(model_path)

    def predict(self,img):
        rows, cols = img.shape[0], img.shape[1]
        res_arr = np.zeros((50,6),dtype=np.float32)
        print("res_Arr===",res_arr) 
        self.yolov5.Detect(self.c_point,c_int(rows), c_int(cols), img.ctypes.data_as(POINTER(c_ubyte)),res_arr)
        print("res_Arr===",res_arr) 
        self.bbox_array = res_arr[~(res_arr==0).all(1)]
        print("bbox===",self.bbox_array) 
        return self.bbox_array

    def free(self):
        self.yolov5.cuda_free(self.c_point)

def visualize(img,bbox_array):
    for temp in bbox_array:
        bbox = [temp[0],temp[1],temp[2],temp[3]]  #xywh
        clas = int(temp[4])
        score = temp[5]
        cv2.rectangle(img,(int(temp[0]),int(temp[1])),(int(temp[0]+temp[2]),int(temp[1]+temp[3])), (105, 237, 249), 2)
        img = cv2.putText(img, "class:"+str(clas)+" "+str(round(score,2)), (int(temp[0]),int(temp[1])-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (105, 237, 249), 1)
    return img

det = Detector(model_path=b"./yolov5s.engine",dll_path="./yolov5.dll")  # b'' is needed
img = cv2.imread("./images/zidane.jpg")
result = det.predict(img)
img = visualize(img,result)
cv2.imshow("img",img)
cv2.waitKey(0)
det.free()
cv2.destroyAllWindows()

运行

python python_trt.py

在这里插入图片描述
至此,python调用dll完成!!!

5.C++调用dll文件

Visual studio创建testYoloDll项目
(1)并创建两个源文件:testYolov5Dll.cpp、testYolov5Dll2.cpp;
(2)导入Yolov5TRTContext.h;
(3)导入yolov5.dll、yolov5.exp、yolov5.lib、yolov5s.engine
项目目录如下:
在这里插入图片描述
项目配置
将以下文件替换成自己的文件目录即可。
VC++目录-》包含目录:

D:\Space\VisualStudioSpace\tensorrtx-yolov5-v6.0\yolov5
D:\AITool\TensorRT\TensorRT-8.4.1.5\include
D:\AITool\CUDA\CUDA_Development\include
D:\Tool\opencv4.5.1\opencv\build\include\opencv2
D:\Tool\opencv4.5.1\opencv\build\include

VC++目录-》库目录:

D:\Tool\opencv4.5.1\opencv\build\x64\vc15\lib
D:\Space\VisualStudioSpace\tensorrtx-yolov5-v6.0\yolov5\build_dll\Release
D:\AITool\TensorRT\TensorRT-8.4.1.5\lib
D:\AITool\CUDA\CUDA_Development\lib\x64

链接器->输入:

opencv_world451d.lib
cudart.lib
cudart_static.lib
yolov5.lib
nvinfer.lib
nvinfer_plugin.lib
nvonnxparser.lib
nvparsers.lib

在这里插入图片描述

静态、动态二选一即可,调用时把另一个dispaly,main注释即可!!!

1.静态dll调用

#pragma once
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/highgui/highgui.hpp> 	
#include <stdio.h>
#include <Windows.h>
#include <iostream>
#include <string>
#include <tchar.h>
#include <time.h>

#include"Yolov5TRTContext.h" //引入头文件调用


using namespace std;
using namespace cv;
void display(Mat dst, vector<vector<float>> list);//显示

//根据自己模型定义 类别  
const static int class_num = 80;
const static string classes[class_num] = { "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light",
		"fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow",
		"elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
		"skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard",
		"tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",
		"sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch",
		"potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone",
		"microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear",
		"hair drier", "toothbrush" };

int main()
{
	bool isOpenCapture = false;//默认不开启(图片); 开启(摄像头检测)
	char  model[] = "yolov5s.engine";//yolov5s.engine 位置
	char* model_path = model;
	float res_arr[50][6] = { 0.0f };//50个anchor 6(x,y,w,h,class,confidence)
	Mat img, dst;
	void* trt = (void*)Init(model_path);//初始化模型
	/*
	clock_t start, finish;
	start = clock();
	*/

	if (isOpenCapture) {
		//摄像头检测
		const char* image_path = "";
		cv::VideoCapture capture(0);//打开摄像头
		while (true)
		{
			//摄像头测试
			capture >> dst;  //取一帧图片
			img = dst;
			Detect(trt, img.rows, img.cols, img.data, res_arr);//推理
			vector<vector<float>> list;
			for (int i = 0; i < 50; i++) {
				if (res_arr[i][0] != 0) {
					vector<float> temp;
					temp.push_back(res_arr[i][0]);//x
					temp.push_back(res_arr[i][1]);//y
					temp.push_back(res_arr[i][2]);//w
					temp.push_back(res_arr[i][3]);//h
					temp.push_back(res_arr[i][4]);//class
					temp.push_back(res_arr[i][5]);//confidence
					list.push_back(temp);
				}
			}
			//cout << "the list size" << list.size() << endl;
			//调用dispaly
			display(img, list);
			waitKey(1);
			//release
			img.release();
			dst.release();

		}
	}
	else {
		//图片检测
		const char* image_path = "./images/zidane.jpg";//图片路径
		img = cv::imread(image_path);//读取图片
		dst = img;
		Detect(trt, img.rows, img.cols, img.data, res_arr);//推理
		vector<vector<float>> list;
		for (int i = 0; i < 50; i++) {
			if (res_arr[i][0] != 0) {
				vector<float> temp;
				temp.push_back(res_arr[i][0]);//x
				temp.push_back(res_arr[i][1]);//y
				temp.push_back(res_arr[i][2]);//w
				temp.push_back(res_arr[i][3]);//h
				temp.push_back(res_arr[i][4]);//class
				temp.push_back(res_arr[i][5]);//confidence
				list.push_back(temp);
			}
		}
		//cout << "the list size" << list.size() << endl;
		//调用dispaly
		display(img, list);
		waitKey(0);
		//release
		img.release();
		dst.release();
	}
	/*
	finish = clock();
	cout << "时间消耗:" << (finish - start) / CLOCKS_PER_SEC * 1000 << endl;
	*/

	//调用cuda_free
	cuda_free(trt);
	return 0;
}

void display(Mat dst, vector<vector<float>> list) {
	//初始化m
	//遍历list
	Scalar scalar(0, 255, 0);//BGR(Green)
	vector<float> temp;
	for (int i = 0; i < list.size(); i++) {

		temp = list.at(i);
		float x = temp.at(0);
		float y = temp.at(1);
		float w = temp.at(2);
		float h = temp.at(3);
		int c = (int)temp.at(4);
		float confidence = temp.at(5);

		// 在dst上面作图
		//cout << "x=" << x << ",y=" << y << ",w" << w << ",h" << h << ",class=" << c << ",confidence=" << confidence << endl;
		Rect rect(x, y, w, h);//绘制矩形
		rectangle(dst, rect, scalar, 2, LINE_8, 0);

		//在dst上添加class confidence
		string text = classes[c] + format(",%0.3f", confidence);
		putText(dst, text, Point2f(x, y + 10), FONT_HERSHEY_SIMPLEX, 0.5, scalar);
		temp.clear();

	}
	namedWindow("yolov5-6.0", WINDOW_AUTOSIZE); //WINDOW_NORMAL
	imshow("yolov5-6.0", dst);
}

2.动态dll调用

#pragma once
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/highgui/highgui.hpp> 	
#include <Windows.h>
#include <iostream>
#include <string>
#include <tchar.h>
#include <time.h>

//动态调用dll

using namespace std;
using namespace cv;

//void display(Mat dst,vector<vector<float>> list);//显示boundingbox

//根据自己模型定义 类别  
const static int class_num = 80;
const static string classes[class_num] = { "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light",
		"fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow",
		"elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
		"skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard",
		"tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",
		"sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch",
		"potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone",
		"microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear",
		"hair drier", "toothbrush" };


//int main()
//{
//	HMODULE module = LoadLibrary(_T("yolov5.dll"));//显示加载dll
//	if (module == NULL)
//	{
//		cout << "加载yolov5.dll动态库失败" << endl;
//		return -1;
//	}
//	else {
//		cout << "加载成功!!!" << endl;
//	}
//	typedef void * (*InitFuc)(char* ); // 定义函数指针类型
//	typedef void (*DetectFuc)(void* , int , int , unsigned char* , float(*)[6]); // 定义函数指针类型
//	typedef void (*cuda_freeFuc)(void*);
//
//	//从dll中加载Init、Detect、cuda_free
//	InitFuc Init;
//	Init = (InitFuc)GetProcAddress(module,"Init");
//	//推理
//	DetectFuc Detect;
//
//	Detect = (DetectFuc)GetProcAddress(module, "Detect");
//	//free
//	cuda_freeFuc cuda_free;
//	cuda_free = (cuda_freeFuc)GetProcAddress(module, "cuda_free");
//
//
//	bool isOpenCapture = false;//默认不开启(图片); 开启(摄像头检测)
//	char  model[] = "yolov5s.engine";//yolov5s.engine 位置
//	char* model_path = model;
//	float res_arr[50][6] = { 0.0f };//50个anchor 6(x,y,w,h,class,confidence)
//	Mat img, dst;
//	void* trt = (void*)Init(model_path);//初始化模型
//	/*
//	clock_t start, finish;
//	start = clock();
//	*/
//
//	if (isOpenCapture) {
//		//摄像头检测
//		const char* image_path = "";
//		cv::VideoCapture capture(0);//打开摄像头
//		while (true)
//		{
//			//摄像头测试
//			capture >> dst;  //取一帧图片
//			img = dst;
//			Detect(trt, img.rows, img.cols, img.data, res_arr);//推理
//			vector<vector<float>> list;
//			for (int i = 0; i < 50; i++) {
//				if (res_arr[i][0] != 0) {
//					vector<float> temp;
//					temp.push_back(res_arr[i][0]);//x
//					temp.push_back(res_arr[i][1]);//y
//					temp.push_back(res_arr[i][2]);//w
//					temp.push_back(res_arr[i][3]);//h
//					temp.push_back(res_arr[i][4]);//class
//					temp.push_back(res_arr[i][5]);//confidence
//					list.push_back(temp);
//				}
//			}
//			//cout << "the list size" << list.size() << endl;
//			//调用dispaly
//			display(img, list);
//			waitKey(1);
//			//release
//			img.release();
//			dst.release();
//
//		}
//	}
//	else {
//		//图片检测
//		const char* image_path = "./images/bus.jpg";//图片路径
//		img = cv::imread(image_path);//读取图片
//		dst = img;
//		Detect(trt, img.rows, img.cols, img.data, res_arr);//推理
//		vector<vector<float>> list;
//		for (int i = 0; i < 50; i++) {
//			if (res_arr[i][0] != 0) {
//				vector<float> temp;
//				temp.push_back(res_arr[i][0]);//x
//				temp.push_back(res_arr[i][1]);//y
//				temp.push_back(res_arr[i][2]);//w
//				temp.push_back(res_arr[i][3]);//h
//				temp.push_back(res_arr[i][4]);//class
//				temp.push_back(res_arr[i][5]);//confidence
//				list.push_back(temp);
//			}
//		}
//		//cout << "the list size" << list.size() << endl;
//		//调用dispaly
//		display(img, list);
//		waitKey(0);
//		//release
//		img.release();
//		dst.release();
//	}
//	/*
//	finish = clock();
//	cout << "时间消耗:" << (finish - start) / CLOCKS_PER_SEC * 1000 << endl;
//	*/
//
//	//调用cuda_free
//	cuda_free(trt);
//
//	return 0;
//
//}

//void display(Mat dst, vector<vector<float>> list) {
//	//初始化m
//	//遍历list
//	Scalar scalar(0, 255, 0);//BGR(Green)
//	vector<float> temp;
//	for (int i = 0; i < list.size(); i++) {
//
//		temp = list.at(i);
//		float x = temp.at(0);
//		float y = temp.at(1);
//		float w = temp.at(2);
//		float h = temp.at(3);
//		int c = (int)temp.at(4);
//		float confidence = temp.at(5);
//
//		// 在dst上面作图
//		//cout << "x=" << x << ",y=" << y << ",w" << w << ",h" << h << ",class=" << c << ",confidence=" << confidence << endl;
//		Rect rect(x, y, w, h);//绘制矩形
//		rectangle(dst, rect, scalar, 2, LINE_8, 0);
//
//		//在dst上添加class confidence
//		string text = classes[c] + format(",%0.3f", confidence);
//		putText(dst, text, Point2f(x, y + 10), FONT_HERSHEY_SIMPLEX, 0.5, scalar);
//		temp.clear();
//
//	}
//	namedWindow("yolov5-6.0", WINDOW_AUTOSIZE); //WINDOW_NORMAL
//	imshow("yolov5-6.0", dst);
//}

运行测试结果:
可以图片测试,也可以打开摄像头测试,只需要更换代码中对应的文件目录,以及isOpenCapture即可!!!
在这里插入图片描述

testYolov5Dll项目想要获取的可以进行下载
CSDN下载:testYolov5Dll项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW网络服务器何使用,有哪些不同

LabVIEW网络服务器何使用&#xff0c;有哪些不同NI有几款不同的Web服务器&#xff0c;可使用不同的产品并覆盖不同的用例。它们具有非常相似的名称&#xff0c;可以互换使用&#xff0c;但每个都提供不同的功能。应用程序Web服务器描述&#xff1a;NI应用Web服务器加载使用LabV…

企业微信商户号是什么?如何开通?

企业微信作为一款优秀的移动办公工具&#xff0c;与微信全方位打通&#xff0c;既可以与客户沟通交流&#xff0c;也可以在达成交易后直接进行对公收款&#xff0c;但是前提是要开通企业微信商户号。前言企业微信和微信都出自腾讯&#xff0c;而且企业微信全方位连接微信&#…

C#,图像二值化(16)——全局阈值的力矩保持算法(Moment-proserving Thresholding)及其源代码

1、力矩保持法 提出了一种基于矩保持原理的自动阈值选择方法。以这样的方式确定地计算阈值&#xff0c;即在输出画面中保留输入画面的时刻。实验结果表明&#xff0c;该方法可以将给定的图像阈值化为有意义的灰度级。该方法描述了全局阈值&#xff0c;但也适用于局部阈值。 A…

企业微信开发——企业内部自建应用开发(第二篇)---JS_SDK配置

企业微信如果想要使用企业微信的JS_SDK来实现拍照、定位等等功能&#xff0c;就需要预先在使用到的页面进行配置&#xff0c;当然你可以做全局配置。对于JS_SDK的配置设计前端和后端的统一配置。下面我来说明下具体的步骤。特别说明&#xff1a;1、企业微信有的接口需要配置wx.…

shader基础入门(1)

本文基于unity免费公开课“Hi Shader以及网络公开资料等书写”遵循开源协议。 MeshFilter网格过滤器 从海量资源中挑选适合的Mesh将他交给MeshRender MeshRenderer 网格渲染器 负责把MeshFilter丢过来的Mesh&#xff0c;绘制显示到我们的场景中 Material 材质球 Material…

多线程之死锁

目录&#xff1a; 1.什么是死锁&#xff1f; 2.可重入与不可重入 3.发生死锁的三个典型情况 4.发生死锁的四个必要条件 5.如何破除死锁&#xff1f; 1.什么是死锁&#xff1f; 谈到死锁&#xff0c;程序猿们都心存忌惮&#xff0c;因为程序一旦出现死锁&#xff0c;就会导…

深度学习训练营之鸟类识别

深度学习训练营之鸟类识别原文链接环境介绍前置工作设置GPU导入数据并进行查找数据处理可视化数据配置数据集残差网络的介绍构建残差网络模型训练开始编译结果可视化训练样本和测试样本预测原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&am…

机器学习:如何解决类别不平衡问题

类别不平衡是一个常见问题&#xff0c;其中数据集中示例的分布是倾斜的或有偏差的。 1. 简介 类别不平衡是机器学习中的一个常见问题&#xff0c;尤其是在二元分类领域。当训练数据集的类分布不均时会发生这种情况&#xff0c;从而导致训练模型存在潜在偏差。不平衡分类问题的示…

【Unity云消散】理论基础:实现SDF的8SSEDT算法

距离元旦假期已经过去5天了&#xff08;从31号算起&#xff01;&#xff09;&#xff0c;接着开始学习&#xff01; 游戏中的很多渲染效果都离不开SDF&#xff0c;那么SDF究竟是什么呢&#xff1f;到底是个怎么样的技术&#xff1f;为什么能解决那么多问题&#xff1f; 1 SD…

git介绍及环境搭建

git介绍及环境搭建Git介绍Git安装流程配置用户信息git工作流程与常用命令问题点总结主要工作流程git工作流程与原理总结Git介绍 1.Git是什么&#xff1f; Git版本控制系统是一个分布式的系统,是用来保存工程源代码历史状态(游戏存档)的命令行工具 GIT是一个命令行工具,用于版…

基于Java+Spring+vue+element社区疫情服务平台设计和实现

基于JavaSpringvueelement社区疫情服务平台设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

Django+channels -> websocket

Django+channels -> websocket 学习视频: https://www.bilibili.com/video/BV1J44y1p7NX/?p=10 workon # 查看虚拟环境 mkvirtualenv web -p python3.10 # 创建虚拟环境 workon web # 进入虚拟环境pip insatll django channelsdjango-admin startproject ws_demo python …

【NI Multisim 14.0原理图环境设置——元器件库管理】

目录 序言 一、元器件库管理 &#x1f349;1.“元器件”工具栏 &#x1f34a;&#xff08;1&#xff09;电源/信号源库 &#x1f34a;&#xff08;2&#xff09;基本器件库 &#x1f34a;&#xff08;3&#xff09;二极管库 &#x1f34a;&#xff08;4&#xff09;晶体管…

seL4 背景知识

1 seL4 演变 1.1 微内核 微内核发展到目前为止经历了三代, 这里做一些归纳。参考《现代操作系统: 原理与实现》中操作系统结构一章, 关于微内核架构发展的介绍。 第一代微内核设计将许多内核态功能放到用户态, Mach 微内核是第一代微内核的代表。第二代微内核设计将对 IPC 优…

C++学习记录——일 C++入门(1)

C入门&#xff08;1&#xff09; 文章目录C入门&#xff08;1&#xff09;一、C关键字二、C第一个程序三、命名空间1、域作用限定符2、了解命名空间3、命名空间的使用四、C输入输出五、缺省参数六、函数重载七、引用1、引用符号2、引用的部分使用场景一、C关键字 关键字有98个&…

filebeat采集nginx日志

背景我们公司项目组用的是elastic的一整套技术栈&#xff0c;es&#xff0c;kibana&#xff0c;filebeat和apm&#xff0c;目前已经可以采集网关各个微服务的日志。架构图现在需要在原来的基础上把nginx这的日志也采集上来&#xff0c;方便做链路跟踪问题与思路原先traceId是在…

数字经济时代,“8K+”开拓行业新格局

2023深圳国际8K超高清视频产业发展大会召开&#xff0c;大会以“超清互联 数智创新”为主题&#xff0c;汇聚两院院士、产业领袖、领军企业共同深入探讨超高清产业发展现状、关键问题和未来趋势&#xff0c;并集中发布《深圳市超高清视频显示产业白皮书&#xff08;2023版&…

「数据密集型系统搭建」开卷篇|什么是数据密集型系统

在我们开发的诸多系统&#xff0c;基本都可以视为“数据密集型系统”&#xff0c;数据是一切物质的载体&#xff0c;我们依靠数据做存储记录&#xff0c;通过数据进行信息传递交换&#xff0c;最终还要数据来呈现和展示等&#xff0c;从一定视角而言&#xff0c;系统中最核心、…

临时用网搞不定?别着急,5G网络“急救车”来啦

如何在1天时间内&#xff0c;用不超过5名装维人员&#xff0c;完成超过200间宿舍的网络覆盖&#xff0c;让即将踏上考场的高三学子们尽快用上网络&#xff1f; 近期&#xff0c;这个问题一直困扰着重庆电信客户经理周睿。原来&#xff0c;由于疫情原因&#xff0c;重庆市某中学…

WINDOWS安装Oracle11.2.0.4

(一)Oracle服务器端安装 1.运行Oracle11g服务器端安装程序setup.exe,弹出如下界面&#xff1a; 2.如上界面中&#xff0c;把默认打上的勾去掉&#xff0c;然后点击【下一步】&#xff0c;弹出如下界面&#xff1a; 3.如上界面中&#xff0c;选择跳过软件更新,然后点击【下一步…