YOLOv7 到 TensorRT 推理侦测(c++)

环境:

TensorRT-8.5.1.7.

Windows10.x86_64

.cuda-11.6

.cudnn8.5

VS2022

TensorRT部署流程:

  1. 训练模型
  2. 导出模型为 ONNX 格式
  3. 选择精度
  4. 转化成 TensorRT 模型
  5. 部署模型

其中 ONNX 格式的导出和运行设备无关,可以在自己的电脑上导出,其他设备上使用。而第四步转化得到的 TensorRT 模型文件是和设备绑定的,在哪个设备上生成就只能在该设备使用。

导出命令:

python export.py --weights=best.pt

到处onnx查看结构:

转化模型:

转化成TensorRT的engine文件命令如下:

trtexec.exe --onnx=best.onnx --workspace=2048 --saveEngine=best.engine --fp16

使用shouxieai的TensorRT_Pro对engin文件推理

C++ TensorRT程序下载:

tensorRT_Pro/example-simple_yolo at main · shouxieai/tensorRT_Pro · GitHub

需要做如下5个操作

 1.准备好best.onnx和best.FP16.trtmodel文件,放到如下目录下:

tensorRT_Pro-main\example-simple_yolo\workspace

2.可以为 best.FP16.engine文件后缀,但要修改程序main.cpp,trtmodel后缀修改为engine,如下:

 修改后:

3.修改labels:

4.创建推理结果存放位置目录simple_yolo_result如下:

tensorRT_Pro-main\example-simple_yolo\workspace\simple_yolo_result

配置好import_lib.cpp中的opencv_world470d.lib

如下:

5. 并将如下所有的包放到C:\Windows\System32下

运行如下:

 

最后关于tensorRT推理文件后缀没有多大关系,可以是engine也可以为trtmodel。如可以使用TensorRT_Pro的程序不用修改main.cpp程序的后缀,直接修改导出 best.engine为best.trtmodel后缀文件也是可以的,不会影响推理。

参考:

YOLOv7 部署到 TensorRT(C++ ) - 知乎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用 YOLOv5 在 C++ 中进行 TensorRT 推理并返回边界框坐标的代码示例: ```cpp // 加载 TensorRT 模型并创建推理引擎 nvinfer1::ICudaEngine* engine = loadEngine(); // 创建 TensorRT 推理上下文 nvinfer1::IExecutionContext* context = engine->createExecutionContext(); // 输入数据缓冲区 void* inputDataBuffer = get_input_data(); // 获取输入数据 // 分配 GPU 内存并将输入数据复制到 GPU 上 cudaMalloc(&gpuInputDataBuffer, inputSize); cudaMemcpy(gpuInputDataBuffer, inputDataBuffer, inputSize, cudaMemcpyHostToDevice); // 输出数据缓冲区 void* outputDataBuffer = get_output_data(); // 获取输出数据 // 分配 GPU 内存并将输出数据清零 cudaMalloc(&gpuOutputDataBuffer, outputSize); cudaMemset(gpuOutputDataBuffer, 0, outputSize); // 执行 TensorRT 推理 void* bindings[] = {gpuInputDataBuffer, gpuOutputDataBuffer}; context->execute(1, bindings); // 将输出数据从 GPU 复制回 CPU cudaMemcpy(outputDataBuffer, gpuOutputDataBuffer, outputSize, cudaMemcpyDeviceToHost); // 解析输出数据并返回边界框坐标 float* outputData = (float*) outputDataBuffer; std::vector<std::tuple<float, float, float, float>> boxes; for (int i = 0; i < outputSize / sizeof(float); i += 6) { if (outputData[i + 4] > confidenceThreshold) { // 计算边界框坐标 float x = outputData[i + 0] * imageWidth; float y = outputData[i + 1] * imageHeight; float w = outputData[i + 2] * imageWidth; float h = outputData[i + 3] * imageHeight; float left = x - w / 2; float top = y - h / 2; float right = x + w / 2; float bottom = y + h / 2; boxes.push_back(std::make_tuple(left, top, right, bottom)); } } // 释放 GPU 内存 cudaFree(gpuInputDataBuffer); cudaFree(gpuOutputDataBuffer); // 释放 TensorRT 对象 context->destroy(); engine->destroy(); ``` 其中,`loadEngine()` 函数用于加载 TensorRT 模型并创建推理引擎,`get_input_data()` 和 `get_output_data()` 函数用于获取输入和输出数据的指针,`inputSize` 和 `outputSize` 分别表示输入和输出数据的大小,`confidenceThreshold` 是一个置信度阈值,用于筛选边界框。返回的 `boxes` 是一个 `tuple` 数组,每个 `tuple` 表示一个边界框的左上角和右下角坐标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值