当前位置: 首页 > news >正文

最简洁yolov8 C++配置教程

最简洁yolov8 C++配置教程

  • ubuntu22.04 安装Cuda TensorRT Cudnn Miniconda
    • 1 .Cuda TensorRT Cudnn配置步骤
    • 2. Miniconda的安装 在之前的安装完毕且成功的情况下
  • yolov8的C++使用
    • 1. github上有个大神开源了yolov8的使用,非常好用,[链接](https://github.com/triple-Mu/YOLOv8-TensorRT):https://github.com/triple-Mu/YOLOv8-TensorRT

ubuntu22.04 安装Cuda TensorRT Cudnn Miniconda

该方法在多个计算平台进行了配置验证,百分百好用,平台包括:AMD CPU+3090、AMD CPU+5090D、intel CPU+P620、intelCPU+1060、intelCPU+4060

1 .Cuda TensorRT Cudnn配置步骤

a. 安装Nvidia显卡驱动,以我下面提供的Cuda TensorRT和Cudnn版本 ,根据电脑显卡型号,在官网上找到对应的显卡驱动版本,按照提示安装,或者在ubuntu22.04系统下打开软件和更新–>附加驱动–>(使用NVIDIA Server metapackage来自nvidia-driver-535),附加驱动部分选择535系列(不能太新了,根据下面安装的Cuda版本选择 535系列显卡驱动就行,非50系列显卡驱动直接用535系列就可以了),在除了5090D计算平台上,(5090D的显卡驱动没有535版本,都比较新,之前在5090上配置的时候直接安装的570系列驱动,此时以下的Cuda TensorRT Cudnn版本都不能用,需要自己去NVIDIA官网按照显卡驱动版本一个一个对应,之后安装流程同下)
b. 驱动安装完之后重启系统,在终端输入nvidia-smi,能查看到显卡 显存 功率等信息代表安装成功
c. 以下的这几个安装需要翻墙,如果不翻墙我放一个百度网盘的下载链接:https://pan.baidu.com/s/1g3744RQMhZH0qqK49E8sZA?pwd=6789 提取码: 6789(该环境中包含Miniconda的安装包)
Cuda 12.2.2 官网地址:https://developer.nvidia.com/cuda-12-2-2-download-archive
TensorRT 8.6.1 官网地址:https://developer.nvidia.com/nvidia-tensorrt-8x-download
cuDNN 8.9.4 官网地址:https://developer.nvidia.com/rdp/cudnn-archive

# 推荐路径,不是强制要求
mkdir ~/Workspace
cd ~/Workspace
mkdir booster tools tmp# 安装 CUDA-12.2.2
cd ~/Workspace/tmp
wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run
sudo sh cuda_12.2.2_535.104.05_linux.run --silent --toolkit
# 如果失败了,可以通过 /var/log/cuda-installer.log 查看具体信息
less /var/log/cuda-installer.log
# 如果成功了,会安装到 /usr/local/cuda下,可以检查一下
ls /usr/local/cuda
# 添加相应的 PATH 和 LD_LIBRARY_PATH
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc# 安装 TensorRT 8.6.1
cd ~/Workspace/tmp
wget https://developer.nvidia.com/downloads/compute/machine-learning/tensorrt/secure/8.6.1/tars/TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-12.0.tar.gz
tar -xzf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-12.0.tar.gz
sudo mv TensorRT-8.6.1.6 /usr/local
# 添加相应的 PATH 和 LD_LIBRARY_PATH
echo 'export LD_LIBRARY_PATH=/usr/local/TensorRT-8.6.1.6/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
echo 'export PATH=/usr/local/TensorRT-8.6.1.6//bin:$PATH' >> ~/.bashrc# 注意官网上下载 cudnn 会鉴权,所以没法直接用 wget 下,请自行用浏览器在官网上搜索下载
# wget https://developer.nvidia.com/downloads/compute/cudnn/secure/8.9.4/local_installers/12.x/cudnn-linux-x86_64-8.9.4.25_cuda12-archive.tar.xz
# 假设已经下好文件 cudnn-linux-x86_64-8.9.4.25_cuda12-archive.tar.xz
cd ~/Workspace/tmp
tar -xvf cudnn-linux-x86_64-8.9.4.25_cuda12-archive.tar.xz
sudo mv cudnn-linux-x86_64-8.9.4.25_cuda12-archive /usr/local/cudnn-8.9.4.25
echo 'export LD_LIBRARY_PATH=/usr/local/cudnn-8.9.4.25/lib:$LD_LIBRARY_PATH' >> ~/.bashrcsource ~/.bashrc

2. Miniconda的安装 在之前的安装完毕且成功的情况下

注意:Miniconda安装过程中有个步骤是否打开终端激活虚拟环境,建议选no,因为激活虚拟环境在编译一些工程的时候会缺少依赖,比如说编译复杂的大型ROS2工程会报错

# 安装 Miniconda(参考 https://docs.conda.io/en/latest/miniconda.html)​
cd ~/Workspace/tmp​
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh​
chmod a+x Miniconda3-latest-Linux-x86_64.sh​
./Miniconda3-latest-Linux-x86_64.sh​
# 阅读并接受许可协议(按 Enter 查看详情,输入 yes 接受)。​
# 选择安装目录(默认是 ~/miniconda3,可以直接按 Enter)。​
# 是否初始化 Conda:输入 yes 让安装程序自动设置 Conda 环境。​
​
source ~/.bashrc​
# 如果设置环境没成功,可以手动设置一下 PATH​
export PATH=/home/booster/miniconda3/bin:$PATH​
​
# 验证 conda 是否安装成功​
conda --version

yolov8的C++使用

Cuda给矩阵乘法、卷积运算等地层计算提供计算内核、TensorRT根据输入做图优化,并采用使用适当模型精度进行计算,最终把算子调用映射到cuDNN/CUDA内核执行、cuDNN针对卷积、池化、归一化、RNN等深度学习常用算子做高度优化,大部分卷积和激活函数的计算都是通过 cuDNN 调用 CUDA kernel 来完成的

1. github上有个大神开源了yolov8的使用,非常好用,链接:https://github.com/triple-Mu/YOLOv8-TensorRT

a. 要求熟练知道CMakeLists.txt的配置和使用,因为需要将CUDA Tensor-RT cuDNN的链接改成和自己电脑环境中相同的,大神的readme写的非常清楚,我按照readme指导的走,运行csrc/detect/end2end
b. 先编译通过,修改CMakeLists,如果你的配置和 ubuntu22.04 安装Cuda TensorRT Cudnn Miniconda这部分配置完全相同,那么可以参考我的CMakeLists:

cmake_minimum_required(VERSION 3.12)# 设置 CUDA 架构和编译器
set(CMAKE_CUDA_ARCHITECTURES 60 61 62 70 72 75 86 89 90)
set(CMAKE_CUDA_COMPILER /usr/local/cuda/bin/nvcc)project(yolov8 LANGUAGES CXX CUDA)# C++ 标准
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -O3")
set(CMAKE_BUILD_TYPE Release)
option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)# 添加自定义模块路径(如果有)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")# 查找 CUDA
find_package(CUDA REQUIRED)
message(STATUS "CUDA_LIBRARIES: ${CUDA_LIBRARIES}")
message(STATUS "CUDA_INCLUDE_DIRS: ${CUDA_INCLUDE_DIRS}")# 查找 OpenCV
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV_LIBS: ${OpenCV_LIBS}")
message(STATUS "OpenCV_INCLUDE_DIRS: ${OpenCV_INCLUDE_DIRS}")# TensorRT 手动路径配置
set(TENSORRT_ROOT /usr/local/TensorRT-8.6.1.6)
set(TensorRT_INCLUDE_DIRS ${TENSORRT_ROOT}/include)
set(TENSORRT_LIBS/usr/local/TensorRT-8.6.1.6/targets/x86_64-linux-gnu/lib/libnvinfer.so/usr/local/TensorRT-8.6.1.6/targets/x86_64-linux-gnu/lib/libnvinfer_plugin.so
)
# 所有 include 路径
list(APPEND ALL_INCLUDE_DIRS${CUDA_INCLUDE_DIRS}${OpenCV_INCLUDE_DIRS}${TensorRT_INCLUDE_DIRS}${CMAKE_CURRENT_SOURCE_DIR}/include
)
# 所有库
list(APPEND ALL_LIBS${CUDA_LIBRARIES}${OpenCV_LIBRARIES}${TensorRT_LIBRARIES}
)
# 打印调试信息
message(STATUS "ALL_INCLUDE_DIRS: ${ALL_INCLUDE_DIRS}")
message(STATUS "ALL_LIBS: ${ALL_LIBS}")
# 添加可执行文件
add_executable(${PROJECT_NAME}${CMAKE_CURRENT_SOURCE_DIR}/main.cpp${CMAKE_CURRENT_SOURCE_DIR}/include/yolov8.hpp${CMAKE_CURRENT_SOURCE_DIR}/include/common.hpp
)
# 包含目录
target_include_directories(${PROJECT_NAME}PUBLIC${ALL_INCLUDE_DIRS}
)
# 链接库
target_link_libraries(${PROJECT_NAME}PRIVATE${ALL_LIBS}
)
target_link_libraries(${PROJECT_NAME} PRIVATE ${TENSORRT_LIBS})

c. 转换出可用模型 这步实现参考帖子:https://blog.csdn.net/m0_64293675/article/details/141165503?spm=1001.2014.3001.5502
创建虚拟环境

conda create -n my_yolov8 python=3.9

激活虚拟环境

conda activate my_yolov8

在虚拟环境中安装pytorch 这里面的cuda版本和之前安装的不冲突,直接使用下面命令安装就可以了

pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116

完成安装后,可以在终端中输入下面命令,查看是否安装成功

python
import torch
print(torch.cuda.is_available(),torch.version.cuda)

成功之后,在虚拟环境中安装yolov8,建议直接用清华大学的镜像安装

# 安装方式1:官方源安装
pip install ultralytics  
# 安装方式2:使用清华大学的镜像源安装
pip install ultralytics -i  https://pypi.tuna.tsinghua.edu.cn/simple/

检查yolov8是否安装成功

python
import ultralytics
ultralytics.checks()

或者使用下面的命令对官方例子图片进行预测:

yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'

预测结果的保存位置会在终端打印出来,在哪个路径下打开终端 执行以上命令最终执行结果就会在该路径下,我在 /home/i/Workspace/yolov8 下运行的,最终预测结果保存在 /home/i/Workspace/yolov8/runs/detect/predict ,如图所示
在这里插入图片描述
开始转换模型,转换之前可以把*ultralytics克隆到本地,其中有 yolov8n.pt必须在虚拟环境激活的情况下,batch=1通常用于实时系统识别(大神git中提供的代码,是基于batch=1运行的),4/8/16用于视频的识别:

yolo export model=yolov8n.pt format=onnx batch=1
yolo export model=yolov8n.pt format=onnx batch=4
yolo export model=yolov8n.pt format=onnx batch=8
yolo export model=yolov8n.pt format=onnx batch=16

之后将onnx模型转engine,过程耗时比较长,我的1060大概5分钟以内,终端打印 &&&& PASSED 代表转换成功,–fp16 代表模型精度

trtexec --onnx=yolov8n.onnx --workspace=4096 --fp16 --dumpLayerInfo --saveEngine=best.engine

d. 代码运行
编译通过之后,将best.engine复制到 end2end/build 中,并整理几张图片,放到一个文件夹 data 里面, 之后在以下路径 YOLOv8-TensorRT/csrc/detect/end2end/build打开终端,输入以下命令运行:

./yolov8 best.engine data/street.jpg

如果成功我这里在原本的代码里面修改了一部分内容,这样能打印出识别到的几个目标的位置信息x y 宽度w 高度h 置信度score 等内容

void YOLOv8::postprocess(std::vector<Object>& objs)
{objs.clear();auto* output = static_cast<float*>(this->host_ptrs[0]);auto& dw    = this->pparam.dw;auto& dh    = this->pparam.dh;auto& width = this->pparam.width;auto& height= this->pparam.height;auto& ratio = this->pparam.ratio;const int row_len = 6;      // 每个目标占 6 个 floatconst int max_objs = 1000;  // engine 输出数组最大长度// 注意这个值要和 engine 输出长度一致for (int i = 0; i < max_objs; i++){float* ptr = output + i * row_len;float score = ptr[4];if(score < 0.01f)  // 置信度小于阈值就跳过continue;float x0 = clamp((ptr[0] - dw) * ratio, 0.f, width);float y0 = clamp((ptr[1] - dh) * ratio, 0.f, height);float x1 = clamp((ptr[2] - dw) * ratio, 0.f, width);float y1 = clamp((ptr[3] - dh) * ratio, 0.f, height);Object obj;obj.rect.x      = x0;obj.rect.y      = y0;obj.rect.width  = x1 - x0;obj.rect.height = y1 - y0;obj.prob        = score;obj.label       = static_cast<int>(ptr[5]);std::cout << "Object " << objs.size()<< ": x=" << obj.rect.x<< " y=" << obj.rect.y<< " w=" << obj.rect.width<< " h=" << obj.rect.height<< " score=" << obj.prob<< " label=" << obj.label << std::endl;objs.push_back(obj);}
}

成功运行后终端输出:

Object 0: x=580.706 y=305.095 w=36.3693 h=106.25 score=0.764892 label=0
Object 1: x=620.073 y=310.25 w=33.3716 h=99.6809 score=0.688364 label=0
Object 2: x=847.604 y=323.74 w=35.8441 h=99.7534 score=0.643329 label=0
Object 3: x=819.02 y=312.895 w=28.1242 h=87.8747 score=0.641422 label=0
Object 4: x=740.895 y=315.29 w=25.9573 h=63.9819 score=0.625209 label=0
Object 5: x=160.731 y=329.927 w=25.4992 h=56.9347 score=0.608885 label=0
Object 6: x=514.092 y=313.593 w=21.3784 h=66.1815 score=0.569015 label=0
Object 7: x=878.064 y=327.165 w=25.5585 h=67.5606 score=0.525947 label=0
Object 8: x=665.528 y=318.699 w=17.5478 h=50.5409 score=0.488672 label=0
Object 9: x=794.88 y=330.446 w=20.6612 h=45.0475 score=0.333178 label=0
Object 10: x=683.809 y=322.792 w=19.1234 h=46.5159 score=0.318697 label=0
Object 11: x=446.304 y=320.658 w=16.3049 h=42.7712 score=0.318167 label=0
Object 12: x=388.238 y=321.909 w=17.7373 h=45.5833 score=0.313525 label=0
http://www.dtcms.com/a/351998.html

相关文章:

  • Leetcode+Java+dpI
  • 汇智焕彩,聚势创新 - openKylin 2.0 SP2正式发布!
  • 企业云办公安全指南:如何构建高效无忧的云办公环境?
  • 在Godot中为您的游戏添加并控制游戏角色的完整技术指南
  • 集成电路学习:什么是MobileNet
  • 在数据同步过程中,RustFS如何平衡RDMA的高吞吐和金融级数据校验的开销?
  • 深分页优化:高效解决方案全解析
  • golang7 数组切片
  • RocketMQ 消息存储机制-消息刷盘
  • TorchInductor - Autotune
  • 【牛客刷题】链表指定区间反转:两种高效解法详解,轻松掌握面试高频题!
  • 互联网医院品牌定位与差异化策略
  • 地下蚁国 全DLC(Empires of the Undergrowth)免安装中文版 在蚂蚁的世界里建立你的帝国
  • 马斯克的「巨硬」: MacroHard
  • 机器学习模型可解释库的介绍:Shapash (一)
  • TRO冻结卷土重来?Keith律所代理Ronald Kuang版权再维权
  • Spring Bean 生命周期高阶用法:从回调到框架级扩展
  • Android系统学习2——Android.Utils.Log模块讨论
  • Android 系统属性添加篇
  • StandardScaler()进行0,1标准化时fit_transform与transform的区别
  • MIME类型与文件上传漏洞 - 网络安全视角
  • 【Jetson】基于llama.cpp部署gpt-oss-20b(推理与GUI交互)
  • 多地闭店上热搜,中产的白月光无印良品怎么了?
  • 项目管理进阶——项目经理任职资格评定聘任及考核管理办法
  • 支持向量机(SVM)核心概念总结
  • Tensor常见操作
  • vscode使用cmake tool进行项目管理安装
  • Elasticsearch映射:优化搜索性能的关键
  • 【无标题】计数组合学7.21(有界部分大小的平面分拆)
  • JVM模型