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

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目录

Yolov5+TensorRT-生成dll-python/c++调用dll_第1张图片

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(我自己的打不开报错,不影响)

Yolov5+TensorRT-生成dll-python/c++调用dll_第2张图片
红色Warning不影响,依次看到Configue done、Generate done即可
Yolov5+TensorRT-生成dll-python/c++调用dll_第3张图片

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

Yolov5+TensorRT-生成dll-python/c++调用dll_第4张图片

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

Yolov5+TensorRT-生成dll-python/c++调用dll_第5张图片
如果你的Visual studio没有该选项,请点击查找现有的
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\visual_studio_integration\MSBuildExtensions 目录中添加即可
Yolov5+TensorRT-生成dll-python/c++调用dll_第6张图片
Yolov5+TensorRT-生成dll-python/c++调用dll_第7张图片

6.设置ALL_BUILD、yolov5、ZERO_CHECK

鼠标右键-》属性,设置Release、X64
Yolov5+TensorRT-生成dll-python/c++调用dll_第8张图片

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

Yolov5+TensorRT-生成dll-python/c++调用dll_第9张图片

Yolov5+TensorRT-生成dll-python/c++调用dll_第10张图片
Yolov5+TensorRT-生成dll-python/c++调用dll_第11张图片

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

Yolov5+TensorRT-生成dll-python/c++调用dll_第12张图片
Yolov5+TensorRT-生成dll-python/c++调用dll_第13张图片

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

Yolov5+TensorRT-生成dll-python/c++调用dll_第14张图片

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

Yolov5+TensorRT-生成dll-python/c++调用dll_第15张图片
Yolov5+TensorRT-生成dll-python/c++调用dll_第16张图片
进入yolov5环境运行,生成yolov5s.wts

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

在这里插入图片描述

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

Yolov5+TensorRT-生成dll-python/c++调用dll_第17张图片
运行命令,生成推理所需的yolov5s.engine文件

yolov5 -s yolov5s.wts yolov5s.engine s

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

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

在Release目录下创建images目录,放入yolov5-6.0的图片
Yolov5+TensorRT-生成dll-python/c++调用dll_第18张图片

yolov5 -d yolov5s.engine ./images

在这里插入图片描述
Yolov5+TensorRT-生成dll-python/c++调用dll_第19张图片

可以看到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 
#include 
#include 
#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);
   

Yolov5+TensorRT-生成dll-python/c++调用dll_第20张图片
修改yolo.cpp文件如下(改动部分如下,未改动部分和@一笑奈何LHY的yolov5s.cpp文件一致,请参考mirrors / Monday-Leo / yolov5_tensorrt_win10):
文件下载,可百度网盘获取
链接:https://pan.baidu.com/s/1haG2JI_WWyFkUGwb2QzJuQ?pwd=xywh
提取码:xywh

#include 
#include 
#include 
#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)

Yolov5+TensorRT-生成dll-python/c++调用dll_第21张图片
Yolov5+TensorRT-生成dll-python/c++调用dll_第22张图片

3.yolov5编译运行

Yolov5+TensorRT-生成dll-python/c++调用dll_第23张图片
运行成功
在这里插入图片描述
在Release目录下查看生成的dll文件
Yolov5+TensorRT-生成dll-python/c++调用dll_第24张图片
至此,yolov5+tensorRT+dll完成!!!

4.Python调用dll文件

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

Yolov5+TensorRT-生成dll-python/c++调用dll_第25张图片

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 = CDLL(dll_path, winmode=0)#python3.8版本加载dll失败时用
        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

Yolov5+TensorRT-生成dll-python/c++调用dll_第26张图片
至此,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
项目目录如下:
Yolov5+TensorRT-生成dll-python/c++调用dll_第27张图片
项目配置
将以下文件替换成自己的文件目录即可。
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\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

Yolov5+TensorRT-生成dll-python/c++调用dll_第28张图片

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

1.静态dll调用

#pragma once
#include 
#include 
#include 
#include  	
#include 
#include 
#include 
#include 
#include 
#include 

#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 
#include 
#include 
#include  	
#include 
#include 
#include 
#include 
#include 

//动态调用dll

using namespace std;
using namespace cv;

//void display(Mat dst,vector> 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> list;
//			for (int i = 0; i < 50; i++) {
//				if (res_arr[i][0] != 0) {
//					vector 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> list;
//		for (int i = 0; i < 50; i++) {
//			if (res_arr[i][0] != 0) {
//				vector 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> list) {
//	//初始化m
//	//遍历list
//	Scalar scalar(0, 255, 0);//BGR(Green)
//	vector 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即可!!!
Yolov5+TensorRT-生成dll-python/c++调用dll_第29张图片

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

你可能感兴趣的:(c++,python,windows,计算机视觉,opencv)