---
# System prepended metadata

title: U-Net Note
tags: [Paper Note]

---

# U-Net Note

::: danger
紅色danger部分，代表我們還沒看很懂得地方
:::

## Abstract:

依賴於annoted data(labeled data?)的data agumentation的訓練策略

包含: contracting path(把資料縮小的過程 ex 卷積)、expanding path(把資料放大，把縮小的資料還原原大小)

這個方法可以用少量的image做到比sliding network的卷積方式更好的結果

訓練一張512*512的圖只要不到一秒

---

## Introduction:

傳統卷積網路，受限於avaiable data set的size，醫學上的data就很少。

傳統卷積常用作分類，只輸出單一label，但在醫學上，會希望附上localization(eg: label可以被標在pixel上，而非圖上)

2012年Ciresan等人，做了一個sliding-window CNN，然後把資料的每個pixel取一個local region(patch)，再用patch去訓練。

這樣讓網路可以做到localization，並且能用的training data變得多很多。但是練起來會很慢，並且因為patch overlapping會有很多的redundancy(冗餘)。

另外，有個trade-off在於localization accuracy與use of context，大patch會導致需要更多max-pooling(池化)使準度下降，小patch則只有更小的context，

有很多更好的網路後來解決的這個trade-off問題

----

這篇paper建了一個fully CNN(把全連接層的部分，換成卷積)，然後把裡面的pooling operator layer換成upsampling(反卷積(本文)、反池化等，可以增加data大小，在fully CNN常用的有FCN-8,FCN-16,FCN-32) operator layer

:::spoiler unampling, copy&crop補充
關於upsampling:[link](https://zhuanlan.zhihu.com/p/359762840)，裡面很詳細的介紹了各種反卷積反池化的方式，比之，下面的只是我隨便截幾張圖代表的

unpooling:
1:
![image](https://hackmd.io/_uploads/HkMdGWQ0p.png)
2:
![image](https://hackmd.io/_uploads/SJqdMZ70p.png)


補充: 卷積實際上可以被換成矩陣的相乘(Y=CX)，而反卷積就是反過來，乘以卷積矩陣的transpose矩陣(不過不會回復原圖，只是回復了矩陣的大小)
[參考資料](https://zhuanlan.zhihu.com/p/48501100)
[參考資料2](https://medium.com/ching-i/fully-convolutional-networks-%E8%AB%96%E6%96%87%E9%96%B1%E8%AE%80-246aa68ce4ad)

補充:
[copy and crop的資料](https://zhuanlan.zhihu.com/p/42833949)
就是為了解決梯度消失而存在的
:::



這份paper對於upsampling的一大修改是，擴增了feature channel(特徵深度，ex: RGB是3)，讓他可以傳遞到更高的resolution layer(應該就是upsampling) 形成了一個U型結構

![image](https://hackmd.io/_uploads/ByKfq81AT.png)
(小備註: feature channel會變深是因為用了多個捲積核，提取不同特徵後疊在一起的，有多深就是用了幾個捲積核)

這個網路沒有任何fully connected layer(因為全連接層是忽略空間訊息的，因為他就像是對於全局的捲積，是為了圖中再任意位置出現該有的特徵，就輸出對應結果，這不符合localization要得)。
[參考link](https://zhuanlan.zhihu.com/p/33841176)


卷積過程中，只使用完全在convolution之內的pixel(稱為 vaild part)[參考資料，卷積的valid mode](https://blog.csdn.net/leviopku/article/details/80327478)

在論文發出的當時，由於GPU記憶體比較小，所以如果圖太大，會把圖分割成好幾個小圖

![image](https://hackmd.io/_uploads/Bkr7CUJ06.png)

如果遇到了在小圖的邊邊的問題，因為缺少上下文，他會使用鏡像反射複製一張input image作為context。

該網路是為了適應少量資料，所以他的data augment使用了elastic deformations(彈性變形，即用非線性的方式，模擬物理的彈性變化，做出很多張圖)。

另外，醫學上會面臨圖像中的細胞分割任務(cell segmentation，把一張圖上的兩個細胞分開來)，該model使用了。該model利用把背景的loss權重調大來達成

---


## Network Architecture

![image](https://hackmd.io/_uploads/BkgTQ8eRp.png)
圖的左邊是contracting path，右邊是expansive path

左邊的結構就是傳統的CNN，基本上看圖就懂了，包含3\*3捲積、2\*2max-pool、Relu avtivation func，每次downsampling(pooling)之後，就會加倍feature channel

右邊，則是由2\*2 upsampling與3\*3 conv組成，並且每次upsampling後，會用conv降低feature channel

最後一層則把它一路捲積到剩下64時，用1/*1的conv把他的feature channel降維到2(希望的class數量)

總共進行了23次convolutional layer(作者應該把up-conv也算進去了?)

然後這個網路要挑選適當的image size，以確保每次pooling都是對於偶數size進行

可以看見，輸出圖比輸入圖還小，這是因為使用了卷積的valid mode，造成的-2導致的差異，[參考連結](https://blog.csdn.net/leviopku/article/details/80327478)

但這張圖似乎不是最終圖，為了解決圖片變小的問題，會使用前面講到的鏡像複製擴大圖片，然後讓最終的輸出跟原圖一樣

/*
鏡像複製好處除了不會縮放圖片，也可以適應全部大小的圖片，也可以調整輸出使其與原圖相同
*/
[overlap-tile](https://blog.csdn.net/soaring_casia/article/details/110677745)
所以最終出來的圖應該長這樣
![image](https://hackmd.io/_uploads/HJAfa_QC6.png)



## Training

用隨機梯度下降

為了最大化運用GPU memory，通常會偏好更大張的而非更大的batch

使用了高的momentum(0.99)(梯度下降的一個參數，會把一次梯度下降動的向量，再加上一部分的前幾次的向量，0.99代表被前面決定很多)(具體怎麼算窩不知道)

先解釋一些名詞:
enery function: 應該跟loss function一樣
pixel-wise: 對於每個pixel逐一處理而不看整體
soft-max: 把pixel變成0~1之間的概率

該model的energy function是cross entropy loss function，然後他會對於final feature map用pixel-wise soft-max，也就是把要輸出的東西，變成是某個class的概率

這個model裡面的soft-max的函數長這樣:
![image](https://hackmd.io/_uploads/BySv6veA6.png)
$a_k(x)$是對於final map上x位置(x是二維向量)的pixel，把他的feature channel的第k個(第k個class)用activation function1變成0~1之間

$p_k(x)$是approximated maxiumn-function，是跟activation得出結果相似的函數，但比較好用來做energy  function的計算

energy function則是:
![image](https://hackmd.io/_uploads/H1wXkde0T.png)
![image](https://hackmd.io/_uploads/SJX01OlCp.png)

L(x)是從x映射到(1~K)的函數，映射到該pixel的true label，形成$p_k(x)$，當$p_k(x)$越小，代表model預測是ture label的機率越小，log出來的值也就負越多。當$p_k(x)$==1，該處獲得的值為0

w(x)是用來調整不同pixel重要性的權重函數，因為log會引出一個負號，所以w應該會是負值?

然後w(x)會是使用者預先計算出來的weight map，當這個class很常在Ground truth map出現，他的weight絕對值會更低，反之則更高，用來讓model不會過度關注那些出現率高的class，而會去關注比較少出現的類別

同時，作者也在ground truth map中，不同class(這裡是寫不同的cell，我其實也不確定是不是不同class /* 應該是同class */ )的邊界設下更高的weight，讓model能夠更好的辨識邊界

此為w(x)的初始化的計算方式
![image](https://hackmd.io/_uploads/r125-nlRa.png)

$w_c(x)$是用來平衡class出現次數的function
$d_1(x)$是離最近cell的邊界的距離，$d_2$則是離第2近cell邊界
在作者的實驗中，$w_0$設10，$\sigma$設5(pixel)



/*
對於權重的初始化，理想是每一個feature map要有差不多unit variance(單位變異數)

他們是用Gaussian distribution with a standard deviation(標準差) of $\sqrt{2/N}$

::: danger
N是單一神經元所接收到的 feature數 * conv
舉例:3x3 convolution and 64 feature channels in the previous layer
N = 9 * 64 = 576

*/
:::

### 3.1 Data Agumentation

[w-r-p-error](https://cvinvolution.medium.com/warping-error-rand-error-and-pixel-error-in-semantic-segmentation-5cd561ba99cb)

[warp-error](https://imagej.net/plugins/tws/topology-preserving-warping-error)
pixel error: $與ground truth 不同的predict pixel / ground truth pixel$

N = (predict == GT)
M = GT
pixel error公式: $(M - N) / M$ 

warping error: pixel error的不在意細節版
![image](https://hackmd.io/_uploads/H1XxHs406.png)


先semantic segmentation 把 所有 pixels cluster into integer indexes

a =  X &  Y
(number of element pair in the same subset of (X clasifier,Y clasifier))
b = !X & !Y
c =  X & !Y
d = !X &  Y

rand index (RI):
= (a + b) / (a + b + c + d) 
= (a + b) / C(n,2)

(n : element 數)
rand error (RE): 1 — RI

rand index = Dice Coefficient 的無視index重視cluster結果版
![image](https://hackmd.io/_uploads/HyhAKjVAa.png)
這張圖 Dice 低 但rand 高，在cell segmatation 中 
分開細胞 > 分開不同類細胞，所以用rand較好

[Dice and IOU](https://cvinvolution.medium.com/dice-loss-in-medical-image-segmentation-d0e476eb486)


實驗中，作者使用了elastic deformaion，做法是把圖片分成好3 * 3為一格單位的網格狀圖，然後以一格為單位去做位移

位移的隨機變量samlping自標準差為10(pixel)的常態分佈

:::danger
然後使用bicubic interpolation(雙三次插值)計算每個pixel的偏移量
:::

再contracting path的最後，還會有個dropout layer(隨機讓某些神經元的輸出為0，藉此讓data失去某部分訊息，用來強化魯棒性)，也算是另類的data augmentation

## Exeperiment

這個model做了3個實驗

但我只看到兩個???
1. 電子顯微鏡下的神經結構分割(segmentatiom)
2. cell segmentation

這段其實沒啥重要的

## conlution

U-net在bio-medical segmentation的表現非常突出
因為有elastic deformation，他可以只用很少的資料，以及合理的時間去訓練

[他人論文摘要](https://medium.com/@hyponymous/paper-summary-u-net-convolutional-networks-for-biomedical-image-segmentation-8df7b802281)