(FCN)-Fully Convolutional Networks for Semantic Segmentation
文章目錄
- Fully Convolutional Networks for Semantic Segmentation
- 摘要
- 全局信息和局部信息
- 感受野
- FCN算法架構
- 訓練技巧
- 詳細參考
Fully Convolutional Networks for Semantic Segmentation
摘要
卷積網絡在計算機視覺領域是一個強有力的工具。我們證明了經過端到端、像素到像素訓練的卷積網絡超過了語義分割中最先進的技術。我們的核心思想是構建一個全卷積的網絡可以輸入一個任意的尺寸,經過有效的推理和學習過程產生相應尺寸的輸出。我們定義和描述了全卷積網絡的空間細節,解釋了FCN網絡在密集預測任務(dense prediction tasks)上的應用以及與先前模型的聯系。我們改編了當前的分類網絡(AlexNet、VGG、GoogLeNet)從全連接的方式為全卷積的方式并且通過微調的手段把它們的學習表現傳遞到分割任務中。我們定義了跳躍連接,其結合了深層的語義信息和來自淺層的表征信息來更準確和精細的進行分割。我們的FCN網絡在PASCAL VOC、NYUDv2和SIFT Flow上達到了state-of-the-art的結果,同時對一個典型的圖像推理只需要花費不到0.2秒的時間。
全局信息和局部信息
來看這幅圖,左邊輸入原始圖像后經過了三個下采樣塊(FCN中共有五次下采樣,每個塊之間的尺寸關系是二倍的關系),當經過前一個或兩個下采樣塊的時候(如上圖中第一個采樣塊所指的圖像)這一部分叫淺層網絡,這時拿到的圖像信息是比較豐富和細致的,這些從淺層網絡中提取到的信息就是局部信息。而隨著網絡的深入,等到后邊的采樣塊的時候,這時就到了深層網絡,圖像的信息基本都被破壞,只剩下了計算機能夠識別的高級特征。這時的空間信息比較豐富,這就是全局信息。對于局部信息而言,其感受野較小,有助于分割尺寸較小的目標,而全局信息的感受野較大,有助于分割尺寸較大的目標,有利于提高分割的精確程度。
在語義分割中存在的一個問題就是局部信息和全局信息內部相矛盾。其矛盾在于隨著下采樣的深入,局部信息全部產生在前邊的特征圖當中,最后得到的輸出一定是全局信息,也就是說所有的局部信息都被處理當做了全局信息。那么就意味著如果不對先前的局部信息進行保留的話就會在后邊的采樣中丟失、破壞。對應的解決方式就是跳躍結構完成特征融合,來共同提高的分割的精度。
感受野
在卷積神經網絡中,決定某一層輸出結果中一個元素所對應的輸入層的區域大小被稱為感受野。通常來說,大感受野的效果要比小感受野的效果更好。
RFl+1=RFl+(kernel_size-1)×stride為計算感受野大小的公式,RFl表示第l層的感受野。由公式可見,感受野是一個相對的概念,即下面一層的感受野大小是和上一層有聯系的,并不是一個絕對的數值,并且stride越大感受野也就越大。所以在深度學習中,按照慣例所有的感受野大小都是相對于原始圖像而言的。
拿上圖舉例來說,如果輸入是一個5×5的圖像,采用3×3的過濾器來進行卷積,卷積后得到了Layer2中的綠色元素點,那么這個綠色元素點的感受野大小就是3。通過公式計算在Layer3中黃色元素點的感受野是5,即原始輸入圖像的大小。這是因為在Layer2中每個元素點對應原始圖像的3×3的區域,在Layer2上應用一個3×3的過濾器最后得到了Layer3上的黃色元素點。那么這個元素點對應在Layer2上的區域是3×3的,而這個3×3的每個點都會對應到原始圖像上,所有的點對應回去后就是原始圖像本身。所以Layer3上黃色元素的點的感受野大小就是5了。
前文提到說stride越大,感受野也就越大。但是過大的stride會使feature map保留的信息變少,因此在減小stride的情況下,如何增大感受野或使其保持不變,成為了分割中的一大問題。
FCN算法架構
對于原始輸入圖像image,每經過一個卷積塊和一個池化層,會得到一個feature map,并且每一次經過池化后圖像尺寸變為了前一層的1/2。所以在FCN網絡中經過了5次下采樣,尺寸縮小為原始輸入圖像的1/32。在第六次和第七次卷積后,就沒有再改變圖像的尺寸了。但是從上圖中可以發現,最后的輸出,即32x upsampled prediction是和原始圖像大小相等的,這是由于加入了一個反卷積的操作。
模型圖右側分別有三個結果圖,32x/16x/8x upsampled prediction,這是什么意思呢?在經過conv6-7后,圖像是原始輸入圖像大小的1/32,通過一步反卷積直接還原32倍得到了最終的FCN-32s。這種操作在實際應用中是不好的,通常上采樣和下采樣會采用同樣的比例,因為如果還原的比例跨度太大總是得不到理想的輸出的。這里之所以這樣做是為了證明跳躍連接在FCN中是有作用的,這在后邊會有詳述。
將conv6-7換為2x conv7即二倍反卷積,再結合pool4做一個融合,即跳躍連接。pool4得到的feature map為原始圖像的1/16,這樣由于在匹配時要求數據的維度是相同的,所以要對1/32的圖像做二倍反卷積的還原,這樣數據大小一致就可以融合了,再用16倍上采樣最后得到了16x upsampled prediction。同理對于FCN-8s,要對conv7進行4倍的反卷積,pool4進行2倍的還原,才能與pool3的大小保持一致,進行三個特征圖的特征融合,得到了1/8的預測輸出。這樣對比三種還原操作還是FCN-8s是最柔和最精細的。
整個過程是非常簡單的,前邊的下采樣都是根據定義好的VGG網絡來完成的,再加入ImageNet上的預訓練權重加入到網絡中,最后結合反卷積還原完成了網絡的構建。
如圖所示就是一個比較詳細的FCN-8s架構。對于一個500×500×3的輸入,經過一層層的卷積和池化(藍色代表卷積、綠色代表池化)和兩個6-7層的卷積后得到16×16×4096大小的特征圖。將其拿出先做一個1×1的卷積,將通道改變為21,然后反卷積還原,擴大為34×34×21。這時與pool4的特征圖裁剪相同尺寸后相加融合,再擴大尺寸為70×70×21。再與pool3的特征圖匹配相加融合8倍反卷積,最終裁剪為與輸入圖像尺寸相等的特征圖。這樣就達到了端到端同尺寸輸入輸出的目的。
在論文的第二版中,對上述的架構圖進行修改優化,省略掉了卷積層,直接以池化的形式給出逐個步驟。然后對于每一次的相加融合以及反卷積還原有了更加直觀的解釋。
訓練技巧
1)加載預訓練模型:文章中反復提到模型會加載經典算法的預訓練模型。
2)初始化反卷積參數:使用線性插值的方式,對反卷積的卷積核進行初始化,這樣做的目的是為了讓其更快的收斂,若是不這樣做收斂速度很慢或是出現根本就不收斂的情況。intermediate upsampling layers are initialized to bilinear upsampling, and then learned.
3)至少175個epoch后算法才會有不錯的表現:文章作者進行了大量實驗,最后得出這一經驗性的總結。所以在實驗中要進行接近200次的循環才能等到一個可以接受的結果,在之前loss下降的不快或者是算法結果提升的不夠高都屬于一個正常的現象。We report the best results achieved after convergence at a fixed learning rate (at least 175 epochs).
4)學習率在100次后進行調整:調整學習率是一個很常見的優化手段,這一手段不局限于多少個epoch之后調整,只是說越到后邊學習率要調整的越小,這樣才不會錯過loss 的全局最小值。The learning rate is decreased by a factor of 100.
5)pool3之前的特征圖不需要融合:之所以不用pool1和pool2,在論文中解釋為通過實驗證實了加到pool1和pool2后對實驗的模型有一個負優化的作用,負優化后的結果不是很明顯但對結果的提升可以說是微乎其微的。那么不再引入這兩層就可以避免再次引入大量的參數,避免對FCN整體的效率產生影響。At this point our fusion improvements have met diminishing returns, both with respect to the IU metric which emphasizes large-scale correctness, and also in terms of the improvement visible e.g. in Figure 4, so we do not continue fusing even lower layers.
詳細參考
詳細參考:FCN的學習及理解(Fully Convolutional Networks for Semantic Segmentation)
總結
以上是生活随笔為你收集整理的(FCN)-Fully Convolutional Networks for Semantic Segmentation的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习——数据降维
- 下一篇: Citavi下载及使用