极智AI | 教你简化onnx upsample算子

本文涉及的产品
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,图像资源包5000点
简介: 本文介绍了简化 onnx upsample 算子的方法。

本文介绍了简化 onnx upsample 算子的方法。

实际部署中经常会涉及到 pytorch / tensorflow / darknet -> onnx 的模型转换过程。本身模型转换过程就比较麻烦(当然 pytorch export onnx 十分方便),成了后你经常又会发现 convert successed 的 onnx model 看起来面目全非。这样一方面看起来不够清爽,另一方面算子细粒度太小,不利于部署。

这里先拿转换 onnx 时的 upsample 算子简洁化说起。


1、upsample 原理

upsample 是上采样,直观理解就是放大图像,采用各种插值算法来扩充 feature map。upsample 在分割网络、GAN 里比较常见,因为这些网络需要还原到特征图。目标检测网络常常会加入多尺度检测的特性,如在 Yolo 系列中最后的 yolo 分支往往就会考虑多尺度检测,这个时候就需要加入 upsample 算子来还原 feature map 的尺寸。

把 upsample 看成这样就好了,当 stride = 1 时:

当 stride = 2 时:


2、简化 onnx upsample

这里介绍一下 pytorch -> onnx upsample 的三种实现方法,也是逐步优化的过程。

2.1 upsample expand

看下 upsample expand 的算子实现方式:

class Upsample_expand(nn.Module):
    def __init__(self, stride=2):
        super(Upsample_expand, self).__init__()
        self.stride = stride
    def forward(self, x):
        assert (x.data.dim() == 4)
        x = x.view(x.size(0), x.size(1), x.size(2), 1, x.size(3), 1).\
            expand(x.size(0), x.size(1), x.size(2), self.stride, x.size(3), self.stride).contiguous().\
            view(x.size(0), x.size(1), x.size(2) * self.stride, x.size(3) * self.stride)
        return x

来看下 upsample expand 转出来的 onnx 结构:

以上的 onnx 结构算子细粒度太细,看起来很不清爽。

2.2 upsample interpolate

看下 upsample interpolate 的算子实现方式:

class Upsample_interpolate(nn.Module):
    def __init__(self, stride):
        super(Upsample_interpolate, self).__init__()
        self.stride = stride
    def forward(self, x):
        assert (x.data.dim() == 4)
        x = torch.nn.functional.interpolate(x, size=(x.size(2) * self.stride, x.size(3) * self.stride), mode='nearest')
        return x

来看下 upsample interpolate 转出来的 onnx 结构:

相比于上面的结构是不是已经简化了很多,算子个数减少了很多,但是还不是我们最终想要的样子,让我们继续简化。

2.3 nn.Upsample

看下 nn.Upsample 的算子实现方式:

nn.Upsample(scale_factor=stride, mode="nearest")

来看下 nn.Upsample 转出来的 onnx 结构:

这样是不是看起来很简洁了,nice~

onnx 作为一个模型转换的中间结构形式,往往喜欢把算子拆成细粒度更加小的算子组合,因为这样能够通过细算子的组合形成更加多的大算子,也可以解决大算子不支持的问题。onnx 的这种特性跟部署喜欢大算子存在着天然的 Gap,所以在 onnx 和 部署之间需要我们做更多的算子融合的工作,如 yolo 层也会存在同样的问题。


这篇先这样了,有问题欢迎交流~


logo_show.gif

相关文章
|
7月前
|
机器学习/深度学习 人工智能 算法
极智AI | 谈谈多通道img2col的实现
大家好,我是极智视界,本文来谈谈 多通道img2col的实现。
164 1
|
7月前
|
人工智能 JSON API
极智AI | 三谈昇腾CANN量化
大家好,我是极智视界,本文介绍一下 三谈昇腾CANN量化。
98 1
|
7月前
|
人工智能 API Python
极智AI | 再谈昇腾CANN量化
大家好,我是极智视界,本文介绍一下 再谈昇腾CANN量化。
149 1
|
7月前
|
人工智能 自然语言处理 算法
极智AI | TensorRT API构建模型推理流程
大家好,我是极智视界,本文介绍一下 TensorRT API 构建模型推理流程。
520 1
|
7月前
|
机器学习/深度学习 人工智能 PyTorch
极智AI | GAN应用于玻璃表面水珠样本生成
大家好,我是极智视界,本文介绍一下 GAN 应用于玻璃表面水珠样本生成的方法。
81 0
极智AI | GAN应用于玻璃表面水珠样本生成
|
7月前
|
人工智能 算法 数据格式
极智AI | 谈谈昇腾CANN量化
大家好,我是极智视界,本文介绍一下 谈谈昇腾CANN量化。
197 0
|
7月前
|
人工智能 Ubuntu C++
极智AI | ncnn模型转换及量化流程
本文介绍一下 ncnn 模型转换及量化流程,以 from_darknet yolov4 为例。
345 0
|
8天前
|
机器学习/深度学习 人工智能 算法
AI技术在医疗诊断中的应用及前景展望
本文旨在探讨人工智能(AI)技术在医疗诊断领域的应用现状、挑战与未来发展趋势。通过分析AI技术如何助力提高诊断准确率、缩短诊断时间以及降低医疗成本,揭示了其在现代医疗体系中的重要价值。同时,文章也指出了当前AI医疗面临的数据隐私、算法透明度等挑战,并对未来的发展方向进行了展望。
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
当前AI大模型在软件开发中的创新应用与挑战
2024年,AI大模型在软件开发领域的应用正重塑传统流程,从自动化编码、智能协作到代码审查和测试,显著提升了开发效率和代码质量。然而,技术挑战、伦理安全及模型可解释性等问题仍需解决。未来,AI将继续推动软件开发向更高效、智能化方向发展。
|
20天前
|
机器学习/深度学习 人工智能 自然语言处理
AI在医疗领域的应用及其挑战
【10月更文挑战第34天】本文将探讨人工智能(AI)在医疗领域的应用及其面临的挑战。我们将从AI技术的基本概念入手,然后详细介绍其在医疗领域的各种应用,如疾病诊断、药物研发、患者护理等。最后,我们将讨论AI在医疗领域面临的主要挑战,包括数据隐私、算法偏见、法规合规等问题。
40 1

热门文章

最新文章