立体匹配模型RAFT-Stereo的onnx导出与trt使用指南
这里写目录标题
- 如何将 RAFT-Stereo 模型导出为 ONNX 格式
- 转化为静态的模型:
- 转化为动态的模型:
- reference
通过将 RAFT-Stereo 模型转换为 ONNX 格式,我们能够在不同的推理引擎和硬件平台上高效地部署和运行该模型,而无需依赖原始的 PyTorch 环境。这为在实际应用中使用 RAFT-Stereo 算法提供了极大的灵活性,尤其是在需要考虑性能优化和跨平台兼容性的场景中。
接下来,我们将详细讲解以下几个方面:
- 如何将 RAFT-Stereo 模型导出为 ONNX 格式
- 如何在 Python 环境中使用导出的 ONNX 模型进行推理
- 如何导出trt模型
如何将 RAFT-Stereo 模型导出为 ONNX 格式
环境设置:
tensorrt= 10
pytorch=1.13.1
cuda=11.6
vs2019
在导出onnx之前,看一下推理的代码:
def forward(self, image1, image2, iters=12, flow_init=None, test_mode=False):""" 估计一对帧之间的光流 """# 将图像归一化到 [-1, 1] 范围image1 = (2 * (image1 / 255.0) - 1.0).contiguous()image2 = (2 * (image2 / 255.0) - 1.0).contiguous()# 运行上下文网络with autocast(enabled=self.args.mixed_precision):# 根据是否使用共享骨干网络选择不同的处理方式if self.args.shared_backbone:*cnet_list, x = self.cnet(torch.cat((image1, image2), dim=0), dual_inp=True, num_layers=self.args.n_gru_layers)fmap1, fmap2 = self.conv2(x).split(dim=0, split_size=x.shape[0]//2)else:cnet_list = self.cnet(image1, num_layers=self.args.n_gru_layers)fmap1, fmap2 = self.fnet([image1, image2])# 处理上下文网络的输出net_list = [torch.tanh(x[0]) for x in cnet_list]inp_list = [torch.relu(x[1]) for x in cnet_list]# 预先计算GRU的卷积层,以提高效率inp_list = [list(conv(i).split(split_size=conv.out_channels//3, dim=1)) for i,conv in zip(inp_list, self.context_zqr_convs)]# 选择相关性实现方法if self.args.corr_implementation == "reg": # 默认方法corr_block = CorrBlock1Dfmap1, fmap2 = fmap1.float(), fmap2.float()elif self.args.corr_implementation == "alt": # 更节省内存的方法corr_block = PytorchAlternateCorrBlock1Dfmap1, fmap2 = fmap1.float(), fmap2.float()elif self.args.corr_implementation == "reg_cuda": # 更快的reg版本corr_block = CorrBlockFast1Delif self.args.corr_implementation == "alt_cuda": # 更快的alt版本corr_block = AlternateCorrBlock# 创建相关性函数corr_fn = corr_block(fmap1, fmap2, radius=self.args.corr_radius, num_levels=self.args.corr_levels)# 初始化光流coords0, coords1 = self.initialize_flow(net_list[0])if flow_init is not None:coords