tensorrt 推理Unet网络(python && C++)

对该博客的推理修改https://blog.youkuaiyun.com/hello_dear_you/article/details/109744627

我的输入是(1,3,720,1280),输出是(1,2,720,1280),源码GitHub - milesial/Pytorch-UNet: PyTorch implementation of the U-Net for image semantic segmentation with high quality images分类数量改为2,训练部分参考源码 ,源码中可能由于pytorch版本不一样需要改一下。可以百度到

重要推理部分如下

import tensorrt as trt
import numpy as np
import pycuda.driver as cuda
import pycuda.autoinit
import cv2
from PIL import Image


def preprocess(mask_values, pil_img, scale, is_mask):
    w, h = pil_img.size
    newW, newH = int(scale * w), int(scale * h)
    assert newW > 0 and newH > 0, 'Scale is too small, resized images would have no pixel'
    pil_img = pil_img.resize((newW, newH), resample=Image.NEAREST if is_mask else Image.BICUBIC)
    img = np.asarray(pil_img)

    if is_mask:
        mask = np.zeros((newH, newW), dtype=np.int64)
        for i, v in enumerate(mask_values):
            if img.ndim == 2:
                mask[img == v] = i
            else:
                mask[(img == v).all(-1)] = i

        return mask

    else:
        if img.ndim == 2:
            img = img[np.newaxis, ...]
        else:
            img = img.transpose((2, 0, 1))

        i
### 使用 TensorRT 部署 UNet 模型的最佳实践 为了高效地使用 TensorRT 部署 UNet 模型,以下是详细的流程和最佳实践: #### 1. 准备 ONNX 模型 在部署之前,通常会先将训练好的 PyTorch 或 TensorFlow 模型转换为 ONNX 格式。ONNX 是一种开放的标准文件格式,能够被多种框架支持,包括 TensorRT。 对于 UNet 模型,在 `PyFiles` 文件夹中有一个名为 `unet.py` 的脚本用于定义网络结构[^3]。可以通过运行 `test_infer.py` 脚本来完成推理并导出 ONNX 模型。此过程的关键在于确保模型的输入输出形状与实际应用一致。 ```python import torch from unet import UNet # 加载预训练权重 model = UNet(n_channels=3, n_classes=1) state_dict = torch.load('weights.pth') model.load_state_dict(state_dict) # 导出到 ONNX dummy_input = torch.randn(1, 3, 256, 256) # 输入张量大小需匹配模型需求 torch.onnx.export(model, dummy_input, 'unet_model.onnx', opset_version=11) ``` 上述代码展示了如何通过 PyTorch 将 UNet 模型保存为 ONNX 格式。 --- #### 2. 将 ONNX 模型转换为 TensorRT Engine TensorRT 提供了一个工具链来优化深度学习模型的性能。具体来说,需要将 ONNX 模型转化为 TensorRT 可执行的 `.engine` 文件。 以下是一个 C++ 实现的例子,展示如何加载 ONNX 并将其转换成 TensorRT 引擎: ```cpp #include "NvInfer.h" #include <fstream> #include <iostream> nvinfer1::ICudaEngine* createEngine(const std::string& onnxFilePath, int maxBatchSize) { // 创建构建器实例 nvinfer1::IBuilder* builder = nvinfer1::createInferBuilder(gLogger); // 获取默认 CUDA 设备上的 IBuilderConfig 对象 nvinfer1::IBuilderConfig* config = builder->createBuilderConfig(); // 添加解析器插件注册表 nvonnxparser::IParser* parser = nvonnxparser::createParser(*builder->createNetworkV2(0), gLogger); // 解析 ONNX 文件 if (!parser->parseFromFile(onnxFilePath.c_str(), static_cast<int>(gLogger.getSeverity()))) { throw std::runtime_error("Failed to parse the ONNX file"); } // 构建引擎 nvinfer1::ICudaEngine* engine = builder->buildEngineWithConfig(*network, *config); if (engine == nullptr) { throw std::runtime_error("Failed to build the engine"); } std::cout << "convert onnx model to TensorRT engine model successfully!" << std::endl; return engine; } ``` 这段代码实现了从 ONNX 到 TensorRT 引擎的转化,并打印确认消息[^4]。 --- #### 3. 推理阶段设置 一旦生成了 TensorRT 引擎,就可以进入推理阶段。这一步骤涉及以下几个部分: - **读取本地模型**:加载已经生成的 `.engine` 文件。 - **创建推理上下文**:初始化 GPU 上下文以便后续调用。 - **分配内存缓冲区**:为输入和输出数据分配显存空间。 - **配置输入数据**:填充输入张量的数据。 - **执行推理**:启动前向传播计算。 - **后处理结果**:提取预测结果并对齐目标用途。 下面是一段 Python 示例代码,演示如何利用 TensorRT 进行推理操作: ```python import tensorrt as trt import numpy as np TRT_LOGGER = trt.Logger(trt.Logger.WARNING) def load_engine(engine_file_path): with open(engine_file_path, "rb") as f, trt.Runtime(TRT_LOGGER) as runtime: return runtime.deserialize_cuda_engine(f.read()) def infer_with_tensorrt(engine, input_data): context = engine.create_execution_context() inputs, outputs, bindings, stream = allocate_buffers(engine) # 填充输入数据 np.copyto(inputs[0].host, input_data.ravel()) # 执行推理 context.execute_async_v2(bindings=bindings, stream_handle=stream.cuda_stream) # 复制输出数据回主机端 [output_buffer] = [np.ascontiguousarray(output.host) for output in outputs] return output_buffer.reshape((1, 1, 256, 256)) # 输出尺寸调整至原始图像分辨率 ``` 以上代码片段说明了如何加载 TensorRT 引擎并实现基本的推理逻辑[^2]。 --- #### 总结 推荐始终采用最新版本的 TensorRT 发布版以获得更好的兼容性和性能改进[^1]。整个工作流涵盖了从 ONNX 模型准备、转换为 TensorRT 引擎再到最终推理的过程。这些步骤共同构成了高效的部署方案。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值