当前位置: 首页 > article >正文

用TensorRT加速你的YOLOv5:Windows C++推理部署实战(附完整项目配置)

用TensorRT加速YOLOv5Windows C推理部署全流程解析在计算机视觉领域YOLOv5因其出色的实时检测性能广受欢迎。但当我们需要将训练好的模型部署到实际生产环境时Python的解释执行往往难以满足性能要求。这时TensorRT作为NVIDIA推出的高性能推理引擎能够显著提升模型执行效率。本文将带你从零开始将一个PyTorch训练的YOLOv5模型转换为TensorRT引擎并集成到C应用程序中。1. 环境准备与模型转换在开始之前我们需要确保开发环境配置正确。以下是必需的组件Windows 10/11 64位系统NVIDIA显卡支持CUDAVisual Studio 2019或更高版本CUDA 11.x和对应版本的cuDNNTensorRT 8.x提示务必保持CUDA、cuDNN和TensorRT版本匹配这是后续步骤成功的关键。首先我们需要将训练好的YOLOv5 PyTorch模型(.pt)转换为ONNX格式import torch from models.experimental import attempt_load # 加载训练好的模型 model attempt_load(yolov5s.pt, map_locationcpu) # 设置输入张量尺寸 input_tensor torch.randn(1, 3, 640, 640) # 导出为ONNX torch.onnx.export( model, input_tensor, yolov5s.onnx, opset_version12, input_names[images], output_names[output], dynamic_axes{ images: {0: batch}, output: {0: batch} } )转换过程中常见的问题及解决方案问题现象可能原因解决方法导出失败使用了不支持的算子降低opset版本或修改模型结构推理结果异常动态尺寸设置不当检查dynamic_axes参数性能下降导出时优化不足添加--simplify参数2. TensorRT引擎构建获得ONNX模型后我们需要使用TensorRT的builder工具将其转换为优化的推理引擎。这里介绍两种方法使用trtexec命令行工具和编程方式构建。2.1 使用trtexec快速转换trtexec是TensorRT自带的实用工具适合快速原型开发trtexec --onnxyolov5s.onnx --saveEngineyolov5s.engine --fp16 --workspace2048关键参数说明--fp16: 启用FP16精度可显著提升性能--workspace: 设置最大工作空间大小(MB)--minShapes/--optShapes/--maxShapes: 定义动态尺寸范围2.2 编程方式构建引擎对于需要更多控制的情况可以使用TensorRT C API#include NvInfer.h #include NvOnnxParser.h nvinfer1::IBuilder* builder nvinfer1::createInferBuilder(logger); const auto explicitBatch 1U static_castuint32_t(nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH); nvinfer1::INetworkDefinition* network builder-createNetworkV2(explicitBatch); nvonnxparser::IParser* parser nvonnxparser::createParser(*network, logger); parser-parseFromFile(yolov5s.onnx, nvinfer1::ILogger::Severity::kWARNING); nvinfer1::IBuilderConfig* config builder-createBuilderConfig(); config-setMaxWorkspaceSize(1 30); if (builder-platformHasFastFp16()) { config-setFlag(nvinfer1::BuilderFlag::kFP16); } nvinfer1::ICudaEngine* engine builder-buildEngineWithConfig(*network, *config);构建引擎时的优化技巧层融合TensorRT会自动融合ConvBNReLU等常见组合精度校准对于INT8量化需要提供校准数据集动态形状合理设置优化配置文件和内存限制3. C推理代码实现有了TensorRT引擎后我们需要编写C代码来加载并执行推理。以下是核心代码结构3.1 引擎加载与上下文创建std::ifstream engineFile(yolov5s.engine, std::ios::binary); engineFile.seekg(0, std::ios::end); size_t engineSize engineFile.tellg(); engineFile.seekg(0, std::ios::beg); std::vectorchar engineData(engineSize); engineFile.read(engineData.data(), engineSize); nvinfer1::IRuntime* runtime nvinfer1::createInferRuntime(logger); nvinfer1::ICudaEngine* engine runtime-deserializeCudaEngine(engineData.data(), engineSize); nvinfer1::IExecutionContext* context engine-createExecutionContext();3.2 内存分配与数据传输// 获取输入输出绑定信息 int nbBindings engine-getNbBindings(); std::vectorvoid* buffers(nbBindings); for (int i 0; i nbBindings; i) { nvinfer1::Dims dims engine-getBindingDimensions(i); size_t size std::accumulate(dims.d, dims.d dims.nbDims, 1, std::multipliessize_t()); cudaMalloc(buffers[i], size * sizeof(float)); } // 将输入数据从主机拷贝到设备 cudaMemcpy(buffers[inputIndex], inputData.data(), inputSize * sizeof(float), cudaMemcpyHostToDevice);3.3 执行推理与结果处理context-executeV2(buffers.data()); // 将输出数据从设备拷贝回主机 std::vectorfloat outputData(outputSize); cudaMemcpy(outputData.data(), buffers[outputIndex], outputSize * sizeof(float), cudaMemcpyDeviceToHost); // 解析YOLOv5输出 std::vectorDetection detections; parseYOLOv5Output(outputData, detections);4. 前后处理优化在实际应用中前后处理往往成为性能瓶颈。以下是几种优化策略4.1 图像预处理加速传统CPU预处理cv::Mat image cv::imread(input.jpg); cv::resize(image, image, cv::Size(640, 640)); image.convertTo(image, CV_32F, 1.0/255.0);优化后的GPU预处理void preprocessGPU(const cv::Mat h_image, float* d_input, cudaStream_t stream) { // 分配设备内存 uchar* d_uchar; cudaMalloc(d_uchar, h_image.rows * h_image.cols * 3); // 拷贝并转换 cudaMemcpyAsync(d_uchar, h_image.data, h_image.rows * h_image.cols * 3, cudaMemcpyHostToDevice, stream); // 调用CUDA核函数进行归一化和通道重排 preprocessKernelgrid, block, 0, stream(d_uchar, d_input, h_image.cols, h_image.rows); }4.2 后处理优化YOLOv5的后处理主要包括解码边界框坐标应用置信度阈值执行非极大值抑制(NMS)优化后的NMS实现__global__ void nmsKernel(Detection* detections, int num_detections, float iou_threshold, int* keep_indices) { // 共享内存存储检测框信息 extern __shared__ float shared_boxes[]; // 每个线程处理一个检测框 int i blockIdx.x * blockDim.x threadIdx.x; if (i num_detections) return; // 加载检测框到共享内存 if (threadIdx.x 0) { for (int j 0; j num_detections; j) { shared_boxes[j*5 0] detections[j].x1; // 加载其他坐标... } } __syncthreads(); // 计算IoU并执行抑制 // ... }5. 性能对比与调优完成部署后我们需要评估TensorRT带来的性能提升。以下是典型测试结果测试项PyTorch CPUPyTorch GPUTensorRT FP32TensorRT FP16延迟(ms)120452515吞吐量(FPS)8.322.240.066.7显存占用(MB)-15001200800性能调优的关键点批处理大小适当增大批处理可提高吞吐量但会增加延迟精度选择FP16通常能在精度损失很小的情况下显著提升性能CUDA流使用多个CUDA流实现流水线并行内存复用避免频繁分配释放内存// 使用CUDA流实现异步执行 cudaStream_t stream; cudaStreamCreate(stream); while (true) { // 异步预处理 preprocessGPU(image, d_input, stream); // 异步推理 context-enqueueV2(buffers.data(), stream, nullptr); // 异步后处理 postprocessGPU(d_output, detections, stream); cudaStreamSynchronize(stream); }在实际项目中我们还需要考虑工程化方面的优化异常处理健壮的错误检查和恢复机制日志系统详细的性能监控和调试信息资源管理使用RAII模式管理CUDA资源多线程支持线程安全的TensorRT上下文管理通过以上步骤我们成功将YOLOv5模型部署到了Windows C环境中并利用TensorRT实现了显著的性能提升。这种部署方式特别适合需要低延迟、高吞吐量的生产环境如视频分析、工业检测等应用场景。

相关文章:

用TensorRT加速你的YOLOv5:Windows C++推理部署实战(附完整项目配置)

用TensorRT加速YOLOv5:Windows C推理部署全流程解析 在计算机视觉领域,YOLOv5因其出色的实时检测性能广受欢迎。但当我们需要将训练好的模型部署到实际生产环境时,Python的解释执行往往难以满足性能要求。这时,TensorRT作为NVIDIA…...

香橙派Lite全解析:从硬件到应用,玩转ARM开发板与物联网项目

1. 香橙派Lite:一张能装进口袋的“万能主板”如果你对树莓派(Raspberry Pi)这类单板电脑有所耳闻,但又觉得它价格偏高或者想尝试更多选择,那么来自中国的香橙派(Orange Pi)系列绝对值得你深入了…...

BGA底部填充胶:嵌入式主控板可靠性设计与工艺全解析

1. 项目概述:为什么BGA底部填充胶是嵌入式主控板的“定海神针”?在嵌入式计算机主控板的设计与生产领域,尤其是那些采用高密度、细间距BGA(球栅阵列)封装芯片的板卡上,有一个工艺环节常常被新手工程师忽略&…...

TI AM64x 5路原生千兆网口:工业物联网确定性网络与多核异构计算实战

1. 项目概述:为什么我们需要5路原生千兆网口?在工业现场摸爬滚打十几年,我见过太多因为网络接口“捉襟见肘”而导致的尴尬局面。想象一下,一个产线控制柜里,PLC、视觉系统、多台伺服驱动器、HMI触摸屏,还有…...

18V/4A同步降压转换器:MPQ8632GLE-4的COT控制与快速瞬态响应解析

MPQ8632GLE-4:4A/18V 同步降压转换器的紧凑型电源解决方案在通信设备、分布式电源系统以及服务器主板等应用中,电源管理单元需要在小面积内实现高效率的电压转换,同时保持良好的瞬态响应。传统的 PWM 控制器往往需要复杂的环路补偿设计&#…...

服务器电源、电机驱动、UPS:IRLR3636TRPBF的60V功率MOSFET应用版图

IRLR3636TRPBF:DPAK封装60V/50A N沟道功率MOSFET的大电流开关应用解析在大功率开关电源、不间断电源以及直流电机驱动等领域,功率MOSFET的导通损耗直接影响系统的温升和能效等级。当设计需要在60V电压平台上处理50A级别的大电流时,导通电阻和…...

【Perplexity阅读推荐查询实战指南】:20年AI工具专家亲授5大精准筛选技巧,错过再等一年

更多请点击: https://kaifayun.com 第一章:Perplexity阅读推荐查询的核心价值与适用场景 Perplexity 作为一款基于大语言模型的实时问答与研究工具,其“阅读推荐查询”能力并非简单的内容聚合,而是融合语义理解、来源可信度评估…...

PB 级自动驾驶数据秒级检索:Apache Doris 统一多模态数据平台实践

导读:多模态数据正成为企业核心资产,但规模化管理仍具挑战。自动驾驶在 PB 级图像、点云、视频等数据治理中积累了可复用经验。本文介绍某公司以 Apache Doris 统一标签、元数据、全文和向量检索,将查询从分钟级提升至秒级。 多模态数据正在成…...

无需电荷泵的高边开关:IRLML6401TRPBF在便携设备电源管理中的简化设计

IRLML6401TRPBF:SOT-23封装P沟道功率MOSFET的开关应用解析在便携式电子设备、电源管理以及电池保护电路中,PCB面积的限制往往与功率处理能力形成矛盾。设计师需要在有限的板级空间内实现高效的电源路径切换和负载管理。IRLML6401TRPBF是英飞凌&#xff0…...

Vibe Coding 灾难的爆发

AI 编程工具确实正在颠覆软件行业,但几乎比我所见过的任何事物都更属于那个"如果没有丰富的前期经验,你不应该在家尝试"的类别: Reddit 上 vibe coding 灾难故事堆积如山。除非你介入并为 AI 建立结构,否则它就会推送垃…...

5个真正赚钱的 AI 工作流 (2026)

AI驱动的创作者经济预计在2026年将达到57.1亿美元。但大多数使用AI工具的人仍然把它们当作搜索引擎——提问,获取答案,关闭标签页,明天重新开始。真正赚到钱的人发现了不同的东西:他们建立了能复合增长的工作流。代理每次运行都会…...

如何判断杉木桩品牌的选型标准?

开篇即明:本文仅输出选型方法,不推荐任何具体产品。杉木桩作为园林、水利、建筑等领域的常用材料,其质量直接关系工程安全与寿命。从业十余年,我始终认为:选型需回归标准,而非品牌名称。以下从四个核心维度…...

半波整流电路:从原理到实践,掌握AC-DC转换基础

1. 项目概述:从交流到直流的第一步在电子电路的世界里,我们常常需要将交流电(AC)转换为直流电(DC),这个过程我们称之为“整流”。而半波整流电路,可以说是所有整流电路中最基础、最经…...

嵌入式PID温度控制:从算法原理到C语言工程实现

1. 项目概述与核心思路最近在做一个智能热水器的嵌入式控制项目,核心任务就是让水温能又快又稳地达到我们设定的目标值。这听起来简单,但实际做起来,水温系统有惯性、有延迟,加热功率和环境散热也在实时变化,想实现精准…...

复旦微FM33FR0xx开发板实战:从零构建低功耗电容触摸应用

1. 项目概述:从一块开发板说起最近在捣鼓智能家居的小玩意儿,想找个带触摸功能又够省电的MCU,正好看到了复旦微电子新出的FM33FR0xx系列开发套件。这板子到手玩了一阵,感觉挺有意思,它不单单是块核心板,还配…...

大模型在软件测试中的应用:从测试用例生成到bug检测

在软件行业高速发展的今天,软件规模持续扩大、复杂度不断攀升,软件测试作为保障软件质量的关键环节,面临着前所未有的挑战。传统测试方法在应对海量需求、复杂业务逻辑以及快速迭代的开发模式时,逐渐暴露出效率低下、覆盖不全等问…...

3个实战场景掌握Kafka-UI:高效管理Apache Kafka集群的实用指南

3个实战场景掌握Kafka-UI:高效管理Apache Kafka集群的实用指南 【免费下载链接】kafka-ui Open-Source Web UI for managing Apache Kafka clusters 项目地址: https://gitcode.com/gh_mirrors/kaf/kafka-ui Kafka-UI是一款专业的开源Web界面工具&#xff0c…...

谷歌开发者大会2026:Gemini全面升级,重塑搜索与生活体验!

谷歌开发者大会2026开幕在品尝过「会前甜点」Android Show 之后,真正的重头戏谷歌开发者大会 Google I/O 2026 正式揭开了帷幕。不出所料,在时长接近两个小时的活动中,Gemini 占据了绝对的 C 位。除了更新基础模型和周边能力之外,…...

AI从业者的理财攻略:如何用AI技术实现被动收入

AI时代,软件测试从业者的新理财机遇在人工智能技术飞速发展的当下,软件测试行业正经历着深刻变革。传统的手工测试逐渐被自动化测试、AI驱动的测试所取代,这既给软件测试从业者带来了挑战,也创造了新的机遇。对于软件测试从业者而…...

S32K3 FlexCAN驱动避坑指南:从波特率计算到邮箱锁定的实战心得

S32K3 FlexCAN驱动避坑指南:从波特率计算到邮箱锁定的实战心得 在嵌入式开发领域,CAN总线通信一直是工业控制、汽车电子等实时系统的核心命脉。NXP S32K3系列芯片集成的FlexCAN模块以其强大的功能和灵活性,成为许多高可靠性项目的首选方案。然…...

uni-app项目上架前必做:手把手教你用Android Studio生成正式签名APK(从证书到发布)

uni-app项目上架全流程:从签名证书到应用商店发布的实战指南 当你完成uni-app项目的开发后,如何将代码转化为可供用户下载安装的正式APK文件?这看似简单的打包过程,实则暗藏诸多技术细节。本文将带你深入理解Android应用签名机制&…...

非 CTP 柜台连接天勤:众期融航易达等网关差异备忘

前言 天勤除 CTP 外还支持众期、融航、杰宜斯、易达等柜台路线,构造函数与可用报单类型可能不同。我帮同事对接时,会先查文档里对应类名,再在模拟环境测通连与下单,避免直接上实盘试错。 一、选型前先确认的三件事 开户期货公司支…...

SystemVerilog测试套件从IP到SoC的重用:架构设计与工程实践

1. 项目概述:从IP到SoC的验证鸿沟在芯片设计行业里摸爬滚打十几年,我见过太多团队在项目后期被验证工作拖得焦头烂额。一个典型的场景是:某个IP(知识产权核,比如一个USB控制器或一个DDR内存控制器)在独立验…...

别再让用户错过消息!UniApp应用通知权限引导的最佳实践与UniPush 2.0优化

UniApp应用通知权限引导的艺术与UniPush 2.0实战策略 当用户的手指在屏幕上轻轻滑动,决定是否授予你的应用通知权限时,这场无声的对话将直接影响后续的用户留存与活跃度。数据显示,超过60%的用户在首次拒绝通知权限后,永远不会主动…...

HsMod终极指南:55项功能打造你的个性化炉石传说体验

HsMod终极指南:55项功能打造你的个性化炉石传说体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是一款基于BepInEx框架开发的炉石传说多功能插件,为玩家提…...

MATLAB图像处理实战:用strel函数玩转膨胀腐蚀,5分钟搞定车牌去噪

MATLAB车牌去噪实战:形态学操作中的结构元素艺术 车牌识别系统在智能交通、停车场管理等场景中应用广泛,但实际采集的车牌图像常因环境干扰出现噪声、污渍或字符粘连问题。形态学处理作为图像预处理的关键步骤,其效果高度依赖结构元素的选择与…...

别再死磕标注数据了!用扩散模型从海量无标签遥感图像中‘白嫖’语义信息,提升变化检测精度

扩散模型在遥感变化检测中的无监督语义挖掘实战 遥感图像变化检测一直是地理信息科学和计算机视觉交叉领域的重要课题。传统方法高度依赖大量精确标注的训练数据,而标注成本高昂、周期漫长,成为制约算法性能提升的瓶颈。2022年涌现的多项突破性研究证明&…...

阿里云服务器上fastText安装踩坑记:从C++11报错到模型量化压缩的完整避坑指南

阿里云ECS实战:fastText从编译报错到模型量化的全流程解决方案 当你在阿里云ECS上部署fastText模型时,是否遇到过那个令人头疼的"C11编译错误"?这仅仅是开始——内存占用过高、磁盘空间不足、推理速度慢等问题会接踵而至。本文将带…...

别再死记硬背!用Python可视化理解第一类曲面积分中的dσ与dxdy关系

用Python可视化破解曲面积分:从dσ到dxdy的几何直觉 第一次看到曲面积分公式里的dσ √(1 fx fy) dxdy时,我盯着那堆平方根和偏导数符号发呆了十分钟。直到某天用Matplotlib让这个公式"动起来",才突然明白那些教科书上的推导到底…...

小白程序员必备:从零基础到大模型实战,这份学习路线图请收藏!

本文结合530名开发者的经验,为AI初学者提供从零基础到项目实战的完整学习路线。核心内容包括:Python编程、数学基础、机器学习、深度学习框架(PyTorch)、科学计算库(NumPy)等关键技能,并避开了常…...