【推理加速】TensorRT C++ 部署YOLO11全系模型

该文章已生成可运行项目,

YOLO11

YOLO11 C++推理YOLO11是Ultralytics最新发布的 目标检测、实例分割、姿态评估的系列模型视觉轻量化框架,基于前代YOLO8版本进行了多项改进和优化。YOLO11在特征提取、效率和速度、准确性以及环境适应性方面都有显著提升,达到SOTA。

TensorRT C++ SDK

最新版本的TensorRT10.x版本已经修改了推理的接口函数与查询输入输出层的函数,其中以YOLO11对象检测为例,获取输入与输出层维度查询代码如下:

// 获取输入与输出维度
auto inputDims = this->engine->getTensorShape("images");
auto outDims = this->engine->getTensorShape("output0");

// 获取输入维度信息
this->input_h = inputDims.d[2];
this->input_w = inputDims.d[3];
printf("inputH : %d, inputW: %d \n", this->input_h, this->input_w);

// 获取输出维度信息
this->output_h = outDims.d[1];
this->output_w = outDims.d[2];
std::cout << "out data format: " << this->output_h << "x" << this->output_w << std::endl;

推理的API函数已经更新直接输入GPU缓存数据,代码如下:

cv::Mat blob = cv::dnn::blobFromImage(image, 1 / 255.0, cv::Size(this->input_w, this->input_h), cv::Scalar(0, 0, 0), true, false);
cudaMemcpyAsync(buffers[0], blob.ptr<float>(), 3 * this->input_h * this->input_w * sizeof(float), cudaMemcpyHostToDevice, stream);
// 推理
context->executeV2(buffers);

其中buffers为GPU数据缓存。

YOLO11对象检测 + TensorRT10.8推理演示:
在这里插入图片描述

YOLO11实例分割 + TensorRT10.8推理演示:
在这里插入图片描述

YOLO11姿态评估 + TensorRT10.8推理演示:
在这里插入图片描述
上述代码我均已经完成C++的封装,SDK 三行代码即可客户端调用,调用演示的代码如下:

# include <tensorrt_yolo11_pose.h>
#include <iostream>
#include <fstream>

int main(int argc, char** argv) {
	std::shared_ptr<YOLO11TRTPose> detector(new YOLO11TRTPose());
	detector->initConfig("D:/python/yolov5-7.0/yolo11n-pose.engine", 0.25f);
	//cv::Mat frame = cv::imread("D:/boogup.jpg");
	//detector->detect(frame);
	//cv::imshow("YOLO11姿态评估 + TensorRT10.8 - OpenCV学堂", frame);
	//cv::waitKey(0);
	//cv::destroyAllWindows();
	cv::VideoCapture capture("D:/images/video/dance.mp4");
	cv::Mat frame;
	std::vector<DetectResult> results;
	while (true) {
		bool ret = capture.read(frame);
		if (frame.empty()) {
			break;
		}
		detector->detect(frame);
		cv::imshow("YOLO12姿态评估 + TensorRT10.8 - OpenCV学堂", frame);
		char c = cv::waitKey(1);
		if (c == 27) { // ESC 退出
			break;
		}
	}
	cv::waitKey(0);
	cv::destroyAllWindows();
	return 0;
}

源码获取

掌握TensorRT10.8 C++如何部署图像分类,对象检测,实例分割,语义分割主流模型,自定义脚本一键INT8量化模型,使用OpenCV CUDA加速图像预处理等各种工程化部署推理技巧,实现推理部署的工程化封装支持,客户端三行代码即可调用,支持YOLOv5~YOLO12系列模型一键集成部署与量化!全部解锁上述技能与源码获取,点击这里

本文章已经生成可运行项目
### 使用 C++ 和 OpenCV 实现 YOLOv11-Pose 姿态估计 为了在C++环境中利用YOLOv11-Pose进行姿态估计,需先确认已安装支持DNN模块的OpenCV版本以及合适的编译工具链。下面提供了一个基本框架来指导如何完成这一过程。 #### 加载 ONNX 模型 通过调用`cv::dnn::readNetFromONNX()`函数可以读取并初始化由PyTorch或其他框架导出至ONNX格式的YOLOv11-Pose模型文件[^1]。 ```cpp #include <opencv2/dnn.hpp> #include <opencv2/imgproc.hpp> // ...其他必要的头文件... std::string modelPath = "path/to/yolov11-pose.onnx"; cv::dnn::Net net = cv::dnn::readNetFromONNX(modelPath); ``` #### 预处理输入图像 对于大多数神经网络而言,在送入数据前都需要对其进行标准化预处理操作。这通常涉及到调整大小、减去均值、除以标准差等步骤。针对特定于YOLOv11-Pose的要求,应该参照官方文档或训练时所采用的数据增强策略来进行相应的转换工作。 ```cpp cv::Mat img = cv::imread(imageFilePath); // Load image from file path. if (img.empty()) { std::cerr << "Could not open or find the image\n"; } int const inputWidth = 640; // Example width, adjust as needed based on your model requirements. int const inputHeight = 480; cv::resize(img, img, cv::Size(inputWidth, inputHeight)); cv::cvtColor(img, img, cv::COLOR_BGR2RGB); blob = cv::dnn::blobFromImage(img, 1 / 255.F, cv::Size(inputWidth, inputHeight), cv::Scalar(), true, false); net.setInput(blob); ``` #### 获取预测结果 一旦完成了上述准备工作,则可以通过调用`forward()`方法执行推理计算,并接收来自最后一层或多层输出的结果向量作为返回值。需要注意的是,不同版本间的API可能会有所变化,请查阅最新版OpenCV手册获取最准确的方法签名说明。 ```cpp std::vector<cv::String> outNames; outNames.push_back(net.getLayerNames().at(net.getUnconnectedOutLayers()[0]-1)); // Adjust according to actual output layer name/index. std::vector<cv::Mat> outs; net.forward(outs, outNames); ``` #### 后处理阶段 最后一步是对得到的原始输出做进一步解释和优化处理,比如筛选置信度较高的关键点位置信息,去除冗余标记点等等。这部分逻辑高度依赖具体的业务场景和个人需求而定,建议开发者依据实际情况灵活设计算法流程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gloomyfish

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值