1. Windows 下 yolov13 TensorRT 部署到底难在哪yolov13 这个目标检测框架出来之后很多人第一反应是拿 Python 跑一遍 demo但真到工程落地尤其是 Windows 上要用 C 做图片和视频推理坑就集中爆发了。我自己在 RTX2070 8G 的机器上从零走了一遍最直观的感受是模型转换本身不复杂复杂的是 CMake 找库、TensorRT 版本对齐、OpenCV 路径写错、以及 engine 文件跟硬件绑定这几件事。先说清楚这篇要解决什么。它适合三类人一是已经会用 Python 跑 yolov13但需要把推理塞进 C 桌面程序或服务里的开发者二是手上有一块 N 卡想在 Windows 上验证 TensorRT 加速效果的同学三是做视觉项目需要图片和视频两条推理链路都能跑通的工程同学。核心检索词就是 C、cmake、yolov13、tensorrt、windows 这一串全文围绕它们展开。为什么不用 Python 直接部署因为很多实际项目是 C 写的比如工业相机采集、MFC/Qt 界面、游戏辅助工具Python 嵌进去要么打包麻烦要么性能损耗大。TensorRT 在 C 里能拿到最低延迟配合 FP16 推理2070 这种卡跑 yolov13n 单帧能压到十几毫秒级别视频流基本能实时。但 Windows 的坑在于CUDA、cuDNN、TensorRT、OpenCV 四个库的版本必须互相兼容而且 CMake 默认找不到它们你得手动指定路径。我试过用错一个 OpenCV 的 vc16 目录直接报一堆链接错误排查了半天。所以这篇不会只给你命令而是把 CMakeLists 怎么写、路径怎么改、engine 怎么生成、报错怎么查全部拆开讲。环境安装这块我不展开网上教程很多你按 CUDA 11.8 cuDNN 8.9.7 TensorRT 8.6.1.6 OpenCV 4.9.0 VS2019 这套组合装就行版本尽量对齐能省掉大量兼容性问题。下面直接从模型导出和工程构建开始。2. TaoToken 前置准备把模型转换和推理链路先打通在正式编译 C 工程之前有一个容易被忽略的前置环节模型格式转换和推理服务的调试。很多人一上来就写 CMake结果 ONNX 导出失败或者 engine 生成报错回头再查很浪费时间。我的做法是先把 Python 侧的转换链路跑通确认 yolov13n.pt 能正常导出 ONNX再去搞 C。这里我习惯用一个统一的 API 入口来管理模型调用和调试TaoToken 的模型对话和 API 能力可以帮你快速验证模型输出是否符合预期。它的官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 注意 API 地址不带 UTM 参数。如果你只是想先看看模型对话效果可以直接走模型对话入口如果要做长期编码和 Agent 类任务Coding Plan 更合适。具体到 yolov13 的部署前置准备分三步。第一步是确认你的 Python 环境里装了 ultralytics 或 yolov13 官方仓库的依赖torch 版本建议 2.5.1cu124跟 CUDA 11.8 匹配。第二步是把 yolov13n.pt 放到项目目录执行导出命令yolo export modelyolov13n.pt formatonnx dynamicFalse opset12这条命令会生成 yolov13n.onnx。注意 dynamicFalse 表示固定输入尺寸推理时图片要 resize 到模型默认的 640x640否则会报维度不匹配。opset12 是 TensorRT 8.6 比较稳的算子集版本别用太高的 opset容易遇到不支持的算子。第三步是验证 ONNX 能不能被 TensorRT 解析。你可以先用 trtexec 试一下trtexec --onnxyolov13n.onnx --saveEngineyolov13n.engine --fp16如果这条命令能跑完并生成 engine 文件说明模型转换链路没问题。如果报错大概率是 ONNX 里有 TensorRT 不支持的算子或者 opset 版本不对。这一步大概要等 20 多分钟取决于你的显卡和模型大小。为什么要先做这一步因为 C 工程里加载的就是这个 engine 文件如果 engine 本身有问题你编译再成功也跑不出结果。另外提醒一句TensorRT 的 engine 是跟硬件绑定的你在 2070 上生成的 engine 拿到 3090 上可能直接用不了必须重新转换。这是 TensorRT 的特性不是 bug。如果你在转换过程中遇到模型下载慢或者需要调试推理结果可以借助 TaoToken 的 API 能力做辅助验证比如把检测结果做二次处理或者对比不同模型的输出。API Keys 在 https://taotoken.net/api-keys 可以拿到接入文档在 https://taotoken.net/doc 。这些前置动作做完再进 C 编译环节会顺很多。3. 可复制配置CMakeLists.txt 与推理源码关键片段这一节是全文的核心直接给你能复制的配置。先说 CMakeLists.txt最关键的是 OpenCV 和 TensorRT 的路径设置。原始工程里这两行必须改成你自己的实际路径# Find and include OpenCV set(OpenCV_DIR D:\\lufiles\\opencv490\\build\\x64\\vc16\\lib) # Set TensorRT path if not set in environment variables set(TENSORRT_DIR D:\\lufiles\\TensorRT-8.6.1.6)注意 OpenCV_DIR 要指向 build 目录下的 x64/vc16/lib不是 bin 也不是 include。vc16 对应 VS2019如果你用 VS2022 可能是 vc17这个要看你 OpenCV 预编译包的实际目录名。TensorRT 路径指向解压后的根目录即可里面要有 include 和 lib 两个文件夹。完整的 CMakeLists 还需要链接这些库cmake_minimum_required(VERSION 3.10) project(yolov13_tensorrt) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) # CUDA find_package(CUDA REQUIRED) include_directories(${CUDA_INCLUDE_DIRS}) # OpenCV find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) # TensorRT include_directories(${TENSORRT_DIR}/include) link_directories(${TENSORRT_DIR}/lib) # 源文件 file(GLOB SOURCES src/*.cpp src/*.cu) add_executable(yolov13-tensorrt ${SOURCES}) target_link_libraries(yolov13-tensorrt ${OpenCV_LIBS} nvinfer nvinfer_plugin nvonnxparser cudart )这里有个细节nvinfer、nvinfer_plugin、nvonnxparser 这三个库必须都链接少一个都会在运行时报找不到符号。cudart 是 CUDA 运行时也要加上。推理源码部分核心是 engine 加载和推理执行。加载 engine 的代码大概长这样#include NvInfer.h #include NvOnnxParser.h #include opencv2/opencv.hpp using namespace nvinfer1; class Logger : public ILogger { public: void log(Severity severity, const char* msg) noexcept override { if (severity ! Severity::kINFO) std::cout msg std::endl; } } gLogger; bool loadEngine(const std::string enginePath, IRuntime* runtime, ICudaEngine* engine) { std::ifstream file(enginePath, std::ios::binary); if (!file.good()) return false; file.seekg(0, std::ios::end); size_t size file.tellg(); file.seekg(0, std::ios::beg); std::vectorchar buffer(size); file.read(buffer.data(), size); file.close(); runtime createInferRuntime(gLogger); engine runtime-deserializeCudaEngine(buffer.data(), size); return engine ! nullptr; }推理执行时输入输出绑定用 executeV2 或者 enqueueV3注意 TensorRT 8.6 推荐用 enqueueV3。图片推理就是把 cv::Mat resize 到 640x640归一化后拷贝到 GPU执行推理再把输出拷回来做 NMS。视频推理就是循环读帧每帧走一遍同样的流程。这里给你一个关键参数对照表方便你检查配置参数推荐值说明输入尺寸640x640与导出 ONNX 时一致精度FP162070 支持速度提升明显batch size1视频推理逐帧处理NMS 阈值0.45可按场景调整置信度阈值0.25过滤低分框如果你在 C 里需要调用外部服务做结果后处理可以把 Base URL 设为 https://taotoken.net/api Key 从 API Keys 页面获取Model ID 按你实际使用的模型填。这三件套在 Cline MCP 或 Codex 的 auth.json 里配置时也是同样的结构Base URL、Key、Model ID 一个都不能少。4. 编译与验证从 cmake 到图片视频推理成功配置改完之后编译流程很直接。在项目根目录执行mkdir build cd build cmake ..cmake 成功后会生成 sln 文件。用 VS2019 打开这个 sln把编译模式切到 x64 Release然后在解决方案资源管理器里找到 ALL_BUILD右键选择生成。这一步会编译所有源文件如果 CMakeLists 路径都对几分钟就能编完。编译成功后在 build\Release 目录下会生成 yolov13-tensorrt.exe。这时候把之前生成的 yolov13n.engine 和测试图片放到同一目录执行图片推理yolov13-tensorrt.exe yolov13n.engine test.jpg正常的话会弹出一个窗口显示检测结果或者输出检测框坐标。视频推理同理yolov13-tensorrt.exe yolov13n.engine car.mp4视频会逐帧处理并显示按 ESC 退出。如果视频帧率明显低于原视频说明推理耗时较长可以检查是否用了 FP16以及输入尺寸是否过大。验证成功的标志有三个一是程序不崩溃能正常读取 engine二是图片上能画出检测框类别和置信度合理三是视频能连续播放检测结果不卡死。我实测下来2070 上 yolov13n FP16 单帧大概 15-20ms视频基本能到 30fps 以上。这里要特别注意 engine 的硬件绑定问题。你在自己电脑上生成的 engine 只能在自己电脑上用换机器必须重新用 trtexec 转换。如果你要把程序发给别人要么让对方自己转 engine要么在程序里集成 ONNX 转 engine 的逻辑。另外二次开发需要读懂 C 推理代码前处理、后处理、NMS 这几块要能改否则只能跑固定流程。如果你在验证阶段想对比不同模型的检测效果可以用模型对话入口快速测试或者通过接入文档了解 API 的调用方式。这些工具在调试阶段能帮你省不少时间。5. 常见报错排查401、local proxy failed、reading choices 等部署过程中最容易卡住的不是编译而是各种报错。我把几个高频错误和排查思路列出来你对照着查。第一个是 401 错误。如果你在调用 API 或某些服务时遇到 401基本是 Key 没填对或者没带上。检查 API Keys 页面生成的 Key 是否完整复制请求头里 Authorization 字段格式对不对。Base URL 要用 https://taotoken.net/api 不要多加斜杠或者路径。第二个是 local proxy failed。这个报错通常出现在网络请求环节说明本地代理配置有问题。检查你的系统代理设置或者代码里是否硬编码了代理地址。如果你在用 Cline MCP 或类似工具检查配置文件里的网络相关字段把不必要的代理项去掉。第三个是 reading choices 相关报错。这通常出现在解析模型返回结果时说明返回的 JSON 结构跟你代码里解析的字段不匹配。打印原始返回内容确认 choices 字段是否存在以及嵌套层级对不对。不同模型的返回格式可能有差异Model ID 填错也会导致返回结构变化。第四个是 OAuth 相关错误。如果你用 Codex 的 auth.json 配置检查里面的 token 是否过期以及 Base URL、Key、Model ID 三件套是否完整。auth.json 的格式要严格按文档来少一个字段都可能认证失败。第五个是 TensorRT 报错比如 engine 反序列化失败。这多半是 engine 文件跟当前 TensorRT 版本或显卡不匹配。解决办法就是重新用 trtexec 生成 engine确保版本一致。第六个是 OpenCV 链接错误比如找不到 opencv_world490.lib。检查 OpenCV_DIR 是否指向 lib 目录以及 CMakeLists 里 find_package(OpenCV REQUIRED) 是否执行成功。可以在 cmake 输出里看 OpenCV 的版本和路径信息。排查原则就一条先看报错原文定位是编译期还是运行期是模型问题还是环境问题。编译期错误查路径和库运行期错误查 engine 和输入数据。把报错信息完整读一遍大部分问题都能自己解决。6. 继续深入C 推理工程化的下一步跑通图片和视频推理只是第一步。如果你要把这套东西用到实际项目里还有几件事值得做。一是把推理封装成类输入输出接口固定方便替换模型。二是加上多线程视频解码和推理分开避免卡顿。三是做性能 profiling用 TensorRT 的 profiler 看每一层耗时针对性优化。如果你需要长期做编码和 Agent 类任务Coding Plan 提供了更稳定的调用额度和管理能力适合把模型能力集成到日常开发流程里。入口在 https://taotoken.net/coding-plan 。对于 Claude Code 这类工具Anthropic 兼容接口的配置方式可以参考 https://taotoken.net/claude-code-anthropic 把 Base URL、Key、Model ID 填对就能接入。最后说一个实际经验TensorRT 的 engine 文件不要提交到 git因为它是硬件相关的每个人本地生成就行。项目里放 ONNX 和转换脚本README 写清楚转换命令这样团队协作不会乱。CMakeLists 里的路径尽量用变量或者环境变量别硬编码绝对路径换机器会省很多事。