ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

YOLO11 全任务 TensorRT-10 部署指南:tensorrtx 从 .wts 权重转换到 FP32/FP16/INT8 引擎推理

YOLO11 全任务 TensorRT-10 部署指南:tensorrtx 从 .wts 权重转换到 FP32/FP16/INT8 引擎推理 人工智能深度学习计算机视觉【免费下载链接】tensorrtxImplementation of popular deep learning networks with TensorRT network definition API项目地址https://gitcode.com/gh_mirrors/te/tensorrtx点击查看免费下载导读本文以 yolo11/readme.md 为主体系统讲解在 tensorrtx 开源仓库中如何将 Ultralytics YOLO11n/s/m/l/x 全尺寸部署到 NVIDIA TensorRT-10 平台覆盖检测det、分类cls、分割seg、关键点pose、旋转框obb五大任务的完整链路PyTorch 权重转 .wts → CMake 编译 → 引擎序列化 → C 推理 → Python API 推理 → INT8 量化校准。读者按本文操作可得到可复现、可运行的 YOLO11 TensorRT 推理程序并理解其网络定义与插件实现的底层原理。1. 项目概述YOLO11 在 tensorrtx 中的定位tensorrtx 是一个使用 TensorRT network definition API 手工搭建流行深度学习网络的仓库项目描述Implementation of popular deep learning networks with TensorRT network definition API。YOLO11 是其中的一个独立子项目位于 yolo11/其 readme 明确指出Yolo11 model supports TensorRT-10.与依赖 ONNX 导出的部署方式不同本子项目完全使用 TensorRT C APIINetworkDefinition、addConvolutionNd、addPoolingNd、addPluginV2等逐层重建网络因此对 TensorRT 版本高度敏感当前实现锁定 TensorRT 10 系列。1.1 支持矩阵readme 中列出的支持范围如下任务精度支持API 支持入口程序YOLO11-det 目标检测FP32 / FP16 / INT8Python / Cyolo11_det.cppYOLO11-cls 图像分类FP32 / FP16 / INT8Python / Cyolo11_cls.cppYOLO11-seg 实例分割FP32 / FP16 / INT8Python / Cyolo11_seg.cppYOLO11-pose 姿态估计FP32 / FP16 / INT8Python / Cyolo11_pose.cppYOLO11-obb 旋转目标检测FP32 / FP16 / INT8Python / Cyolo11_obb.cpp从源码结构看五个任务的 C 入口共用 src/ 与 include/ 下的网络定义代码model.cpp分别提供buildEngineYolo11Det/Cls/Seg/Pose/Obb五个构建函数差异集中在检测头Head的输出组织方式上这为一次编译、多任务复用打下了基础。1.2 目录结构yolo11/ ├── CMakeLists.txt # 编译脚本产出 5 个可执行文件 libmyplugins.so ├── gen_wts.py # PyTorch .pt → .wts 权重转换脚本 ├── yolo11_det.cpp / _cls / _seg / _pose / _obb # C 入口 ├── yolo11_*_trt.py # Python API 推理示例 ├── include/ # 头文件config.h / block.h / model.h / calibrator.h / preprocess.h / postprocess.h 等 ├── src/ # block.cpp / model.cpp / calibrator.cpp / preprocess.cu / postprocess.cpp / postprocess.cu └── plugin/ # yololayer.cu / yololayer.h检测头自定义插件2. 环境要求readme 给出了作者实测通过的软件版本组合组件版本CUDA12.9cuDNN9.10.2TensorRT10.10.0.31OpenCV4.8.0ultralytics8.3.238Python3.12需要说明的是这是 readme 作者声明的工作环境并非严格的下限要求。实际部署时只要 TensorRT 10.x 主版本一致、CUDA/cuDNN 与所用 TensorRT 构建版本匹配即可按相同流程操作。从 CMakeLists.txt 还可以看到两个部署细节编译期默认设置CMAKE_CUDA_ARCHITECTURES 75 80 86 89 90即覆盖 Turing75、Ampere80/86、Ada Lovelace89、Hopper90等主流架构请按实际 GPU 计算能力修改该列表否则可能编译出无法在当前显卡加载的 kernel。构建脚本对 aarch64嵌入式平台如 Jetson与 x86 分别处理CMAKE_SYSTEM_PROCESSOR MATCHES aarch64时链接/usr/local/cuda/targets/aarch64-linux否则链接/usr/local/cuda与 TensorRT 安装目录。TensorRT 头文件/库路径在脚本中写死为/workspace/shared/TensorRT-10.10.0.31与本机实际路径不一致时必须手动修改。3. 核心配置项解析include/config.h所有可调参数集中在 include/config.hreadme 也明确指出Other configs please check src/config.h。该文件是调整精度、输入尺寸、类别数、阈值的唯一入口。3.1 精度控制宏// #define USE_FP32 #define USE_FP16 // #define USE_INT8三个宏三选一注释掉 FP32、打开 FP16 即默认以半精度构建打开 INT8 则走量化流程见第 8 节。对应实现中src/model.cpp 在构建引擎时根据宏设置BuilderFlag::kFP16或BuilderFlag::kINT8。3.2 常用配置参数宏默认值含义kInputTensorName/kOutputTensorNameimages/output输入/输出张量名kProtoTensorNameproto分割任务的原型掩码张量名kNumClass80检测/分割类别数COCOkPoseNumClass1姿态任务类别数只有 person 一类kNumberOfPoints17姿态关键点数量kObbNumClass15OBB 旋转框类别数kObbNe1OBB 额外输出参数个数角度kBatchSize1批大小kGpuId0使用的 GPU 编号kInputH/kInputW640 / 640检测、分割、姿态输入尺寸kObbInputH/kObbInputW1024 / 1024OBB 输入尺寸kNmsThresh0.45NMS IoU 阈值kConfThresh0.5置信度阈值kConfThreshKeypoints0.5关键点置信度阈值kMaxInputImageSize3000×3000预处理缓存上限kMaxNumOutputBbox1000单图最大输出框数kInputQuantizationFolder./coco_calibINT8 校准图片目录kClsNumClass1000分类任务类别数ImageNetkClsInputH/kClsInputW224 / 224分类任务输入尺寸需要自定义数据集例如改为 20 类时只需修改kNumClass并重新构建引擎OBB 与分类任务的输入尺寸与检测不同已在配置中独立控制。4. 权重转换PyTorch .pt → .wtstensorrtx 的通用约定是先用 Python 脚本把 PyTorch 权重序列化为自定义的.wts文本格式C 侧再通过loadWeights见 src/block.cpp按参数名读取并构建nvinfer1::Weights。4.1 转换脚本参数gen_wts.py 提供三个命令行参数参数必填说明-w/--weights是输入 .pt 权重路径-o/--output否输出 .wts 路径缺省为权重同名文件-t/--type否默认detect任务类型可选detect / cls / seg / pose / obb4.2 转换原理脚本内部执行如下关键步骤gen_wts.py第 40-56 行torch.load(pt_file, map_locationcpu)[model].float()加载模型并强制转为 FP32对detect/seg/pose/obb任务读取检测头锚点model.model[-1].anchors计算anchor_grid anchors * stride后将其从模型中移除delattr因为在 TensorRT 侧由插件统一处理锚框遍历model.state_dict()第一行写入参数总个数之后逐行写出参数名 参数个数及每个浮点数的 IEEE-754 单精度十六进制表示struct.pack(f, float(vv)).hex()。.wts是明文文本文件行数与参数个数一一对应C 侧 loadWeights 按同一格式解析为std::mapstd::string, Weights。4.3 生成五类权重readme 给出的完整命令流程为以 nano 为例其余尺寸同理# 1. 准备 ultralytics 训练代码与预训练权重下载 ultralytics v8.3.238 源码包 # 并从官方 Assets 发布页分别获取以下 .pt 文件 # yolo11n.pt 检测 # yolo11n-cls.pt 分类 # yolo11n-seg.pt 分割 # yolo11n-pose.pt 姿态 # yolo11n-obb.pt 旋转框 # 2. 将转换脚本拷贝到 ultralytics 目录并依次转换 cp [PATH-TO-TENSORRTX]/yolo11/gen_wts.py . python gen_wts.py -w yolo11n.pt -o yolo11n.wts -t detect python gen_wts.py -w yolo11n-cls.pt -o yolo11n-cls.wts -t cls python gen_wts.py -w yolo11n-seg.pt -o yolo11n-seg.wts -t seg python gen_wts.py -w yolo11n-pose.pt -o yolo11n-pose.wts -t pose python gen_wts.py -w yolo11n-obb.pt -o yolo11n-obb.wts -t obb每个-t类型必须与 .pt 权重自身任务一致否则检测头结构对不上后续构建引擎时会因权重缺失而断言失败。转换后每个任务得到一个.wts文件。5. 编译构建readme 的构建步骤cd [PATH-TO-TENSORRTX]/yolo11 mkdir build cd build cmake .. make编译成功后会生成五个可执行文件yolo11_det、yolo11_cls、yolo11_seg、yolo11_pose、yolo11_obb动态库libmyplugins.so由 plugin/yololayer.cu 编译而来包含检测头自定义插件YoloLayer_TRT供引擎序列化与 Python 推理加载使用。从 CMakeLists.txt 可见myplugins仅链接nvinfer与cudart各可执行文件再额外链接myplugins与 OpenCV。编译前请确认CUDA 架构列表与实际显卡匹配TensorRT 头文件/库路径正确脚本默认/workspace/shared/TensorRT-10.10.0.31OpenCV 可被find_package(OpenCV)找到。6. 命令行参数约定与推理流程五个可执行文件遵循统一的-s/-d参数协议以 yolo11_det.cpp 中的parse_args第 122-167 行为例./yolo11_det -s [.wts] [.engine] [n/s/m/l/x] # 序列化由 .wts 构建并保存 engine ./yolo11_det -d [.engine] ../images [c/g] # 反序列化加载 engine 并批量推理-s构建引擎并写入 plan 文件。serialize_engine内部创建IBuilder调用buildEngineYolo11Det后把IHostMemory数据写入二进制文件。-d从 plan 文件反序列化引擎逐批读入图片执行推理结果图保存在 build 目录下输出文件名为_原图名。[c/g]表示后处理位置c表示在 CPU 上做解码 NMSbatch_nmsg表示在 GPU 上通过cuda_decodecuda_nms见 src/postprocess.cu完成解码与 NMS再由batch_process回读结果。注意g模式当前不支持kBatchSize 1代码中会直接退出。6.1 子模型 n/s/m/l/x 的网络超参第五个参数[n/s/m/l/x]决定网络宽度与深度。yolo11_det.cpp中硬编码了与 Ultralytics YOLO11 各尺寸一致的缩放系数子模型depthgdwidthgwmax_channels内部typen0.500.251024ns0.500.501024sm0.501.00512ml1.001.00512lx1.001.50512x这些系数在 src/model.cpp 中通过get_width(x, gw, max_channels)通道数取 8 的倍数向上取整与get_depth(x, gd)深度四舍五入且结果不小于 1换算成实际网络层数/通道数从而在不改动代码的情况下复用同一套网络定义构建不同尺寸的模型。6.2 检测任务Detectioncp [PATH-TO-ultralytics]/yolo11n.wts . # 构建并序列化 TensorRT 引擎 ./yolo11_det -s yolo11n.wts yolo11n.engine n # 运行推理c CPU 后处理g GPU 后处理 ./yolo11_det -d yolo11n.engine ../images c # 结果保存在 build 目录推理主循环yolo11_det.cpp第 225-253 行按kBatchSize分批次cv::imread读图经cuda_batch_preprocesssrc/preprocess.cu完成缩放填充到 640×640然后enqueueV3异步推理最后draw_bbox绘制并cv::imwrite输出。6.3 分类任务Classification分类使用独立的 224×224 输入输出经全局平均池化 全连接model.10见buildEngineYolo11Cls得到 1000 类得分cp [PATH-TO-ultralytics]/yolo11n-cls.wts . # 构建并序列化 TensorRT 引擎 ./yolo11_cls -s yolo11n-cls.wts yolo11n-cls.engine n # 下载 ImageNet 类别标签文件imagenet_classes.txt wget imagenet_classes.txt 下载地址 -O imagenet_classes.txt # 运行推理 ./yolo11_cls -d yolo11n-cls.engine ../images分类程序读入标签文件后在推理结果中按 top-1/top-5 输出类别名称与置信度。6.4 分割任务Segmentation分割任务的引擎输出除了检测框外还包含 32 维掩码系数Detection.mask[32]见 include/types.h推理时与proto特征相乘还原掩码cp [PATH-TO-ultralytics]/yolo11n-seg.wts . # 构建并序列化 TensorRT 引擎 ./yolo11_seg -s yolo11n-seg.wts yolo11n-seg.engine n # 下载 COCO 类别标签文件 wget -O coco.txt coco-labels.txt 下载地址 # 运行推理第三个参数 c 为后处理位置第四个参数为标签文件 ./yolo11_seg -d yolo11n-seg.engine ../images c coco.txt6.5 姿态任务Pose姿态输出包含 17 个关键点的(x, y, conf)三元组配置中kNumberOfPoints 17、kConfThreshKeypoints 0.5cp [PATH-TO-ultralytics]/yolo11n-pose.wts . # 构建并序列化 TensorRT 引擎 ./yolo11_pose -s yolo11n-pose.wts yolo11n-pose.engine n # 运行推理 ./yolo11_pose -d yolo11n-pose.engine ../images6.6 旋转框任务OBBOBB 是特殊任务输入尺寸为 1024×1024kObbInputH/W类别数 15kObbNumClass且Detection结构体带angle字段用于角度回归cp [PATH-TO-ultralytics]/yolo11n-obb.wts . # 构建并序列化 TensorRT 引擎 ./yolo11_obb -s yolo11n-obb.wts yolo11n-obb.engine n # 下载示例图片并放入 images 目录 wget -O P0015.png P0015.png 下载地址 mv P0015.png ../images # 运行推理 ./yolo11_obb -d yolo11n-obb.engine ../images7. 网络定义的源码级原理7.1 基础算子封装src/block.cppsrc/block.cpp 用 TensorRT API 手工实现了 YOLO11 的全部基础模块convBnSiLU第 74-94 行Conv2d BatchNorm SiLU。其中 BatchNorm 被数学等价地折叠为IScaleLayeraddBatchNorm2d第 40-72 行将gamma/beta/mean/var融合成 scale/shift 两个向量避免显式计算 BN 算子C3K2第 239-275 行对应 YOLO11 主干中的 C3k2 模块通过addSlice把cv1输出按通道一分为二一侧串联多个bottleneck或 C3k再与另一侧addConcatenation汇合最后cv2卷积C2PSA第 380-415 行YOLO11 引入的 PSA位置敏感自注意力模块。从源码可以推断其核心是PSABlock第 357-378 行内的Attention第 293-355 行qkv卷积 → reshape 多头 → 矩阵乘注意力图 → Softmax → 与v加权 → 叠加可学习的相对位置编码peDepthwise Conv→proj卷积再串接两层 FFN每个子层都带 shortcut 残差SPPF第 113-136 行三个串联的最大池化5×5、stride1、padding2后与原始特征addConcatenation再 1×1 卷积DFL第 138-157 行分布聚焦损失对应的解码分支将 4×16 的分布通过 Softmax 与 1×1 卷积加权得到 4 个回归量DWConv第 417-437 行深度可分离卷积conv-setNbGroups(ch)用于 PSA 中的编码分支。7.2 检测头插件plugin/yololayer.cu三个尺度的特征图经拼接后接入自定义插件YoloLayer_TRTaddYoLoLayerblock.cpp 第 159-218 行。插件通过PluginField传入combinedInfo数组包含类别数、关键点数、输入尺寸、kMaxNumOutputBbox以及 seg/pose/obb 标志位再配合各尺度网格大小px_arry。插件在 GPU 上一次性完成 anchor 解码、多尺度合并与阈值过滤输出统一为[kMaxNumOutputBbox]长度的Detection结构见 include/types.hCPU 后处理只需做最终的 NMS。7.3 尺寸换算与推理缓冲src/model.cpp 中get_width/get_depth负责把 n/s/m/l/x 的 gd/gw 映射为实际通道与深度C 入口则按kOutputSize kMaxNumOutputBbox * sizeof(Detection)/sizeof(float) 1分配输出缓冲并在运行时通过engine-getTensorShape读取实际输出框数model_bboxesyolo11_det.cpp第 206-207 行。8. INT8 量化readme 给出了 INT8 量化三步流程准备校准图片可从训练集随机挑选 1000 张以上或直接下载作者提供的 COCO 校准集coco_calib解压到构建目录将校准图片目录放入yolo11/build下路径必须与kInputQuantizationFolder一致默认./coco_calib开启量化并重新编译# 编辑 include/config.h # 注释 #define USE_FP16取消注释 #define USE_INT8 makeconfig.h中默认// #define USE_INT8即关闭状态打开后 src/model.cpp 会检查builder-platformHasFastInt8()并断言设置BuilderFlag::kINT8创建Int8EntropyCalibrator2src/calibrator.cpp按kInputW/kInputH批量读取coco_calib目录中的图片完成熵校准校准表保存为int8calib.table。校准完成后后续-s序列化生成的 engine 即 INT8 引擎推理流程与 FP16 完全一致。需要强调INT8 引擎对当前输入尺寸与校准集敏感更换分辨率或类别数后应重新校准。9. Python API 推理readme 提供可选的第 3 步在 Python 中加载 C 序列化好的 engine 与插件库进行推理。# 安装 python-tensorrt、pycuda 等依赖 # 确保 build 目录中已有 yolo11n.engine 与 libmyplugins.so python yolo11_det_trt.py ./build/yolo11n.engine ./build/libmyplugins.so9.1 常见坑与修复readme 明确记录了两个环境相关 FAQWindows 下pycuda._driver.LogicErrorLinux 下Segmentation fault。修复方式相同在 Python 文件头部显式初始化 PyCUDA 运行时import pycuda.autoinit import pycuda.driver as cuda这正是 yolo11_det_trt.py 第 13-14 行的写法——pycuda.autoinit会在模块导入时完成 CUDA 上下文初始化pycuda.driver提供显存与流管理接口。脚本还通过ctypes.CDLL加载libmyplugins.so注册插件否则反序列化 engine 时找不到YoloLayer_TRT并定义了与 C 一致的CONF_THRESH 0.5、IOU_THRESHOLD 0.4等常量以及YoLo11TRT类封装预处理、推理与后处理。yolo11_seg_trt.py、yolo11_pose_trt.py、yolo11_obb_trt.py、yolo11_cls_trt.py与检测脚本结构一致分别按各自任务解析输出张量分割取proto 32 维掩码系数姿态取 17×3 关键点OBB 取角度。10. 总结与注意事项基于 readme 与源码将 YOLO11 在 tensorrtx 上的部署要点归纳如下版本锁定网络使用 TensorRT 10 的显式 batch API 与enqueueV3接口构建不要混用 TensorRT 7/8 的旧 API 风格权重格式.wts是 tensorrtx 自有的文本权重格式必须与 gen_wts.py 的-t任务参数严格对应配置唯一入口精度、输入尺寸、类别数、NMS/置信度阈值、量化目录等全部在 include/config.h 修改改后需重新make后处理两种模式cCPU通用且支持多 batchgGPU性能更优但当前仅支持单 batchINT8 需要校准量化前务必准备足够的校准图片量化后的 engine 在更换输入分辨率或数据集后需要重新校准Python 推理必须同时提供 engine 与libmyplugins.so且要显式import pycuda.autoinit这是 Windows 与 Linux 上常见异常的根因。若需查阅同一部署框架下的其他模型可参见仓库根目录 README.md 与其他子项目如 yolov8/、yolov10/、yolov13/的 readme它们遵循相同的.wts→ engine → 推理的整体流程。赞分享人工智能深度学习计算机视觉【免费下载链接】tensorrtxImplementation of popular deep learning networks with TensorRT network definition API项目地址https://gitcode.com/gh_mirrors/te/tensorrtx点击查看免费下载相关推荐tensorrtx 中 YOLOv10 的 TensorRT-10 部署指南从 .pt 权重到 FP32/FP16/INT8 引擎tensorrtx 中 YOLOv10 的 TensorRT 10 部署指南从 .pt 权重到 FP32/FP16/INT8 引擎 导读 本文基于 tenso人工智能深度学习计算机视觉tensorrtx 中 YOLOv8 的 TensorRT-10 完整部署指南从 .pt 权重到 FP32/FP16/INT8 推理tensorrtx 中 YOLOv8 的 TensorRT 10 完整部署指南从 .pt 权重到 FP32/FP16/INT8 推理 导读 本文围绕 tens人工智能深度学习计算机视觉TensorRT 部署 YOLOv3-Tiny 完整指南wts 权重转换、引擎构建与推理tensorrtx 实战TensorRT 部署 YOLOv3 Tiny 完整指南wts 权重转换、引擎构建与推理tensorrtx 实战 YOLOv3 Tiny 是 YOLOv3人工智能深度学习计算机视觉上一篇【亲测免费】 若依框架消息弹框提示增强资源文件提升用户体验的利器下一篇【MATLAB项目实战】基于Morlet小波变换的滚动轴承故障特征提取研究精准故障诊断的利器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表