pytorch图片分割原理分析

 更新时间:2024年10月14日 08:46:46   作者:xx_xjm  
自Transformer模型被应用于计算机视觉领域后,图像分割技术得到了进一步的发展,但图像分割操作复杂,特别是对张量的处理,涉及多种变换方法,其中,view/reshape用于改变数据形状,而permute/transpose用于改变数据的维度顺序

pytorch图片分割原理

自从transformer应用到cv领域以后,对图片的分割需求便越加重了,但是图像分割说起来容易,实际操作起来还是有很多地方不懂(主要还是code能力太弱)。

我们知道,对张量的处理一般又两种,一种是view/reshape这样的,先将数据按行展开,再按照指定形状排列数据;另一种是permute/transpose这种,是把数据按照维度进行变化,也就是把数据排列的先后顺序转换一下(后面具体介绍)。所以分割图片就用到了两者的结合

实验

原图:

1:我们先看直接reshape的结果:将原图片切割为8份

完全没法看好吧!

原因就是上面说的,reshape是把整张图片按行(这里是按照通道数3,实际上也确实应该把通道数调到最后,按照通道展开,原因后面介绍)展开。

2:我们看一下正确的做法

可以看到分割的很完美!

接下来解释一下原因

1:通道数必须放到最后一个维度:首先,我们知道再张量数据是连续的情况下,其数据是按行展开排序的,也就是按照张量最后一个维度展开排序,所以,对于一个三通道的RGB图像(3,H, W)它本来是按照宽度展开的,但这样在分割的时候就存在问题了,因为,分割一张图片,应该是三个通道一起分割,故,我们第一步应该把通道数调到最后一个维度(这里因为是用cv2打开的图片,通道数已经在最后一维 ,所以不用再单独转换,但如果需要转换的话,注意,不可以用reshape或者view,只能用permute/或者transpose)

2:宽和高的分割必须先在自己的维度分割,即对于一组(B,C,H, W)的图片,在把C转换到最后一维后为(B,H,W,C),分割(此时用reshape)应该先按照(B,H/H分割size,H分割size,W/W分割size,W分割size,C)展开,然后再用permute,或者tanspose转化为(B,H/H分割size,W/W分割size,H分割size,W分割size,C),最后,再用contiguous().view转化为(B,(H/H分割size)*(W/W分割size),H分割size,W分割size,C),解释如下:

张量的维度,实际上表述数据的方向和排列顺序,越靠后的维度越先排列,所以,对于(B, H W, C),如果只是进行reshape或者view的话,他始终是会先把宽W排完之后再排高,所以,为了要把图片分成一份一份的,那么就必须让宽和高交替出现,也就是要改变数据的排列顺序,这正是permute和transpose的作用,它们相当于在保持现有数据在内存中顺序的基础上,改变数据的排列顺序,这里(B,H/H分割size,H分割size,W/W分割size,W分割size,C)H/H分割size,H分割size都代表高;W/W分割size,W分割size都代表宽,也就是(B,高,高,宽,宽,C),将H分割size和W/W分割size转换以后则为(B,高,宽,高,宽,C )

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解OpenCV中简单的鼠标事件处理

    详解OpenCV中简单的鼠标事件处理

    谈及鼠标事件,就是在触发鼠标按钮后程序所做出相应的反应,但是不影响程序的整个线程。本文将主要介绍OpenCV中的简单鼠标事件处理,感兴趣的可以学习一下
    2022-01-01
  • python实现超简单端口转发的方法

    python实现超简单端口转发的方法

    这篇文章主要介绍了python实现超简单端口转发的方法,实例分析了Python同构socket实现端口转发的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Python调用两个机器人聊天的实战

    Python调用两个机器人聊天的实战

    本文主要介绍了Python调用两个机器人聊天,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Opencv+Python实现图像运动模糊和高斯模糊的示例

    Opencv+Python实现图像运动模糊和高斯模糊的示例

    今天小编就为大家分享一篇关于Opencv+Python实现图像运动模糊和高斯模糊的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • Python3实现Web网页图片下载

    Python3实现Web网页图片下载

    这篇文章主要介绍了Python3通过request.urlopen实现Web网页图片下载,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • Django与FastAPI的选择区别深入剖析

    Django与FastAPI的选择区别深入剖析

    这篇文章主要为大家介绍了Django与FastAPI的选择区别深入剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Python:Scrapy框架中Item Pipeline组件使用详解

    Python:Scrapy框架中Item Pipeline组件使用详解

    这篇文章主要介绍了Python:Scrapy框架中Item Pipeline组件使用详解,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • Python判断一个数是否为质数的3种方法(超详细)

    Python判断一个数是否为质数的3种方法(超详细)

    一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除(2, 3, 5, 7等),换句话说就是该数除了1和它本身以外不再有其他的因数,下面这篇文章主要给大家介绍了关于利用Python判断一个数是否为质数的3种方法,需要的朋友可以参考下
    2024-09-09
  • ubuntu系统如何从python3.7升级到python3.8

    ubuntu系统如何从python3.7升级到python3.8

    这篇文章主要给大家介绍了关于ubuntu系统如何从python3.7升级到python3.8的相关资料,Python是一种广泛使用的编程语言,而Ubuntu是一个流行的开源操作系统,通过升级Python您可以获得新功能、性能改进和安全修复,需要的朋友可以参考下
    2023-11-11
  • python flask几分钟实现web服务的例子

    python flask几分钟实现web服务的例子

    今天小编就为大家分享一篇python flask几分钟实现web服务的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07

最新评论