ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLOv5+TensorRT+VS2019:Windows端C++推理加速部署指南

YOLOv5+TensorRT+VS2019:Windows端C++推理加速部署指南 简介YOLOv5实战与TensorRT加速部署是计算机视觉开发者关注的热点。该资源面向需要在Windows 10系统上完成YOLOv5模型推理加速的工程师和初学者聚焦解决CUDA、cuDNN、VS2019、OpenCV、Anaconda、CMake及TensorRT 7等环境配置繁琐、版本匹配难的问题。包体为单个PDF文档共1个文件大小仅169KB方便快速查阅和离线保存。已有3492人浏览学习说明其内容具有较高的实用参考价值。文档基于YOLOv5-V4.0结合配套博文教程清晰梳理了从依赖安装、环境变量设置到使用CMake配置工程、VS2019编译以及TensorRT引擎生成的全过程要点并提供打包好的百度网盘全部软件环境与提取码可大幅降低手动配置成本帮助学习者快速跑通部署流程、理解TensorRT优化原理。1. YOLOv5实战TensorRT部署VS2019编译这条链路到底值不值得走机器视觉交付项目里最常见的尴尬是模型在 PyTorch 里跑得好好的一上 Windows 工业机就被嫌弃“跑得慢”“依赖太脏”。YOLOv5 配合 TensorRT 做推理加速再用 VS2019 编译出原生 C 程序是目前 Windows 端性价比最高的落地方式。这篇文章按“软件选型 → 模型导出 → 工程编译 → 排错验证”的顺序展开覆盖从 .pt 权重到 TensorRT 引擎再到可执行 exe 的完整链路适合手上有模型但没跑过 TensorRT 的工程师也适合被版本兼容问题反复折磨的老手。下面讲的每一步都是可复现的参数也按经验值给出。2. 软件下载与版本选型VS2019、CUDA、TensorRT 怎么配才不翻车做 TensorRT 部署的第一步不是写代码而是把 VS2019、CUDA、cuDNN、TensorRT 四者的版本关系理顺。这一步错了后面编译报错会让你怀疑人生。常见做法是先定 TensorRT 版本再反推 CUDA 和 VS 版本因为 TensorRT 对 CUDA 版本有硬性要求而 VS2019 的编译器版本又决定了能不能正常编 CUDA 代码。不少人在这一步就卡了两三天下载了最新版 TensorRT 却发现和手上的 CUDA 对不上最后只能全部重装。2.1 VS2019 社区版安装与企业版许可证注意点VS2019 的安装包在微软官网常规下载页已经不好找了需要进入 Visual Studio 旧版本下载入口才能拿到。社区版对个人开发者和小型团队免费企业版则需要许可证。很多公司内部要求统一用企业版这里不讨论许可证获取方式只提醒两句部署机上不需要装完整 VS装 VC 运行时库就够开发机上装 VS2019 时务必勾选“使用 C 的桌面开发”工作负载否则连 CMake 工程都建不起来。提示VS2019 自带的 MSVC v142 工具集是编译 TensorRT 工程最稳的搭配没必要追 VS2022。安装时建议把“Windows 10 SDK”和“适用于最新 v142 生成工具的 C 编译器”两个子项一并勾上。很多人在 CMake 配置阶段报“找不到 C 编译器”就是因为只装了 IDE 没装工具集。还有一点容易被忽略VS2019 安装完成后第一次启动会要求登录微软账号建议提前准备好账号避免卡在欢迎界面。如果公司统一用企业版安装时输入产品密钥即可激活许可证与账号绑定换机器后重新登录就行。不建议在公司机器上装来源不明的精简版或绿色版 VS。TensorRT 编译时对 MSVC 工具链的完整性要求很高精简版经常缺资源文件打开工程时提示“未能加载项目”或是编到一半报“C1083 无法打开包括文件”。花半小时装一个完整的 VS2019比后面省事得多。2.2 CUDA cuDNN TensorRT 版本配套表TensorRT 每个大版本都对 CUDA 有明确的下限要求。以 TensorRT 8.x 为例8.5 之前主要支持 CUDA 11.x8.6 之后才开始支持 CUDA 12.0。如果你手头显卡驱动版本较旧就只能用 CUDA 11.x 系列。我一般建议按这个配套走TensorRT 版本CUDA 版本cuDNN 版本典型显卡8.4 GA11.6 / 11.78.5 或更高RTX 30 系8.5 GA11.88.6RTX 30 / 40 系8.6 GA11.8 / 12.08.9RTX 40 系表格里的配套关系来自 NVIDIA 官方发布说明。下载时建议直接去 NVIDIA 官网找指定版本不要盲目点“最新版下载”。TensorRT 的安装包是 tar 包格式解压后把 lib 目录加入系统 PATH把 include 目录路径记下来后面 CMake 配置要用。还要注意 TensorRT 8.5 和 8.6 的 API 有细微差异比如 enqueueV2 到 enqueueV3 的迁移照着旧教程抄代码经常编不过。cuDNN 下载需要注册 NVIDIA 开发者账号解压后把 bin、include、lib 三个目录里的内容分别拷贝到 CUDA 安装目录的对应位置。这一步很多教程一笔带过但漏拷贝 bin 下的 dll 会导致运行时报“找不到 cudnn64_x.dll”。拷贝完成后可以在终端里执行where cudnn64_x.dll检查是否被系统找到。2.3 OpenCV 选型与系统环境变量配置OpenCV 建议直接用 4.5.x 或 4.8.x 的官方 Windows 预编译包里面已经带 VC16 编译好的库和 VS2019 正好匹配。不要自己从源码编译 OpenCV除非要用 contrib 模块否则纯属浪费时间。下载时选择 win 版本解压后目录结构应为 build\include 和 build\x64\vc16\bin。拿到手后先验证一下 bin 目录下的 opencv_world480.dll 是否存在很多压缩包下载不完整缺了这一个文件后面链接全崩。环境变量建议配置以下四条PATH 追加 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\libnvvp D:\TensorRT-8.5.3.1\lib D:\opencv\build\x64\vc16\bin配完后重开一个终端分别执行nvcc --version和trtexec --version验证。trtexec 是 TensorRT 自带的命令行工具后面验证引擎对不对全靠它。如果 trtexec 提示找不到说明 PATH 里的 TensorRT lib 路径不对或环境变量没生效。注意PATH 里多个 CUDA 版本共存时一定要把当前要用的 CUDA bin 目录放在最前面否则 nvcc 可能调错版本。环境变量配好后再确认一下 CUDA 的 cudart64_*.dll 能被找到。TensorRT 构建引擎时会动态加载 CUDA 运行时如果 PATH 里顺序不对程序可能加载到旧版本的 cudart运行时报“CUDA driver version is insufficient”。排查思路是先用nvidia-smi看驱动版本再确认 cudart 和 nvinfer 的 dll 实际是从哪个路径加载的。3. 从 .pt 到 TensorRT 引擎YOLOv5 模型导出与转换踩过的坑训练好的 YOLOv5 模型是 PyTorch 的 .pt 格式TensorRT 不能直接加载。常规路径是先把 .pt 转成 .wts这是 TensorRT 官方 yolov5 示例专用的权重格式再由 C 代码读取 .wts 构建引擎。也有走 .onnx 再转 engine 的路线但在 Windows 下 .wts 路线更稳少一层 onnx 算子映射的问题排查起来也更直接。转换前先确认一件事你的 .pt 文件是 PyTorch 原生保存的完整模型还是只存了权重参数。yolov5 训练默认保存的是完整模型用 torch.load 能直接加载如果经过 torch.jit 或其他工具的二次处理gen_wts 脚本可能因为找不到模型结构定义而报错。遇到这种情况用原始训练生成的 .pt 重新导出一次。3.1 yolov5 超参调整与自有数据集训练要点训练自有数据集时yolov5 的 data.yaml 要写对路径和类别数。这里不展开完整训练流程重点讲三个和部署强相关的点。第一类别数决定后处理代码里的 class_num 常量训练 5 类目标后处理写成 80输出张量解析会直接越界。第二训练时如果用了自定义 anchor导出 .wts 后 anchor 参数不会变但后处理要严格对齐否则检测框位置会错。第三hyp.yaml 里的超参数不要乱改尤其是 anchor 相关的 scale 设置动了 anchor 就得同步改后处理里的对应逻辑。训练完先跑一遍 val 脚本确认 mAP 达标再进入部署环节。很多人训练完直接导出结果部署端推理精度对不上回头才发现是训练集和验证集的预处理不一致。yolov5 训练时的预处理包含 mosaic 增强、随机仿射变换这些只影响训练过程推理时的预处理只有 resize、letterbox 加归一化。千万别把训练增强逻辑带到部署代码里。关于超参数的调整yolov5 的 hyp.yaml 里影响部署效果的主要是置信度阈值相关参数和 anchor 设计。如果场景里小目标偏多把 anchor 的尺度调小会比盲目堆模型更有效。但记住任何超参数的调整都要完整训练完再验证不要训练一半就中断去导出权重。那种 .pt 文件虽然能加载但权重不完整转成 .wts 后推理结果会非常奇怪检测框大面积丢失。3.2 用 .pt 导出 .wts转换脚本的用法与参数TensorRT 官方 yolov5 示例仓库里自带 gen_wts.py 脚本。把脚本放到 yolov5 源码根目录然后运行# 从 .pt 导出 .wts python gen_wts.py -w yolov5s.pt -o yolov5s.wts这个脚本会把权重按层名称平铺写成文本格式。.wts 文件本质是“层名 权重数值”的文本序列TensorRT 的 C 加载代码会逐行读取。yolov5s 导出的 .wts 大约 7000 行文本属正常范围不要因为文件不算大就怀疑转换失败。参数说明-w 指定输入权重文件必须是 yolov5 训练输出的 .pt-o 指定输出文件名建议带上模型规模前缀比如 yolov5s.wts、yolov5m.wts方便后面区分。如果训练了自定义类别模型脚本本身不需要修改类别信息不会写进 .wts而是在后处理代码里手动指定类别数。运行脚本前注意一个细节gen_wts.py 运行时依赖 PyTorch 和 yolov5 的模型定义要在 yolov5 源码根目录下执行而不是把脚本单独拷贝到别的目录否则会报“No module named models”之类的导入错误。如果本机有多个 Python 环境确认当前激活的环境里装了训练时用的 torch 版本版本不一致也可能加载失败。导出完成后用文本编辑器打开 .wts 文件看一眼。前面若干行可能是注释或网络描述信息后面是类似“model.0.conv.weight”的层名加一串浮点数。看到层名连续、数值不是 0 就说明权重内容正常。如果文件只有几百行大概率是脚本没正确加载模型权重没写全需要重新导出。3.3 .wts 转 TensorRT 引擎构建参数与序列化拿到 .wts 后需要用 C 代码构建引擎。核心流程是创建 builder、network然后设置最大 batch、精度模式和工作空间大小。下面是官方示例里最关键的构建函数// 构建 TensorRT 引擎 IHostMemory* buildEngine(YOLOv5::Config config, ILogger logger) { IBuilder* builder createInferBuilder(logger); INetworkDefinition* network builder-createNetwork(); // 使用 yolov5 官方的 wts 解析器 yolov5::YoloWtsParser parser(config, network, logger); parser.parse(config.wtsFilePath); builder-setMaxBatchSize(config.maxBatchSize); builder-setMaxWorkspaceSize(config.workspaceSize); // 开启 FP16 推理速度翻倍但精度略降 if (config.fp16) builder-setFp16Mode(true); ICudaEngine* engine builder-buildCudaEngine(*network); IHostMemory* serialized engine-serialize(); // 保存为 .engine 文件后续直接加载 std::ofstream f(config.engineFilePath, std::ios::binary); f.write((char*)serialized-data(), serialized-size()); delete engine; delete network; delete builder; return serialized; }这段代码的逻辑先创建 builder 和 network用 wts 解析器把权重写进网络设置工作空间和精度模式然后 buildCudaEngine 得到可执行引擎最后 serialize 成二进制文件保存。之后部署直接加载这个序列化文件不需要重新构建。config 里的 maxBatchSize 建议设成运行时实际使用的 batch不要设 32 或 64。TensorRT 会按最大 batch 分配显存设太大导致显存浪费甚至 OOM。workspaceSize 建议 1GB 起步显存充足就设 2GB。设太小的后果是某些层的融合优化被跳过推理变慢这个参数直接影响最终延迟。构建过程比较吃时间从几十秒到几分钟不等。第一次构建时看到日志停留在一个层上很久是正常的那是 TensorRT 在做算子选型。日志末尾会出现“Total Host Memory”和“Total Device Memory”两行分别对应构建时和运行时的内存占用。如果 Device Memory 接近显存上限说明网络太大或 workspace 设得过高需要调小。构建完成后的 .engine 文件绑定了 TensorRT 版本、CUDA 版本和 GPU 架构换机器后必须重新构建。4. VS2019 编译 TensorRT C 工程CMake 配置与推理代码拆解引擎构建好了下一步是建一个 VS2019 能编译的 C 工程。整个工程分四块CMakeLists 配置、推理封装、预处理、后处理。我见过太多人卡在这一步明明训练和导出都顺利一到 VS 里就是各种链接错误。VS2019 对 CMake 的原生支持已经做得不错不需要额外装插件直接选择“打开文件夹”指向 CMakeLists.txt 所在目录即可。4.1 创建 VS2019 工程CMake 配置与第三方库链接推荐直接用 VS2019 打开 CMake 文件夹而不是新建“控制台应用”再手动改属性。CMakeLists 里把 CUDA、TensorRT、OpenCV 三个库的路径写清楚这是整个工程能否编过的基础cmake_minimum_required(VERSION 3.18) project(yolov5_trt) set(CMAKE_CXX_STANDARD 14) # TensorRT set(TENSORRT_DIR D:/TensorRT-8.5.3.1) include_directories(${TENSORRT_DIR}/include) link_directories(${TENSORRT_DIR}/lib) # CUDA include_directories(C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.8/include) link_directories(C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.8/lib/x64) # OpenCV set(OpenCV_DIR D:/opencv/build) find_package(OpenCV REQUIRED) add_executable(yolov5_trt main.cpp) target_link_libraries(yolov5_trt nvinfer nvinfer_plugin cudart ${OpenCV_LIBS} )关键点nvinfer 和 nvinfer_plugin 对应 TensorRT lib 目录下的 nvinfer.lib 和 nvinfer_plugin.lib。如果你的 TensorRT 是 8.5 及以上lib 里可能还有 nvonnxparser 和 nvparsers但走 .wts 路线用不到。OpenCV 用 find_package 自动链接前提是 OpenCV_DIR 指向的路径下有 OpenCVConfig.cmake。VS2019 首次打开 CMake 工程时会自动生成 CMakeCache。如果中途更换了 TensorRT 或 CUDA 版本必须删除 CMakeCache.txt 再重新配置否则路径改动不生效。还有一个细节link_directories 的查找顺序会影响同名库的解析。建议把 TensorRT 的 lib 目录放在 CUDA 之前因为 OpenCV 自带的某些库文件可能和 CUDA 的库重名顺序不对会链接到错误的库报一堆莫名奇妙的 LNK2005 错误。4.2 预处理与推理主循环从 cv::Mat 到网络输入C 端读入图片后要做和 PyTorch 训练时一致的预处理resize 到 640x640、除以 255 归一化、BGR 转 RGB、按 CHW 排列。很多人的检测结果对不上就是这里漏了某一步。特别强调yolov5 推理时用 letterbox 保持纵横比而不是直接拉伸成正方形这个差异直接影响检测精度。// 预处理Mat 转 TensorRT 输入 void preprocess(cv::Mat img, float* inputBuffer, int inputH, int inputW) { cv::Mat resized, rgb; // letterbox 保持纵横比 float scale std::min(inputH * 1.0 / img.rows, inputW * 1.0 / img.cols); int newW round(img.cols * scale); int newH round(img.rows * scale); cv::resize(img, resized, cv::Size(newW, newH)); int padX (inputW - newW) / 2; int padY (inputH - newH) / 2; cv::copyMakeBorder(resized, resized, padY, padY (inputH - newH - padY), padX, padX (inputW - newW - padX), cv::BORDER_CONSTANT, cv::Scalar(114, 114, 114)); cv::cvtColor(resized, rgb, cv::COLOR_BGR2RGB); // NCHW 排列归一化因子是 1/255 for (int c 0; c 3; c) { for (int i 0; i inputH * inputW; i) { inputBuffer[c * inputH * inputW i] rgb.data[i * 3 c] / 255.0f; } } }这里的核心是 letterbox 填充值 114必须与训练时保持一致yolov5 默认就是 114。如果自定义数据集时改过填充值这里要同步。scale、padX、padY 三个变量在后处理还原坐标时还要再用建议封装成结构体传递别在函数里算完就丢否则后面还原坐标时会现算一遍容易出错。推理主循环相对直接把 inputBuffer 拷贝到 GPU 显存调用 enqueue 执行再把输出拷回 CPU。TensorRT 8.5 的 API 是 enqueueV28.6 及以上改成了 enqueueV3编译前先确认你用的版本对应的函数签名。以下是常见的调用方式// 显存分配 cudaMalloc(gpuInput, batchSize * 3 * inputH * inputW * sizeof(float)); cudaMalloc(gpuOutput, batchSize * outputSize * sizeof(float)); // 输入拷贝到 GPU cudaMemcpy(gpuInput, inputBuffer, batchSize * 3 * inputH * inputW * sizeof(float), cudaMemcpyHostToDevice); // 推理 void* bindings[] {gpuInput, gpuOutput}; bool ok context-enqueueV2(bindings, stream, nullptr); // 输出拷回 CPU cudaMemcpy(outputBuffer, gpuOutput, batchSize * outputSize * sizeof(float), cudaMemcpyDeviceToHost);这段代码里的 stream 是 CUDA 流对象。如果对延迟敏感建议用多个 stream 做异步推理把预处理、推理、后处理流水化。单线程模式下即使推理本身只要 5ms加上预处理和内存拷贝可能到 10ms。使用 stream 能把这个瓶颈明显缓解特别是在高分辨率输入场景下。4.3 YOLOv5 后处理decode 与 NMS 的 C 实现yolov5 的输出是一个 [batch, 25200, 85] 的张量。25200 是 3 个尺度特征图预测框总数85 是 xywh、置信度加 80 类分数。后处理要做的是解码出真实坐标、过滤低置信度框、执行 NMS。这是整个部署链路里最容易出错的一环坐标还原的任何一个参数错了画出来的框就是偏的。// 后处理decode NMS std::vectorDetection postprocess(float* output, int numBoxes, int numClasses, float confThresh, float iouThresh, float scale, int padX, int padY) { std::vectorDetection detections; for (int i 0; i numBoxes; i) { float* ptr output i * (numClasses 5); float objConf ptr[4]; if (objConf confThresh) continue; // 找最高类别分 float maxCls 0; int maxIdx 0; for (int j 5; j 5 numClasses; j) { if (ptr[j] maxCls) { maxCls ptr[j]; maxIdx j - 5; } } float score objConf * maxCls; if (score confThresh) continue; // 还原到原始图像坐标 float x (ptr[0] - padX) / scale; float y (ptr[1] - padY) / scale; float w ptr[2] / scale; float h ptr[3] / scale; detections.push_back({x, y, w, h, score, maxIdx}); } // NMS 按 score 降序IoU 超过阈值的抑制 std::sort(detections.begin(), detections.end(), [](const Detection a, const Detection b) { return a.score b.score; }); std::vectorDetection results; for (size_t i 0; i detections.size(); i) { bool suppressed false; for (size_t j 0; j results.size(); j) { if (iou(detections[i], results[j]) iouThresh) { suppressed true; break; } } if (!suppressed) results.push_back(detections[i]); } return results; }这段后处理有两点值得注意。一是 25200 这个数值不是写死的要从输出张量的 shape 里读取。训练时输入分辨率或 anchor 数量变了这个值会跟着变写死会导致漏检或越界。二是坐标还原时 padX、padY 和 scale 必须和预处理时用同一套值。NMS 参数里 iouThresh 一般设 0.45confThresh 设 0.25这两个值和 PyTorch 端验证时的参数保持一致避免出现“训练时好好的C 里检测不到”的错觉。另外一个常见坑是输出张量的维度布局。如果输出是 [batch, 85, 25200] 而不是 [batch, 25200, 85]说明引擎构建时做了维度转置。判断方法很简单打印输出张量第一行看前 5 个数值。85 的排列里索引 4 是置信度值应该在 0 到 1 之间如果前 5 个数都接近 0 或 1大概率是布局反了需要先做一次 transpose 再进入后处理逻辑。5. TensorRT 部署避坑VS2019 编译与运行时的五个高频问题从交付经验看TensorRT 部署的问题大多不出在算法而集中在工程环境。下面五条按出现频率排序每条按“现象 → 原因 → 解决”的格式写基本覆盖了从编译到运行最常遇到的坑。5.1 推理结果全零归一化与通道顺序的坑现象引擎构建成功推理也执行了但输出的检测框全为空。打印输出张量发现数值全部是 0。原因预处理时用的是 cv::Mat 的行列连续内存。cvtColor 转成 RGB 后如果直接按内存地址连续拷贝到 inputBuffer通道数据是 HWC 排列而 TensorRT 输入要求 NCHW。数值错位导致模型输入全乱网络输出自然全是 0。解决按上面 preprocess 的写法用三重循环按通道拷贝或者先用 opencv 的 split 函数把三通道拆开再逐个 memcpy。我在代码里特意写了逐通道循环就是怕有人图省事直接用 data 指针。另外检查 inputBuffer 的数据类型TensorRT 输入层默认是 float如果你建网络时用了 kHALF需要把输入数据转成 FP16否则输出同样会异常。5.2 编译通过但运行时找不到 nvinfer.dll现象VS2019 里编译零错误生成 exe 后双击运行提示“由于找不到 nvinfer.dll无法继续执行代码”。原因VS 编译时通过 .lib 文件完成链接但运行时要加载 dll。TensorRT 的 dll 在 lib 目录下系统 PATH 里没有配置程序自然找不到。解决把 TensorRT 的 lib 目录加到系统 PATH或者更省事——把 nvinfer.dll、nvinfer_plugin.dll、nvonnxparser.dll 直接拷贝到 exe 同级目录。OpenCV 的 opencv_world480.dll 同理。发布到客户机器时建议写一个部署脚本把 exe 目录和依赖的 dll 一次性拷贝过去避免远程指导客户手动配环境既费时间又容易出错。5.3 反序列化引擎失败TensorRT 与 CUDA 版本不匹配现象用序列化保存的 .engine 文件换一台机器加载loadEngine 直接返回空指针日志报“could not find node with input name”之类的错误。原因TensorRT 的 .engine 文件只兼容同版本 TensorRT跨版本一定加载不了。另外如果构建时用的 CUDA 是 11.8运行机的 NVIDIA 驱动太旧同样会加载失败。解决部署机的显卡驱动版本要高于构建机 CUDA 版本对应的最小驱动要求。CUDA 11.8 对应驱动不低于 520 系列。遇到这种情况先升级驱动再试。我的习惯是每台部署机首次启动时检测引擎文件是否存在不存在则现场构建这样驱动匹配问题会在日志里提前暴露而不是等到业务运行时才报错。还要记住.engine 文件绑定了 GPU 架构在 RTX 3090 上构建的引擎放到 GTX 1060 上一样加载不了跨型号部署必须重新构建。5.4 检测框整体偏移letterbox 还原坐标时漏了 pad现象检测框能出来但全部往右下偏移几十像素小目标尤其明显。原因预处理用了 letterbox 保持纵横比图片缩放后四周有灰色填充边。后处理还原坐标时直接把输出坐标当成原始图像坐标来计算没有减去 pad 再除以 scale导致所有框整体偏移。解决后处理里坐标还原用这三行x (ptr[0] - padX) / scaley (ptr[1] - padY) / scale。preprocess 里计算出的 scale、padX、padY 要保存到结构体传递到 postprocess不能各算各的。这个问题在输入图片不是正方形时特别容易暴露比如工业相机输出 1920x1080letterbox 后左右有大量灰边偏移量能达到几十像素。调试方法把 TensorRT 输出的检测框画到原图上和 PyTorch 推理结果叠加对比如果只是偏移而非形状变化基本就是这个原因。5.5 VS2019 首次打开 CMake 工程卡在“正在配置”现象用 VS2019 打开 CMakeLists 文件夹后长时间停在配置阶段偶尔报找不到 CUDA。原因CMake 缓存不干净或者 CMakeSettings.json 没有指定生成器架构。VS2019 的 CMake 默认生成器是 Ninja架构默认 x64但 CUDA 的检测依赖系统 PATH 里的 nvccPATH 里没有就会卡住。解决在 CMakeSettings.json 里显式指定生成器为 Ninja、架构为 x64并确保 PATH 里 nvcc 可用。如果还是卡把 CMakeCache.txt 和 build 目录整个删掉重开 VS。这个操作相当于 CMake 的“后悔药”90% 的配置问题都能靠重新配置解决。另外注意如果之前用 x86 架构配置过TensorRT 和 CUDA 都只提供 x64 库必须切成 x64 并清理缓存否则会报“无法解析的外部符号”。6. 引擎验证与进阶部署技巧从“能跑”到“跑得稳”TensorRT 引擎构建完先别急着写业务代码。用 trtexec 跑一轮官方验证确认引擎正确性和性能基线# 验证引擎正确性和性能 trtexec --loadEngineyolov5s.engine --shapesinput:1x3x640x640 --fp16参数说明--loadEngine 加载已构建引擎--shapes 指定输入维度。跑完后看 Throughput 和 Latency 两项指标。以 RTX 3060 为例yolov5s 在 FP16 下典型延迟在 3 到 6ms。如果延迟超过 15ms优先检查 workspace 是否设得太小以及有没有真正开启 FP16 模式。进阶部署时我习惯把引擎加载和推理封装成独立 DLL对外暴露 CreateEngine、Infer、Release 三个函数。这样上层业务用 C# 或 Python 都能接部署机上不需要安装完整 VS 环境。另一个建议是在构建引擎时开启 dynamic shape 支持允许输入分辨率在 320 到 1280 之间变化适配不同相机分辨率代价是构建时间变长部分层不做静态尺寸优化。最后说一个真实教训早期部署 YOLOv5 时我喜欢把 maxBatchSize 设成 32结果显存占用直接翻倍换到 4GB 显存的部署机上就 OOM。后来改成运行时 batch 等于实际并发数问题才消失。TensorRT 不是参数堆得越大越好。合理的 workspace、匹配的精度模式、干净的环境变量路径这三点做到位模型才算真正交付出去。希望帮到你。本文还有配套的精品资源点击获取
返回列表