unet图像分割_UNet++解读 + 它是如何对UNet改进 + 作者的研究态度和方式
UNet++論文: 地址
UNet++論文翻譯:地址
UNet++源代碼: 地址
UNet++作者在知乎上進行了解讀,里面還有視頻的講解,深入人心.里面有一句話令我印象深刻,我總結下: 很多論文給出了他們建議的網絡結構,其中包括非常多的細節,比如用什么卷積,用幾層,怎么降采樣,學習率多少,優化器用什么,這些都是比較直觀的參數,其實這些在論文中給出參數并不見得是最好的,所以關注這些的意義不大,一個網絡結構,我們真正值得關注的是它的設計給我們傳達了什么信息,給我們引起了什么樣的思考,所以我們應該要關注論文所傳遞的大方向,不要被論文中的細節局限了創造力, 而像這種細節參數的調整是屬于比較樸素的深度學習方法論,很容易花費你很多時間,而最終并沒有自身科研水平的提升,。這很有感觸,很多時候急于發paper,改改里面參數啥的又發表,這樣真的可以提高科研水平嗎?我們應該從一個大的方向思考,而不是把精力花在這些意義不大的事情上.作者在分析UNet時是從一個大的方向上分析,首先提出疑問,實踐驗證,總結改進,重復上述過程...最后UNet++誕生了,雖然新的網絡很快代替它,但是作者的這種研究態度和方式是值得學習的!
(建議先看他的知乎和視頻,下面是我個人的學習筆記,總結作者的心路歷程)
1、網紅拓撲結構
編碼和解碼(encoder-decoder),早在2006年就被Hinton大神提出來發表在了nature上.當時這個結構提出的主要作用并不是分割,而是壓縮圖像和去噪聲.后來把這個思路被用在了圖像分割的問題上,也就是現在我們看到的FCN或者U-Net結構,在它被提出的三年中,有很多很多的論文去講如何改進U-Net或者FCN,不過這個分割網絡的本質的拓撲結構是沒有改動的, 即下采樣、上采樣和skip connection.
這個結構真的一點毛病都沒有嗎?顯然沒有, 大家都在這個經典的結構上不斷地去完善它. 在這三年中,U-Net得到的超過2500次的引用,FCN接近6000次的引用,大家都在做什么樣的改進呢?如果讓你在這個經典的結構基礎上改進,你會去關注哪些點呢?
2、降采樣和升采樣
第一個問題: 降采樣對于分割網絡到底是不是必須的?問這個問題的原因就是,既然輸入和輸出都是相同大小的圖,為什么要折騰去降采樣一下再升采樣呢?
理論回答是這樣的: 降(下)采樣的理論意義,它可以增加對輸入圖像的一些小擾動的魯棒性,比如圖像平移,旋轉等,減少過擬合的風險,降低運算量,和增加感受野的大小。升(上)采樣的最大的作用其實就是把抽象的特征再還原解碼到原圖的尺寸,最終得到分割結果。如下圖所示:
?作者認為,對于特征提取階段,淺層結構可以抓取圖像的一些簡單的特征,比如邊界,顏色,而深層結構因為感受野大了,而且經過的卷積操作多了,能抓取到圖像的一些說不清道不明的抽象特征,講的越來越玄學了,總之,淺有淺的側重,深有深的優勢.然后他再次提出疑問:多深才好?U-Net為什么只在4層以后才返回去?問題實際是這樣的,下圖所示,既然 X1,0 、X2,0、 X3,0 、X4,0所抓取的特征都很重要,為什么我非要降到 X4,0 層了才開始上采樣回去呢?
3、網絡要多深
提出疑問后, 作者開始做實驗,為了驗證多深才好,干脆每加一個深度(層次)就一個網絡,然后測它們各自的分割表現,如下圖所示,先不要看后兩個UNet++,就看這個不同深度的U-Net的表現(黃色條形圖),我們可以看出,不是越深越好吧,它背后的傳達的信息就是,不同層次特征的重要性對于不同的數據集是不一樣的,并不是說我設計一個4層的U-Net,就像原論文給出的那個結構,就一定對所有數據集的分割問題都最優。(備注:作者分別用了兩個數據集:Electron Microscopy 和 Cell)
4、UNet++的萌芽
從上面的分析可見,不同數據集的最優的深度是不一樣的, 但是總不能把所有不同深度的U-Net都訓練一遍吧,這太耗時間了吧。如果給你一個數據集,訓練你的網絡,你并不知道網絡要多深才算最優,也就是你并不知道不同深度的特征的重要性,那有沒有辦法設計一個網絡使得它能夠學習不同深度的特征的重要性呢?
我把圖打出來就很簡單了。
我們來看一看, 在這個網絡里面你都可以找到1~4層的U-Net,它們全部都連在了一起. 這個結構的好處就是我不管你哪個深度的特征有效,我干脆都給你用上,讓網絡自己去學習不同深度的特征的重要性。第二個好處是它共享了一個特征提取器(我認為這說的是encoder),也就是你不需要訓練一堆U-Net,而是只訓練一個encoder,它的不同層次的特征由不同的decoder路徑來還原。這個encoder依舊可以靈活的用各種不同的backbone來代替。
5、無法訓練
可惜的是,上面這個網絡結構是不能被訓練的,原因在于,梯度不會經過這個紅色的區域,由于這個區域和算loss function的地方(
)在反向傳播時的路途是斷開的。如下圖所示
如何解決無法訓練這個問題?
- 第一個是用deep supervision,后面再說.
- 第二個解決方案是把結構改成這樣子:
如果沒有我上面說的那一堆話來盤邏輯,這個結構可能不那么容易想到,但是如果順著思路一步一步的走,這個結構雖然不能說是顯而易見,也算是順理成章的.但是我提一句,這個結構由UC Berkeley的團隊提出,發表在今年的CVPR上,是一個oral的論文,題目是"Deep Layer Aggregation"。他們在論文中給出的關于分割網絡結構的改進,他們還做了其他的工作,包括分類,和邊緣檢測。但是主要的思路就是剛剛盤的那些,目標就是取整合各個不同層次的特征。
這只是一個題外話哦,我們繼續來看這個結構,請問,你覺得這個結構又有什么問題?
為了回答這個問題,現在我們和UNet那個結構對比一下,不難發現這個結構強行去掉了U-Net本身自帶的長連接。取而代之的是一系列的短連接。那么我們來看看U-Net引以為傲的長連接到底有什么優點。如下圖:
?作者認為,U-Net中的長連接是有必要的,它聯系了輸入圖像的很多信息,有助于還原降采樣所帶來的信息損失.所以作者給出一個綜合長連接和短連接的方案.
6、UNet++模型誕生
這個綜合長連接和短連接的方案就是作者他們在MICCAI中發表的UNet++,也就是說這里的短連接是為了使模型能夠得到訓練,然后長連接是獲得更多信息.
(UNet++和剛剛說的那個CVPR的論文結構也太像了吧,這個工作和UC Berkeley的研究是完全兩個獨立的工作,也算是一個美麗的巧合。UNet++在年初時思路就已經成型了,CVPR那篇是我們七月份開會的時候看到的,當時UNet++已經被錄用了,所以相當于同時提出。另外,和CVPR的那篇論文相比,作者還有一個更精彩的點埋在后面說,剛剛也留了一個伏筆)
7、參數多了是導致UNet++比UNet好嗎
UNet++的效果是比UNet好,從網絡結構上看,說白了就是把原來空心的U-Net填滿了
所以有人會認為是參數多了才導致效果好,而不是網絡結構的增加.怎么反駁這個呢?
為了回答這個問題,同樣作者又去做實驗驗證
作者的做法是強行增加U-Net里面的參數量,讓它變寬,也就是增加它每個層的卷積核個數。由此,作者他們設計了一個叫wide U-Net的參考結構,先來看看UNet++的參數數量是9.04M,而U-Net是7.76M,多了差不多16%的參數,所以wide U-Net我們在設計時就讓它的參數比UNet++差不多,并且還稍微多一點點,來證明效果好并不是無腦增加參數量帶來的
?顯然,這個實驗用到了控制變量法,為了證明不是參數量影響了模型的表現.所以增加U-Net參數使它變寬,即“wide” U-Net.這樣這個“wide” U-Net就和UNet++的參數差不多,甚至還多了點.實驗結果如下:
?實驗證明,UNet++性能的提升和參數量無直接關系,和網絡結構有關.(不過這樣“無腦”增加參數的實驗,作者認為有點敷衍,應該還有更好的辦法來完善這個實驗,使它更有說服力,總之,作者這種研究思路和愛發現問題以及動手實驗值得我學習)
另外,實驗也證明了單純地把網絡變寬、把參數提上,對效果的提升并不大
8、簡單解讀UNet++
?從上面分析下來,我們可以解讀一下為什么UNet++好
解讀1:顯然它的優勢是可以抓取不同層次的特征,將它們通過特征疊加的方式整合. 不同層次的特征,或者說不同大小的感受野,對于大小不一的目標對象的敏感度是不同的,比如,感受野大的特征,可以很容易的識別出大物體的,但是在實際分割中,大物體邊緣信息和小物體本身是很容易被深層網絡一次次的降采樣和一次次升采樣給弄丟的,這個時候就可能需要感受野小的特征來幫助.而UNet++就是擁有不同大小的感受野,所以效果好.
解讀2:如果你橫著看其中一層的特征疊加過程,就像一個去年很火的DenseNet的結構,非常的巧合,原先的U-Net,橫著看就很像是Residual的結構,這個就很有意思了,UNet++對于U-Net分割效果提升可能和DenseNet對于ResNet分類效果的提升,原因如出一轍,因此,在解讀中作者他們也參考了Dense Connection的一些優勢,比方說特征的再利用等等.
以上說法不一各有各的,這些解讀都是很直觀的認識,其實在深度學習里面,某某結構效果優于某某結構的理由,或者你加這個操作比不加操作要好,很多時候是有玄學的味道在里頭,也有大量的工作也在探索深度網絡的可解釋性。
9、深監督(Deep Supervision)
剛剛在講本篇的第5節的時候留了一個伏筆,說這個結構在反向傳播的時候, 如果只用最右邊的一個loss來做的話, 中間部分會收不到過來的梯度,導致無法訓練, 解決的辦法除了用短連接的那個結構外,還有一個辦法就是用深監督(deep supervision).如下圖所示,具體的實現操作就是在圖中 X0,1 、X0,2、 X0,3 、X0,4后面加一個1x1的卷積核,相當于去監督每個level,或者說監督每個分支的U-Net的輸出。這樣可以解決那個結構無法訓練的問題.
雖然通過加入短連接解決了無法訓練的問題,但是作者仍然把deep supervision加入到UNet++中,因為這會帶來一個非常棒的優勢,就是剪枝
?10、剪枝
同時引出三個問題:
- 為什么UNet++可以被剪枝
- 如何剪枝
- 好處在哪里
?我們來看看為什么可以剪枝,這張圖特別的精彩。關注被剪掉的這部分,你會發現,在測試的階段,由于輸入的圖像只會前向傳播,扔掉這部分對前面的輸出完全沒有影響的,而在訓練階段,因為既有前向,又有反向傳播,被剪掉的部分是會幫助其他部分做權重更新的。即測試時,剪掉部分對剩余結構不做影響,訓練時,剪掉部分對剩余部分有影響。這就是第一個問題的回答.
因為在深監督的過程中,每個子網絡的輸出都其實已經是圖像的分割結果了,所以如果小的子網絡的輸出結果已經足夠好了,我們可以隨意的剪掉那些多余的部分
接著, 我們把每個剪完剩下的子網絡根據它們的深度命名為UNet++ L1,L2,L3,L4,后面會簡稱為L1~L4.
?第二個問題是如何去決定剪多少。因為在訓練模型的時候會把數據分為訓練集,驗證集和測試集,訓練集上是一定擬合的很好的,測試集是我們不能碰的,所以我們會根據子網絡在驗證集的結果來決定剪多少(所謂的驗證集就是從訓練集中分出來的數據,用來監測訓練過程用的)。下面是監督各個子網絡在驗證集下運行的效果:
?先看看L1~L4的網絡參數量,差了好多,L1只有0.1M,而L4有9M,也就是理論上如果L1的結果我是滿意的,那么模型可以被剪掉的參數達到98.8%。不過根據我們的四個數據集,L1的效果并不會那么好,因為太淺了嘛。但是其中有三個數據集顯示L2的結果和L4已經非常接近了,也就是說對于這三個數據集,在測試階段,我們不需要用9M的L4網絡,用0.5M的L2網絡就足夠了。
這也再一次回答了,網絡需要多深合適這個問題,這幅圖是不是就一目了然。網絡的深度和數據集的難度是有關系的,這四個數據集當中,第二個,也就是息肉分割是最難的,大家可以看到縱坐標,它代表分割的評價指標,越大越好,其他都能達到挺高的,但是唯獨息肉分割只有在30左右,對于比較難的數據集,可以看到網絡越深,它的分割結果是在不斷上升的。對于大多數比較簡單的分割問題,其實并不需要非常深,非常大的網絡就可以達到很不錯的精度了。
那我們回答第三個問題,剪枝有什么好處?
橫坐標代表的是在測試階段,單顯卡12G的TITAN X (Pascal)下,分割一萬張圖需要的時間。我們可以看到不同的模型大小,測試的時間差好多。如果比較L2和L4的話,就差了三倍之多。
?對于測試的速度,用這一幅圖會更清晰。我們統計了用不同的模型,1秒鐘可以分割多少的圖。如果用L2來代替L4的話,速度確實能提升三倍。
剪枝應用最多的就是在移動手機端了,根據模型的參數量,如果L2得到的效果和L4相近,模型的內存可以省18倍。還是非常可觀的數目。
關于剪枝的這部分作者認為是對原先的U-Net的一個很大的改觀,原來的結構過于刻板,并且沒有很好的利用不用層級的特征。
11、總結
簡單的總結一下,UNet++的第一個優勢就是精度的提升,這個應該是它整合了不同層次的特征所帶來的,第二個是靈活的網絡結構配合深監督,讓參數量巨大的深度網絡在可接受的精度范圍內大幅度的縮減參數量。
作者給我們帶來了非常飽滿的心路歷程, 這個過程我們學到了要想設計出更強的結構,你得首先明白這個結構,甚至它的原型(如U-Net)設計背后的心路歷程。
(從認識原型,到分析它的組成,到批判性的解讀,再到改進思路的形成,實驗設計,自問自答 ,這是我在這個作者身上學到的做研究的范式)
reference
1、UNet++作者批判UNet https://zhuanlan.zhihu.com/p/44958351
總結
以上是生活随笔為你收集整理的unet图像分割_UNet++解读 + 它是如何对UNet改进 + 作者的研究态度和方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux删除文件_Linux中删除特殊
- 下一篇: 5g虚拟技术旅游_5G造就文旅新时代,驴