当前位置:   article > 正文

yolov8实战第六天——yolov8 TensorRT C++ 部署——(踩坑,平坑,保姆教程)

yolov8 tensorrt

C++ 结合 TensorRT 部署深度学习模型有几个关键优势,这些优势在各种工业和商业应用中极其重要:

  1. 高效的性能:TensorRT 通过优化深度学习模型来提高推理速度,减少延迟。这对于实时处理应用(如视频分析、机器人导航等)至关重要。

  2. 降低资源消耗:TensorRT 优化了模型以在GPU上高效运行,这意味着更低的内存占用和更高的吞吐量。对于资源受限的环境或在多任务并行处理的情况下,这是一个显著优势。

  3. 跨平台和硬件兼容性:C++ 是一种跨平台语言,配合 TensorRT,可以在多种硬件和操作系统上部署深度学习模型,包括嵌入式设备和服务器。

  4. 准确性和稳定性:TensorRT 提供了精确的数学和统计方法来减少浮点运算误差,这对于确保深度学习应用的准确性和稳定性至关重要。

  5. 定制和灵活性:使用 C++ 和 TensorRT,开发者可以高度定制他们的深度学习应用。这包括调整模型结构、优化算法和调节性能参数以满足特定需求。

  6. 支持复杂网络和大规模部署:TensorRT 支持最新的深度学习网络结构,并能够处理复杂的计算任务。这对于需要部署大型、复杂网络的工业应用来说是必要的。

  7. 易于集成和扩展:C++ 提供了与其他系统和工具(如数据库、网络服务等)集成的灵活性。此外,TensorRT 也可以轻松与其他NVIDIA工具链(如CUDA、cuDNN等)集成。

 

一、准备

下载YOLOv8项目和Tensorrt部署项目,TensorRT C++代码选择:

https://github.com/xiaocao-tian/yolov8_tensorrt

yolov8参考前几天的ultralytics。

在ultralytics新建weights文件夹,放入yolov8s.pt.

将src的gen_wts.py,复制到ultralytics。

运行gen_wts.py,生成 yolov8s.wts.

 

 

再将weights复制到 yolov8 TensorRT。

 

二、环境准备 

1.vs配置

我下载的是vs2022,只安装c++的桌面开发。

踩坑1:特别注意,请先安装Visual Studio 2019,再安装CUDA。这样做的目的是避免在Visual Studio 2019中看不到CUDA runtime模板。CUDA安装过程中,会提供cuda模板插件,如果先下载好Visual Studio 2019的情况下,该插件会自动配置。

平坑1:安装好vs2022后,再重装cuda。
cuda和cudnn安装请看:yolov8实战第一天——yolov8部署并训练自己的数据集(保姆式教程)_yolov8训练自己的数据集-CSDN博客

2.cmake配置

Index of /files

下载:cmake-3.28.0-rc1-windows-x86_64.msi 

安装版本,自己添加环境变量。

踩坑2:要验证cmake安装是否成功。 

 

cmake成功安装。

3.opencv、tensorrt配置

opencv安装:C++实战Opencv第一天——win11下配置vs,opencv环境和运行第一个c++代码(从零开始,保姆教学)-CSDN博客

tensorrt安装

yolov8实战第三天——yolov8TensorRT部署(python推理)(保姆教学)_yolov8 tensorrt python部署-CSDN博客

踩坑3环境变量的配置

平坑3opencv、tensorrt、cudnn环境变量配置

至此,vs,cmake,cuda,cudnn,opencv,tensorrt全部配置完成。 

三、编译

在tensorrt项目中新建build文件夹,然后使用cmake编译,注意tensorrt项目中Cmakelist.txt 

分别配置自己opencv和tensorrt的地址即可。

  1. cmake_minimum_required(VERSION 3.10)
  2. project(yolov8)
  3. # Modify to your path
  4. set(OpenCV_DIR "E:/opencv/opencv/build")
  5. set(TRT_DIR "E:/TensorRT-8.6.1.6")
  6. add_definitions(-std=c++11)
  7. add_definitions(-DAPI_EXPORTS)
  8. set(CMAKE_CXX_STANDARD 11)
  9. set(CMAKE_BUILD_TYPE Debug)
  10. # setup CUDA
  11. find_package(CUDA REQUIRED)
  12. message(STATUS "libraries: ${CUDA_LIBRARIES}")
  13. message(STATUS "include path: ${CUDA_INCLUDE_DIRS}")
  14. include_directories(${CUDA_INCLUDE_DIRS})
  15. enable_language(CUDA)
  16. include_directories(${PROJECT_SOURCE_DIR}/include)
  17. include_directories(${PROJECT_SOURCE_DIR}/plugin)
  18. # TensorRT
  19. set(TENSORRT_ROOT "E:/TensorRT-8.6.1.6")
  20. include_directories("${TENSORRT_ROOT}/include")
  21. link_directories("${TENSORRT_ROOT}/lib")
  22. # OpenCV
  23. find_package(OpenCV)
  24. include_directories(${OpenCV_INCLUDE_DIRS})
  25. add_library(myplugins SHARED ${PROJECT_SOURCE_DIR}/plugin/yololayer.cu)
  26. target_link_libraries(myplugins nvinfer cudart)
  27. file(GLOB_RECURSE SRCS ${PROJECT_SOURCE_DIR}/src/*.cpp ${PROJECT_SOURCE_DIR}/src/*.cu)
  28. add_executable(yolov8 ${PROJECT_SOURCE_DIR}/src/main.cpp ${SRCS})
  29. target_link_libraries(yolov8 nvinfer)
  30. target_link_libraries(yolov8 cudart)
  31. target_link_libraries(yolov8 myplugins)
  32. target_link_libraries(yolov8 ${OpenCV_LIBS})

在tensorrt项目中新建build文件夹,然后使用cmake编译,填写如图。

 

 

 踩坑1:No CUDA toolset found.就是找不到cuda。

  1. The C compiler identification is MSVC 19.38.33133.0
  2. The CXX compiler identification is MSVC 19.38.33133.0
  3. Detecting C compiler ABI info
  4. Detecting C compiler ABI info - done
  5. Check for working C compiler: E:/vs2022/Community/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe - skipped
  6. Detecting C compile features
  7. Detecting C compile features - done
  8. Detecting CXX compiler ABI info
  9. Detecting CXX compiler ABI info - done
  10. Check for working CXX compiler: E:/vs2022/Community/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe - skipped
  11. Detecting CXX compile features
  12. Detecting CXX compile features - done
  13. CMake Warning (dev) at CMakeLists.txt:15 (find_package):
  14. Policy CMP0146 is not set: The FindCUDA module is removed. Run "cmake
  15. --help-policy CMP0146" for policy details. Use the cmake_policy command to
  16. set the policy and suppress this warning.
  17. This warning is for project developers. Use -Wno-dev to suppress it.
  18. Found CUDA: D:/CUDA (found version "12.0")
  19. libraries: D:/CUDA/lib/x64/cudart_static.lib
  20. include path: D:/CUDA/include
  21. CMake Error at D:/cmake/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:529 (message):
  22. No CUDA toolset found.
  23. Call Stack (most recent call first):
  24. D:/cmake/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:8 (CMAKE_DETERMINE_COMPILER_ID_BUILD)
  25. D:/cmake/share/cmake-3.28/Modules/CMakeDetermineCompilerId.cmake:53 (__determine_compiler_id_test)
  26. D:/cmake/share/cmake-3.28/Modules/CMakeDetermineCUDACompiler.cmake:135 (CMAKE_DETERMINE_COMPILER_ID)
  27. CMakeLists.txt:20 (enable_language)
  28. Configuring incomplete, errors occurred!

踩坑3:找不到cudnn。

  1. User
  2. Traceback (most recent call last):
  3. File "<stdin>", line 1, in <module>
  4. File "E:\Anaconda3\Lib\site-packages\tensorrt\__init__.py", line 127, in <module>
  5. ctypes.CDLL(find_lib(lib))
  6. ^^^^^^^^^^^^^
  7. File "E:\Anaconda3\Lib\site-packages\tensorrt\__init__.py", line 81, in find_lib
  8. raise FileNotFoundError(
  9. FileNotFoundError: Could not find: cudnn64_8.dll. Is it on your PATH?
  10. Note: Paths searched were:

平坑后:警告不用管。configure:

 generate:

然后open Project。

踩坑4cmake 点 open Project 没反应 。

平坑4在生成的build中找到yolov8.sln,右键打开方式选择vs2022.

 

解决方案右键属性->选择yolov8. 

 

打开main.cpp

先注释 表示生成.engine文件。

    //wts_name = "";

注释后直接运行。 

 

 去掉注释,再次执行。

wts_name = "";

 视频太短,长视频fps在100左右。

添加fps代码:

  1. while (char(cv::waitKey(1) != 27)) {
  2. cap >> image;
  3. if (image.empty()) {
  4. std::cerr << "Error: Image not loaded or end of video." << std::endl;
  5. break; // or continue based on your logic
  6. }
  7. auto t_beg = std::chrono::high_resolution_clock::now();
  8. float scale = 1.0;
  9. int img_size = image.cols * image.rows * 3;
  10. cudaMemcpyAsync(image_device, image.data, img_size, cudaMemcpyHostToDevice, stream);
  11. preprocess(image_device, image.cols, image.rows, device_buffers[0], kInputW, kInputH, stream, scale);
  12. context->enqueue(kBatchSize, (void**)device_buffers, stream, nullptr);
  13. cudaMemcpyAsync(output_buffer_host, device_buffers[1], kBatchSize * kOutputSize * sizeof(float), cudaMemcpyDeviceToHost, stream);
  14. cudaStreamSynchronize(stream);
  15. std::vector<Detection> res;
  16. NMS(res, output_buffer_host, kConfThresh, kNmsThresh);
  17. // 计算FPS
  18. frame_counter++;
  19. if (frame_counter % 10 == 0) { // 每10帧更新一次FPS
  20. auto t2 = std::chrono::high_resolution_clock::now();
  21. auto time_span = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1);
  22. fps = frame_counter / time_span.count();
  23. t1 = t2;
  24. frame_counter = 0;
  25. }
  26. drawBbox(image, res, scale, labels);
  27. // 将FPS绘制到图像上
  28. cv::putText(image, "FPS: " + std::to_string(fps), cv::Point(10, 30), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 0), 2);
  29. auto t_end = std::chrono::high_resolution_clock::now();
  30. cv::imshow("Inference", image);
  31. float total_inf = std::chrono::duration<float, std::milli>(t_end - t_beg).count();
  32. std::cout << "Inference time: " << int(total_inf) << std::endl;
  33. }
  34. // cv::waitKey();
  35. cv::destroyAllWindows();

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/736306
推荐阅读
相关标签
  

闽ICP备14008679号