pytorch圖片分割原理分析
pytorch圖片分割原理
自從transformer應(yīng)用到cv領(lǐng)域以后,對(duì)圖片的分割需求便越加重了,但是圖像分割說(shuō)起來(lái)容易,實(shí)際操作起來(lái)還是有很多地方不懂(主要還是code能力太弱)。
我們知道,對(duì)張量的處理一般又兩種,一種是view/reshape這樣的,先將數(shù)據(jù)按行展開(kāi),再按照指定形狀排列數(shù)據(jù);另一種是permute/transpose這種,是把數(shù)據(jù)按照維度進(jìn)行變化,也就是把數(shù)據(jù)排列的先后順序轉(zhuǎn)換一下(后面具體介紹)。所以分割圖片就用到了兩者的結(jié)合
實(shí)驗(yàn)
原圖:

1:我們先看直接reshape的結(jié)果:將原圖片切割為8份



完全沒(méi)法看好吧!
原因就是上面說(shuō)的,reshape是把整張圖片按行(這里是按照通道數(shù)3,實(shí)際上也確實(shí)應(yīng)該把通道數(shù)調(diào)到最后,按照通道展開(kāi),原因后面介紹)展開(kāi)。
2:我們看一下正確的做法





可以看到分割的很完美!
接下來(lái)解釋一下原因
1:通道數(shù)必須放到最后一個(gè)維度:首先,我們知道再?gòu)埩繑?shù)據(jù)是連續(xù)的情況下,其數(shù)據(jù)是按行展開(kāi)排序的,也就是按照張量最后一個(gè)維度展開(kāi)排序,所以,對(duì)于一個(gè)三通道的RGB圖像(3,H, W)它本來(lái)是按照寬度展開(kāi)的,但這樣在分割的時(shí)候就存在問(wèn)題了,因?yàn)?,分割一張圖片,應(yīng)該是三個(gè)通道一起分割,故,我們第一步應(yīng)該把通道數(shù)調(diào)到最后一個(gè)維度(這里因?yàn)槭怯胏v2打開(kāi)的圖片,通道數(shù)已經(jīng)在最后一維 ,所以不用再單獨(dú)轉(zhuǎn)換,但如果需要轉(zhuǎn)換的話,注意,不可以用reshape或者view,只能用permute/或者transpose)
2:寬和高的分割必須先在自己的維度分割,即對(duì)于一組(B,C,H, W)的圖片,在把C轉(zhuǎn)換到最后一維后為(B,H,W,C),分割(此時(shí)用reshape)應(yīng)該先按照(B,H/H分割size,H分割size,W/W分割size,W分割size,C)展開(kāi),然后再用permute,或者tanspose轉(zhuǎn)化為(B,H/H分割size,W/W分割size,H分割size,W分割size,C),最后,再用contiguous().view轉(zhuǎn)化為(B,(H/H分割size)*(W/W分割size),H分割size,W分割size,C),解釋如下:
張量的維度,實(shí)際上表述數(shù)據(jù)的方向和排列順序,越靠后的維度越先排列,所以,對(duì)于(B, H W, C),如果只是進(jìn)行reshape或者view的話,他始終是會(huì)先把寬W排完之后再排高,所以,為了要把圖片分成一份一份的,那么就必須讓寬和高交替出現(xiàn),也就是要改變數(shù)據(jù)的排列順序,這正是permute和transpose的作用,它們相當(dāng)于在保持現(xiàn)有數(shù)據(jù)在內(nèi)存中順序的基礎(chǔ)上,改變數(shù)據(jù)的排列順序,這里(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轉(zhuǎn)換以后則為(B,高,寬,高,寬,C )

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python數(shù)據(jù)的標(biāo)準(zhǔn)輸出與格式化輸出
這篇文章主要給大家介紹了關(guān)于Python數(shù)據(jù)的標(biāo)準(zhǔn)輸出與格式化輸出的相關(guān)資料,和大多數(shù)語(yǔ)言一樣,Python也是用print()函數(shù)來(lái)進(jìn)行輸出,需要的朋友可以參考下2023-08-08
Linux添加Python?path方法及修改環(huán)境變量的三種方法
這篇文章主要介紹了Linux添加Python?path方法及修改環(huán)境變量的三種方法,Linux 下設(shè)置環(huán)境變量有三種方法,一種用于當(dāng)前終端,一種用于當(dāng)前用戶,一種用于所有用戶,本文對(duì)每種方法給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
詳解Pytorch自動(dòng)求導(dǎo)機(jī)制
自動(dòng)求導(dǎo)是一種計(jì)算梯度的技術(shù),它允許我們?cè)诙x模型時(shí)不需要手動(dòng)推導(dǎo)梯度計(jì)算公式,PyTorch 提供了自動(dòng)求導(dǎo)的功能,使得梯度的計(jì)算變得非常簡(jiǎn)單和高效,這篇文章主要介紹了Pytorch自動(dòng)求導(dǎo)機(jī)制詳解,需要的朋友可以參考下2023-07-07
Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)將名稱映射到序列元素中的方法
這篇文章主要介紹了Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)將名稱映射到序列元素中的方法,結(jié)合實(shí)例形式分析了Python使用collections.namedtuple()進(jìn)行元組命名相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
Python中使用jpype調(diào)用Jar包中的實(shí)現(xiàn)方法
這篇文章主要介紹了Python中使用jpype調(diào)用Jar包中的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
python如何將.tif格式圖批量轉(zhuǎn)化為.jpg格式圖
這篇文章主要介紹了python如何將.tif格式圖批量轉(zhuǎn)化為.jpg格式圖問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Python如何實(shí)現(xiàn)Paramiko的二次封裝
這篇文章主要介紹了Python如何實(shí)現(xiàn)Paramiko的二次封裝,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01

