赞
踩
下述cpp和.h文件下载链接如下:
封装的cpp文件
前面讲过yolov5的环境配置,源码测试,以及使用TensorRT进行推理加速,但是有时候为了让模型方便部署在移动端,需要将模型封装成一个动态链接库dll,从而使得模型能够在任意的移动端无需配置环境即可运行,只需通过读取dll即可在其他模块进行调用。
假设此时,您已经熟悉了pytorch
的环境配置,yolov5
源码的测试,CUDA
以及TensorRT
的安装,完成推理过程并成功生成了engine
模型
如果以上的步骤还没有完成请参考以下博文:
略
如果不了解新建dll项目的基本方法,请参考以下博文
由于在前面我们已经生成了engine
模型,所以将yolov5
封装成一个类我们只需两个成员函数即可,一个是初始化函数inital()
,一个是推理检测函数detectFunction()
,当然封装的过程可以根据自己喜好任意设定。下面贴出我封装yolov5
类的成员函数及成员变量。
#pragma once
#include <iostream>
#include <chrono>
#include "cuda_runtime_api.h"
#include "logging.h"
#include "common.hpp"
#include "utils.h"
#include "calibrator.h"
#define USE_FP16 // set USE_INT8 or USE_FP16 or USE_FP32
#define DEVICE 0 // GPU id
#define NMS_THRESH 0.4
#define CONF_THRESH 0.5
#define BATCH_SIZE 1
#define NET s // s m l x
#define NETSTRUCT(str) createEngine_##str
#define CREATENET(net) NETSTRUCT(net)
#define STR1(x) #x
#define STR2(x) STR1(x)
using namespace std;
using namespace cv;
class YoloV5
{
public:
YoloV5();
~YoloV5();
bool inital(const string& enginePath);
void detect(const Mat& inputImg, vector<Rect>& vRect);
private:
char* trtModelStream;
size_t size;
Logger gLogger;
int INPUT_H;
int INPUT_W;
int CLASS_NUM;
int OUTPUT_SIZE;
char* INPUT_BLOB_NAME;
char* OUTPUT_BLOB_NAME;
void* buffers[2];
float* data;
float* prob;
IExecutionContext* context;
cudaStream_t stream;
private:
void doInference(IExecutionContext& context, cudaStream_t& stream, void **buffers, float* input, float* output, int batchSize);
cv::Rect get_rect(cv::Mat& img, float bbox[4]);
float iou(float lbox[4], float rbox[4]);
//bool cmp(const Yolo::Detection& a, const Yolo::Detection& b);
void nms(std::vector<Yolo::Detection>& res, float *output, float conf_thresh, float nms_thresh = 0.5);
};
inline bool cmp(const Yolo::Detection& a, const Yolo::Detection& b) {
return a.conf > b.conf;
}
对于每个函数的具体实现,请参考wang-xinyu的工作,源码链接点这里
注:
封装时如果编译报错,请检查包含的头文件是否正确
项目属性设置是否正确
配置环境路径是否设置正确
如果编译不报错Release
文件夹下会生成一个yolov5.dll
文件和yolov5.lib
文件,即表示封装成功
// Test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include "..//yolov5/yolov5.h"
#include"..//yolov5/include/dirent.h"
int main()
{
yolov5 yolov5_1;
string eiginePath = "C:\\Users\\Administrator\\Desktop\\Python\\model\\broken\\yolov5s.engine";
yolov5_1.inital(eiginePath);
vector<cv::String> vImgPath;
string filter = "C:\\Users\\Administrator\\Desktop\\Python\\img\\samples\\*.jpg";
glob(filter, vImgPath);
for (auto i = 0; i < vImgPath.size(); i++)
{
//cout << "vImgPath.size() : " << vImgPath.size() << endl;
Mat img = imread(vImgPath[i]);
if (img.channels() == 1)
{
cvtColor(img, img, cv::COLOR_GRAY2BGR);
}
vector<Rect> res1;
yolov5_1.detectFunction(img, ref(res1));
}
return 0;
}
Release
文件夹下会生成Test.exe
文件,yolov5.dll
文件以及它们对应的lib
文件
双击Test.exe即可调用yolov5模型进行目标检测
GIF图动态演示如下:
封装的过程主要的工作是解决各种报错问题,分析报错的原因,如头文件和库的依赖等,从图中可以看出,yolov5通过TensorRT推理加速使得模型运行的效率非常的高效,每张图片的检测时间只有2ms左右,这使得该模型部署在移动端具有很大的优势。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。