【TensorRT】TensorRT+YOLOv5第六版C++部署全解

         注意CUDA环境与TensorRT版本匹配,否则会有问题:

Could not load library cudnn_cnn_infer64_8.dll. Error code 126Please make sure cudnn_cnn_infer64_8.dll is in your library path!

        交代一下软件相关版本信息,防止翻车!

Win10 x64CUDA11.0.2cuDNN8.2.0TensorRT8.4.0VS2017OpenCV4.5.4GPU3050 ti

VS2017中开发环境配置

配置包含路径

配置库目录路径:

说明一下,我的TensorRT解压缩之后在路径为D:\TensorRT-8.4.0.6

配置连接器相关lib文件如下:

相关lib文件列表如下:(特别注意:版本不同会有差异,请慎重拷贝!)

nvinfer.libnvinfer_plugin.libnvonnxparser.libnvparsers.libcublas.libcublasLt.libcuda.libcudadevrt.libcudart.libcudart_static.libcudnn.libcudnn64_8.libcudnn_adv_infer.libcudnn_adv_infer64_8.libcudnn_adv_train.libcudnn_adv_train64_8.libcudnn_cnn_infer.libcudnn_cnn_infer64_8.libcudnn_cnn_train.libcudnn_cnn_train64_8.libcudnn_ops_infer.libcudnn_ops_infer64_8.libcudnn_ops_train.libcudnn_ops_train64_8.libcufft.libcufftw.libcurand.libcusolver.libcusolverMg.libcusparse.libnppc.libnppial.libnppicc.libnppidei.libnppif.libnppig.libnppim.libnppist.libnppisu.libnppitc.libnpps.libnvblas.libnvjpeg.libnvml.libnvrtc.libOpenCL.lib

YOLOv5模型转换ONNX->engine

直接初始化YOLOv5TRTDetector类,然后调用onnx2engine方法,实现onnx到engine文件转换,相关代码如下:

auto detector = std::make_shared();detector->onnx2engine("D:/python/yolov5-6.1/yolov5s.onnx", "D:/python/yolov5-6.1/yolov5s.engine", 0);

运行结果如下:

相关方法实现代码如下:

void YOLOv5TRTDetector::onnx2engine(std::string onnxfilePath, std::string enginefilePath, int type) {
    IBuilder* builder = createInferBuilder(gLogger);
    const auto explicitBatch = 1U << static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);
    nvinfer1::INetworkDefinition* network = builder->createNetworkV2(explicitBatch);
    auto parser = nvonnxparser::createParser(*network, gLogger);
    parser->parseFromFile(onnxfilePath.c_str(), 2);
    for (int i = 0; i < parser->getNbErrors(); ++i)
    {
          std::cout << "load error: "<< parser->getError(i)->desc() << std::endl;
    }
    printf("tensorRT load mask onnx model successfully!!!...\n");


    // 创建推理引擎
    IBuilderConfig* config = builder->createBuilderConfig();
    config->setMaxWorkspaceSize(16*(1 << 20));
    if (type == 1) {
          config->setFlag(nvinfer1::BuilderFlag::kFP16);
    }
    if (type == 2) {
          config->setFlag(nvinfer1::BuilderFlag::kINT8);
    }
    auto myengine = builder->buildEngineWithConfig(*network, *config);
    std::cout << "try to save engine file now~~~" << std::endl;
    std::ofstream p(enginefilePath, std::ios::binary);
    if (!p) {
          std::cerr << "could not open plan output file" << std::endl;
          return;
    }
    IHostMemory* modelStream = myengine->serialize();
    p.write(reinterpret_cast<const char*>(modelStream->data()), modelStream->size());
    modelStream->destroy();
    myengine->destroy();
    network->destroy();
    parser->destroy();
    std::cout << "convert onnx model to TensorRT engine model successfully!" << std::endl;
}

常见错误:​​​​​​​

Error Code 1: Cuda Runtime (driver shutting down)Unexpected Internal Error: [virtualMemoryBuffer.cpp::~StdVirtualMemoryBufferImpl::121] Error Code 1: Cuda Runtime (driver shutting down)Unexpected Internal Error: [virtualMemoryBuffer.cpp::nvinfer1::StdVirtualMemoryBufferImpl::~StdVirtualMemoryBufferImpl::121] Error Code 1: Cuda Runtime (driver shutting down)

要释放,不然就是上面的错误

context->destroy();
engine->destroy();
network->destroy();
parser->destroy();

这样就好啦

YOLOv5 engine模型加载与推理

分别转换为32FP与16FP的engine文件之后,执行推理代码与运行结果如下:

std::string label_map = "D:/python/yolov5-6.1/classes.txt";
int main(int argc, char** argv) {
    std::vectorclassNames;
    std::ifstream fp(label_map);
    std::string name;
    while (!fp.eof()) {
          getline(fp, name);
          if (name.length()) {
                  classNames.push_back(name);
          }
    }
    fp.close();


    auto detector = std::make_shared();
    detector->initConfig("D:/python/yolov5-6.1/yolov5s.engine", 0.4, 0.25);
    std::vectorresults;
    cv::VideoCapture capture("D:/images/video/sample.mp4");
    cv::Mat frame;
    while (true) {
          bool ret = capture.read(frame);
          detector->detect(frame, results);
          for (DetectResult dr : results) {
                  cv::Rect box = dr.box;
                  cv::putText(frame, classNames[dr.classId], cv::Point(box.tl().x, box.tl().y - 10), cv::FONT_HERSHEY_SIMPLEX, .5, cv::Scalar(0, 0, 0));
          }
          cv::imshow("YOLOv5-6.1 + TensorRT8.4 - by gloomyfish", frame);
          char c = cv::waitKey(1);
          if (c == 27) { // ESC 退出
                  break;
          }
          // reset for next frame
          results.clear();
    }
    cv::waitKey(0);
    cv::destroyAllWindows();
    return 0;
}

运行结果:

FP32上推理,速度在80+FPS左右

FP16上推理,速度达到100+FPS左右,TensorRT8.4.0

总结

TensorRT推理一定要及时释放资源,YOLOv5 第六版实际输出的四个输出层。只解析output层输出即可。先把模型导出onnx格式然后再通过tensorRT导出为engine文件,简单快捷!网上有很多文章都是以前写的,不太可信,建议少参考!直接加载engine文件推理,速度在我的笔记本3050ti上可达100FPS左右!

转自:TensorRT+YOLOv5第六版C++部署全解-面包板社区 (eet-china.com)

  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: TensorRT是一个高性能的深度学习推理库,可以帮助您在 NVIDIA GPU 上加速深度学习推理。要在C++部署YOLOv5,您需要进行以下步骤: 1.安装 TensorRT:在系统上安装 TensorRT 库和配套的驱动程序。 2.导出权重:在训练模型之后,您需要将权重导出到一个可以被 TensorRT 读取的格式,如 ONNX 或 TensorRT 格式。 3.构建网络:使用 TensorRTC++ API 构建网络,并将权重加载到网络。 4.配置推理:设置网络的运行参数,如批量大小和精度。 5.运行推理:使用 TensorRT 运行网络,并得到结果。 6.解码结果:最后,您需要对结果进行解码,以便更好地理解结果。 希望这能帮到你。 ### 回答2: TensorRT是一个高性能的推理引擎,可以加速神经网络模型的推理,而yolov5 c是一种基于深度学习的物体检测模型,因此使用TensorRT部署yolov5 c可以提高模型的运行速度和效率。 下面是TensorRT部署yolov5 c的步骤: 1. 模型转换:将yolov5的模型文件转换为TensorRT可处理的格式。这可以使用yolov5_offical代码库的convert.py脚本来完成。通过在终端运行该脚本,可以生成一个TensorRT可识别的Engine文件。 2. Engine文件编写:将生成的Engine文件加载到CUDA内存,并在CPU上分配空间。 3. 归一化和预处理:对于输入图片,进行归一化和预处理,使其适合模型的输入。 4. 推理:在CPU上运行推理,得出检测结果并处理。 5. 结果可视化:将推理结果可视化,可以使用OpenCV等工具库来实现。 TensorRT部署yolov5 c可以让模型实现更快的推理速度,同时提供高效能的计算功能,进一步提高了模型在实际应用的作用。使用TensorRT,可以有效缩短模型推理的时间,提高应用的实时性和响应速度。 ### 回答3: TensorRT是一种针对机器学习模型的高性能推理引擎,它可以通过优化、量化、融合等技术将模型的推理速度提升数十倍。在使用TensorRT部署yolov5 c时,可以按照以下步骤进行: 1. 准备环境:首先需要安装yolov5 c和TensorRT,并安装CMake辅助构建工具。同时还需要下载yolov5的配置文件和权重文件。 2. 将模型转换为TensorRT引擎:使用TensorRT提供的API,将训练好的yolov5 c模型转换为TensorRT引擎。这个过程主要包含以下几个步骤: (1)通过TensorRT提供的Builder API创建一个Builder对象,用于定义TensorRT引擎的配置。 (2)将yolov5 c模型加载进来,通过Parser API解析为TensorRT的网络描述对象。 (3)使用Builder对象定义TensorRT引擎,包括设置精度、批大小、推理模式等。 (4)转换为TensorRT引擎,生成对应的.engine文件,以便进行后续推理。 3. 进行推理:使用生成的TensorRT引擎文件,进行推理操作。这个过程主要包含以下几个步骤: (1)创建一个执行上下文,用于对输入数据进行处理和输出结果。 (2)将输入数据加载到TensorRT引擎,通过execute API进行推理。 (3)获取输出结果,将其解析为目标检测的结果,包括物体类别、位置和置信度等。 4. 部署到目标设备:最后根据实际应用需要,将部署好的yolov5 c模型和TensorRT引擎部署到目标设备上,进行实时目标检测。 总之,TensorRT部署yolov5 c可以较大的提高其推理性能,使得其在实际应用场景更加高效、准确和实时。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值