当前位置:   article > 正文

【TensorRT】TensorRT+YOLOv5第六版C++部署全解_unexpected internal error: [virtualmemorybuffer.cp

unexpected internal error: [virtualmemorybuffer.cpp::~stdvirtualmemorybuffer

         注意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);

运行结果如下:

相关方法实现代码如下:

  1. void YOLOv5TRTDetector::onnx2engine(std::string onnxfilePath, std::string enginefilePath, int type) {
  2.     IBuilder* builder = createInferBuilder(gLogger);
  3.     const auto explicitBatch = 1<< static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);
  4.     nvinfer1::INetworkDefinition* network = builder->createNetworkV2(explicitBatch);
  5.     auto parser = nvonnxparser::createParser(*network, gLogger);
  6.     parser->parseFromFile(onnxfilePath.c_str(), 2);
  7.     for (int i = 0; i < parser->getNbErrors(); ++i)
  8.     {
  9.           std::cout << "load error: "<< parser->getError(i)->desc() << std::endl;
  10.     }
  11.     printf("tensorRT load mask onnx model successfully!!!...\n");
  12.     // 创建推理引擎
  13.     IBuilderConfig* config = builder->createBuilderConfig();
  14.     config->setMaxWorkspaceSize(16*(1 << 20));
  15.     if (type == 1) {
  16.           config->setFlag(nvinfer1::BuilderFlag::kFP16);
  17.     }
  18.     if (type == 2) {
  19.           config->setFlag(nvinfer1::BuilderFlag::kINT8);
  20.     }
  21.     auto myengine = builder->buildEngineWithConfig(*network, *config);
  22.     std::cout << "try to save engine file now~~~" << std::endl;
  23.     std::ofstream p(enginefilePath, std::ios::binary);
  24.     if (!p) {
  25.           std::cerr << "could not open plan output file" << std::endl;
  26.           return;
  27.     }
  28.     IHostMemory* modelStream = myengine->serialize();
  29.     p.write(reinterpret_cast<const char*>(modelStream->data()), modelStream->size());
  30.     modelStream->destroy();
  31.     myengine->destroy();
  32.     network->destroy();
  33.     parser->destroy();
  34.     std::cout << "convert onnx model to TensorRT engine model successfully!" << std::endl;
  35. }

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

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

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

  1. context->destroy();
  2. engine->destroy();
  3. network->destroy();
  4. parser->destroy();

这样就好啦

YOLOv5 engine模型加载与推理

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

  1. std::string label_map = "D:/python/yolov5-6.1/classes.txt";
  2. int main(int argc, char** argv) {
  3.     std::vectorclassNames;
  4.     std::ifstream fp(label_map);
  5.     std::string name;
  6.     while (!fp.eof()) {
  7.           getline(fp, name);
  8.           if (name.length()) {
  9.                   classNames.push_back(name);
  10.           }
  11.     }
  12.     fp.close();
  13.     auto detector = std::make_shared();
  14.     detector->initConfig("D:/python/yolov5-6.1/yolov5s.engine"0.40.25);
  15.     std::vectorresults;
  16.     cv::VideoCapture capture("D:/images/video/sample.mp4");
  17.     cv::Mat frame;
  18.     while (true) {
  19.           bool ret = capture.read(frame);
  20.           detector->detect(frame, results);
  21.           for (DetectResult dr : results) {
  22.                   cv::Rect box = dr.box;
  23.                   cv::putText(frame, classNames[dr.classId], cv::Point(box.tl().x, box.tl().y - 10), cv::FONT_HERSHEY_SIMPLEX, .5, cv::Scalar(000));
  24.           }
  25.           cv::imshow("YOLOv5-6.1 + TensorRT8.4 - by gloomyfish", frame);
  26.           char c = cv::waitKey(1);
  27.           if (c == 27) { // ESC 退出
  28.                   break;
  29.           }
  30.           // reset for next frame
  31.           results.clear();
  32.     }
  33.     cv::waitKey(0);
  34.     cv::destroyAllWindows();
  35.     return 0;
  36. }

运行结果:

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

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

总结

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

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号