# [論文筆記] MultiResUNet: Rethinking the U-Net architecteure for multimodal biomedical image segmentation
###### tags: `MultiResUNet` `Biomedical Image` `Segmentation` `UNet`
2018年的論文,來自UNet的變形,以tensorflow-keras框架呈現。
## 摘要
**MultiResUNet**,被視作UNet的接班人!
- 創新點
- 將較大的捲積層(5x5、7x7)以一連串更輕便的3x3捲積塊來分解,並引入1x1捲積層,添加residual connection,使model可學習到一些額外的空間訊息。
- 套用Res path取代原版UNet的skip connection。
## 引言
電腦輔助醫學影像分析的主要任務為二: **切割、診斷**。
傳統且簡單的方法在遇到大量數據時無法保持強健性(Robustness),轉而使用深度學習的方法。
即便在電腦視覺領域已取得突破,但其需要大量的訓練資料,
而這是醫學影像所缺乏的,畢竟**取得不易且精確標註的成本過高**。
UNet架構類似FCN和SegNet,呈對稱結構,具有:
**可以萃取影像的空間訊息的Encoder和建構segmentation map的Decoder**,
最重要的部分則是**skip connection**,使得network可以**取回在pooling時遺失的空間訊息**。
---
**MultiResUNet 優點**:
1. 可以在較少epochs得到更好的結果
2. 更好地勾畫出隱約的邊界(delineate faint boundaries)
3. 對擾動(perturbations)更免疫
4. 在異常值上更可靠
---
## 架構
先分別放上傳統UNet和改良過後的MultiResUNet


經由比較,可以看到主要的差異就**在MultiRes Blocks**和**Res Path**。
- **MultiRes Blocks**

- 由(a)可得知用多重分辨率分析功能增強U-Net的最簡單方法是將3×3和7×7卷積運算與5×5卷積運算並行地合併(效仿Inception Network)
- 由(b)可看見另一種替代方案是使用步距卷積(Strided convolution)(Wang等人,2018),但在本文的實驗中,儘管有更佳的表現,但卻因並行引入額外的捲積層,而增加了過大的內存需求。
- 於是藉由(b)的概念,作者將較大的捲積層(5x5、7x7)以一連串更輕便的3x3捲積塊來分解,並引入1x1捲積層,添加residual connection,使model可學習到一些額外的空間訊息,得到(c )。
$W = \alpha * U$ :要傳送到下一個block前之input layer的filter 個數
$U$: number of filters $\alpha$: scalar coefficient
```python=135
W = alpha * U
shortcut = inp
shortcut = conv2d_bn(shortcut, int(W*0.167) + int(W*0.333) +
int(W*0.5), 1, 1, activation=None, padding='same')
conv3x3 = conv2d_bn(inp, int(W*0.167), 3, 3,
activation='relu', padding='same')
conv5x5 = conv2d_bn(conv3x3, int(W*0.333), 3, 3,
activation='relu', padding='same')
conv7x7 = conv2d_bn(conv5x5, int(W*0.5), 3, 3,
activation='relu', padding='same')
out = concatenate([conv3x3, conv5x5, conv7x7], axis=3)
out = BatchNormalization(axis=3)(out)
out = add([shortcut, out])
out = Activation('relu')(out)
out = BatchNormalization(axis=3)(out)
```
- **Res Path**

- 引入殘差連接,用3x3的filter於捲積層,並附帶1x1filter的residual connections
這些額外的非線性運算是為了消除Encoder和Decoder間的語意鴻溝。
```python=175
shortcut = inp
shortcut = conv2d_bn(shortcut, filters, 1, 1,
activation=None, padding='same')
out = conv2d_bn(inp, filters, 3, 3, activation='relu', padding='same')
out = add([shortcut, out])
out = Activation('relu')(out)
out = BatchNormalization(axis=3)(out)
```
## 訓練
做了一般以下四種比較,來凸顯創新點的好壞:
- UNet
- UNet + ResPath
- UNet + ResBlocks
- MultiResUNet

*由圖d、j:*
**Unet + ResBlocks** 會有切割不連續的現象。(進而推測ResPath可讓連續且同質的區域更相同)
*由圖e、k:*
**Unet + ResPath** 雖然可以減緩切割不連續的現象,但對於邊緣檢測來說效果不彰。(推測ResBlocks有改善整體邊緣檢測的效果)
## 實作


