目录
2、修改CMakeLists.txt内容(主要是路径要正确)
3、win+R--->cmd--->输入:cmake-gui
7、[C/C++] -> [预处理器] -> [预处理器定义] -> 加指令:_CRT_SECURE_NO_WARNINGS
10、添加现有项:导入必要头文件、库文件(h、cpp、cu文件)
(1)...\TensorRT-Alpha-main\utils内:
(2)...\TensorRT-Alpha-main\yolov8-seg内:
(3)...\TensorRT-8.5.2.2\samples\common内:
15、app_yolov8_seg.cpp内修改main函数可导出视频
本文主要根据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文件
(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];//修改成自己新建的颜色集
......
}
}
}