ubuntu20+cuda-12.1+TensorRT-8.6.1.6+opencv-4.8.1

部署运行你感兴趣的模型镜像

要在ubuntu20的镜像安装opencv

原有的环境中有cuda12.1了

1. 安装TensorRT-8.6.1.6

安装依赖

cuda-12.1

cudnn-9.7.1.26(为了cuda的opencv,换了8+版本)

TensorRT-8.6.1.6安装无压力,成功

2. 安装opencv-4.8.1

官方教程的默认操作命令不是带cuda的编译

使用

cd opencv/build
rm -rf *  # 清空build目录
cmake -D WITH_CUDA=ON \
      -D WITH_CUDNN=ON \
      -D OPENCV_DNN_CUDA=ON \
      -D CUDNN_INCLUDE_DIR=/usr/local/cuda/include \
      -D CUDNN_LIBRARY=/usr/local/cuda/lib64/libcudnn.so \
      -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
      ..
make -j$(nproc)
sudo make install

依赖:

1. opencv_contrib-4.8.1

2. cudnn-8.9.7.29(使用9+版本会报编译错误)

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think> 我们正在处理一个关于使用C++TensorRT 8.6.1.6实现YOLO模型推理的请求。由于直接提供完整的源码可能过于复杂且长度较长,我们将提供一个简化的框架,并说明关键步骤。实际实现需要根据具体的YOLO版本(如YOLOv5, YOLOv8等)进行调整。 关键步骤: 1. 模型转换:将训练好的YOLO模型(通常是PyTorch格式)转换为ONNX格式,再通过TensorRT的onnx-parser转换为TensorRT引擎。 2. 引擎序列化与反序列化:生成的引擎可以序列化保存到文件,后续使用时直接反序列化加载,避免每次重新构建。 3. 推理流程:包括输入数据预处理、推理执行、输出后处理(解码YOLO输出、非极大值抑制NMS等)。 下面是一个简化的C++代码框架,使用TensorRT 8.6.1.6 API: ```cpp #include <iostream> #include <fstream> #include <vector> #include <cuda_runtime_api.h> #include "NvInfer.h" #include "NvOnnxParser.h" using namespace nvinfer1; // 日志记录器 class Logger : public ILogger { void log(Severity severity, const char* msg) noexcept override { // 只记录警告以上的信息 if (severity <= Severity::kWARNING) std::cout << msg << std::endl; } } gLogger; // 读取文件到缓冲区 std::vector<char> readBuffer(const std::string& filePath) { std::ifstream file(filePath, std::ios::binary | std::ios::ate); size_t size = file.tellg(); file.seekg(0, std::ios::beg); std::vector<char> buffer(size); file.read(buffer.data(), size); return buffer; } // 创建引擎:从ONNX文件构建TensorRT引擎,并保存为序列化文件 bool createEngine(const std::string& onnxPath, const std::string& enginePath, int batchSize) { IBuilder* builder = createInferBuilder(gLogger); const auto explicitBatch = 1U << static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH); INetworkDefinition* network = builder->createNetworkV2(explicitBatch); nvonnxparser::IParser* parser = nvonnxparser::createParser(*network, gLogger); if (!parser->parseFromFile(onnxPath.c_str(), static_cast<int>(ILogger::Severity::kWARNING))) { std::cerr << "Failed to parse ONNX file." << std::endl; return false; } // 配置构建器 IBuilderConfig* config = builder->createBuilderConfig(); config->setMaxWorkspaceSize(1 << 30); // 1GB // 设置精度,如FP16 if (builder->platformHasFastFp16()) { config->setFlag(BuilderFlag::kFP16); } // 设置批次大小 builder->setMaxBatchSize(batchSize); // 构建引擎 IHostMemory* serializedEngine = builder->buildSerializedNetwork(*network, *config); // 保存引擎到文件 std::ofstream engineFile(enginePath, std::ios::binary); engineFile.write(static_cast<const char*>(serializedEngine->data()), serializedEngine->size()); // 释放资源 serializedEngine->destroy(); parser->destroy(); network->destroy(); config->destroy(); builder->destroy(); return true; } // 反序列化引擎 ICudaEngine* loadEngine(const std::string& enginePath) { std::vector<char> engineData = readBuffer(enginePath); IRuntime* runtime = createInferRuntime(gLogger); return runtime->deserializeCudaEngine(engineData.data(), engineData.size()); } // 执行推理 void inference(ICudaEngine* engine, void** buffers, const int batchSize) { IExecutionContext* context = engine->createExecutionContext(); context->executeV2(buffers); context->destroy(); } int main() { // 步骤1:创建引擎(如果还没有引擎文件) // createEngine("yolov5s.onnx", "yolov5s.engine", 1); // 步骤2:加载引擎 ICudaEngine* engine = loadEngine("yolov5s.engine"); // 步骤3:准备输入输出缓冲区(根据模型输入输出设置) // 获取输入输出索引 int inputIndex = engine->getBindingIndex("images"); // 输入节点名称,根据模型而定 int outputIndex = engine->getBindingIndex("output"); // 输出节点名称,根据模型而定 // 获取输入输出尺寸 Dims inputDims = engine->getBindingDimensions(inputIndex); Dims outputDims = engine->getBindingDimensions(outputIndex); // 分配GPU内存 void* buffers[2]; cudaMalloc(&buffers[inputIndex], batchSize * inputSize); // inputSize根据输入维度计算 cudaMalloc(&buffers[outputIndex], batchSize * outputSize); // outputSize根据输出维度计算 // 步骤4:预处理输入数据(将图像缩放到模型输入尺寸,归一化等),并拷贝到GPU // ... 预处理代码 ... // 步骤5:执行推理 inference(engine, buffers, 1); // 步骤6:将推理结果拷贝回CPU,并进行后处理(NMS等) // ... 后处理代码 ... // 步骤7:释放资源 cudaFree(buffers[inputIndex]); cudaFree(buffers[outputIndex]); engine->destroy(); return 0; } ``` 注意: - 上述代码仅为框架,实际应用中需要补充预处理、后处理以及错误处理。 - 输入输出节点的名称需要根据你的模型确定,可以通过Netron查看ONNX模型的结构。 - 后处理部分需要根据YOLO的输出格式编写解码和NMS代码。例如,YOLOv5的输出为一个[1, num_boxes, 85]的张量,其中85包含4个坐标值、1个置信度分数和80个类别分数(COCO数据集)。 - 预处理通常包括:调整图像大小、归一化(如除以255)、转换通道顺序(BGR转RGB)等。 由于完整的实现代码很长,建议参考TensorRT官方示例(如`sampleOnnxMNIST`)和YOLO官方仓库中的导出和推理代码(如YOLOv5的`export.py`和`detect.py`)。 相关问题: 1. 如何将PyTorch训练的YOLO模型转换为TensorRT引擎? 2. YOLO模型的后处理(包括解码和NMS)在C++中如何实现? 3. TensorRT推理时如何优化性能(如使用FP16/INT8、调整工作空间大小)? 4. 如何动态调整输入图像的尺寸而不重新构建引擎? 5. 如何处理多批次推理以及异步流处理? </think> 以下是一个使用C++TensorRT 8.6.1.6实现YOLO推理的源码框架及关键步骤说明。实际实现需结合具体YOLO版本(如YOLOv5/v8)进行调整: ### 核心步骤 1. **模型转换** - 将PyTorch/YOLO模型 → ONNX → TensorRT引擎 - 使用TensorRT的`trtexec`工具: ```bash trtexec --onnx=yolov5s.onnx --saveEngine=yolov5s.engine --fp16 ``` 2. **TensorRT推理流程** ```cpp #include <NvInfer.h> #include <NvOnnxParser.h> #include <cuda_runtime_api.h> // 1. 创建推理运行时 nvinfer1::IRuntime* runtime = nvinfer1::createInferRuntime(logger); nvinfer1::ICudaEngine* engine = runtime->deserializeCudaEngine(engineData.data(), engineSize); // 2. 创建执行上下文 nvinfer1::IExecutionContext* context = engine->createExecutionContext(); // 3. 准备输入/输出缓冲区 void* buffers[2]; // [input, output] cudaMalloc(&buffers[inputIndex], inputSize); cudaMalloc(&buffers[outputIndex], outputSize); // 4. 数据预处理(需自行实现) preprocessImage(imageData, gpuInput, width, height); // 缩放/归一化/BGR2RGB // 5. 执行推理 context->executeV2(buffers); // 6. 后处理(含NMS) std::vector<Detection> detections; decodeOutput(gpuOutput, detections, confThreshold, nmsThreshold); ``` 3. **预处理/后处理关键代码** ```cpp // 预处理示例 (OpenCV) cv::Mat preprocess(cv::Mat& img) { cv::Mat resized; cv::resize(img, resized, cv::Size(640, 640)); // YOLOv5输入尺寸 resized.convertTo(resized, CV_32F, 1.0 / 255.0); // 归一化 return resized; } // 后处理解析输出 void decodeOutput(float* output, std::vector<Detection>& detections) { for (int i = 0; i < numBoxes; ++i) { float conf = output[i * 85 + 4]; // 85=4坐标+1置信度+80类别 if (conf > confThreshold) { // 解析坐标和类别... detections.emplace_back(x1, y1, x2, y2, classId, conf); } } // 执行NMS... } ``` 4. **CMake配置示例** ```cmake cmake_minimum_required(VERSION 3.10) project(YOLO_TensorRT) find_package(OpenCV REQUIRED) set(TensorRT_ROOT "/path/to/TensorRT-8.6.1.6") include_directories( ${OpenCV_INCLUDE_DIRS} ${TensorRT_ROOT}/include ) link_directories( ${TensorRT_ROOT}/lib ) add_executable(infer main.cpp) target_link_libraries(infer nvinfer nvonnxparser cudart ${OpenCV_LIBS} ) ``` ### 完整实现要点 1. **模型适配** - YOLOv5需使用[官方导出脚本](https://github.com/ultralytics/yolov5/blob/master/export.py)导出ONNX - 输出层修改为单输出:`--simplify` 选项 2. **性能优化** ```cpp config->setMemoryPoolLimit(MemoryPoolType::kWORKSPACE, 1 << 30); // 1GB workspace config->setFlag(BuilderFlag::kFP16); // FP16加速 ``` 3. **资源管理** - 使用`unique_ptr`管理TensorRT对象生命周期 - CUDA流异步处理 > **重要提示**:完整实现需参考: > 1. TensorRT官方示例:[GitHub - NVIDIA/TensorRT](https://github.com/NVIDIA/TensorRT) > 2. YOLOv5 TensorRT实现:[yolov5/tensorrt](https://github.com/ultralytics/yolov5/tree/master/tensorrt) > 3. ONNX解析器文档:[NvOnnxParser.h](https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#onnx) [^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值