【超详细】yolov8-tensorrt实例分割部署,使用TensorRT-Alpha-main版本

目录

一、预览前提

1、“塔哥AI”b站视频教程:

2、“塔哥AI”百度云链接:

二、环境配置和准备

1、直接下载文件包(推荐)

2、或者一个个下载。

(1)vs2019

(2)cuda

(3)cudnn

(4)Aanconda

(5)pycharm

(6)opencv(4.0以上)

(7)Tensorrt

(8)cmake

(9)eigen库(建议eigen3)

(10)ultralytics-main文件

(11)yolov8s-seg模型

(12)TensorRT-Alpha-main文件

三、具体操作

1、准备trt文件

(1)下载pt文件

(2)pt文件转onnx文件---(使用python环境)

(3)onnx文件转trt文件

2、修改CMakeLists.txt内容(主要是路径要正确)

3、win+R--->cmd--->输入:cmake-gui

4、输入yolov8-seg路径和新建的build路径

5、属性yolov8-seg

6、设置Release/x64

7、[C/C++] -> [预处理器] -> [预处理器定义] -> 加指令:_CRT_SECURE_NO_WARNINGS 

8、确保生成依赖性----生成自定义(B):CUDA

9、在属性管理器Release / x64下加现有属性表

(1)cuda2025:

(2)tensorrt8.5.2.2:

(3)opencv454:

(4)eigen:

呈现结果:

9、高级--->字符集:改成未设置

10、添加现有项:导入必要头文件、库文件(h、cpp、cu文件)

(1)...\TensorRT-Alpha-main\utils内:

(2)...\TensorRT-Alpha-main\yolov8-seg内:

(3)...\TensorRT-8.5.2.2\samples\common内:

11、X64目录下新建image+weight文件夹:

(1)  image:存放结果

(2)weight:存放模型

12、app_yolov8_seg.cpp内修改

(1)关于颜色类别声明的修改

(2)关于模型视频图片路径地址的修改

13、utils.h内修改

14、点击运行导出图片

15、app_yolov8_seg.cpp内修改main函数可导出视频

四、关于使用自己训练的模型

1、需准备yaml文件

2、修改数据集声明

(1)utils.h

(2)app _yolov8 seg.cpp


本文主要根据b站大佬---“塔哥AI”的b站视频和百度云资料进行总结和补充。

一、预览前提

1、“塔哥AI”b站视频教程:

(强烈建议配合视频一起深入学习!!!)

【yolov8】实例分割tensort部署教程,适用目标检测和姿态识别_哔哩哔哩_bilibili

2、“塔哥AI”百度云链接:

(复制到百度网盘可直接打开下载)

https://pan.baidu.com/s/1ztK1qTdN66xsN21iC_5RPg?pwd=x90j

提取码:x90j


二、环境配置和准备

环境已配置的可直接跳到【 三(12) 】步骤!!!

1、直接下载文件包(推荐)

根据上面的百度云链接下载软件包即可

2、或者一个个下载。

(具体的环境变量设置很多文章都有,就不做过多介绍了,大家可以去官网一个个搜索下载或者看看我的过往文章~)

(1)vs2019

(vs2019选c++桌面应用和windows即可,vs一定要在cuda之前下载好!!!!

注意:如果先下载了cuda,再下载vs2019,需要将:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3\extras\visual_studio_integration\MSBuildExtensions
放到
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Microsoft\VC\v160\BuildCustomizations
NOMINMAX}

(2)cuda

(3)cudnn

(4)Aanconda

(5)pycharm

(6)opencv(4.0以上)

(7)Tensorrt

(cuda要求11.x系列,10.x 12.x不行,版本8.0以上)

(8)cmake

(9)eigen库(建议eigen3)

(10)ultralytics-main文件

(11)yolov8s-seg模型

(12)TensorRT-Alpha-main文件

网址:https://github.com/FeiYull/tensorrt-alpha

简单给大家看一下我的变量设置,可参考需下载的软件环境变量设置:

  • 用户变量设置:

  •  系统环境变量设置:

 


三、具体操作

1、准备trt文件

.pt(训练或下载)---.wts(python)---.trt(tensorrt)

(1)下载pt文件

YOLOv8 -Ultralytics YOLO 文档https://docs.ultralytics.com/zh/models/yolov8/#supported-tasks-and-modeshttps://docs.ultralytics.com/zh/models/yolov8/#supported-tasks-and-modeshttps://docs.ultralytics.com/zh/models/yolov8/#supported-tasks-and-modeshttps://docs.ultralytics.com/zh/models/yolov8/#supported-tasks-and-modeshttps://docs.ultralytics.com/zh/models/yolov8/#supported-tasks-and-modeshttps://docs.ultralytics.com/zh/models/yolov8/#supported-tasks-and-modeshttps://docs.ultralytics.com/zh/models/yolov8/#supported-tasks-and-modeshttps://docs.ultralytics.com/zh/models/yolov8/#supported-tasks-and-modeshttps://docs.ultralytics.com/zh/models/yolov8/#supported-tasks-and-modeshttps://docs.ultralytics.com/zh/models/yolov8/#supported-tasks-and-modeshttps://docs.ultralytics.com/zh/models/yolov8/#supported-tasks-and-modes

(2)pt文件转onnx文件---(使用python环境)

from ultralytics import YOLO

# 根据自己的环境更改路径,一般在ultralytics-main\ultralytics-main\ultralytics\cfg\datasets内
model = YOLO('yolov8-seg.yaml') 

# 根据自己的环境更改路径
model = YOLO('yolov8s-seg.pt')  

# 下列参数禁止修改
model.export(format='onnx', dynamic=True, opset=12) 

根据结果找到导出的yolov8s-seg文件 

复制粘贴到...\TensorRT-8.5.2.2\bin目录下:

(3)onnx文件转trt文件

在...\TensorRT-8.5.2.2\bin内输入转换命令:

trtexec.exe --onnx=yolov8s-seg.onnx --saveEngine=yolov8s-seg.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:2x3x640x640 --maxShapes=images:4x3x640x640

如图已输入转换命令, 回车运行:

出现PASSED表示导出trt文件成功: 

2、修改CMakeLists.txt内容(主要是路径要正确)

下面是我的CMakeLists.txt内容,大家可直接粘贴修改路径,也可以在自己的CMakeLists.txt内容里修改对应的路径·。

cmake_minimum_required(VERSION 3.15.5)

project(yolov8_seg_0117)

add_definitions(-std=c++11)
add_definitions(-DAPI_EXPORTS)
set(CMAKE_CXX_STANDARD 11)
#set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_BUILD_TYPE Release)

MESSAGE(STATUS "operation system is ${CMAKE_SYSTEM}") 
IF (CMAKE_SYSTEM_NAME MATCHES "Linux")
	MESSAGE(STATUS "current platform: Linux ")
	set(CUDA_COMPILER_PATH "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.7/bin/nvcc.exe")
	set(TENSORRT_PATH "E:/TensorRT-8.5.2.2")
	include_directories(/usr/local/cuda/include)
	link_directories(/usr/local/cuda/lib64)
	link_directories(/usr/local/cuda/lib)
ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows")
	MESSAGE(STATUS "current platform: Windows")
	set(CUDA_COMPILER_PATH "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.7/bin/nvcc.exe")
	set(TENSORRT_PATH "E:/TensorRT-8.5.2.2")
	set(OpenCV_DIR "E:/opencv/build")
	set(OpenCV_INCLUDE_DIRS ${OpenCV_DIR}\\include) 
	set(OpenCV_LIB_DIRS ${OpenCV_DIR}\\x64\\vc15\\lib) 
	set(OpenCV_Debug_LIBS "opencv_world454d.lib") 
	set(OpenCV_Release_LIBS "opencv_world454.lib") 
	set(CudaToolkitDir "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.7")

	include_directories(${PROJECT_SOURCE_DIR}/windows)
	include_directories(${CUDA_INCLUDE_DIRS})
	link_directories(${CUDA_LIBRARIES})
ELSE (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
	MESSAGE(STATUS "other platform: ${CMAKE_SYSTEM_PROCESSOR}")
	include_directories(/usr/local/cuda/targets/aarch64-linux/include)
	link_directories(/usr/local/cuda/targets/aarch64-linux/lib)
ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux")


set(CMAKE_CUDA_COMPILER ${CUDA_COMPILER_PATH})
enable_language(CUDA)

# tensorrt
include_directories(${TENSORRT_PATH}/include)
link_directories(${TENSORRT_PATH}/lib)


include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(${OpenCV_LIB_DIRS})

include_directories(${PROJECT_SOURCE_DIR}/include/)

file(GLOB_RECURSE SRCS ${PROJECT_SOURCE_DIR}/src/*.cpp ${PROJECT_SOURCE_DIR}/src/*.cu)


add_executable(yolov8_seg ${PROJECT_SOURCE_DIR}/yolov8_seg.cpp ${SRCS})
target_link_libraries(yolov8_seg nvinfer cudart)

target_link_libraries(yolov8_seg ${OpenCV_LIBS_DIRS})
target_link_libraries(yolov8_seg debug ${OpenCV_Debug_LIBS}) 
target_link_libraries(yolov8_seg optimized ${OpenCV_Release_LIBS})


3、win+R--->cmd--->输入:cmake-gui

4、输入yolov8-seg路径和新建的build路径

依次点击Confi gure---Generate---Open Project :

5、属性yolov8-seg

6、设置Release/x64

7、[C/C++] -> [预处理器] -> [预处理器定义] -> 加指令:_CRT_SECURE_NO_WARNINGS 

_CRT_SECURE_NO_WARNINGS

8、确保生成依赖性----生成自定义(B):CUDA

 

9、在属性管理器Release / x64下加现有属性表

(1)cuda2025:

包含目录:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include

库目录:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\libnvvp

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\lib

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\lib\x64

链接器:所有库目录下的所有dil文件

zlibwapi.lib
cublas.lib
cublasLt.lib
cuda.lib
cudadevrt.lib
cudart.lib
cudart_static.lib
cudnn.lib
cudnn64_8.lib
cudnn_adv_infer.lib
cudnn_adv_infer64_8.lib
cudnn_adv_train.lib
cudnn_adv_train64_8.lib
cudnn_cnn_infer.lib
cudnn_cnn_infer64_8.lib
cudnn_cnn_train.lib
cudnn_cnn_train64_8.lib
cudnn_ops_infer.lib
cudnn_ops_infer64_8.lib
cudnn_ops_train.lib
cudnn_ops_train64_8.lib
cufft.lib
cufftw.lib
cufilt.lib
curand.lib
cusolver.lib
cusolverMg.lib
cusparse.lib
nppc.lib
nppial.lib
nppicc.lib
nppidei.lib
nppif.lib
nppig.lib
nppim.lib
nppist.lib
nppisu.lib
nppitc.lib
npps.lib
nvblas.lib
nvinfer.lib
nvinfer_dispatch.lib
nvinfer_lean.lib
nvinfer_plugin.lib
nvinfer_vc_plugin.lib
nvjpeg.lib
nvml.lib
nvonnxparser.lib
nvparsers.lib
nvptxcompiler_static.lib
nvrtc-builtins_static.lib
nvrtc.lib
nvrtc_static.lib
OpenCL.lib

(2)tensorrt8.5.2.2:

包含目录:

E:\TensorRT-8.5.2.2\include

E:\yolov8配置文件\TensorRT-8.5.3.1\samples\common

库目录:

E:\TensorRT-8.5.2.2\lib

链接器:所有库目录下的所有dil文件

nvinfer.lib
nvinfer_plugin.lib
nvonnxparser.lib
nvparsers.lib

(3)opencv454:

包含目录:

E:\opencv\build\include

E:\opencv\build\include\opencv2

库目录:

E:\opencv\build\x64\vc15\lib

链接器:所有库目录下的所有dil文件

opencv_world454.lib

(4)eigen:

包含目录:

D:\20250116_bbbbb\eigen-3.4.0

呈现结果:

  • 显示界面:

  • 包含目录:

  • 库目录:

  •  连接器--->输入--->需要包含上面库目录下的所有dil文件

9、高级--->字符集:改成未设置

10、添加现有项:导入必要头文件、库文件(h、cpp、cu文件)

(1)...\TensorRT-Alpha-main\utils内:

所有h、cpp、cu文件

(2)...\TensorRT-Alpha-main\yolov8-seg内:

所有h、cpp、cu文件

(3)...\TensorRT-8.5.2.2\samples\common内:

logger.cpp、logger.h、sampleOptions.h、parserOnnxConfig.h

11、X64目录下新建image+weight文件夹:

(1)  image:存放结果

(2)weight:存放模型

12、app_yolov8_seg.cpp内修改

(1)关于颜色类别声明的修改

void setParameters(utils::InitParameter& initParameters)
{
    initParameters.class_names = utils::dataSets::coco80;

//点击coco80可选转到其声明部分,如果是自己的数据集,就需要更改声明文件
//使用官方yolov8模板就无需修改

    initParameters.num_class = 80;

//80是coco80数据集的类别数,如果是自己的数据集需要更改类别数
//使用官方yolov8模板就无需修改

...
}

(2)关于模型视频图片路径地址的修改

int main(int argc, char** argv)
{
...
    std::string model_path = "D:/20250116_bbbbb/TensorRT-Alpha-main/yolov8-seg/build20250116/weight/yolov8n-seg.trt";

//更改成trt模型的路径

    std::string video_path = "D:/20250116_bbbbb/TensorRT-Alpha-main/yolov8-seg/6.mp4";

//更改成测试视频的路径

    std::string image_path = "D:/20250116_bbbbb/TensorRT-Alpha-main/yolov8-seg/002.jpg";

//更改成测试图片的路径
//自己找的图片可能会存在格式大小等问题,可以先采用coco128图片集内的图片进行测试

...

}

13、utils.h内修改

    struct InitParameter
    {
......
        bool is_show = true;
        bool is_save = true;
    };

//两个false都改成true(小写)

14、点击运行导出图片

导出标注后的图片可在image文件夹内找到。

15、app_yolov8_seg.cpp内修改main函数可导出视频

将main函数部分修改为下列代码,会在image文件夹内导出标注后视频的每一帧,也会在build文件夹内导出检测后的视频。(1)(2)(3)(4)。

int main(int argc, char** argv)
{
	cv::CommandLineParser parser(argc, argv,
		{
			"{model 	|| tensorrt model file	   }"
			"{size      || image (h, w), eg: 640   }"
			"{batch_size|| batch size              }"
			"{video     || video's path			   }"
			"{img       || image's path			   }"
			"{cam_id    || camera's device id	   }"
			"{show      || if show the result	   }"
			"{savePath  || save path, can be ignore}"
		});
	utils::InitParameter param;
	setParameters(param);
	std::string model_path = "D:/20250116_bbbbb/TensorRT-Alpha-main/yolov8-seg/build20250116/weight/yolov8n-seg.trt";
	//std::string model_path = "D:/20250116_bbbbb/TensorRT-Alpha-main/yolov8-seg/build20250116/weight/best.trt";
	std::string video_path = "D:/20250116_bbbbb/TensorRT-Alpha-main/yolov8-seg/6.mp4";
	std::string image_path = "D:/20250116_bbbbb/TensorRT-Alpha-main/yolov8-seg/003.jpg";
	int camera_id = 0;
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 用于表示输入流的来源
	utils::InputStream source;
	//utils::InputStream::IMAGE;//注释
	utils::InputStream::VIDEO;
	//source = utils::InputStream::IMAGE;//图像
//添加/////////////改视频(1)
	source = utils::InputStream::VIDEO;
//复制两注释符号之间的代码
	//source = utils::InputStream::CAMERA;//摄像头
	int size = -1;
	int batch_size = 8;
	bool is_show = true;
	bool is_save = true;
	if (parser.has("model"))
	{
		model_path = parser.get<std::string>("model");
		sample::gLogInfo << "model_path = " << model_path << std::endl;
	}
	if (parser.has("size"))
	{
		size = parser.get<int>("size");
		sample::gLogInfo << "size = " << size << std::endl;
		param.dst_h = param.dst_w = size;
	}
	if (parser.has("batch_size"))
	{
		batch_size = parser.get<int>("batch_size");
		sample::gLogInfo << "batch_size = " << batch_size << std::endl;
		param.batch_size = batch_size;

	}
	if (parser.has("video"))
	{
		source = utils::InputStream::VIDEO;
		video_path = parser.get<std::string>("video");
		sample::gLogInfo << "video_path = " << video_path << std::endl;
	}
	if (parser.has("img"))
	{
		source = utils::InputStream::IMAGE;
		image_path = parser.get<std::string>("img");
		sample::gLogInfo << "image_path = " << image_path << std::endl;
	}
	if (parser.has("cam_id"))
	{
		source = utils::InputStream::CAMERA;
		camera_id = parser.get<int>("cam_id");
		sample::gLogInfo << "camera_id = " << camera_id << std::endl;
	}

	if (parser.has("show"))
	{
		param.is_show = true;
		sample::gLogInfo << "is_show = " << is_show << std::endl;
	}
	if (parser.has("savePath"))
	{
		param.is_save = true;
		param.save_path = parser.get<std::string>("savePath");
		sample::gLogInfo << "save_path = " << param.save_path << std::endl;
	} 
	int total_batches = 0;
	int delay_time = 1;
//视频处理
	cv::VideoCapture capture;
	if (!setInputStream(source, image_path, video_path, camera_id,
		capture, total_batches, delay_time, param))
	{
		sample::gLogError << "read the input data errors!" << std::endl;
		return -1;
	}

	// 初始化视频写入器
//添加/////////////改视频(2)
	double fps = capture.get(cv::CAP_PROP_FPS);
	cv::Size frameSize = cv::Size(capture.get(cv::CAP_PROP_FRAME_WIDTH), capture.get(cv::CAP_PROP_FRAME_HEIGHT));
	cv::VideoWriter videoWriter;
	int fourcc = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');
	videoWriter.open("output_video.avi", fourcc, fps, frameSize);
//复制两注释符号之间的代码
	setRenderWindow(param);
	YOLOv8Seg yolo(param);
	std::vector<unsigned char> trt_file = utils::loadModel(model_path);
	if (trt_file.empty())
	{
		sample::gLogError << "trt_file is empty!" << std::endl;
		return -1;
	}
	if (!yolo.init(trt_file))
	{
		sample::gLogError << "initEngine() ocur errors!" << std::endl;
		return -1;
	}
	yolo.check();


	//图像处理
	cv::Mat frame;
	std::vector<cv::Mat> imgs_batch;
	imgs_batch.reserve(param.batch_size);
	sample::gLogInfo << imgs_batch.capacity() << std::endl;
	int batchi = 0;
	while (capture.isOpened())
	{
		if (batchi >= total_batches && source != utils::InputStream::CAMERA)
		{
			break;
		}
		if (imgs_batch.size() < param.batch_size)
		{
			if (source != utils::InputStream::IMAGE)
			{
				capture.read(frame);
			}
			else
			{
				frame = cv::imread(image_path);
			}
			if (frame.empty())
			{
				sample::gLogWarning << "no more video or camera frame" << std::endl;
				task(yolo, param, imgs_batch, delay_time, batchi);
				imgs_batch.clear();
				batchi++;
				break;
			}
			else
			{
				imgs_batch.emplace_back(frame.clone());
			}
		}
		else
		{
			task(yolo, param, imgs_batch, delay_time, batchi);
			// 将处理后的帧写入视频文件
//添加////////////改视频(3)
			for (const auto& img : imgs_batch) {
				videoWriter.write(img);
			}
//复制两注释符号之间的代码
			imgs_batch.clear();
			batchi++;
		}
	}

	// 释放视频写入器资源
//添加/////////////改视频(4)
	videoWriter.release();
//复制两注释符号之间的代码
	return  -1;
}

--------------------------------------------------------------------------------------------------------------------

四、关于使用自己训练的模型

1、需准备yaml文件

如果是自己在yolov8-seg训练得到的best.pt模型,需要在...\ultralytics\cfg\models\v8目录下新建yaml文件(复制粘贴"yolo8-seg.yaml"的内容,修改类别)。

2、修改数据集声明

(1)utils.h

在utils.h文件中增加自己数据集的标签集、颜色集,以及更改类别数。

namespace utils 
{
    namespace dataSets
    {
......
const std::vector<std::string> rooftop105 = {"rooftop"};//添加屋顶标签集
    }
    namespace Colors
    {
......
const std::vector<cv::Scalar> colar1{cv::Scalar(128, 77, 207) };//添加屋顶标注颜色集
    }

    struct InitParameter
    {
        //int num_class{ 80 }; //注释
        int num_class{ 1 }; // 修改类别数
......
    };
}

(2)app _yolov8 seg.cpp

//修改成自己的数据集

void setParameters(utils::InitParameter& initParameters)
{
	//initParameters.class_names = utils::dataSets::coco80;//注释
	initParameters.class_names = utils::dataSets::rooftop105;//修改成自己命名的数据集
    initParameters.num_class = 1;

......
}

//修改成自己的颜色集 

void YOLOv8Seg::showAndSave(const std::vector<std::string>& classNames, const int& cvDelayTime, std::vector<cv::Mat>& imgsBatch)
{
......
    for (size_t bi = 0; bi < imgsBatch.size(); bi++)
    {
            ......
        for (size_t i = 0; i < num_boxes; i++)
        {
            ......
            {
                int label = ptr[5];
                //cv::Scalar color = utils::Colors::color80[label];//注释
                cv::Scalar color = utils::Colors::color1[label];//修改成自己新建的颜色集
......
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扶云云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值