圖像分割的理解
知乎回答
為什么深度學習中的圖像分割要先編碼再解碼?💻
問題描述:如FCN, U-NET等結構,都有編碼,解碼的過程(降采樣,上采樣),為什么不能直接用全卷積,不pooling,一直保持相同的特征圖大小進行分割呢?
回答作者:張良懷
鏈接:https://www.zhihu.com/question/294617103/answer/634142274
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
可以不用降采樣,降采樣是手段不是目的!!(可參考下文的HighRes3DNet)
降采樣有以下幾個目的:
- 降低顯存和計算量,圖小了占內存也就小了,運算量也少了。
- 增大感受野,使同樣3*3的卷積能在更大的圖像范圍上進行特征提取。大感受野對分割任務很重要,小感受野是做不了多類分割的,而且分割出來的掩膜邊界很粗糙!!
- 多出幾條不同程度下采樣的分支,可以很方便進行多尺度特征的融合。多級語義融合會讓分類很准。如果不需要考慮計算和顯存,你當然可以不做下采樣,用膨脹卷積也是可以增大感受野的。
大家可能覺得做了下采樣,會導致底層特征損失,但只要留下一條沒有做下采樣的分支,底層特征就不會損失。所以unet提出用skip connection保留細節。
但unet的缺陷是是底層特征都沒做什么變換就直接融合了,網絡會不會非線性不夠學習能力不行?所以問題的基礎目的是,如何增大特征提取感受野並實現多尺度特征融合。進階目的是,如何保證各尺度信息變換充分。
下面舉幾個很好的例子說明以上幾點:
-
HRNet
核心思想就是充分變換並融合三條不同分辨率支路的特征。這個網絡在分割,目標檢測和姿態檢測三個任務上都達到STOA。網絡思路明確,做法粗暴,效果好,但是性能要求不低。github link
-
unet改進系列,unet++,DLANet
- 這兩個網絡的細節可見周縱葦-研習U-Net
- 這些網絡改善了unet淺層特征可能變換不充分的缺點。更像HRNet,但性能上要求低一些。
圖像語義分割中 【語義】 體現在哪里?🌍
回答作者:張良懷
鏈接:https://www.zhihu.com/question/294617103/answer/634142274
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
語義提取, 就是編碼、濃縮的過程。
分類問題是一個純語義提取問題,所以網絡是一個不斷編碼濃縮的過程,最終網絡的輸出也就是一個是與否的二值信息(兩分類)。
分割,依托於解碼重建的過程。需要給網絡補充足夠的細節。
語義和分割是兩個需要權衡的矛盾體。需要更廣的語義必然需要壓縮的很厲害(池化或stride大於1的卷積),而壓縮太厲害又會導致細節丟失嚴重。所以如何做到在不丟失細節的情況下提取更多的語義,是語義分割一直以來着重解決的問題。
通過deconv的方式搭建的decoder結構,相當於是通過訓練,在deconv的權值中存儲恢復目標輪廓特征的統計信息,用來為重建過程提供細節指導。既然是統計信息,必然是平均的情況,因此重建出來的目標會呈現出一種平滑或平均的效果。遇到一些特別一點的輸入,分割效果就會相差很大(這種平滑的特性也可以用來做去噪,或者圖像的超分辨,圖像的復原)。
unet網絡采用一種跳線的方式,將encoder中更高分辨率的特征送入到decoder為其提供細節。
deeplab 網絡提出膨脹卷積,可以在不使用池化的情況下,增大語義范圍,避免了細節的丟失。
它們還提出assp,小范圍語義,大范圍語義,都對分割有貢獻。
目標結構有多大,就盡量給網絡多大的感受野,它才能夠識別出目標的語義,輔助完成准確的分割。
回答作者:匿名
來源:知乎
用卷積做下采樣可能可以減少信息的損失,但是我覺得應該不會完全沒有損失。你想要讓一個feature map上同時存儲高層信息和低層信息,這就涉及到網絡如何去統一存儲這些信息,這對卷積網絡是不直觀的,我覺對網絡來說,為它在網絡設計的層面上就給它分層規划好,哪些層的卷積存高維信息語義,哪些存低維細節信息,網絡會更容易訓練,有限資源下也能達到更好的效果。
為什么邏輯回歸對樣本分布不均衡比較敏感,為什么樹模型沒有線性模型那么敏感?
回答作者:張良懷
鏈接:https://www.zhihu.com/question/294617103/answer/634142274
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
任何通過計算樣本的Loss然后反向傳播更新權值的算法,都會對正負樣本的數量是否平衡很敏感。哪一類樣本多,權重調整時就更傾向於調整到使該類樣本錯分率更低。不管是邏輯回歸,還是深度學習。
樹模型不屬於上一類,它是通過計算信息熵來選擇特征划分樣本的,划分后熵增最大。這個計算過程對於樣本的數量的多少是不敏感的,因為熵的計算和樣本數量無直接關系。
再說下,SVM,他不是算最小Loss,是算最大間隔(樣本到決策邊界的垂直距離),它的表述更直觀。而因為它只算支持向量到分割平面的間隔,所以事實上他對於樣本的不平衡不敏感,只要支持向量平衡就行了。
有哪些「魔改」loss函數,曾經拯救了你的深度學習模型?
我來談談分割任務的Loss函數。首先想要解釋一下,Loss函數的目的是為了評估網絡輸出和你想要的輸出(Ground Truth,GT)的匹配程度。我們不應該把Loss函數限定在Cross-Entropy和他的一些改進上面,應該更發散思維,只要滿足兩點:
-
能夠表示網絡輸出和待分割目標的相似程度
-
Loss的計算過程是可導的,可以進行誤差反傳。
仍然從Cross-Entropy和它的一些改進說起,這一類Loss函數可以叫做Pixel-Level的Loss,因為他們都是把分割問題看做對每個點的分類,這一類包括:
- CE(cross-entropy)。
- wCE(weighted cross-entropy)。可以看UNet原論文,對邊界像素這些難學習的像素加大權重(pixel-weight)
- 當然還可以做類層面的加權(class-weight),比如對前景像素加大權重,背景像素減小權重,或者不同的類別按照其所占像素的比例,分配權重,占比小的權重大一些,占比大的權重小一些,解決樣本不平衡的問題。
- focal loss。很巧妙又簡潔的一種方式。它使難分類樣本權重大,易分類樣本權重小。至於哪些是難分類樣本哪些是易分類樣本,都由網絡的輸出和真實的偏差決定。這就實現了網絡自適應調整。類比我們學知識,難學習的內容,我們同樣時間學的不好自己知道,我就會自覺的花更多精力去學習。以前的神經網絡沒有識別難易任務自動分配精力的方式,focal loss帶來了這種自適應反饋。同樣能夠實現這種自適應方式的還有在線難樣本挖掘(Online Hard Example Mining,OHEM)。
2016年的VNet論文首次提出了Dice Loss,應該是Class-Level的Loss的代表。Dice系數是分割效果的一個評判指標,其公式相當於預測結果區域和ground truth區域的交並比,所以它是把一個類別的所有像素作為一個整體去計算Loss的。因為Dice Loss直接把分割效果評估指標作為Loss去監督網絡,不繞彎子,而且計算交並比時還忽略了大量背景像素,解決了正負樣本不均衡的問題,所以收斂速度很快。類似的Loss函數還有IoU Loss。
如果說DiceLoss是一種區域面積匹配度去監督網絡學習目標的話,那么我們也可以使用邊界匹配度去監督網絡的Boundary Loss。我們只對邊界上的像素進行評估,和GT的邊界吻合則為0,不吻合的點,根據其距離邊界的距離評估它的Loss。這一類論文可以搜關鍵詞Boundary aware,Boundary Loss等。
不管是逐像素、區域,還是邊界,它們都是低維特征,我們還可以考慮使用預測結果和GT的高維特征的匹配度去監督網絡,高維特征即Mask的一些形狀特征,這樣的監督方式就能夠讓網絡學會去學習目標結構的形狀先驗(Shape Prior)。如何提取高維特征,有的論文使用PCA對輸出和GT進行降維,也有使用自編碼器(AutoEncoder)的Encoder端進行編碼的(需先使用Mask訓練一個自編碼器),然后對降維后的編碼計算距離,作為最終的Loss。這一類論文可以搜關鍵詞Shape Prior,Shape Constrained...,Anatomically Constrained等等。以上所有的Loss都是用Mask去監督網絡的輸出,如果我們的Mask標注的並不夠好呢,我們是不是可以考慮引入一些原圖的信息作為輔助,豐富Loss函數,監督網絡,這種思路叫做Weakly-supervise/Semi-supervise,弱監督。
上述大多都是結合自己的工作和文獻閱讀的總結。如果有不恰當的地方,歡迎交流討論。
skip connection的原理是什么?為什么U-net中要用到skip connection?🔪
知乎作者:SuperMHP@知乎
針對unet的skip connection
1.對於分割這個任務,空間域信息非常重要。而網絡的encoder部分,通過各個pooling層已經把特征圖分辨率降得非常小了,這一點不利於精確的分割mask生成,通過skip-connection可以把較淺的卷積層特征引過來,那些特征分辨率較高,且層數淺,會含有比較豐富的low-level信息,更利於生成分割mask。
針對resnet里的skip connection:
1.從Resnet最早引入skip-connection的角度看,這種跳躍連接可以有效的減少梯度消失和網絡退化問題,使訓練更容易。直觀上理解可以認為BP的時候,深層的梯度可以更容易的傳回淺層,因為這種結構的存在,對神經網絡層數的設定可以更隨意一些。不帶skip connection的網絡層數深了非凸性暴增。
2.從微分方程角度看,skip-connection的加入會使得具體一層可以替代為差分預測機,這種理解對於resnet已經被一定數量的工作闡明 [2, 3],至於unet這種,鏈接方式不是相加,且所跨層數不固定的,是否可以和微分方程建立聯系,還需要想一想。
xiehousen@github
github鏈接:https://github.com/xiehousen/Dense-Unet
研一的時候研究過U-Net,簡單說一下自己的理解,如有錯誤還望指正!
U-Net是一種典型的編碼-解碼結構,編碼器部分利用池化層進行逐級下采樣,解碼器部分利用反卷積進行逐級上采樣,原始輸入圖像中的空間信息與圖像中的邊緣信息會被逐漸恢復,由此,低分辨率的特征圖最終會被映射為像素級的分割結果圖。而為了進一步彌補編碼階段下采樣丟失的信息,在網絡的編碼器與解碼器之間,U-Net算法利用Concat拼接層來融合兩個過程中對應位置上的特征圖,使得解碼器在進行上采樣時能夠獲取到更多的高分辨率信息,進而更完善地恢復原始圖像中的細節信息,提高分割精度。
而增加了skip connection結構的U-Net,能夠使得網絡在每一級的上采樣過程中,將編碼器對應位置的特征圖在通道上進行融合。通過底層特征與高層特征的融合,網絡能夠保留更多高層特征圖蘊含的高分辨率細節信息,從而提高了圖像分割精度。
我們也在U-Net上面做了一些工作。
我們在網絡中引入鄰層特征重建和跨層特征重建增強層與層之間特征信息傳遞的同時,進一步對高層卷積特征層中豐富的細節信息進行了利用,從而最大化地提高了網絡各層中的特征信息的利用率。
跨層特征重建:跨層特征重建模塊建立在編碼器-解碼器結構的基礎上,旨在將語義信息更豐富的高層卷積特征層和低層卷積特征進行融合。因為在網絡傳播的過程中,隨着網絡越來越深,相應特征圖的感受野會越來越大,但是保留的細節信息會越來越少,而對於語義分割任務,高層卷積所保留的豐富的細節信息是非常有利用價值的,基於編碼器-解碼器對稱式的結構,利用Concat拼接層將編碼器過程中下采樣提取出來的特征圖與解碼器過程中上采樣得到的新特征圖一一對應進行通道維度拼接。憑借跨層特征重建模塊,可以更大程度地保留高層卷積中的一些重要特征信息,有利於實現更精細的分割效果。
鄰層特征重建:鄰層特征重建是在整個網絡中除主干路之外的每一對具有相同尺寸特征圖的相鄰卷積層之間搭建了支路,即利用Concat拼接層將上一層卷積與下一層卷積得到的特征圖進行通道維度的拼接。Concat拼接完成后再回到網絡主干路,執行原有的計算並傳遞給下一層。憑借鄰層特征重建模塊,網絡的整體結構變得更密集,網絡中每一層都可以從其上一層的輸入中最大化地利用其之前所有層中的特征信息。
公眾號文章
來源公眾號:GiantPandaCV
來源標題:談一談UNet圖像分割
來源標題:https://mp.weixin.qq.com/s/eQgA1OYozKLXx-gbJjDpnw
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
圖像分割結構設計的一些套路:
-
上采樣+下采樣作為整體的網絡結構(Encoder-Decoder)
-
多尺度的特征融合
-
信息流通的方式
-
獲得像素級別的segment map
應該說很多人,其實都喜歡在UNet進行改進,換個優秀的編碼器,然后自己在手動把解碼器對應實現一下。至於為什么要選擇UNet上進行改進,可能是因為UNet網絡的結構比較簡單,還是比較好進行改進的,而且UNet的效果,在很多場景下的表現力可能都是差強人意的。
但是,直接對UNet進行簡單的替換編解碼器,效果應該也是差強人意或者效果就是很差的;之前也有一些同事,在對UNet進行改進的時候,也會遇到效果不好的問題。直接對UNet改進,個人認為有一個本質的原因會影響網絡的效果。
- 首先,原始的UNet在編碼器的網路結構是很淺的,同時沒有加padding,使得解碼器獲取編碼器的信息時,位置信息丟失的不會很嚴重;但是一旦選擇一個比較深的網絡作為編碼器(一般的特征提取的網絡會加padding),使得位置信息丟失的相對來說是很嚴重的,在解碼器獲取到對應編碼器的信息時,就已經產生了很大的偏移,再經過一個同樣深的解碼器,那么位置偏移就會變得更加嚴重,效果不好就可以解釋的通了。
個人認為,UNet上的改進一定要認識到最原始的設計思路,以及它相對於后面系列的一個劣勢,就是信息融合、位置不偏移。
其實,信息融合、位置偏移在yolov4、v5中也得到了體現,v4和v5對於網絡的改進思路也是緊緊抓住了這兩個點(當然也有其他非常重要或者新穎的點,但是這兩點一定是核心的),后期對於UNet進行改進的網絡都是在對信息融合上有着獨到的理解,這也是后面改進的網絡比較難以再進行優化的一個原因,要想對UNet有着非常獨到的新穎的改進,還是比較有難度的(Swin-UNet是Transformer在圖像上的表現,我也不太好評價)。
如果非要在UNet上通過替換編解碼器的方式(用現有的優秀的特征提取器)進行改進時,可以借鑒UNet++和UNet3+的思想,橫縱信息的流通,還有就是padding上的特殊處理、能不能更好的進行反向傳播、位置偏移上的特殊處理、不要選擇太深的網絡、卷積核的大膽設計這幾個方面出發。
最后,其實分割網絡可以嘗試其他的分割模型,Deeplab系列也是一個比較好的選擇,對主干的修改也相對容易。