Tensorrt python版本的推理实例


model_path = "./model.engine"
import tensorrt as trt
verbose = True 
IN_NAME = 'input' #输入节点名字 
OUT_NAME = 'output' #输出节点名字
IN_H = 512
IN_W = 512
BATCH_SIZE = 1 

EXPLICIT_BATCH = 1 << (int)( 
    trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH) 
import tensorrt as trt #必须安装
import pycuda.driver as cuda #必须安装
import pycuda.autoinit
import numpy as np
import time
import cv2
import os
from tensorflow import keras
import threading
# 加载TRT引擎

class OxfordPets1(keras.utils.Sequence):

    # 在__init__方法中指定batch_size,img_size,input_img_paths,target_img_paths
    def __init__(self, batch_size, img_size, input_img_paths):
        self.batch_size = batch_size  # 批量大小
        self.img_size = img_size  # 图像大小
        self.input_img_paths = input_img_paths  # 输入图像路径
        #self.target_img_paths = target_img_paths  # 标注图像路径
        #self.on_epoch_end()

    def __len__(self):
        # 计算迭代次数
        return len(self.input_img_paths) // self.batch_size

    def __getitem__(self, idx):
        """
        获取每一个batch数据
        """
        i = idx * self.batch_size
        # 获取输入的图像数据
        batch_input_img_paths = self.input_img_paths[i: i + self.batch_size]
        # 获取标签数据
        #batch_target_img_paths = self.target_img_paths[i: i + self.batch_size]
        # 构建特征值数据:获取图像数据中每个像素的数据存储在x中
        x = np.zeros((self.batch_size,) + self.img_size + (3,), dtype="float32")
        #x = np.zeros((batch_size,) + self.img_size + (1,), dtype="float32")
        for j, path in enumerate(batch_input_img_paths):
            #img = load_img(path, target_size=self.img_size)
            img = np.load(path)['arr_0']
            img = np.array(img)
            x[j] = img
        return x
    def on_epoch_end(self):
        self.indexes = np.arange(len(self.input_img_paths))  

with open(model_path, 'rb') as f:
    engine_data = f.read()
#print(engine_data)
TRT_LOGGER = trt.Logger(trt.Logger.WARNING)
trt.init_libnvinfer_plugins(TRT_LOGGER, '')
runtime = trt.Runtime(TRT_LOGGER)

engine = runtime.deserialize_cuda_engine(engine_data)

# 创建执行上下文
context = engine.create_execution_context()

# 分配内存
# 创建输入和输出缓冲区
# 分配输入和输出内存
input_shape = (1,3,512,512)  # 输入数据的形状 如果是三通道(1,3,512,512)
output_shape = (1,3,512,512)  # 输出数据的形状 如果是三通道(1,3,512,512)
input_dir = "./Data/Inference_data/SZJ1-19_20231024/11101"
input_img_paths = sorted(
        [
            os.path.join(input_dir, fname)
            for fname in os.listdir(input_dir)
            if fname.endswith(".npz")
        ]
    )
val_input_img_paths = input_img_paths[:]
data = OxfordPets1(1, (512,512), val_input_img_paths)
data=np.array(data,dtype = 'float32')
print(data.shape)
data = data.reshape(1200,3,512,512)
out_position = './result3/11101'
if not os.path.exists(out_position):
    os.makedirs(out_position)
T1 = time.time()
for index in range(1200):
    input_data = data[index].reshape((1,3,512,512,)).astype(np.float32) 

    output_data = np.empty(output_shape, dtype=np.float32)
    # 在GPU上分配内存
    d_input = cuda.mem_alloc(input_data.nbytes)
    d_output = cuda.mem_alloc(output_data.nbytes)
    # 创建CUDA流
    stream = cuda.Stream()

    # 将输入数据从主机内存复制到GPU内存
    cuda.memcpy_htod_async(d_input, input_data, stream)

    # 执行TensorRT推理
    #T1 = time.time()
    bindings = [int(d_input), int(d_output)]
    stream_handle = stream.handle
    context.execute_async_v2(bindings=bindings, stream_handle=stream_handle)

    # 将输出数据从GPU内存复制到主机内存
    cuda.memcpy_dtoh_async(output_data, d_output, stream)

    # 等待推理完成
    stream.synchronize()

    #cv2.imwrite(out_position+'/11101_'+str(index+1)+'_bac.tiff',output_data[0,:,:,0])
    cv2.imwrite(out_position+'/11101_'+str(index+1)+'_ine.tiff',output_data[0,:,:,1])
    #cv2.imwrite(out_position+'/11101_'+str(index+1)+'_cen.tiff',output_data[0,:,:,2])
T2 = time.time()
print('程序运行时间:%s秒' % ((T2 - T1)))
# 打印输出结果
print((output_data.shape))

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorRT 支持 CPU 推理,但是需要使用 TensorRT Python API 和 TensorRT 介质库来实现。需要注意的是,CPU 推理的性能一般不如 GPU 推理,因为 CPU 的计算能力有限。不过,如果你是在低功耗设备上进行推理,或者没有可用的 GPU,那么 CPU 推理是一个很好的选择。 以下是使用 TensorRT Python API 进行 CPU 推理的基本步骤: 1. 准备模型:导出已经训练好的模型并转换成 TensorRT 支持的格式(如 ONNX 或 TensorFlow)。 2. 创建 TensorRT 引擎:通过 TensorRT Python API 创建一个 TensorRT 引擎对象,这个对象会对模型进行优化和编译,以便在 CPU 上高效地执行推理。 3. 分配内存:创建 CPU 内存作为输入和输出数据的容器。 4. 执行推理:通过 Python API 将输入数据传递给 TensorRT 引擎,并获取输出数据。 下面是一个简单的代码示例: ```python import tensorrt as trt import numpy as np # 创建 TensorRT 引擎 engine_file_path = "/path/to/trt/engine/file" trt_logger = trt.Logger(trt.Logger.WARNING) with open(engine_file_path, "rb") as f, trt.Runtime(trt_logger) as runtime: engine = runtime.deserialize_cuda_engine(f.read()) # 分配内存 input_shape = (1, 3, 224, 224) output_shape = (1, 1000) input_data = np.random.rand(*input_shape).astype(np.float32) output_data = np.empty(output_shape, dtype=np.float32) bindings = [None, input_data, output_data] inputs, outputs, bindings = [], [], [] for binding in engine: if engine.binding_is_input(binding): inputs.append(binding) bindings.append(input_data) else: outputs.append(binding) bindings.append(output_data) # 执行推理 with engine.create_execution_context() as context: context.execute_v2(bindings=bindings) # 输出结果 print(output_data) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值