影象語義分割(1)-FCN:用於語義分割的全卷積神經網路
阿新 • • 發佈:2019-01-14
論文地址:Fully Convolutional Networks for Semantic Segmentation
[Long J , Shelhamer E , Darrell T . Fully Convolutional Networks for Semantic Segmentation[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2014, 39(4):640-651.]
論文實現:github程式碼
1. 創新
- 接收任意尺寸輸入的全卷積網路
- 使用反捲積的上取樣
- 融合深層粗糙特徵和淺層精細特徵的跳躍結構
2.模型提出
- 為什麼可以將CNN轉化為FCN?
全連線層可以看作卷積層,其中,feature map 1x1,向量長度為通道數。 - 為什麼需要上取樣?
端到端的密集預測需要輸入和輸出的尺寸一致,而提取特徵圖的過程中影象畫素降低,感受野變大,輸出尺寸與輸入不一致。 - 為什麼需要跳躍結構進行跨層特徵融合?
深層的特徵對應全域性的語義資訊,淺層的特徵對應著目標的位置資訊,語義分割二者都需要考慮,所以引入了跳躍結構。
3.模型架構
3.1 調整分類網路至全卷積以進行稠密預測
將全連線層替換為卷積層,如圖:
3.2 使用反捲積的上取樣
為了還原影象的尺寸,文章中提出了三種方法,即稀疏濾波(Shift-and-stitch)、雙線性插值、和反捲積, 並採用了反捲積的方法。反捲積是與卷積操作相反的計算,比如下圖是普通的卷積,4x4 Input、3x3 KernelSize、0 pad、1 stride:
反捲積將卷積還原:2x2 Input、3x3 KernelSize、0 pad、1 stride,如圖:
在TensorFlow框架中,反捲積過程如下:
3.3 跨層結構(skip architecture)
首先貼上論文中的結構圖:
首先是基礎的五步操作:
- Input n convs + 1 max Pooling poo1:: Input
- pool1 n convs + 1 max Pooling poo2:: Input
- pool2 n convs + 1 max Pooling poo3:: Input
- pool3 n convs + 1 max Pooling poo4:: Input
- pool4
n convs + 1 max Pooling
poo5::
Input
應用跳躍結構得到三種不同的模型: - 直接對 pool5 進行 32x 上取樣後,將得到的特徵圖扔給Softmax分類器,得到密集預測結果 FCN-32s
- 對 pool5 進行 2x 上取樣得到與 pool4 尺寸一樣的上取樣特徵,並於 pool4 逐點相加得到特徵圖,對此特徵圖進行 16x 上取樣,將得到的特徵圖扔給Softmax分類器,得到密集預測結果 FCN-16s
- 對 pool5 進行 2x 上取樣得到與 pool4 尺寸一樣的上取樣特徵,對此特徵進行 2x 上取樣得到與 pool3 尺寸一樣的上取樣特徵,並於 pool3 逐點相加得到特徵圖,對此特徵圖進行 8x 上取樣,將得到的特徵圖扔給Softmax分類器,得到密集預測結果 FCN-8s
4. 訓練
4.1 StageWise Training
- 將經典分類網路初始化,棄用全連線層為卷積層
- 從特徵小圖 16x16x4096 預測分割小圖 16x16x21,之後上取樣為大圖。反捲積步長為32
- 融合pool4,反捲積步長16
- 融合pool3,反捲積步長8,得到效果最好的FCN-8s
4.2 其他細節
- 使用資料增強方式對最終結果影響不大(需要思考一波為什麼和這種效果與GAN的聯絡);增加有效標註數量提升了最終的效能
- 引數:20 mini batch;固定學習率;動量 0.9;weight decay
- 微調:對整個網路進行微調對效能的提升不大,因為直接微調後幾層就會達到前者70%左右的效能
- 沒有類別平衡策略