ARTICLE DETAIL

资讯详情

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

深度学习模型试跑(十):yolov5-deepsort-tensorrt(c++,vs2019版) 用 TaoToken 统一 Key 打通推理链路

深度学习模型试跑(十):yolov5-deepsort-tensorrt(c++,vs2019版) 用 TaoToken 统一 Key 打通推理链路 1. VS2019 下 yolov5-deepsort-tensorrt 首次试跑为什么总卡在环境与配置yolov5-deepsort-tensorrt 是把 YOLOv5 的目标检测能力和 DeepSORT 的轨迹关联能力串成一条 C 推理流水线的工程适合需要在本地复现多目标跟踪、又不想依赖 Python 运行时开销的开发者。它做的事情很直接YOLOv5 负责每一帧里“有哪些目标、在哪”DeepSORT 负责“这个目标和上一帧的哪个是同一个”两者都通过 TensorRT 引擎在 GPU 上跑最终输出带 ID 的跟踪框。适合谁适合已经跑通过 PyTorch 版 YOLOv5、手里有 RTX 系列显卡、想在 VS2019 里把整条链路编译成 exe 的人。但真正动手你会发现第一次试跑卡住的地方往往不是算法而是三件事TensorRT 引擎序列化时版本对不上、VS2019 的 CMake 工程找不到 CUDA 和 OpenCV、以及 DeepSORT 的 engine 生成脚本路径写错。我试过在 win10 CUDA 11.1 TensorRT 8.x 上从零走一遍光是把 onnx2engine 和 demo 两个 exe 编出来就来回折腾了几轮。这篇就按“环境搭建 → 引擎生成 → 端到端验证 → 报错排查”的顺序把每一步可复制的配置写清楚同时说明怎么用 TaoToken 统一 Key 管理模型服务调用避免你在多个 API 通道之间来回切换。先说清楚整体链路训练阶段在 PyTorch 里完成产出 yolov5l.pt 和 deepsort 的 onnx转换阶段用 tensorrtx 把 yolov5 的权重转成 .engine用 deepsort-tensorrt 把 reid 模型转成 .engine推理阶段在 VS2019 编译出的 C 工程里加载两个 engine逐帧跑检测 跟踪。你要准备的目录结构建议这样yolov5-deepsort-tensorrt/ ├── yolov5/ # tensorrtx 生成的 yolov5 工程 │ ├── build/ │ └── yolov5.exe ├── deepsort-tensorrt/ # deepsort engine 工程 │ ├── build/ │ ├── onnx2engine.exe │ └── demo.exe ├── resources/ │ ├── yolov5l.engine │ └── deepsort.engine └── CMakeLists.txt环境版本这块必须对齐错一个就可能在serialize或deserialize时报错。下面是我实测能跑通的组合组件版本说明操作系统Windows 10 21H2VS2019 对 win10 支持最稳CUDA11.1与 TensorRT 8.x 匹配cuDNN8.0.5对应 CUDA 11.1TensorRT8.0.1.6引擎序列化版本敏感OpenCV4.5.4带 world 模块即可CMake3.17.1低于 3.15 会缺 CUDA 语言支持VS201916.11需装“使用 C 的桌面开发”TensorRT 的版本尤其关键。engine 文件不是跨版本通用的你用 TensorRT 8.0 生成的 engine换到 8.2 上deserializeCudaEngine会直接返回 nullptr。所以生成 engine 和加载 engine 必须是同一套 TensorRT 运行时。这一点在第一次试跑时最容易忽略因为很多人机器上装了多个版本PATH 里指向的那个未必是编译时用的那个。2. TaoToken 统一 Key 在推理链路里的前置准备在正式编译之前先把模型服务调用的通道理顺。yolov5-deepsort-tensorrt 本身是纯本地推理不依赖外部 API但你在试跑过程中大概率会做几件事用大模型帮你读报错、生成 CMake 片段、解释 TensorRT 日志、或者把训练好的模型元信息登记到某个服务里做版本管理。这些调用如果每个都单独配 Key很快就会乱。TaoToken 的作用就是把这些模型服务调用收敛到一个统一 Key 和一条 API 通道上。它的定位是模型服务聚合与统一接入不是替代你的本地推理。你可以把它理解成一个“模型调用的总入口”Base URL 固定Key 固定具体调哪个模型通过 Model ID 区分。这样你在 VS2019 工程里写辅助脚本、或者在终端里排查问题时不用记一堆不同的地址和密钥。前置准备分三步。第一步拿到 Key。访问 https://taotoken.net/api-keys 创建注意这个页面是 deep link创建后 Key 只显示一次复制到本地环境变量里别硬编码进代码。第二步确认 Base URL。API 调用统一走 https://taotoken.net/api这个地址不带任何查询参数直接作为 OpenAI 兼容接口的 base。第三步选 Model ID。如果你只是排错和读日志用通用对话模型即可如果要做代码补全或 Agent 类任务走 Coding Plan 更合适。环境变量建议这样设Windows 下用 setx 持久化setx TAOTOKEN_API_KEY sk-你的key setx TAOTOKEN_BASE_URL https://taotoken.net/api设完之后新开一个终端验证echo %TAOTOKEN_API_KEY%能打印出 Key 就说明环境变量生效了。这里有个坑VS2019 的 CMake 工程在 configure 时读的是启动 VS 时的环境变量快照如果你在 VS 已经打开的情况下才 setx需要重启 VS 才能读到。我踩过一次configure 一直报找不到变量重启就好了。为什么要在推理工程里接这个因为首次试跑时你会频繁遇到 TensorRT 的日志比如[TRT] Some tactics do not have sufficient workspace memory这种信息搜索引擎给的解释往往不针对你的版本。把日志贴给模型让它结合你的 TensorRT 版本和层配置分析比盲试快得多。而统一 Key 让你在脚本、终端、IDE 插件里用同一套凭证不用来回切换。需要说明的是TaoToken 在这里承担的是“调用通道管理”你的 YOLOv5 和 DeepSORT 推理仍然完全在本地 GPU 上跑数据不出本机。这一点对做生物图像、医疗图像这类敏感数据的开发者很重要。3. 可复制的 CMake 与 VS2019 工程配置这一节是重点配置写不对后面全是报错。先给 yolov5 部分的 CMakeLists.txt基于 tensorrtx 的工程改关键是找对 CUDA、TensorRT、OpenCV 三个路径cmake_minimum_required(VERSION 3.15) project(yolov5_deepsort_trt) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CUDA_STANDARD 14) # CUDA find_package(CUDA REQUIRED) set(CUDA_INCLUDE_DIRS C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.1/include) set(CUDA_LIBRARIES C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.1/lib/x64/cudart.lib) # TensorRT set(TENSORRT_ROOT C:/TensorRT-8.0.1.6) include_directories(${TENSORRT_ROOT}/include) link_directories(${TENSORRT_ROOT}/lib) # OpenCV set(OpenCV_DIR C:/opencv/build) find_package(OpenCV REQUIRED) include_directories( ${CUDA_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR} ) file(GLOB SRCS *.cpp *.cu) add_executable(yolov5 ${SRCS}) target_link_libraries(yolov5 ${CUDA_LIBRARIES} nvinfer nvinfer_plugin nvonnxparser ${OpenCV_LIBS} )配置里有几个必须改的地方。TENSORRT_ROOT指向你解压的 TensorRT 目录注意是解压版不是安装版TensorRT 官方给的是 zip。OpenCV_DIR指向 build 目录而不是 install 目录否则 find_package 找不到 OpenCVConfig.cmake。CUDA 路径里的版本号要和你实际装的一致。然后是类别数。你的数据集有多少类就要在yololayer.h里改static constexpr int CLASS_NUM 53; static constexpr int MAX_OUTPUT_BBOX_COUNT 1000;53 是我那次生物细胞数据集的类数你换成自己的。改完这个还要确认yolov5.cpp里模型分支的判断用 l 模型的话else if (net[0] l) { // yolov5l 配置 }生成 engine 的命令yolov5.exe -s yolov5l.wts yolov5l.engine l-s是序列化l对应模型规模。生成成功会打印每层的耗时和最终 engine 大小。如果卡在某个层报out of memory把 workspace 调大const auto explicitBatch 1U static_castuint32_t(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH); config-setMaxWorkspaceSize(1 30); // 1GBDeepSORT 部分的 CMake 用工程自带的CMakeLists_deepsort-tensorrt_win10.txt重命名为CMakeLists.txt后改这几处set(TENSORRT_ROOT C:/TensorRT-8.0.1.6) set(OpenCV_DIR C:/opencv/build) set(CUDA_TOOLKIT_ROOT_DIR C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.1)然后必须改两个源码文件否则 engine 读写会失败。featuretensor.cpp第 66 行附近std::ifstream engineStream(enginePath, std::ios::binary);deepsortenginegenerator.cpp第 52 行附近serializeOutputStream.open(enginePath, std::ios::binary);原工程里这两处可能用了文本模式Windows 下会把\n转成\r\n导致 engine 二进制被破坏deserialize 直接失败。这个坑很隐蔽因为编译不报错运行时才崩。VS2019 打开工程的方式用 CMake 生成 VS 解决方案命令行里mkdir build cd build cmake .. -G Visual Studio 16 2019 -A x64生成后打开yolov5_deepsort_trt.sln把yolov5设为启动项目配置选 Release x64。Debug 模式下 TensorRT 会慢很多而且某些插件在 Debug 下行为不一致首次试跑直接用 Release。4. 端到端验证请求与成功结果确认配置完成后先单独验证两个 engine 能加载再跑整体。DeepSORT 的 engine 生成onnx2engine.exe deepsort.onnx deepsort.engine成功会输出类似Loading onnx file from path deepsort.onnx... Beginning ONNX file parsing Completed parsing of ONNX file Building an engine from file deepsort.onnx, this may take a while... Completed creating Engine Saving engine to deepsort.engine然后单独测 DeepSORTdemo.exe deepsort.engine track.txttrack.txt里放测试图片路径每行一张。成功会打印每张图的特征向量维度通常是 128 维。YOLOv5 单独测yolov5.exe -d yolov5l.engine test.jpg会输出检测框坐标和类别。确认两个都通了再跑整体工程。整体工程的输入是一段视频或图片序列输出是带跟踪 ID 的结果。我那次 640x640 的图YOLOv5 推理约 8msDeepSORT 特征提取约 7ms合计平均 15ms 一帧在 RTX3090 上这个延迟是合理的。验证成功的标志有三个第一控制台没有deserializeCudaEngine返回 nullptr 的报错第二输出的跟踪框 ID 在连续帧之间保持稳定不会每帧都变第三GPU 显存占用稳定不会随帧数增长。如果 ID 频繁跳变多半是 DeepSORT 的 max_dist 或 nn_budget 参数需要调不是 engine 的问题。这里插一句 TaoToken 的用法。验证阶段如果遇到 engine 加载失败把完整报错贴给模型分析比翻文档快。调用示例import os, requests resp requests.post( os.environ[TAOTOKEN_BASE_URL] /v1/chat/completions, headers{Authorization: Bearer os.environ[TAOTOKEN_API_KEY]}, json{ model: gpt-4o, messages: [{role: user, content: TensorRT 8.0 deserializeCudaEngine 返回 nullptrengine 是用 8.0 生成的可能原因有哪些}] } ) print(resp.json()[choices][0][message][content])注意 Base URL 后面拼/v1/chat/completions这是 OpenAI 兼容格式。Model ID 按你实际要用的填。这样你在排错时不用切浏览器终端里就能拿到分析。5. 首次试跑常见报错对照排查这一节按真实报错来。第一个Error: deserializeCudaEngine failed。原因通常是 engine 和运行时 TensorRT 版本不一致或者 engine 文件在传输中被文本模式破坏。排查确认生成和加载用的是同一个 TensorRT 目录检查 engine 文件大小是否和生成时一致用二进制方式重新读写。第二个local proxy failed或连接类报错。如果你在调用模型服务时遇到先确认 Base URL 是 https://taotoken.net/api 而不是带其他路径的地址再确认环境变量里的 Key 没有多余空格。Windows 下 setx 有时会把引号也存进去用echo %TAOTOKEN_API_KEY%看输出是否干净。第三个reading choices相关报错。这通常出现在解析模型返回时说明返回结构和你预期的不一致。先打印完整 response 看结构再取字段。别直接假设choices[0]一定存在加个判断。第四个401 Unauthorized。Key 无效或没带上。检查请求头是不是Authorization: Bearer sk-xxxBearer 后面有一个空格。如果用的是 VS2019 里的脚本确认脚本读到了环境变量而不是空字符串。第五个OAuth 相关报错。如果你用的是需要 OAuth 的客户端比如某些 IDE 插件确认回调地址和 Key 类型匹配。TaoToken 的 API Key 走的是 Bearer 认证不需要 OAuth 流程如果客户端强制走 OAuth换用支持 API Key 的方式。第六个CMake configure 报No CMAKE_CUDA_COMPILER could be found。CUDA 没装或者 VS2019 没装 CUDA 集成。确认 VS2019 安装时勾了“使用 C 的桌面开发”并且 CUDA 安装时勾了 VS 集成组件。第七个nvinfer_plugin链接失败。TensorRT 的 plugin 库路径没加对或者用了 Debug 版的 lib 配 Release 的 exe。统一用 Release。第八个DeepSORT 输出 ID 全是 -1。说明跟踪器没初始化成功检查deepsort.engine是否加载成功以及传入的特征维度是否和 engine 期望的一致。排查时把报错原文、TensorRT 版本、CUDA 版本、engine 生成命令一起贴出来定位会快很多。这也是统一 Key 的价值你在任何终端、任何脚本里都能直接调模型分析不用重新配环境。6. 把统一 Key 接入你的日常推理调试流程走到这里你的 yolov5-deepsort-tensorrt 应该已经能跑出带 ID 的跟踪结果了。接下来把 TaoToken 的调用固化到日常流程里让它真正省事。第一个场景编译报错自动分析。写一个批处理编译失败时把 stderr 传给模型cmake --build . --config Release build.log 21 if errorlevel 1 ( python analyze.py build.log )analyze.py读日志、调 API、打印建议。这样你不用手动复制报错。第二个场景engine 参数调优。TensorRT 的 workspace、batch size、精度模式FP16/INT8组合很多让模型根据你的 GPU 型号和显存给建议比一个个试快。第三个场景长期做编码和 Agent 任务的话走 Coding Plan。它适合需要持续调用、上下文较长的场景比如让模型帮你维护整个 CMake 工程、生成测试用例、解释 TensorRT 日志。入口在 https://taotoken.net/coding-plan按需选。第四个场景验证模型能力。如果你不确定某个模型适不适合读 TensorRT 日志先去模型对话页面试一条 https://taotoken.net/models用真实报错测一下合适再写进脚本。接入文档在 https://taotoken.net/doc里面有各语言的调用示例和参数说明。API Keys 管理在 https://taotoken.net/api-keysKey 轮换、权限控制都在这里。最后给一个实用技巧把常用的调用封装成一个函数放在你的工具脚本里参数只留 prompt 和 model。这样无论你在 VS2019 的终端、还是独立的 Python 脚本里调用方式都一样。统一 Key 的意义就在这——你只需要维护一套凭证剩下的精力放在推理链路本身。整个流程跑通后你会发现首次试跑最难的不是算法而是版本对齐和二进制读写这些细节。把 CMake 路径、TensorRT 版本、engine 读写模式这三件事确认死后面就顺了。
返回列表