【論文筆記】FCN全卷積網(wǎng)絡(luò)
全卷積網(wǎng)絡(luò)(FCN)是用于圖片語(yǔ)義分割的一種卷積神經(jīng)網(wǎng)絡(luò)(CNN),由Jonathan Long,Evan Shelhamer 和Trevor Darrell提出,由此開啟了深度學(xué)習(xí)在語(yǔ)義分割中的應(yīng)用。語(yǔ)義分割是計(jì)算機(jī)視覺領(lǐng)域很重要的一個(gè)分支,在自動(dòng)駕駛、地面檢測(cè)等方面都起到很重要作用。與簡(jiǎn)單區(qū)分前景后景的圖像分割技術(shù)不同,語(yǔ)義分割則不僅是區(qū)分每個(gè)像素的前后景,更需要將其所屬類別預(yù)測(cè)出來(lái),屬于像素層面的分類,是密集的目標(biāo)識(shí)別。傳統(tǒng)用于語(yǔ)義分割的CNN網(wǎng)絡(luò)每個(gè)像素點(diǎn)用包圍其的對(duì)象或區(qū)域類別進(jìn)行標(biāo)注,無(wú)論是在分割速度還是分割精度層面都很不理想。FCN參考了CNN在圖像分類領(lǐng)域成功的經(jīng)驗(yàn),是一種端到端、像素到像素的模型,在多個(gè)語(yǔ)義分割的指標(biāo)中均達(dá)到了state-of-the-art。
1 傳統(tǒng)的CNN在做語(yǔ)義分割存在的問(wèn)題
CNN做圖像分類甚至做目標(biāo)檢測(cè)的效果已經(jīng)被證明并廣泛應(yīng)用,圖像語(yǔ)義分割本質(zhì)上也可以認(rèn)為是稠密的目標(biāo)識(shí)別(需要預(yù)測(cè)每個(gè)像素點(diǎn)的類別)。對(duì)于一般的分類CNN網(wǎng)絡(luò),如VGG和Resnet,都會(huì)在網(wǎng)絡(luò)的最后加入一些全連接層,經(jīng)過(guò)softmax后就可以獲得類別概率信息。但是這個(gè)概率信息是1維的,即只能標(biāo)識(shí)整個(gè)圖片的類別,不能標(biāo)識(shí)每個(gè)像素點(diǎn)的類別,所以這種全連接方法不適用于圖像分割。
傳統(tǒng)的基于CNN的語(yǔ)義分割方法是:將像素周圍一個(gè)小區(qū)域(如25*25)作為CNN輸入,做訓(xùn)練和預(yù)測(cè)。這種方法有幾個(gè)缺點(diǎn):
- 存儲(chǔ)開銷很大。例如對(duì)每個(gè)像素使用的圖像塊的大小為25x25,然后不斷滑動(dòng)窗口,每次滑動(dòng)的窗口給CNN進(jìn)行判別分類,因此則所需的存儲(chǔ)空間根據(jù)滑動(dòng)窗口的次數(shù)和大小急劇上升。
- 計(jì)算效率低下。相鄰的像素塊基本上是重復(fù)的,針對(duì)每個(gè)像素塊逐個(gè)計(jì)算卷積,這種計(jì)算也有很大程度上的重復(fù)。
- 像素塊大小的限制了感知區(qū)域的大小。通常像素塊的大小比整幅圖像的大小小很多,只能提取一些局部的特征,從而導(dǎo)致分類的性能受到限制。
2 FCN網(wǎng)絡(luò)
2.1 將全連接層轉(zhuǎn)化為卷積層
通常的識(shí)別網(wǎng)絡(luò),包括LeNet,AlexNet,以及后面更加優(yōu)秀的網(wǎng)絡(luò)結(jié)構(gòu),都是輸入固定大小的圖像,得到非空間結(jié)構(gòu)的輸出。但是,這些網(wǎng)絡(luò)的全連接層也可以看做是覆蓋整個(gè)圖像區(qū)域的卷積核。因此,可以將其轉(zhuǎn)化為全卷積網(wǎng)絡(luò),那么可以輸入任意大小的圖像,輸出分類特征圖,保留了空間信息。

如何將全連接層轉(zhuǎn)化為卷積層?
比如一個(gè)7×7×512的特征矩陣,首先將其展平(flatten)為1×1×25088的向量,再通過(guò)全連接層得到長(zhǎng)度為4096的向量,總參數(shù)量為25088×4096=102760448。如果使用卷積(7×7,s1,4096)代替全連接層,輸出也是長(zhǎng)度為4096的向量,總參數(shù)量為7×7×512×4096=102760448。每一個(gè)卷積核有7×7×512=25088個(gè)參數(shù),而全連接輸出向量中的每一個(gè)值都是由25088個(gè)值乘上權(quán)重得來(lái),計(jì)算過(guò)程是一樣的,所以4096個(gè)卷積核的參數(shù)可以由全連接層的4096個(gè)節(jié)點(diǎn)的參數(shù)reshape得到。
2.2 上采樣
卷積操作和池化操作會(huì)使得特征圖的尺寸變小,為得到原圖像大小的稠密像素預(yù)測(cè),需要對(duì)得到的特征圖進(jìn)行上采樣操作。可通過(guò)雙線性插值(Bilinear)實(shí)現(xiàn)上采樣,且雙線性插值易于通過(guò)固定卷積核的轉(zhuǎn)置卷積(transposed convolution)實(shí)現(xiàn),轉(zhuǎn)置卷積即為反卷積(deconvolution)。在論文中,作者并沒有固定卷積核,而是讓卷積核變成可學(xué)習(xí)的參數(shù)。轉(zhuǎn)置卷積操作過(guò)程如下:
- 在輸入特征圖元素間填充s-1行、列0(其中s表示轉(zhuǎn)置卷積的步距)
- 在輸入特征圖四周填充k-p-1行、列0(其中k表示轉(zhuǎn)置卷積的kernel_size大小,p為轉(zhuǎn)置卷積的padding,注意這里的padding和卷積操作中有些不同)
- 將卷積核參數(shù)上下、左右翻轉(zhuǎn)
- 做正常卷積運(yùn)算(填充0,步距1)
示例 下面假設(shè)輸入的特征圖大小為2x2(假設(shè)輸入輸出都為單通道),通過(guò)轉(zhuǎn)置卷積后得到4x4大小的特征圖。這里使用的轉(zhuǎn)置卷積核大小為k=3,stride=1,padding=0的情況(忽略偏執(zhí)bias)。

2.3 跳級(jí)結(jié)構(gòu)
如果僅對(duì)最后一層的特征圖進(jìn)行上采樣得到原圖大小的分割,最終的分割效果往往并不理想。因?yàn)樽詈笠粚拥奶卣鲌D太小,這意味著過(guò)多細(xì)節(jié)的丟失。因此,通過(guò)跳級(jí)結(jié)構(gòu)將低層,精細(xì)層(fine layers)與高層,粗糙層(coarse layers)結(jié)合,使得模型兼顧局部預(yù)測(cè)以及全局結(jié)構(gòu)。下圖不顯示卷積層,因此VGG中只剩下5個(gè)池化層。在實(shí)現(xiàn)代碼時(shí),可以加載預(yù)訓(xùn)練模型,取出預(yù)訓(xùn)練模型中間層的輸出(博客),比如(pool3,4,5),再進(jìn)行上采樣。

CNN的一大特點(diǎn)在于越深的網(wǎng)絡(luò)感受野越大,其關(guān)于輸入圖片的全局信息也越多。圖像語(yǔ)義分割要解決的兩大問(wèn)題是“what”和”where”,即在判斷出圖像中出現(xiàn)的物體類別的前提下還要定位物體的位置,深層次的CNN能很好解決“what”這個(gè)問(wèn)題,但是由于網(wǎng)絡(luò)層次的加深,也破壞了輸入圖片原始的空域信息而淺層次的CNN網(wǎng)絡(luò)會(huì)更好的保持原始圖片的空域信息,所以FCN的跳躍結(jié)構(gòu)就是將CNN的淺層次網(wǎng)絡(luò)和深層次網(wǎng)絡(luò)結(jié)合。
FCN-32s
使用VGG16作為backbone,在5次下采樣后得到7x7x512的特征矩陣,再經(jīng)過(guò)32倍上采樣恢復(fù)原圖大小。具體操作為:
- pool5后添加FC6,由Conv(7×7,s1)+ReLU+Dropout(0.5)組成,輸出特征矩陣寬高不變,通道數(shù)變?yōu)?096
- 增加FC7,由Conv(1×1,s1)+ReLU+Dropout(0.5)組成,不改變特征矩陣那個(gè)寬高和通道數(shù)
- 增加1x1卷積(通道為num_classes)
- 增加反卷積層ConvTranspose2d(64×64,s32),將coarse outputs轉(zhuǎn)化為pixel-dense outputs(長(zhǎng)寬為原圖大小,通道數(shù)為類別數(shù))

FCN-16s
對(duì)于FCN-16s,首先對(duì)pool5 feature進(jìn)行2倍上采樣獲得2x upsampled feature,再把pool4 feature和2x upsampled feature逐點(diǎn)相加,然后對(duì)相加的feature進(jìn)行16倍上采樣,獲得16x upsampled feature prediction。
FCN-8s
對(duì)于FCN-8s,首先進(jìn)行pool4+2x upsampled feature逐點(diǎn)相加,然后又進(jìn)行pool3+2x upsampled逐點(diǎn)相加,即進(jìn)行更多次特征融合。得到平均IOU62.7,并且得到更好的細(xì)節(jié)(沒有提升特別大)。隨著與更低的層進(jìn)行融合,但是并沒有得到較大的改善,因此沒有進(jìn)行進(jìn)一步的融合。

3 訓(xùn)練
3.1 整體訓(xùn)練流程
- VGG網(wǎng)絡(luò)初始化:利用已經(jīng)訓(xùn)練好的VGG權(quán)重初始化網(wǎng)絡(luò),舍棄池化層和池化層后的全連接層;
- 全連接轉(zhuǎn)全卷積:增加FC6,F(xiàn)C7,score層初始化為0,反卷積層初始化為雙線性插值,最后一層反卷積固定為插值不做學(xué)習(xí);
- 訓(xùn)練FCN-32s:從特征小圖(16*16*4096)預(yù)測(cè)分割小圖(16*16*21),之后上采樣得到大圖;
- 訓(xùn)練網(wǎng)絡(luò)FCN-16s:融合了2個(gè)pooling層(pool4,pool5)的預(yù)測(cè)結(jié)果,反卷積步長(zhǎng)16;
- 訓(xùn)練網(wǎng)絡(luò)FCN-8s:融合了3個(gè)pooling層(pool3,pool4,pool5)的預(yù)測(cè)結(jié)果反卷積步長(zhǎng)8。
3.2 Patchwise Training is Loss Sampling
論文中使用21類的PASCAL VOC數(shù)據(jù)集,訓(xùn)練集提供原始圖片和對(duì)應(yīng)的ground truth,ground truth上每個(gè)像素點(diǎn)均有用顏色表示的標(biāo)簽。圖片輸入模型后得到原圖寬高的輸出,輸出與ground truth計(jì)算交叉熵?fù)p失。
通常做語(yǔ)義分割的方法都是使用Patchwise訓(xùn)練,就是指將一張圖片中的重要部分裁剪下來(lái)進(jìn)行訓(xùn)練以避免整張照片直接進(jìn)行訓(xùn)練所產(chǎn)生的信息冗余,這種方法有助于快速收斂。FCN如何模擬這樣的隨機(jī)選一些patchs組成minibatch的過(guò)程呢?答案是先對(duì)整個(gè)圖像進(jìn)行逐像素?fù)p失的計(jì)算,之后從圖像上隨機(jī)采一些點(diǎn)組成batch,而這個(gè)batch的損失就是已經(jīng)計(jì)算出的這些點(diǎn)的損失的平均。這個(gè)過(guò)程作者稱為“loss sampling”。因?yàn)槭且淮涡杂?jì)算出所有點(diǎn)的損失之后再采樣,相比采樣后再計(jì)算損失,loss sampling要更加高效。作者實(shí)驗(yàn)發(fā)現(xiàn),全圖訓(xùn)練和采樣訓(xùn)練相比最終效果差不多,但全圖訓(xùn)練更快收斂,還是直接用整個(gè)圖像的損失進(jìn)行訓(xùn)練。

3.3 padding=100
當(dāng)輸入圖像長(zhǎng)度或?qū)挾刃∮?92時(shí),下采樣32倍后VGG16 backbone的輸出小于7,但后面接FC6時(shí)卷積核大小為7,是沒法進(jìn)行卷積操作的。為了避免這個(gè)問(wèn)題產(chǎn)生,F(xiàn)CN中的VGG16網(wǎng)絡(luò)與原VGG16的一點(diǎn)不同是,FCN在conv1_1層中設(shè)置了padding=100來(lái)擴(kuò)充圖像。由于(1)語(yǔ)義分割輸入的圖像一般不會(huì)太小(2)padding會(huì)導(dǎo)致計(jì)算量增大,后期還要crop裁剪,所以沒必要使用。
3.4 其他
優(yōu)化器:Optimization SGD+Momentum(momentum=0.9,weight decay =5*0.0001或者2*0.0001);
批尺寸:batch size=20;
學(xué)習(xí)率:FCN-AlexNet,F(xiàn)CN-VGG16和FCN-GoogLeNet的學(xué)習(xí)率分別固定為0.001,0.0001,5*0.00001,或者為了偏移,學(xué)習(xí)率乘以2,訓(xùn)練過(guò)程對(duì)上述參數(shù)不是很敏感,但是對(duì)學(xué)習(xí)率很敏感。分類分?jǐn)?shù)卷積層使用零初始化,隨機(jī)初始化并沒有改善。Dropout跟隨之前的網(wǎng)絡(luò)使用。
Metrics:我們?cè)谡Z(yǔ)義分割和場(chǎng)景分割中評(píng)測(cè)了四個(gè)指標(biāo),比如像素精度,IOU。其中nij為第i類像素被預(yù)測(cè)為第j類像素的數(shù)量,ncl為總類別數(shù)量。

Fine-tuning: 我們對(duì)所有層進(jìn)行微調(diào),僅僅微調(diào)分類層,能達(dá)到前者70%的效果。從頭開始訓(xùn)練網(wǎng)絡(luò)是不可行的,VGG網(wǎng)絡(luò)訓(xùn)練非常耗時(shí)(值得注意的是,VGG16是分階段訓(xùn)練的,我們從完全的16層初始化開始的)。單GPU需要3天微調(diào)FCN-32s,在此基礎(chǔ)上,F(xiàn)CN-16s和FCN-8s分別需要在增加一天。
Class Balancing:全卷積訓(xùn)練可以進(jìn)行類平衡,比如損失添加權(quán)重或者損失采樣(sampling loss)。盡管我們的數(shù)據(jù)并不是那么平衡(3/4是背景),但是我們發(fā)現(xiàn)類平衡不是很必要。
Shift-and-Stitch:發(fā)現(xiàn)上采樣更有效,所以沒有采用Shift-and-Stitch
Augmentation 數(shù)據(jù)集增強(qiáng)方式:隨機(jī)鏡像,像素在每一個(gè)方向上隨機(jī)偏移32像素,但是沒有明顯的提高。
More Training Data:PASCAL VOC 2011 Table1中使用,標(biāo)注了1112張圖片。Hariharan 收集8498張圖,訓(xùn)練了SDS分割系統(tǒng)。提高了FCN-VGG16在驗(yàn)證集上3.4個(gè)百分點(diǎn),Mean IU達(dá)到59.4.
參考:
1. 轉(zhuǎn)置卷積(Transposed Convolution)
2. FCN網(wǎng)絡(luò)結(jié)構(gòu)詳解(視頻)
3. 深度學(xué)習(xí)論文翻譯--Fully Convolutional Networks for Semantic Segmentation
4. 【圖像分割 之 開山之作】 2015-FCN CVPR
6. FCN(全卷積神經(jīng)網(wǎng)絡(luò))詳解
7. FCN論文筆記

浙公網(wǎng)安備 33010602011771號(hào)