淺談語義分割網路U-Net
theme: cyanosis
持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第10天,點選檢視活動詳情
我一個做NLP的本來是用不到U-Net的,但是現在我在搞擴散模型嘛,擴散模型中神經網路部分用的是U-Net,所以我就得淺淺地學習一下子。
U-Net出自 U-Net: Convolutional Networks for Biomedical Image Segmentation
這個網路和別的自編碼(autoe第二步是就是ncoder)模型一樣,在中間有一個bottleneck,以確保網路只學習最重要的資訊。和他之前的模型的一個區別是它引入了編碼器和解碼器之間的殘差連線,大大改善了梯度流。
看下圖,看這個形狀你們應該就知道它為什麼叫U-Net了。
可以看出,U-Net模型首先對輸入進行downsamples即在空間解析度上使輸入變小,進行特徵提取,然後再進行updownsamples,用於精確定位,文中使用的是bilinear雙線性插值。
該網路由收縮路徑(contracting path)和擴張路徑(expanding path)組成。我們可以將兩部分認為是encoder-decoder結構。
接下來介紹一下影象的處理過程。 看一下右下角的圖例: - 藍色箭頭代表3*3的卷積+ReLU - 灰色箭頭代表複製裁剪 - 紅色箭頭是池化 - 綠色箭頭是upsampling上取樣 - 青色箭頭是坐了個1*1的卷積
- 而圖中的藍色框框就是feature map了。
第一步接收到影象之後是將影象從1通道轉化成64通道,順便做了一個卷積,用的是3x3 的卷積核,padding 為 0 ,striding 為 1,所以每次計算之後影象H、W兩個維度都會減2。
第二步是進行一次 stride 為 2 的 max pooling。
之後就是一直重複直到最底下那三個,你先是得到一個32*32通道數為512的features map,然後再進行兩次卷積最後得到通道數1024的28*28的features map。
看一下這一部分是怎麼來的。白色部分是從左邊直接裁剪出來的,用於殘差連線,直接拼接到原來的維度上。右邊藍色部分就是通過一個反捲積插值擴大維度。
雖然我們認為U-Net屬於 FCN 的一種變體,但是在這一步中體現出了FCN和U-Net很重要的一個區別。在這裡處理的時候U-Net使用的是concat,將兩部分拼接到一起,但是傳統的FCN在這一步中是將二者相加。
至於向上的綠色箭頭進行反捲積,我們可以簡單地理解為使用公式進行定位,以原來features map中的點為核心將影象補全。
將一個 2x2 的矩陣通過插值的方式得到 4x4 的矩陣,那麼將 2x2 的矩陣稱為源矩陣,4x4 的矩陣稱為目標矩陣。雙線性插值中,目標點的值是由離他最近的 4 個點的值計算得到的。
計算公式如下:
$$ \begin{aligned} &X_{後}=\left(X_{前}+0.5\right) \left(\frac{\text { Width }{後}}{\text { Width }{前}}\right)-0.5\ &Y_{後}=\left(Y_{前}+0.5\right) \left(\frac{\text { Height }{後}}{\text { Height }{前}}\right)-0.5 \end{aligned} $$
舉個例子,假設我們現在要計算這個黑色格子,那根據公式:
$$ \begin{aligned} &0=\left(X_{前}+0.5\right) 2-0.5\ &1=\left(Y_{前}+0.5\right) 2-0.5 \end{aligned} $$
得到
$$ \begin{aligned} X_{前}&=-0.25\ Y_{前}&=0.25 \end{aligned} $$
源矩陣長這樣,肯定不能找到$(-0.25,0.25)$的位置,所以我們將其擴充,找到這個位置周圍的四個點即可。
所以對應的四個位置是$(-1,0) \quad (-1,1)\quad (0,0)\quad (0,1)$
然後使用公式 $$ \begin{aligned} f(x + u, y + v) =& (1 - u) (1 - v) f(x, y) + (1 - u) v f(x, y+ 1) \ &+ u (1 - v) f(x + 1, y) + u v f(x + 1, y+ 1) \end{aligned} $$
帶入計算得到:
$$ \begin{aligned} &(1 - 0.75) (1 - 0.25) 6+ (1 - 0.75) 0.25 6 + 0.75 (1 - 0.25)5 + 0.75 0.25 5\ &= 0.250.756+0.250.256+0.750.755+0.750.255 \ &=5.25 \end{aligned} $$
最終計算得到黑色格子為5.25。
其他過程以此類推。U-Net就是這樣,不斷使特徵變短的過程叫下采樣,不斷恢復特徵長度叫上取樣,上下采樣兩部分共同組成一個U-Net。
- 【翻譯】最近興起的擴散模型
- 深扒torch.autograd原理
- 用一個影象分類例項拿捏Pytorch使用方法
- 帶你瞭解自然語言處理文字生成方向
- 你們居然還在用負樣本做對比學習?
- 4個例子幫你梳理PyTorch的nn module
- 幾個例子幫你梳理PyTorch知識點(張量、autograd)
- SimCSE,丹琦女神把對比學習用到了NLP中了!
- 兩個視角給你解讀 熵、交叉熵、KL散度
- 你們那種對比學習是辣雞,我SwAV今天就要開啟新局面!
- “軍備競賽”時期的對比學習
- 怎麼用PyTorch實現一個Encoder-Decoder框架?
- 公式程式碼都有了,速來學LSTM 長短期記憶網路
- 【翻譯】圖解自注意力機制
- 用pytorch寫個RNN 迴圈神經網路
- 用pytorch寫個 GRU 門控迴圈單元
- 手把手教你實現 seq2seq
- 突然火起來的diffusion model是什麼?
- TensorBoard 一行程式碼實現指標視覺化
- 【翻譯】圖解transformer