Yolov3使用TensorRT加速(一)

本文记录了使用TensorRT加速Yolov3模型过程中遇到的困难,包括Caffe的编译问题,如hdf5、c++11、lsnappy、leveldb和protobuf版本冲突等,并提供了相应的解决办法和参考资料。

近期想要用TensorRT加速一下自己训练过的yolov3模型,谁知道处处是坑,因此记录下来踩过的这些坑希望对大家有帮助。(也许你遇不到我的这些奇葩bug,那是最好不过了)
一.编译caffe
参照该大神的博客:https://blog.youkuaiyun.com/Chen_yingpeng/article/details/80692018
第一步过程其实就是模型转换,得到yolov3.cfg、yolov3.weights(用官方模型举例)转换成的yolov3.prototxt和yolov3.caffemodel. 前期的步骤不再详细介绍,例如安装pytorch等等。

前期下载caffe源码包括makefile 文件的修改,upsample层的加入等内容不再赘述,相信大家应该都没什么问题,主要记录一下make时候的一堆问题。
(1)hdf5
重新安装
(2)c++11
参考链接:https://www.cnblogs.com/haiyang21/p/10214278.html
(3)lsnappy lleveldb
参考链接:https://www.cnblogs.com/zxc2man/p/4064480.html
(4)lib/libcaffe.so:undefine reference to goo

### 使用TensorRT加速YOLOv5模型推理 为了实现YOLOv5模型的高效推理,可以利用NVIDIA的TensorRT工具来优化和部署模型。具体流程涉及几个关键步骤。 #### 准备工作 确保环境配置满足需求,安装必要的依赖库并获取YOLOv5项目的官方源码[^1]。这步骤对于后续的操作至关重要,因为正确的开发环境能够简化整个过程中的许多潜在问题。 #### 转换模型权重至TensorRT引擎格式 将已经训练完成的YOLOv5模型(通常是`.pt`文件)转换为适用于TensorRT执行的引擎文件。此过程中可能需要用到Python脚本辅助完成从PyTorch到ONNX再到TensorRT的转换。 ```python import torch.onnx from models.experimental import attempt_load def convert_to_onnx(weights_path, onnx_save_path): model = attempt_load(weights_path, map_location=torch.device('cpu')) # Load model model.eval() input_names = ["input_0"] output_names = ['output_0'] dynamic_axes = {'input_0': {0: 'batch_size'},'output_0': {0: 'batch_size'}} dummy_input = torch.randn(1, 3, 640, 640) torch.onnx.export( model, dummy_input, onnx_save_path, export_params=True, opset_version=12, do_constant_folding=True, input_names=input_names, output_names=output_names, dynamic_axes=dynamic_axes ) ``` 这段代码展示了如何通过调用 `torch.onnx.export()` 方法将 PyTorch 的 `.pt` 文件导出为 ONNX 格式的模型,并设置了些参数以便更好地适配 TensorRT 推理的要求。 接着,使用 trtexec 工具或其他方式进步编译 ONNX 模型成为高效的 TensorRT 引擎文件(.engine): ```bash trtexec --onnx=yolov5s.onnx --saveEngine=yolov5s.engine ``` #### 执行推理测试 旦获得了 TensorRT 引擎文件之后,就可以编写 C++ 或 Python 程序加载该引擎来进行实际的数据推断了。这里需要注意 CPU 和 GPU 内存之间的数据交换效率以及 yolov5 输出层的结果解析等问题[^3]。 例如,在C++环境中,可以通过以下方式初始化并运行推理: ```cpp #include "NvInfer.h" // ...其他必要的头文件... int main(){ // 创建Logger实例... nvinfer1::IRuntime* runtime = nvinfer1::createInferRuntime(gLogger); assert(runtime != nullptr); std::ifstream engineFile(engineFilePath, std::ios::binary | std::ios::ate); size_t fsize = engineFile.tellg(); engineFile.seekg (0, std::ios::beg); char *data = new char[fsize]; engineFile.read(data,fsize); engineFile.close(); nvinfer1::ICudaEngine* engine = runtime->deserializeCudaEngine(data, fsize, nullptr); delete[] data; assert(engine != nullptr); nvinfer1::IExecutionContext* context = engine->createExecutionContext(); assert(context != nullptr); float* hInputData; // Host端输入缓冲区指针 float* dInputData; // Device端输入缓冲区指针 cudaMalloc(&dInputData, INPUT_SIZE); cudaMemcpy(dInputData,hInputData,INPUT_SIZE,cudaMemcpyHostToDevice); void* buffers[] = {dInputData}; // 输入输出缓冲数组 context->executeV2(buffers); // 开始执行推理 // 处理输出结果... } ``` 上述代码片段说明了创建 TensorRT 运行时对象、反序列化已保存的引擎文件、分配 CUDA 设备上的内存空间用于存储输入图像数据、启动推理计算并将最终得到的结果返回给主机程序的过程。 #### 后处理与性能评估 最后还需要考虑对原始预测框进行解码、应用 NMS(non-max suppression)算法去除冗余检测框等系列后处理操作;同时也要关注整体系统的吞吐量、延迟等指标以衡量加速效果的好坏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值