当前位置:   article > 正文

yolov5s利用tensorRT部署并转dll文件_export failure: no module named 'tensorrt

export failure: no module named 'tensorrt

1.首先是生成tensorRT的engine文件:

      Tensorrt的环境配置并生成tensorrt文件参考与以下的B站视频链接。

        【手把手带你实战YOLOv5-部署篇】YOLOv5 TensorRT环境安装与配置_哔哩哔哩_bilibili

        其中遇到了不少的问题,记录如下:

        (1)AssertionError: Invalid CUDA '--device 0' requested, use '--device cpu' or pass valid         CUDA device(s)

          这个问题是说cuda不可用,最终发现就是cuda没有正确安装,要安装cuda的GPU版本,          cudnn,并且torch和torchvision的版本都要与cuda对应,缺一不可。

        (2)tensorrt: export failure  0.0s: No module named 'tensorrt':问题是说tensorrt没有正确安装成功,但是我是根据视频的教程一步一步来的,于是我就想卸载重装,但是在终端中删除这个库的时候出现了错误,说我没装这个库,警告的信息如下。

        WARNING: Ignoring invalid distribution -pencv-python (d:\anaconda3\lib\site-packages)

        WARNING: Skipping tensorrt as it is not installed.

        与是我发现这个是我base环境的位置,于是我换了个思路,在base环境中也用pip install的指令安装了对应版本的tensorrt发现能够正常运行了。

        以上终于能够实现.pt模型转.engine文件。

2.在C++项目中调用.engine文件

        首先要进行tensorRT、OpenCV的环境配置,这个找不到参考的文献了,就是配置一下项目的库目录、包含目录、以及附加依赖项。

        在配置好环境之后,读取文件模型:

  1. // 读取本地模型文件
  2. std::string model_path_engine = model_path;
  3. std::ifstream file_ptr(model_path_engine, std::ios::binary);
  4. if (!file_ptr.good()) {
  5. std::cerr << "文件无法打开,请确定文件是否可用!" << std::endl;
  6. }
  7. size_t size = 0;
  8. file_ptr.seekg(0, file_ptr.end);
  9. size = file_ptr.tellg();
  10. file_ptr.seekg(0, file_ptr.beg);
  11. char* model_stream = new char[size];
  12. file_ptr.read(model_stream, size);
  13. file_ptr.close();

        做一些推理前的准备工作,并分配内存

  1. // 反序列化引擎
  2. nvinfer1::IRuntime* runtime = nvinfer1::createInferRuntime(logger);
  3. // 推理引擎 // 保存模型的模型结构、模型参数以及最优计算kernel配置; // 不能跨平台和跨TensorRT版本移植
  4. nvinfer1::ICudaEngine* engine = runtime->deserializeCudaEngine(model_stream, size);
  5. // 上下文// 储存中间值,实际进行推理的对象// 由engine创建,可创建多个对象,进行多推理任务
  6. nvinfer1::IExecutionContext* context = engine->createExecutionContext();
  7. delete[] model_stream;
  8. // 创建GPU显存缓冲区
  9. void** data_buffer = new void* [num_ionode];
  10. // 创建GPU显存输入缓冲区
  11. int input_node_index = engine->getBindingIndex(input_node_name);
  12. nvinfer1::Dims input_node_dim = engine->getBindingDimensions(input_node_index);
  13. size_t input_data_length = input_node_dim.d[1] * input_node_dim.d[2] * input_node_dim.d[3];
  14. cudaMalloc(&(data_buffer[input_node_index]), input_data_length * sizeof(float));
  15. // 创建GPU显存输出缓冲区
  16. int output_node_index = engine->getBindingIndex(output_node_name);
  17. nvinfer1::Dims output_node_dim = engine->getBindingDimensions(output_node_index);
  18. size_t output_data_length = output_node_dim.d[1] * output_node_dim.d[2];
  19. cudaMalloc(&(data_buffer[output_node_index]), output_data_length * sizeof(float));

        创建cuda流:

  1. // 创建输入cuda流
  2. cudaStream_t stream;
  3. cudaStreamCreate(&stream);
  4. std::vector<float> input_data(input_data_length);
  5. memcpy(input_data.data(), BN_image.ptr<float>(), input_data_length * sizeof(float));

        模型推理:

  1. // 模型推理、记录模型推理时间
  2. auto start_time = std::chrono::high_resolution_clock::now();
  3. context->enqueueV2(data_buffer, stream, nullptr); //这里得到的data_buffer就是模型的输入和输出
  4. auto end_time = std::chrono::high_resolution_clock::now();
  5. std::chrono::duration<double, std::milli> inference_time = end_time - start_time;
  6. std::cout << "-----------------Inference Time: " << inference_time.count() << " ms------------------" << std::endl;
  7. float* result_array = new float[output_data_length];
  8. // 输出数据由GPU转到CPU
  9. cudaMemcpyAsync(result_array, data_buffer[output_node_index], output_data_length * sizeof(float), cudaMemcpyDeviceToHost, stream);

        之后利用模型的输出进行框的解码工作就行了。解码的代码是参考一个大佬的,网址我也找不到了,很抱歉。框的解码包括了输出解码、置信度过滤、非极大值抑制、最后绘制检测框的内容。

  1. cv::Mat net_result(cv::Mat image, float* result, float factor, std::vector<std::string> class_names)
  2. {
  3. cv::Mat det_output = cv::Mat(25200, 85, CV_32F, result);
  4. std::vector<cv::Rect> position_boxes;
  5. std::vector<int> classIds;
  6. std::vector<float> confidences;
  7. std::cout << det_output.rows << std::endl; //共25200个框,每个框有85个信息
  8. for (int i = 0; i < det_output.rows; i++) {
  9. float confidence = det_output.at<float>(i, 4);
  10. if (confidence < 0.2) {
  11. continue;
  12. }
  13. std::cout << "confidence: " << confidence << std::endl;
  14. cv::Mat classes_scores = det_output.row(i).colRange(5, 85);
  15. cv::Point classIdPoint;
  16. double score;
  17. // 获取一组数据中最大值及其位置
  18. minMaxLoc(classes_scores, 0, &score, 0, &classIdPoint);
  19. // 置信度 0~1之间
  20. if (score > 0.25)
  21. {
  22. float cx = det_output.at<float>(i, 0);
  23. float cy = det_output.at<float>(i, 1);
  24. float ow = det_output.at<float>(i, 2);
  25. float oh = det_output.at<float>(i, 3);
  26. int x = static_cast<int>((cx - 0.5 * ow) * factor);
  27. int y = static_cast<int>((cy - 0.5 * oh) * factor);
  28. int width = static_cast<int>(ow * factor);
  29. int height = static_cast<int>(oh * factor);
  30. cv::Rect box;
  31. box.x = x;
  32. box.y = y;
  33. box.width = width;
  34. box.height = height;
  35. position_boxes.push_back(box);
  36. classIds.push_back(classIdPoint.x);
  37. confidences.push_back(score);
  38. }
  39. }
  40. // NMS
  41. std::vector<int> indexes;
  42. cv::dnn::NMSBoxes(position_boxes, confidences, 0.25, 0.45, indexes);
  43. for (size_t i = 0; i < indexes.size(); i++) {
  44. int index = indexes[i];
  45. int idx = classIds[index];
  46. cv::rectangle(image, position_boxes[index], cv::Scalar(0, 0, 255), 2, 8);
  47. cv::rectangle(image, cv::Point(position_boxes[index].tl().x, position_boxes[index].tl().y - 20),
  48. cv::Point(position_boxes[index].br().x, position_boxes[index].tl().y), cv::Scalar(0, 255, 255), -1);
  49. cv::putText(image, class_names[idx], cv::Point(position_boxes[index].tl().x, position_boxes[index].tl().y - 10), cv::FONT_HERSHEY_SIMPLEX, .5, cv::Scalar(0, 0, 0));
  50. }
  51. return image;
  52. }

        写得很烂,主要是自己想记录一下,后续如果找到了参考文献的话会贴在评论区里面,大佬写得比我好多了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/129847?site
推荐阅读
相关标签
  

闽ICP备14008679号