使用Tensorrt的python api 部署支持动态batch的yolov5s

本文档详细介绍了如何在Ubuntu 18.04上使用TensorRT 8.2和PyTorch 1.10.0构建YOLOv5s的ONNX模型,并通过动态batch支持生成TensorRT引擎。首先,修改YOLOv5源码简化模型输出,然后导出ONNX模型。接着,使用trtexec的替代方法,创建包含优化配置文件的TensorRT引擎,处理动态维度。最后,演示了如何从引擎文件反序列化并进行推理,包括数据预处理、推理和结果处理。

系统环境:

ubuntu 1804

cuda11.3

tensorrt 8.2.06

显卡2080

pytorch 1.10.0

onnx 1.10.2

onnx-simplifier 0.3.6

步骤1:导出onnx 模型(参考https://github.com/shouxieai/tensorRT_Pro)

1.1 下载yolov5项目并修改相关代码,目的是减少导出onnx的复杂度,只保留一个输出便于后处理

# 下载并进入yolov5项目
git clone git@github.com:ultralytics/yolov5.git
cd yolov5/models
gedit yolo.py

#更改yolov5/models/yolo.py Detect.forward函数 

# yolov5/models/yolo.py 
# bs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)
# x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
# 修改为:
bs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)
bs = -1
ny = int(ny)
nx = int(nx)
x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()

# yolov5/models/yolo.py
#  z.append(y.view(bs, -1, self.no))
# 修改为:
z.append(y.view(bs, self.na * ny * nx, self.no))

############# 对于 yolov5-6.0 #####################
# yolov5/models/yolo.py Detect.forward函数
# if self.grid[i].shape[2:4] != x[i].shape[2:4] or self.onnx_dynamic:
#    self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)
# 修改为:
if self.grid[i].shape[2:4] != x[i].shape[2:4] or self.onnx_dynamic:
    self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)

    # disconnect for pytorch trace
    anchor_grid = (self.anchors[i].clone() * self.stride[i]).view(1, -1, 1, 1, 2)

# y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
# 修改为:
y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * anchor_grid  # wh


# wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
# 修改为:
wh = (y[..., 2:4] * 2) ** 2 * anchor_grid  # wh

#return x if self.training else (torch.cat(z, 1), x)
#修改为
return torch.cat(z, 1)

1.2 模型导出

修改yolov5/export.py,目的是只保留onnx模型动态batch

############# 对于 yolov5-6.0 #####################

# yolov5/export.py export_onnx函数
# torch.onnx.export(model, im, f, verbose=False, opset_version=opset,
#                   training=torch.onn
### 使用 TensorRT 部署 YOLOv5 进行实例分割 #### 准备环境 为了确保部署过程顺利,在开始之前需确认已安装适合硬件配置的 CUDA、cuDNN 和 TensorRT 版本[^4]。这一步骤至关重要,因为兼容性的选择直接影响到后续工作的效率与稳定性。 #### 下载预训练模型 从 GitHub 获取指定版本的 YOLOv5 源码以及预先训练好的实例分割权重文件 v5s-seg.pt 是必要的前置条件之一[^3]。此操作可通过访问 Ultralytics 官方发布的资源链接来完成。 #### 转换 ONNX 格式 为了让 YOLOv5 的 PyTorch 模型能够在 TensorRT 上高效执行,通常会先将其转换成通用中间表示形式——ONNX (Open Neural Network Exchange)[^4]。这一过程中涉及的主要命令如下: ```bash python export.py --weights yolov5s-seg.pt --include onnx ``` 上述脚本将会读取给定路径下的 `.pt` 文件并导出对应的 `.onnx` 文件用于下一步处理。 #### 构建 TensorRT 引擎 有了 ONNX 文件之后,便可以利用 TensorRT 提供的相关工具进一步编译生成优化后的推理引擎。具体做法是在 Python 中调用 `tensorrt` 库中的 API 来加载 ONNX 并创建序列化后的计划文件(plan file),即所谓的 TRT engine。下面是一个简单的例子说明如何做到这一点: ```python import tensorrt as trt from polygraphy.backend.trt import CreateConfig, EngineFromNetwork, TrtRunner from polygraphy.comparator import DataLoader from polygraphy.logger import G_LOGGER def build_engine(onnx_file_path): with open(onnx_file_path, 'rb') as model: dnn_def = model.read() builder = trt.Builder(G_LOGGER) network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) parser = trt.OnnxParser(network) if not parser.parse(dnn_def): for error in range(parser.num_errors): print(parser.get_error(error)) config = builder.create_builder_config() config.max_workspace_size = 1 << 30 profile = builder.create_optimization_profile() input_shape = [1, 3, 640, 640] profile.set_shape('input', min=input_shape, opt=input_shape, max=input_shape) config.add_optimization_profile(profile) serialized_engine = builder.build_serialized_network(network, config) return bytes(serialized_engine) engine_data = build_engine('./models/yolov5s-seg.onnx') with open("./models/yolov5s-seg.engine", "wb") as f: f.write(engine_data) ``` 这段代码展示了怎样通过 Polygraphy 工具集简化构建流程,并最终保存得到的 TensorRT 引擎至本地磁盘以便日后重复使用。 #### 执行推理任务 一旦拥有了经过充分优化过的 TensorRT 引擎,接下来就只需要编写少量额外的应用层逻辑即可启动实际的数据预测环节。这里的关键在于理解输入张量布局及输出解析方式的不同之处,特别是针对实例分割这类复杂视觉识别问题时更应如此[^2]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值