【圖像處理】U-Net中的重疊-切片(Overlap-tile)
全文大綱:
1.Overlap-tile在U-Net中的使用
2.隨機切片
3.鏡像填充
4.按序切片
5.將切片重構(gòu)成圖像
6.總結(jié)
吐血整理~作為辛勤的B站up主,為我僅有的6000個粉絲保持更新,只為等待更多在人工智能、機器人等前沿技術(shù)志同道合者的青睞!T-T
以下為正文內(nèi)容,全是干貨,建議收藏加關(guān)注,定期推送獨家好文!
(作者簡介位于文末)

Foreword
最開始接觸?U-Net?的時候并不知道原作使用了?Overlap-tile?這種策略,因此當時不太理解為何網(wǎng)絡(luò)結(jié)構(gòu)要設(shè)計成非對稱形式,即上采樣得到的特征圖尺寸與對應層在下采樣時的尺寸不一致。
另外發(fā)現(xiàn),這種策略可用于許多場景,特別是當?數(shù)據(jù)量較少?或者?不適合對原圖進行縮放時尤其適用(縮放通常使用插值算法,主流的插值算法如雙線性插值具有低通濾波的性質(zhì),會使得圖像的高頻分量受損,從而造成圖像輪廓和邊緣等細節(jié)損失,可能對模型學習有一定影響),同時它還能起到為目標區(qū)域提供上下文信息的作用。
本文先對這種策略的原理以及在U-Net中的使用進行說明,然后結(jié)合源碼對該策略的實現(xiàn)進行解析,內(nèi)容包括隨機切片、鏡像填充后按序切片以及將切片重構(gòu)成圖像。
1.Overlap-tile在U-Net中的使用
先來對Overlap-tile策略的原理及其在U-Net中的使用做個介紹,讓大家對其有個初步印象和基本理解。
熟悉U-Net結(jié)構(gòu)的煉丹者們肯定清楚,它并不是一個完全對稱的結(jié)構(gòu)。也就是說,某一層特征圖下采樣后再上采樣回來到對應層時,其尺寸會發(fā)生變化,比原來的小,原因在于U-Net使用的是不帶padding的3x3卷積(valid卷積),每次經(jīng)過這樣的一個卷積就會使得特征圖尺寸減小2x2。

顯然,如果直接輸入原圖,那么最后輸出的尺寸會比原圖小。如果我們希望得到和輸入一致的尺寸,會怎么做?
最直接的是對輸出結(jié)果再進行一次上采樣,可以使用插值或者轉(zhuǎn)置卷積的方法,若使用插值,由于其是不可學習的,會帶來一定的誤差;而使用轉(zhuǎn)置卷積的話,又會增加參數(shù)量,并且模型也不一定能學習得好。
另外一種方法就是將U-Net中的valid卷積改為same卷積,即使用padding,這樣每次3x3卷積就不會改變特征圖的尺寸了,最終上采樣回來的尺寸就能夠和輸入一致了。但是,padding是會引入誤差的,而且模型越深層得到的feature map抽象程度越高,受到padding的影響會呈累積效應。
上述方法都體現(xiàn)出明顯的不足之處,那么有沒有更好的方法呢?我們來看看U-Net中的Overlap-tile是怎么做的。
做法其實很簡單,就是在輸入網(wǎng)絡(luò)前對圖像進行padding,使得最終的輸出尺寸與原圖一致。特別的是,這個padding是鏡像padding,這樣,在預測邊界區(qū)域的時候就提供了上下文信息。

上圖左邊是對原圖進行鏡像padding后的效果,黃框是原圖的左上角部分,padding后其四周也獲得了上下文信息,與圖像內(nèi)部的其它區(qū)域有類似效果。
Overlap-tile策略可搭配?patch(圖像分塊)一起使用。當內(nèi)存資源有限從而無法對整張大圖進行預測時,可以對圖像先進行鏡像padding,然后按序?qū)adding后的圖像分割成固定大小的patch。這樣,能夠?qū)崿F(xiàn)對任意大的圖像進行無縫分割,同時每個圖像塊也獲得了相應的上下文信息。另外,在數(shù)據(jù)量較少的情況下,每張圖像都被分割成多個patch,相當于起到了擴充數(shù)據(jù)量的作用。更重要的是,這種策略不需要對原圖進行縮放,每個位置的像素值與原圖保持一致,不會因為縮放而帶來誤差。
2.隨機切片
隨機切片是在圖像內(nèi)部隨機選取patch中心,然后將圖像切成固定數(shù)量的patch。
以下示例是對單張圖像及對應的掩膜(mask)做隨機切片。

patch中心位置根據(jù)其尺寸在圖像內(nèi)部隨機選取,確定中心位置后,再根據(jù)各邊長就可以確定patch的左上和右下兩個頂點坐標。

最后從原圖中取出對應位置的區(qū)域即可。


3.鏡像填充
對原圖進行鏡像填充,能夠使模型對邊界區(qū)域進行預測時獲得上下文信息。下圖藍框部分是原圖的左上角部分,鏡像填充后,得到紅框部分。

鏡像填充后會進行按序切片,在切片時,各patch之間可以設(shè)定一個固定的間隔,這樣能夠避免過份重疊。至于各邊需要填充多少長度,可以基于以下兩種方式來決定:
i). 填充后,各邊都能恰好切出整數(shù)個patch(最后不會剩余一點長度不足一個patch);
ii). 提前計算輸入輸出之間的尺寸差,使得padding后輸出與輸入尺寸保持一致。
下面就第i)種方式進行源碼解析。若有多張不同尺寸的圖片,那么就一張張獨立處理;否則,可以組成一個批次進行處理。

先在豎直方向上進行填充,填充后,將原圖置于中間,頂部和底部使用原圖的鏡像進行填充。

然后在水平方向上進行填充,同樣地,將填充前的圖像置于中間,左右兩邊剩余部分使用填充前圖像的鏡像進行填充。

4.按序切片
按序切片就是從圖像的左上方開始,按照一定間隔依次將圖像切成一個個小的圖像塊,直至圖像的右下方。

注意,各切片之間的間隔是可以小于切片邊長的,這就代表各切片可能存在重疊部分。

每張圖切出相同數(shù)量相同大小的切片,計算出各個切片的位置,從圖中取出對應的部分就得到各切片。

5.將切片重構(gòu)成圖像
將圖像切片后,模型是對切片進行預測的,那么通常我們需要將這些切片的預測結(jié)果重新組合成整張圖像對應的預測結(jié)果以方便評估和展示。
預測結(jié)果的重組與切片重組成圖像的原理類似,這里就切片重組進行源碼解析。

在上一節(jié)提到,切片之間可能存在重疊部分,而重疊部分的像素值,我們通常取平均值。對于切片重構(gòu)圖像來說,取平均后的像素值與原圖相同;而對于切片預測結(jié)果重組成整圖預測結(jié)果來說,求平均相當于對多次預測所得的概率求均值作為最終預測結(jié)果。

注意,并不是將切片直接放入圖像對應位置,而是使用求和(下圖中 img +=、weights +=),就是因為切片之間可能存在重疊的部分,我們需要對這些部分求均值。

如果切片前做了padding,那么重構(gòu)后的圖像尺寸對應的是padding后的尺寸,因此我們還要裁出原圖。我們在padding的時候,原圖是放中間的,那么記下之前padding的長度就很容易計算出原圖位置了。

6.End
如本文所述,Overlap-tile帶來的好處有許多:不需要對圖像進行縮放從而避免圖像細節(jié)損失、能夠為邊界區(qū)域提供上下文信息、在數(shù)據(jù)量較少時充當數(shù)據(jù)擴充的手段。但是,在煉丹的世界里,實際效果如何還得“煉一煉”才知道,感興趣的煉丹師可以在訓練中嘗試下這種策略。

作者簡介
CW,廣東深圳人,畢業(yè)于中山大學(SYSU)數(shù)據(jù)科學與計算機學院,畢業(yè)后就業(yè)于騰訊計算機系統(tǒng)有限公司技術(shù)工程與事業(yè)群(TEG)從事Devops工作,期間在AI LAB實習過,實操過道路交通元素與醫(yī)療病例圖像分割、視頻實時人臉檢測與表情識別、OCR等項目。目前也有在一些自媒體平臺上參與外包項目的研發(fā)工作,項目專注于CV領(lǐng)域(傳統(tǒng)圖像處理與深度學習方向均有)。