paper: U-Net: Convolutional Networks for Biomedical Image Segmentation
code: PyTorch,官方公布的matlab的caffe版本
如果需要看網絡結構,可以用這個prototxt文件unet prototxt,網絡結構查看工具http://ethereon.github.io/netscope/quickstart.html
Abstract
- Unet是2015年的一篇工作了,在醫療圖像分割中,能夠在很少的訓練集上實現比較好的分割效果。同時,設計的Encode-Decode結構(U形結構),在后來的很多方法中被借鑒使用
- 現在回過來看UNet的工作,整體思路還是比較簡單的,具體的細節,將按照如下的網絡結構圖進行展開闡述:

Details
-
每一層的尺寸
- 訓練樣本的大小是
512*512,為了能夠包含到圖像邊緣的像素點,將訓練樣本擴充為572*572(圖像邊緣多30個像素,用圖像內的像素對稱填充),如下圖
- 至於為什么擴充30個像素,個人理解是為了保證對Encode中的倒數第二個特征圖(也就是Decode時進行concat的第一個層)crop時不會把原始圖像的邊緣信息裁剪掉,如上圖中右側原始圖像的一個點,其按照Encode的反向過程計算的感受野大小為\( ((0\times2+2+2)\times2+2+2)\times2+2+2)\times2+2+2 = 60 \)
- Encode過程中,每一層的卷積都是valid卷積,即
padding=0,這就會導致每一層執行一次3*3卷積尺寸便縮小減小4個像素。這里如果用same conv,網絡結構設計上應該也會更隨意些 - 整個UNet共計經過4次下采樣和4次上采樣,除最后一層外全部使用的是
3*3(valid conv),最后一層使用1*1,共計23層conv
- 訓練樣本的大小是
-
每一層的channel個數
- Encode每次執行pooling后,kernel的個數都會增加一倍,而Decode的過程中,則是反過來的
-
Encode-Decode結構的連接方式
- 這里連接是為了將低層特征和高層特征進行融合
- 對於低層特征(encode部分的feature map),由於前面提到的valild conv,在decode中的層執行upconv操作后,和原始尺寸還是有偏差的,因此直接將encode過程中的feature map裁剪成相同大小的feature map,然后在直接在channel維度concate,而不是element-wise的sum;同時,原始輸入圖像擴充,也保證了這里crop時原始圖像的特征不會被丟棄
-
Loss
- unet使用的是二分類交叉熵損失,如果用於多分類,該用多分類交叉熵即可
- unet本身對二分類交叉熵loss進行了修改,引入weighted map,使得網絡能夠學習到更好的邊界信息,這里不再贅述。(個人理解,對於其他語義分割任務,用原始交叉熵即可)
