图像目标分割_2 FCN(Fully Convolutional Networks for Semantic Segmentation)
6.2.1 FCN 背景介紹
圖像語(yǔ)義分割:給定一張圖片,對(duì)圖片上每一個(gè)像素點(diǎn)進(jìn)行分類!但是與圖像分類目的不同,語(yǔ)義分割模型要具有像素級(jí)的密集預(yù)測(cè)能力才可以。
6.2.2 FCN介紹
6.2.2.1 全卷積網(wǎng)絡(luò)
全卷積網(wǎng)絡(luò),模型由卷積層、池化層組成(沒(méi)有全連接層),可以接受任意大小的輸入,網(wǎng)絡(luò)的示意圖如下
過(guò)程:輸入一張圖片,網(wǎng)絡(luò)由淺到深,隨著卷積層和池化層不斷作用,產(chǎn)生的特征圖分辨率越來(lái)越小,但是通道數(shù)會(huì)越來(lái)越多。最后通過(guò)逐層上采樣得到一個(gè)和輸入形狀一樣的結(jié)果。
- 輸入可為任意尺寸圖像彩色圖像;輸出與輸入尺寸相同,深度為:20類目標(biāo)+背景=21(VOC分類)
1、結(jié)構(gòu)修改,保證任意圖像對(duì)應(yīng)輸入輸出
典型的識(shí)別網(wǎng)絡(luò),包括LeNet、AlexNet,表面上采用固定大小的輸入并產(chǎn)生非空間輸出。 這些網(wǎng)全連接的層具有固定的尺寸并丟棄空間坐標(biāo)。 然而,這些完全連接的層也可以被視為與覆蓋整個(gè)輸入?yún)^(qū)域的內(nèi)核的卷積。
一般圖像分類CNN網(wǎng)絡(luò)在最后一層卷積層后會(huì)跟若干個(gè)全連接層, 將卷積層產(chǎn)生的特征圖映射成一個(gè)固定長(zhǎng)度的特征向量。論文中的例子:輸入一張貓的圖片, 經(jīng)過(guò)CNN網(wǎng)絡(luò), 得到一個(gè)長(zhǎng)為1000的輸出向量, 這個(gè)向量經(jīng)過(guò)softmax歸一化,分別對(duì)應(yīng)1000個(gè)類別的概率,這樣我們可以得到輸入圖像屬于每一類的概率, 在下例中我們可以看出圖像屬于"tabby cat"這一類可能性最大。
這篇論文里面是將全連接層轉(zhuǎn)化為卷積層。上圖中我們可以看出FCN將最后3層轉(zhuǎn)換為卷積層,卷積核的大小(通道數(shù),寬,高)分別為(4096,1,1)、(4096,1,1)、(1000,1,1)。
全連接層怎么轉(zhuǎn)成卷積層:拿上圖為例,最后一層卷積層的輸出為7 x 7 x 256 。后面再接三個(gè)全連接層變?yōu)?1,4096),(1,4096),(1,1000)(一維向量)。我們可以把這三個(gè)全連接層變?yōu)榫矸e層。
變換方式:
-
針對(duì)FC1 ,選卷積核K=7卷積,輸出為1 x 1 x 4096。
-
針對(duì)FC2,選卷積核K=1卷積,輸出為1 x 1 x 4096。
-
對(duì)最后一個(gè)FC3,選卷積核k=1卷積,輸出為1x1x1000。
這樣轉(zhuǎn)換后的網(wǎng)絡(luò)輸出的就是一個(gè)熱力圖 ,這個(gè)圖明顯二維的。這樣轉(zhuǎn)換后的網(wǎng)絡(luò)輸出的就是一個(gè)熱力圖 ,這個(gè)圖明顯二維的。
2、上采樣得到預(yù)測(cè)映射(dense prediction)的策略
我們可以看出
- 1、對(duì)原圖像進(jìn)行卷積conv1, pool1后原圖像縮小為1/2;
- 2、之后對(duì)圖像進(jìn)行第二次conv2,pool2后圖像縮小為1/4;
- 3、對(duì)圖像進(jìn)行第三次卷積操作conv2,pool3縮小為原圖像的1/8, 此時(shí)保留pool3的feature map;
- 4、繼續(xù)對(duì)圖像進(jìn)行第四次卷積操作conv4,pool4,縮小為原圖像的1/16,保留 pool4的feature map;
- 5、最后對(duì)圖像進(jìn)行第五次卷積操作conv5,pool5,縮小為原圖像的1/32
- 6、然后把原來(lái)CNN操作中的全連接變成卷積操作 conv6,圖像的feature map 數(shù)量改變但是圖像大小依然為原圖的1/32,此時(shí)圖像heatmap(熱力圖)。
最后的輸出是1000張heatmap經(jīng)過(guò)upsampling變?yōu)樵瓐D大小的圖片,為了對(duì)每個(gè)像素進(jìn)行分類預(yù)測(cè)label成最后已經(jīng)進(jìn)行語(yǔ)義分割的圖像
論文作者研究過(guò)3種方案實(shí)現(xiàn)dense prediction:反卷積法以及(移針?lè)?#xff08;shift-and-stitch)、稀疏濾波(filter rarefaction))
(1)反卷積法(deconvolutional)
注:反卷積(Deconvolution),當(dāng)然關(guān)于這個(gè)名字不同框架不同,Caffe和Kera里叫Deconvolution,而tensorflow里叫Conv2DTranspose。叫conv_transpose更為合適。
-
反卷積(轉(zhuǎn)置卷積):反卷積是一種特殊的正向卷積,先按照一定的比例通過(guò)補(bǔ)0來(lái)擴(kuò)大輸入圖像的尺寸,接著卷積核卷積,再進(jìn)行正向卷積。
- 1、先進(jìn)行上采樣,即擴(kuò)大像素;再進(jìn)行卷積
-
卷基的forward、backward操作對(duì)調(diào),就是轉(zhuǎn)置卷積。
-
卷積與轉(zhuǎn)置卷積的本質(zhì)就是進(jìn)行了矩陣運(yùn)算,從矩陣角度理解
理解:然后把普通卷積的輸出作為轉(zhuǎn)置卷積的輸入,而轉(zhuǎn)置卷積的輸出,就是普通卷積的輸入,常用于CNN中對(duì)特征圖進(jìn)行上采樣,比如語(yǔ)義分割和超分辨率任務(wù)中。
- 卷積與轉(zhuǎn)置卷積的可視化計(jì)算過(guò)程
- 參考:https://github.com/vdumoulin/conv_arithmetic
公式:設(shè)反卷積的輸入是n * n,
反卷積的輸出為m*m,?padding=p,stride=spadding=p,stride=s?。
那么此時(shí)反卷積的輸出就為:m = s(n-1) + k -2p,反過(guò)來(lái)就是n = (m+2p -k)/s + 1
例子理解:
下圖中藍(lán)色是反卷積層的input,綠色是反卷積層的output,元素內(nèi)和外圈都補(bǔ)0的轉(zhuǎn)置卷積。
舉個(gè)例子:選擇一個(gè)輸入input尺寸為?3 ,卷積核kernel 尺寸?3,步長(zhǎng)strides=2,填充padding=1 ,即n=3,k=3,s=2,p=1,則輸出output的尺寸為m=2x(3-1) +3=5 。
問(wèn)題:怎么使反卷積的output大小和輸入圖片大小一致,從而得到pixel level prediction?
因?yàn)镕CN里面全部都是卷積層(pooling也看成卷積),卷積層不關(guān)心input的大小,inputsize和outputsize之間存在線性關(guān)系。
假設(shè)圖片輸入為n×n大小,第一個(gè)卷積層輸出map就為conv1_out.size=(n-kernelsize)/stride + 1,記做conv1_out.size = f(n), 依次類推,conv5_out.size = f(conv5_in.size) = f(... f(n)), 反卷積是要使n = f‘(conv5_out.size)成立,要確定f’,就需要設(shè)置deconvolution層的kernelsize,stride,padding。
TensorFlow 中tf.keras.layers.Conv2DTranspose
tf.keras.layers.Conv2DTranspose(filters, kernel_size, strides=(1, 1), padding='valid', output_padding=None,data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True,kernel_initializer='glorot_uniform', bias_initializer='zeros',kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None,kernel_constraint=None, bias_constraint=None, **kwargs )參數(shù): 1、filters:整數(shù),輸出空間的維數(shù)(即卷積中輸出過(guò)濾器的數(shù)量)。 2、kernel_size:2個(gè)整數(shù)的整數(shù)或元組/列表,指定2D卷積窗口的高度和寬度。可以是單個(gè)整數(shù),以為所有空間尺寸指定相同的值。 4、strides:一個(gè)整數(shù)或2個(gè)整數(shù)的元組/列表,指定沿高度和寬度的卷積步幅。可以是單個(gè)整數(shù),以為所有空間尺寸指定相同的值。指定任何跨步值!= 1與指定任何dilation_rate值!= 1 不兼容。 5、padding:"valid"或之一"same"(不區(qū)分大小寫(xiě))。 6、output_padding:一個(gè)整數(shù)或2個(gè)整數(shù)的元組/列表,指定沿輸出張量的高度和寬度的填充量。可以是單個(gè)整數(shù),以為所有空間尺寸指定相同的值。沿給定尺寸的輸出填充量必須小于沿相同尺寸的步幅。如果設(shè)置為None(默認(rèn)),則推斷輸出形狀。 7、data_format:字符串,channels_last(默認(rèn))或之一channels_first。輸入中尺寸的順序。 8、channels_last對(duì)應(yīng)于具有形狀的輸入, (batch, height, width, channels)而channels_first 對(duì)應(yīng)于具有形狀的輸入 (batch, channels, height, width)。默認(rèn)為image_data_format在Keras配置文件中找到的值~/.keras/keras.json。如果您從未設(shè)置,那么它將是“ channels_last”。 9、dilation_rate:一個(gè)整數(shù)或2個(gè)整數(shù)的元組/列表,指定用于擴(kuò)張卷積的擴(kuò)張率。可以是單個(gè)整數(shù),以為所有空間尺寸指定相同的值。當(dāng)前,指定任何dilation_rate值!= 1與指定任何步幅值!= 1不兼容。 10、activation:要使用的激活功能。如果您未指定任何內(nèi)容,則不會(huì)應(yīng)用任何激活(即“線性”激活:)a(x) = x。 11、use_bias:布爾值,層是否使用偏置向量。 12、kernel_initializer:kernel權(quán)重矩陣的初始化程序。 13、bias_initializer:偏置矢量的初始化器。其他方法如下:
(2)移針?lè)?#xff08;shift-and-stitch)
對(duì)于移針?lè)?#xff0c;設(shè)原圖與FCN所得輸出圖之間的降采樣因子是f,那么對(duì)于原圖的每個(gè)f的區(qū)域(不重疊),“shift the input x pixels to the right and y pixels down for every (x,y) ,0 < x,y < f." 把這個(gè)f區(qū)域?qū)?yīng)的output作為此時(shí)區(qū)域中心點(diǎn)像素對(duì)應(yīng)的output,這樣就對(duì)每個(gè)f的區(qū)域得到了f^2個(gè)output,也就是每個(gè)像素都能對(duì)應(yīng)一個(gè)output,所以成為了dense prediction。(3)稀疏濾波
就是放大CNN網(wǎng)絡(luò)中的下采樣層的濾波器尺寸,得到新的濾波方法。
其中s是下采樣的滑動(dòng)步長(zhǎng),這個(gè)新濾波器的滑動(dòng)步長(zhǎng)要設(shè)為1,這樣的話,下采樣就沒(méi)有縮小圖像尺寸,最后可以得到dense prediction。
以上兩種方法作者都沒(méi)有采用,主要是因?yàn)檫@兩種方法都是經(jīng)過(guò)折中(trade-off)的。
-
對(duì)于移針?lè)?#xff0c; 下采樣的功能被減弱,使得更細(xì)節(jié)的信息能被filter看到,但是其感受野會(huì)相對(duì)變小,可能會(huì)損失全局信息,且會(huì)對(duì)卷積層引入更多運(yùn)算。
-
對(duì)于稀疏濾波,雖然receptive fileds沒(méi)有變小,但是由于原圖被劃分成f*f的區(qū)域輸入網(wǎng)絡(luò),使得filters無(wú)法感受更精細(xì)的信息。
6.2.2.2 skip layers實(shí)現(xiàn)fusion prediction
作者在試驗(yàn)中發(fā)現(xiàn),得到的分割結(jié)果比較粗糙,所以考慮加入更多前層的細(xì)節(jié)信息,也就是把倒數(shù)第幾層的輸出和最后的輸出做一個(gè)fusion,實(shí)際上也就是加和,過(guò)程如下,一共有三種方式:
- 第一種方法對(duì)所得特征圖像直接進(jìn)行32倍的上采樣,被稱為FCN-32s,處理方法簡(jiǎn)單迅速,但是其采樣預(yù)測(cè)結(jié)果的邊緣信息比較模糊,無(wú)法表現(xiàn)得更具體。
- 第二種方法提出了層跨越(skip layers)的思路,即特征圖像進(jìn)行2倍的上采樣后,將其結(jié)果與第四層池化操作后的結(jié)果相迭加,之后再對(duì)結(jié)果進(jìn)行16倍上采樣,最終獲得采樣預(yù)測(cè),即FCN-16s。
- 其將低層的fine layer與高層的coarse layer進(jìn)行結(jié)合,兼顧了局部信息與全局信息,對(duì)像素的空間判別與語(yǔ)義判別進(jìn)行了很好的折中處理。相較FCN-32s,FCN-16s所獲得的采樣預(yù)測(cè)不管是從預(yù)測(cè)結(jié)果還是網(wǎng)絡(luò)結(jié)構(gòu)來(lái)說(shuō)顯然都更加優(yōu)秀。
- 第三種方法則是在FCN-16s的基礎(chǔ)上,進(jìn)行了與第三層池化操作后的結(jié)果相迭加,再對(duì)結(jié)果進(jìn)行8倍上采樣的FCN-8s。顯然,其生成的語(yǔ)義標(biāo)簽圖像是三種情況中最好的。?
最終:在逐層fusion的過(guò)程中,做到第三層再往下,結(jié)果又會(huì)變差,所以作者做到這里就停了。
6.2.2.3 patch-wise training in FCN?
1、損失計(jì)算
upsample之后,網(wǎng)絡(luò)輸出是與origin image大小相同,channel數(shù)為C+1的每個(gè)pixel的分類預(yù)測(cè),其中C表示分類數(shù)量(如Pascal voc數(shù)據(jù)集,則C=20),對(duì)空間每個(gè)pixel 做softmax分類預(yù)測(cè),那么易知損失函數(shù)為。
其中x為最后一層的輸出(3-D),記origin image 大小為h x w,那么x大小為(C+1) x h x w。每個(gè)pixel都是一個(gè)softmax 分類預(yù)測(cè)。
2、訓(xùn)練
一般對(duì)于語(yǔ)義分割的訓(xùn)練,學(xué)術(shù)界有兩種辦法: Patchwise training 和類別損失加權(quán)的方法來(lái)進(jìn)行訓(xùn)練。
- 類別損失加權(quán): 根據(jù)類別數(shù)量的分布比例對(duì)各自的損失函數(shù)進(jìn)行加權(quán),比如有些樣本的數(shù)量較少,我就給它的損失函數(shù)比重增大一些。
- 分批訓(xùn)練: 旨在避免完整圖像訓(xùn)練的冗余。
- 定義:patchwise training是指對(duì)每一個(gè)感興趣的像素,以它為中心取一個(gè)patch,然后輸入網(wǎng)絡(luò),輸出則為該像素的標(biāo)簽,訓(xùn)練時(shí)就將一個(gè)個(gè)patch組成一個(gè)batch作為網(wǎng)絡(luò)輸入。由于patches可能高度重疊,所以需要一些sampling方法對(duì)選取一些patches作為訓(xùn)練集
- 避免完全圖像訓(xùn)練的冗余,在語(yǔ)義分割中,假設(shè)你在對(duì)圖像中的每個(gè)像素進(jìn)行分類,通過(guò)使用整個(gè)圖像,你在輸入中添加了大量的冗余。在訓(xùn)練分割網(wǎng)絡(luò)中避免這種情況的一種標(biāo)準(zhǔn)方法是從訓(xùn)練集而不是完整的圖像中向網(wǎng)絡(luò)提供批量的隨機(jī)patches(圍繞感興趣的對(duì)象的小圖像區(qū)域)。
- 從另一種角度出發(fā),我們也可以使得這些補(bǔ)丁區(qū)域盡量減少背景信息,從而緩解類別不均衡問(wèn)題。
作者根據(jù)實(shí)驗(yàn)結(jié)果給出結(jié)論:補(bǔ)丁式訓(xùn)練完全沒(méi)有必要,訓(xùn)練 FCN 還是輸入整張圖片比較好。并且解決這種類別不均衡的問(wèn)題,只需要給損失函數(shù)按比例加權(quán)重就行。
6.2.2.4 訓(xùn)練細(xì)節(jié)
- 第一階段
以經(jīng)典的分類網(wǎng)絡(luò)為初始化。最后兩級(jí)是全連接(紅色),參數(shù)棄去不用。
- 第二階段
從特征小圖(16x16x4096)預(yù)測(cè)分割小圖(161621),之后直接升采樣為大圖。 反卷積(橙色)的步長(zhǎng)為32,這個(gè)網(wǎng)絡(luò)稱為FCN-32s。 這一階段作者使用單GPU訓(xùn)練約需3天。
- 第三階段
上采樣分為兩次完成(橙色×2)。 在第二次上采樣前,把第4個(gè)pooling層(綠色)的預(yù)測(cè)結(jié)果(藍(lán)色)融合進(jìn)來(lái)。使用跳級(jí)結(jié)構(gòu)提升精確性。 第二次反卷積步長(zhǎng)為16,這個(gè)網(wǎng)絡(luò)稱為FCN-16s。 這一階段作者使用單GPU訓(xùn)練約需1天。
- 第四階段
上采樣分為三次完成(橙色×3)。 進(jìn)一步融合了第3個(gè)pooling層的預(yù)測(cè)結(jié)果。 第三次反卷積步長(zhǎng)為8,記為FCN-8s。 這一階段作者使用單GPU訓(xùn)練約需1天。
- 論文中優(yōu)化利用momentum訓(xùn)練了GSD。 對(duì)于FCN-AlexNet,FCN-VGG16和FCN-GoogLeNet,使用20個(gè)圖像的小批量大小和0.001,0.0001和0.00005的固定學(xué)習(xí)速率。
通過(guò)反向傳播通過(guò)整個(gè)網(wǎng)絡(luò)對(duì)所有層進(jìn)行微調(diào)。 考慮到學(xué)習(xí)基本分類網(wǎng)絡(luò)所需的時(shí)間,單獨(dú)對(duì)輸出分類器單獨(dú)進(jìn)行微調(diào)只能獲得完整微調(diào)性能的70%,因此從頭開(kāi)始進(jìn)行訓(xùn)練是不可行的。 (VGG網(wǎng)絡(luò)是分階段訓(xùn)練的,從完整的16層初始化后進(jìn)行訓(xùn)練)。對(duì)于的FCN-32s,在單GPU上,微調(diào)要花費(fèi)三天的時(shí)間,而且大約每隔一天就要更新到FCN-16s和FCN-8s版本。
圖中對(duì)比了patch取樣,全圖有效地訓(xùn)練每張圖片batches到常規(guī)的、大的、重疊的patches網(wǎng)格。采樣在收斂速率上沒(méi)有很顯著的效果相對(duì)于全圖式訓(xùn)練,但是由于每個(gè)每個(gè)批次都需要大量的圖像,很明顯的需要花費(fèi)更多的時(shí)間。
6.2.2.5 評(píng)價(jià)指標(biāo)
論文中實(shí)驗(yàn)了四種評(píng)價(jià)指標(biāo):
6.2.3 分割架構(gòu)效果
最終分割通過(guò)在ILSVRC12的AlexNet3體系結(jié)構(gòu),以及在ILSVRC14中的VGG網(wǎng)絡(luò)和GoogLeNet4做的很不錯(cuò)。
通過(guò)丟棄最終的分類器層來(lái)斬?cái)嗝總€(gè)網(wǎng)絡(luò)的開(kāi)始,并將所有的全連接層轉(zhuǎn)換為卷積。下面在PASCAL VOC 2011 數(shù)據(jù)集中,NVIDIA Tesla K40c上對(duì)500×500輸入進(jìn)行20次試驗(yàn)的平均值)的比較
- 不同的FCN的skip效果比較
- 其它效果
- FCN-8s is the best in Pascal VOC 2011.
- FCN-16s is the best in NYUDv2.
- FCN-16s is the best in SIFT Flow.
缺點(diǎn)
-
得到的結(jié)果還是不夠精細(xì)。進(jìn)行8倍上采樣雖然比32倍的效果好了很多,但是上采樣的結(jié)果還是比較模糊和平滑,對(duì)圖像中的細(xì)節(jié)不敏感
-
對(duì)各個(gè)像素進(jìn)行分類,沒(méi)有充分考慮像素與像素之間的關(guān)系。忽略了在通常的基于像素分類的分割方法中使用的空間規(guī)整(spatial regularization)步驟,缺乏空間一致性
6.2.4 網(wǎng)絡(luò)結(jié)構(gòu)總結(jié)
- 全卷積(convolutional):采樣端對(duì)端的卷積網(wǎng)絡(luò),將普通分類網(wǎng)絡(luò)的全連接層換上對(duì)應(yīng)的卷積層(FCN)
- 上采樣(upsample):即反卷積(deconvolution),恢復(fù)圖片的位置信息等,反卷積層可以通過(guò)最小化誤差學(xué)習(xí)得到。
- 跳躍連接(skip layer):通過(guò)連接不同卷積層的輸出到反卷積層,來(lái)改善上采樣很粗糙的問(wèn)題。
6.2.5 總結(jié)
- FCN的結(jié)構(gòu)組成
- FCN的上采樣方法以及skip layers
- FCN training的訓(xùn)練過(guò)程以及訓(xùn)練方式
總結(jié)
以上是生活随笔為你收集整理的图像目标分割_2 FCN(Fully Convolutional Networks for Semantic Segmentation)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 读取外部配置文件_SpringBoot外
- 下一篇: 数据结构链表之循环链表——4