Index
- Introduction
- Analysis
- FC layer -> Convolutional layer
- Fine tune
- Up-Sampling
- Skip-layer
Introduction
CVPR2015最佳論文<Fully Convolutional Networks for Semantic Segmentation>介紹了FCN網絡用于語義分割。該論文提出了端對端的FCN(全卷積網絡),使用了pixel級別的預測以及有監督學習預訓練。此外,論文中的網絡可以接受任意大小的圖片輸入。
通常的CNN網絡包含以下結構: [INPUT - CONV - RELU - POOL - FC].
- 卷積層 convolution
- ReLu
- 池化層 pooling
- 全連接層 fully connected
在論文中,FCN將全連接層替換為卷積層和轉置卷積層,端對端得生成語義分割圖像。如下圖:
Analysis
FC layer -> Convolutional layer
卷積層與全連接層的區別在于,卷積層是局部感知并且共享權值的。也就是說,卷積層在某個時刻只作用于某個局部區域,通過移動filter,來達到不同的局部區域共享權值。而在全連接層中,比如32個神經元連接到64個神經元時候,有[32x64]個權值,即每一個輸入層都與每一個輸出層連接,并有自己的權值。
實際上,由于全連接層與卷積層與輸入的計算方式都為點乘,因此可以實現全連接層與卷積層的相互轉換:
- 對于每一個卷積層conv,都有全連接層fc與其表示相同的forward function。此時fc中大多數區域都為0,只存在某些塊有值(由于局部連接)。而這些塊的值相同(由于共享權值)。
- 同樣的,對于每一個fc,都有conv與其表示相同的forward function。例如,當輸入為[7x7x512]時,假設fc輸出層size為4096,則有7x7x512x4096個weights. 此時用conv層代替fc,則filter為[7x7x512], strides=1, padding=0, 輸出size為[1x1x4096]。
Fine-tune
文章采用了fine-tune的方法,采用了在ImagenNet訓練好的VGG,AlexNet,GoogLeNet。具體來講,文章對訓練好的模型全連接層進行fine-tune,將訓練好模型最后的全連接層變為卷積層以及Up-sampling層,再對其進行訓練。
Fine-tune一般分為下面幾種情況:
(1)新數據集小而且與原數據集相似。由于數據集小,容易出現過擬合的問題,此時不應該對ConvNet進行fine-tune,而是將訓練好的模型作為特征提取模型,然后再對提取的特征訓練一個線性分類器如(SVM,Softmax分類器等)。
(2)新數據集很大并且與原數據集相似。此時由于有更多的數據,我們不需要擔心過擬合問題,因此可以對整個網絡進行fine-tune。
(3)新數據集很小但是與原數據集很不相同。由于數據集很小,我們同樣只訓練一個線性分類器。但是此時數據集和原數據集差別較大,我們使用訓練好的網絡淺層提取的特征來訓練線性分類器,而非使用深層特征。CNN深層卷積核通常會提取更高維的特征。這些高維特征與數據集是相對應的,如AlexNet中,可能存在能夠提取狗胡子特征的卷積核,而我們的新數據是關于車輛識別時,就不應該使用高維特征。
(4)新數據集很大而且與原數據集相差較大。此時我們可以從頭訓練一個CNN網絡,將大數據集訓練好的CNN網絡參數用于初始化新模型參數。
更多關于Fine-tune的內容可以等待正在寫的一篇關于遷移學習的文章。(此處應有鏈接)
Up-Sampling
Up-Sampling(升采樣)是Deconvolution的應用之一。在FCN中,池化造成了圖像尺寸成倍縮小,要端對端得生成分割圖像,則需要升采樣,在這里的語義下,也就是Deconvolution(逆卷積)。
Deconvolution(逆卷積)還有一個叫法為轉置卷積(在tensorflow中)。轉置卷積是卷積做相反的正向和反向傳播操作。
卷積操作時,令y = Cx,其中C為weights矩陣。則反向傳播時候:
在Deconvolution的情況下,正向傳播y‘=C_Tx', 反向傳播為C乘偏導。
Deconvolution還可以應用在無監督學習以及卷積可視化中
Skip-layer
實驗發現,直接對訓練好的VGG16進行fine-tune并在最后進行up-sampling的效果并不好,如下圖:
FCN-32s即為FCN-VGG16,其中32s代表其strides=32。CNN低維提取的信息包含更多局部信息如location,而高維信息則包含了全局的信息如該物體是什么。文章中添加了skips,將淺層的特征與最后結果相加,得到最終圖像。其結構如下:
舉例來說,對于FCN-16s,pool4得到的特征圖的尺寸為原圖像的1/2^4 (經歷了四次池化),而conv7得到的特征圖尺寸為原圖像的1/2^5 (經歷了五次池化),此時,將conv7通過一個2x的up-sampling層,得到1/2^4的特征圖,再與pool4特征圖相加,然后用一個16x的up-sampling,得到與原圖同樣大小的輸出,進行pixel級訓練。
有時間會講解FCN的tensorflow或者torch代碼。
系列文章包括:
- 生物醫學圖像語義分割(一)FCN
- 生物醫學圖像語義分割(二)U-Net
- 生物醫學圖像語義分割(三)CVPR2017-Fine-tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively and Incrementally