设计网站一条龙,高级网络规划设计师有什么用,友情链接购买网站,杭州产品设计公司1. 环境准备#xff1a;打好地基#xff0c;避免后续“踩坑” 想在Ubuntu 20.04上把YOLOv11模型用C和TensorRT跑起来#xff0c;第一步也是最关键的一步#xff0c;就是把环境给配好。这就像盖房子#xff0c;地基不稳#xff0c;后面装修得再漂亮也白搭。我见过太多朋友…1. 环境准备打好地基避免后续“踩坑”想在Ubuntu 20.04上把YOLOv11模型用C和TensorRT跑起来第一步也是最关键的一步就是把环境给配好。这就像盖房子地基不稳后面装修得再漂亮也白搭。我见过太多朋友卡在这一步折腾好几天最后发现是CUDA版本不对或者TensorRT没装好。所以咱们先花点时间把环境梳理清楚。我的测试设备是一台搭载了NVIDIA GeForce RTX 3050显卡的机器。选择Ubuntu 20.04是因为它长期支持生态稳定很多工业级应用都基于这个版本开发兼容性有保障。下面是我最终验证可用的关键软件版本清单你可以直接对照着来系统Ubuntu 20.04.6 LTS显卡驱动535.183.01这个驱动版本决定了你能用的最高CUDA版本CUDA12.2.2cuDNN8.9.7TensorRT10.8.0.43CMake3.28.6Python3.10.16主要用于前期的模型转换工具链这里有个核心逻辑驱动 CUDA cuDNN TensorRT版本必须依次兼容。简单说你的显卡驱动得支持你选的CUDA版本而TensorRT的版本又必须匹配你的CUDA版本。我选择CUDA 12.2.2是因为我的535驱动最高就支持到这个版本。你可以在终端用nvidia-smi命令查看驱动版本和支持的CUDA版本。1.1 安装与配置CUDA和cuDNN如果你机器上已经装过其他版本的CUDA别急着卸载我们可以实现多版本共存。我推荐用官方runfile方式安装这样最干净也最容易管理多个版本。首先去NVIDIA官网下载对应版本的CUDA Toolkit安装包比如cuda_12.2.2_535.104.05_linux.run。下载后给它执行权限并安装sudo chmod x cuda_12.2.2_535.104.05_linux.run sudo ./cuda_12.2.2_535.104.05_linux.run安装过程中记得取消勾选驱动安装Driver因为我们已经有了合适的驱动。安装完成后CUDA默认会放在/usr/local/cuda-12.2。接下来配置环境变量让系统知道我们用哪个CUDA。编辑你的~/.bashrc文件gedit ~/.bashrc在文件末尾添加这几行# CUDA 12.2 export PATH/usr/local/cuda-12.2/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH保存后执行source ~/.bashrc让配置生效。这时你可以通过建立一个软链接/usr/local/cuda指向你当前使用的版本方便切换。比如sudo rm -f /usr/local/cuda sudo ln -s /usr/local/cuda-12.2 /usr/local/cuda这样很多软件默认找/usr/local/cuda就能找到正确的版本。验证安装用nvcc --version。cuDNN的安装相对简单下载对应CUDA 12.x的版本我用的8.9.7解压后将其中的库文件和头文件复制到CUDA目录即可sudo cp cuda/include/cudnn*.h /usr/local/cuda/include/ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/ sudo chmod ar /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*1.2 安装TensorRT与trtexec工具TensorRT是NVIDIA的推理优化引擎是我们这次部署的核心。去NVIDIA开发者网站下载TensorRT 10.8.0 GA for Linux x86_64 and CUDA 12.0的TAR包。为什么选10.8因为它对YOLO系列的新模型支持比较好而且和CUDA 12.2兼容性经过验证。下载后解压我习惯把它放到/usr/local目录下统一管理tar -xzvf TensorRT-10.8.0.43.Linux.x86_64-gnu.cuda-12.6.tar.gz sudo mv TensorRT-10.8.0.43 /usr/local/同样需要把它的库路径加到环境变量里。编辑~/.bashrc在刚才CUDA的配置后面追加# TensorRT export PATH$PATH:/usr/local/TensorRT-10.8.0.43/bin export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/usr/local/TensorRT-10.8.0.43/libsource ~/.bashrc之后一个非常重要的工具trtexec就可以用了。你可以在终端输入trtexec --version测试。这个工具后面会用来把ONNX模型转换成TensorRT的引擎文件.engine是离线优化模型性能的关键。1.3 配置Python虚拟环境与编译工具模型转换部分从PyTorch的.pt到ONNX还需要Python环境。为了避免污染系统环境也为了版本管理方便强烈建议使用虚拟环境。我用的是pyenv配合virtualenv你也可以用conda。首先安装Python 3.10.16然后创建虚拟环境pyenv install 3.10.16 pyenv virtualenv 3.10.16 py310_yolo pyenv activate py310_yolo在这个环境里我们需要安装一些必要的Python包比如pybind11用于C和Python交互、onnx、torch等。但先别急等我们拿到模型转换工具再一起装。最后确保你的CMake版本足够高。因为后续编译TensorRT-YOLO工具需要C17等新特性支持。Ubuntu 20.04默认的CMake版本较低需要升级。可以通过官方Kitware仓库安装最新版或者下载源码编译。安装后记得确认版本cmake --version。2. 模型转换从PyTorch到TensorRT引擎环境配好了接下来就是处理模型本身。我们的起点通常是一个在PyTorch框架下训练好的YOLOv11模型文件比如yolo11n.pt。目标是要把它变成TensorRT能直接高效推理的序列化引擎文件.engine。这个过程分两步走先转ONNX再转TensorRT。2.1 获取与编译TensorRT-YOLO转换工具自己从头写转换脚本比较麻烦而且容易出错。社区有个很棒的开源工具叫TensorRT-YOLO它封装了YOLOv5/v8/v10/v11等模型到ONNX再到TensorRT引擎的完整转换流程我们直接用它。首先把代码仓库克隆下来git clone https://github.com/laugh12321/TensorRT-YOLO.git cd TensorRT-YOLO关键的一步来了编译安装。这里需要在我们之前创建的Python虚拟环境下操作。pyenv activate py310_yolo # 激活虚拟环境 pip install pybind11[global] # 安装必要的Python绑定工具然后使用CMake进行构建。注意-DTRT_PATH要指向你TensorRT的安装目录cmake -S . -B build -DTRT_PATH/usr/local/TensorRT-10.8.0.43 -DBUILD_PYTHONON cmake --build build -j$(nproc) --config Release-j$(nproc)表示用你电脑所有的CPU核心并行编译速度更快。编译完成后进入Python目录安装这个工具包cd python pip install --upgrade build python -m build --wheel # 安装生成的wheel包路径根据实际情况修改 pip install /path/to/TensorRT-YOLO/python/dist/tensorrt_yolo-6.2.0-py3-none-any.whl[export]安装成功后你会获得一个命令行工具trtyolo。这个工具就是我们进行模型转换的“瑞士军刀”。2.2 生成ONNX中间模型现在假设你的YOLOv11模型文件是yolo11n.pt。使用trtyolo导出ONNX模型非常简单trtyolo export --weights yolo11n.pt --opset 17 --simplify这里有几个参数需要注意--opset 17指定ONNX算子集版本。版本不宜过低否则可能不支持某些算子也不宜过高需考虑TensorRT的兼容性。17是一个比较稳妥的选择。--simplify启用模型简化。这个步骤非常重要它会调用onnx-simplifier对计算图进行优化合并冗余的算子常常能解决后续TensorRT解析时遇到的“不支持的算子”错误。命令执行成功后你会得到一个yolo11n.onnx文件。我建议用Netron一个在线或离线的模型可视化工具打开这个.onnx文件看一眼检查一下输入输出的名字和维度是否正确。通常输入是一个1x3x640x640的图片张量输出可能比较复杂是检测框、置信度和类别的组合。2.3 使用trtexec生成优化后的TensorRT引擎拿到ONNX模型后就可以用TensorRT自带的trtexec工具进行编译和优化了。这一步会在你的特定硬件GPU上为这个模型生成一个高度优化的推理引擎。trtexec --onnxyolo11n.onnx --saveEngineyolo11n.engine --fp16 --workspace4096这个命令的参数是性能优化的核心--onnx指定输入的ONNX模型路径。--saveEngine指定输出的TensorRT引擎文件路径。--fp16启用FP16半精度浮点数推理。这是大幅提升推理速度的关键通常精度损失很小但能带来显著的性能提升。如果你的GPU支持INT8比如RTX 3050支持甚至可以尝试--int8进行量化速度更快不过需要校准数据流程稍复杂。--workspace设置GPU显存工作空间大小单位是MB。如果模型比较大或者你用的是小显存显卡可能会遇到“out of memory”错误可以适当调小这个值比如1024。如果显存充足设大一点如4096可以让TensorRT有更多空间尝试不同的内核实现来优化速度。转换过程中trtexec会输出大量的日志显示它正在进行的优化步骤比如图层融合、常量折叠等。最终看到“Engine built in … ms”就成功了。生成的.engine文件是硬件相关的换一台不同型号的GPU可能就需要重新生成。3. 构建独立的C推理工程模型准备好了接下来我们要打造一个纯粹的、不依赖Python环境的C推理程序。这样做的目的是为了集成和部署。你可以把这个C程序轻松地嵌入到你的机器人、边缘计算盒子或者任何C主程序中。3.1 工程结构与核心文件提取我们不需要整个庞大的TensorRT-YOLO仓库只需要其中与检测Detect相关的核心C代码。从TensorRT-YOLO/examples/detect/目录下我们需要拷贝以下文件来组建自己的最小化工程你的工程目录/ ├── CMakeLists.txt # 项目构建文件需要修改 ├── src/ │ └── detect.cpp # 主推理代码 ├── include/ # 头文件从原仓库拷贝 │ ├── preprocess.h │ ├── postprocess.h │ └── ... ├── models/ │ └── yolo11n.engine # 上一步生成的TensorRT引擎 ├── images/ # 待检测的图片 │ └── test.jpg ├── labels.txt # 类别标签文件 └── output/ # 检测结果输出目录detect.cpp是这个工程的核心它完成了加载引擎、预处理图片、执行推理、后处理画框的全流程。原版的代码已经写得很清晰我们主要是要让它能在我们自己的CMake工程里编译通过。3.2 定制化CMakeLists.txt详解CMakeLists.txt是项目的构建蓝图这里我分享一个我修改过的、更清晰、适应性更强的版本。你需要重点关注几个路径的配置。cmake_minimum_required(VERSION 3.18) project(detect LANGUAGES CXX CUDA) # 设置C标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 1. 查找OpenCV必须用于图像读写和显示 find_package(OpenCV REQUIRED) message(STATUS Found OpenCV: ${OpenCV_DIR}) # 2. 查找CUDA find_package(CUDAToolkit REQUIRED) # 设置CUDA架构根据你的GPU来。RTX 3050是sm86但兼容sm89。多写几个兼容性好。 set(CMAKE_CUDA_ARCHITECTURES 89;86;75;70;61) # 3. 配置TensorRT路径这是你需要修改的关键 set(TRT_PATH /usr/local/TensorRT-10.8.0.43) # 改成你的TensorRT实际安装路径 if(NOT EXISTS ${TRT_PATH}) message(FATAL_ERROR TensorRT not found at ${TRT_PATH}) endif() set(TRT_INCLUDE_DIR ${TRT_PATH}/include) set(TRT_LIB_DIR ${TRT_PATH}/lib) # 4. 配置TensorRT-YOLO的部署库路径另一个关键 set(DEPLOY_PATH /home/your_username/code/TensorRT-YOLO) # 改成你克隆TensorRT-YOLO的绝对路径 set(DEPLOY_INCLUDE_DIR ${DEPLOY_PATH}/include) # 包含preprocess.h等头文件 set(DEPLOY_LIB_DIR ${DEPLOY_PATH}/lib) # 包含编译好的libdeploy.a静态库 # 5. 创建可执行文件 add_executable(detect src/detect.cpp) # 6. 为可执行文件添加头文件搜索路径 target_include_directories(detect PRIVATE ${OpenCV_INCLUDE_DIRS} ${TRT_INCLUDE_DIR} ${DEPLOY_INCLUDE_DIR} ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES} ) # 7. 添加链接库搜索路径 target_link_directories(detect PRIVATE ${TRT_LIB_DIR} ${DEPLOY_LIB_DIR} ${OpenCV_LIBRARY_DIRS} ) # 8. 链接所有必需的库 target_link_libraries(detect PRIVATE ${OpenCV_LIBS} nvinfer nvinfer_plugin nvonnxparser cudart deploy # 链接TensorRT-YOLO的部署静态库 ) # 9. 设置输出目录 set_target_properties(detect PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin )这个CMakeLists.txt的关键在于两个路径TRT_PATH和DEPLOY_PATH。前者指向TensorRT的安装位置后者指向你克隆并编译好的TensorRT-YOLO仓库。deploy库是编译TensorRT-YOLO时生成的里面封装了图像预处理和后处理的CUDA内核函数是高性能的保证。3.3 编译与验证在工程根目录下执行标准的CMake编译流程mkdir build cd build cmake .. make -j$(nproc)如果一切顺利你会在./bin目录下看到生成的可执行文件detect。在运行它之前请确保你的目录结构正确特别是models/下的.engine文件和labels.txt标签文件每行一个类别名已经就位。4. 运行推理与性能调优终于到了收获成果的时刻。运行你的C检测程序感受一下本地推理的速度。4.1 执行推理命令与参数解析进入bin目录运行程序cd bin ./detect -e ../models/yolo11n.engine -i ../images -o ../output -l ../labels.txt这些命令行参数在detect.cpp的main函数开头有定义-e或--engineTensorRT引擎文件路径。-i或--input输入源。可以是一张图片的路径、一个包含多张图片的文件夹路径或者摄像头索引如0代表第一个摄像头。-o或--output检测结果输出目录。程序会把画了检测框的图片保存到这里。-l或--labels类别标签文件。程序运行后你会在终端看到类似这样的输出显示了预处理、推理、后处理各阶段耗时[INFO] Loaded engine: ../models/yolo11n.engine [INFO] Input shape: 1x3x640x640 [INFO] Processing image: ../images/test.jpg [INFO] Preprocess time: 1.2 ms [INFO] Inference time: 4.5 ms [INFO] Postprocess time: 0.8 ms [INFO] Total time: 6.5 ms (153.8 FPS) [INFO] Saved result to: ../output/test.jpg看到153.8 FPS了吗这就是在RTX 3050上用TensorRT FP16模式推理YOLOv11-nano模型能达到的实时性能。相比在PyTorch下直接推理可能有数倍甚至十倍的提升。4.2 性能瓶颈分析与优化策略如果你的帧率不理想或者想进一步压榨硬件性能可以从以下几个方向排查和优化1. 预处理瓶颈detect.cpp中的预处理如图像resize、归一化、BGR转RGB、HWC转CHW默认是在CPU上进行的。对于高分辨率或批量图片这可能成为瓶颈。优化的方法是使用CUDA内核进行GPU预处理。幸运的是我们拷贝的TensorRT-YOLO代码中的preprocess.h/cpp已经实现了GPU版本的预处理preprocess_kernel_img你需要确保在代码中调用的是这个GPU版本并且正确管理了CPU与GPU之间的内存拷贝。2. 推理引擎配置回顾我们生成引擎时的trtexec命令。--fp16是速度提升的关键。如果精度允许可以尝试--int8但需要提供校准数据集。另外--workspace大小会影响一些层融合优化策略在显存够用的情况下可以给大一点。3. 后处理优化后处理从模型输出张量中解析出框、分数、类别并执行非极大值抑制NMS也是计算密集型的。原版代码的后处理可能在CPU上执行。更优的方案是使用TensorRT的插件Plugin或者编写CUDA内核将NMS等操作也放在GPU上完成避免在CPU和GPU之间传输大量候选框数据。4. 流水线与批处理对于视频流可以设计流水线Pipeline让预处理、推理、后处理在不同的CUDA Stream中并行执行。同时如果应用场景支持使用批处理Batch Inference一次推理多张图片能显著提高GPU的利用率和吞吐量。这需要你在创建TensorRT引擎时指定动态批次维度并在推理时传入一批数据。5. profiling工具使用nvprof或Nsight Systems来对程序进行性能剖析可以直观地看到每个CUDA内核、每个Memcpy操作的时间消耗精准定位热点。在实际部署中我通常会把预处理和后处理都移到GPU并开启FP16这样一套组合拳下来即使是稍微大一点的YOLOv11模型在中等性能的显卡上也能轻松跑出超过100 FPS的实时性能。整个过程虽然步骤不少但一旦跑通你就会得到一个独立、高效、可集成到任何C项目中的目标检测模块这种掌控感是直接用Python脚本无法比拟的。