python .onnx 转 .engine亲测ok

 安装tensorRT:

1、下载与电脑中cuda和cudnn版本对应的tensorRT(比如我的是TensorRT-8.2.1.8.Windows10.x86_64.cuda-11.4.cudnn8.2)

2、打开目录里面有python文件夹,找到对应python版本的whl文件(我的是tensorrt-8.2.1.8-cp38-none-win_amd64.whl)  因为我python安装的是3.8版本

3、终端安装:pip install tensorrt-8.2.1.8-cp38-none-win_amd64.whl

4、结束


import tensorrt as trt
def get_DynEngine(onnx_file_path, engine_file_path,patchsize,max_workspace_size,max_batch_size):
    '''
    Attempts to load a serialized engine if available,
    otherwise build a new TensorRT engine as save it
    '''
    TRT_LOGGER = trt.Logger()
    trt.init_libnvinfer_plugins(TRT_LOGGER, "")
    explicit_batch = 1 << (int)(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
    builder = trt.Builder(TRT_LOGGER)
    network = builder.create_network(explicit_batch)
    config = builder.create_builder_config()
    parser = trt.OnnxParser(network, TRT_LOGGER)
    runtime = trt.Runtime(TRT_LOGGER)
    print("common.EXPLICIT_BATCH:", explicit_batch)
    # 最大内存占用
    # 显存溢出需要重新设置
    config.max_workspace_size = max_workspace_size # 256MB
    config.set_flag(trt.BuilderFlag.FP16)
    print("max_workspace_size:", config.max_workspace_size)
    builder.max_batch_size = max_batch_size  # 推理的时候要保证batch_size<=max_batch_size
    
    if not os.path.exists(onnx_file_path):
        print(f'onnx file {onnx_file_path} not found,please run torch_2_onnx.py first to generate it')
        exit(0)
    print(f'Loading ONNX file from path {onnx_file_path}...')
    with open(onnx_file_path, 'rb') as model:
        print('Beginning ONNX file parsing')
        if not parser.parse(model.read()):
            print('ERROR:Failed to parse the ONNX file')
            for error in range(parser.num_errors):
                print(parser.get_error(error))
            return None
    inputs = [network.get_input(i) for i in range(network.num_inputs)]
    print("input", inputs)

    outputs = [network.get_output(i) for i in range(network.num_outputs)]
    print("out:", outputs)
    print("Network Description")
    for input in inputs:
        # 获取当前转化之前的 输入的 batch_size
        batch_size = input.shape[0]
        print("Input '{}' with shape {} and dtype {} . ".format(input.name, input.shape, input.dtype))
    for output in outputs:
        print("Output '{}' with shape {} and dtype {} . ".format(output.name, output.shape, output.dtype))
    # Dynamic input setting 动态输入在builder的profile设置
    # 为每个动态输入绑定一个profile
    profile = builder.create_optimization_profile()
    print("network.get_input(0).name:", network.get_input(0).name)
    profile.set_shape(network.get_input(0).name, (1,1, *patchsize), (1, 1,*patchsize),
                      (max_batch_size, 1, *patchsize))  # 最小的尺寸,常用的尺寸,最大的尺寸,推理时候输入需要在这个范围内
    config.add_optimization_profile(profile)
    print('Completed parsing the ONNX file')
    print(f'Building an engine from file {onnx_file_path}; this may take a while...')
    
    engine = builder.build_serialized_network(network, config)
    print('Completed creating Engine')
    with open(engine_file_path, 'wb') as f:
        f.write(engine)
    return engine



if __name__ == "__main__":

     get_DynEngine("1.onnx", "2.engine",[96,160,160],5*(1<<30),2)
                    
    

    

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
你可以使用TensorRT来将YOLOv7的ONNX模型换为TensorRT引擎。下面是一些步骤供你参考: 1. 首先,你需要安装TensorRT并设置好环境。你可以从NVIDIA的官方网站上下载TensorRT并按照文档进行安装。 2. 然后,你需要使用ONNX Parser来解析YOLOv7的ONNX模型并创建TensorRT网络。你可以使用TensorRT Python API中的`trt.Builder`和`trt.OnnxParser`类来完成这个步骤。 ```python import tensorrt as trt TRT_LOGGER = trt.Logger(trt.Logger.WARNING) builder = trt.Builder(TRT_LOGGER) network = builder.create_network() parser = trt.OnnxParser(network, TRT_LOGGER) # 解析ONNX模型 with open('yolov7.onnx', 'rb') as model: if not parser.parse(model.read()): for error in range(parser.num_errors): print(parser.get_error(error)) ``` 3. 接下来,你需要设置TensorRT网络的输入和输出。YOLOv7模型有三个输入(图像数据、图像尺寸、批处理大小)和两个输出(检测框坐标和类别概率)。你需要为这些输入和输出创建TensorRT的`trt.ITensor`对象。 ```python input_tensor = network.get_input(0) input_shape = input_tensor.shape input_tensor.name = 'input' output_tensor1 = network.get_output(0) output_shape1 = output_tensor1.shape output_tensor1.name = 'output1' output_tensor2 = network.get_output(1) output_shape2 = output_tensor2.shape output_tensor2.name = 'output2' ``` 4. 然后,你可以设置TensorRT的优化选项,例如设置最大批处理大小、最大工作空间大小等。这些选项可以通过`trt.Builder`类的方法进行设置。 ```python builder.max_batch_size = 1 builder.max_workspace_size = 1 << 30 # 1GB ``` 5. 最后,你需要使用`trt.Builder`类的`build_cuda_engine`方法来编译TensorRT引擎,并将其保存到磁盘上以便后续使用。 ```python engine = builder.build_cuda_engine(network) trt.save_engine(engine, 'yolov7.engine') ``` 完成以上步骤后,你将得到一个TensorRT引擎文件(yolov7.engine),你可以将其用于加速YOLOv7模型的推理过程。请注意,上述代码仅为示例,你可能需要根据你的具体模型和需求进行调整。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值