截止目前,CNN已經(jīng)在圖像分類分方面取得了巨大的成就,涌現(xiàn)出如VGG和Resnet等網(wǎng)絡(luò)結(jié)構(gòu),并在ImageNet中取得了好成績。CNN的強(qiáng)大之處在于它的多層結(jié)構(gòu)能自動(dòng)學(xué)習(xí)特征,并且可以學(xué)習(xí)到多個(gè)層次的特征:
較淺的卷積層感知域較小,學(xué)習(xí)到一些局部區(qū)域的特征;
較深的卷積層具有較大的感知域,能夠?qū)W習(xí)到更加抽象一些的特征。
這些深層抽象特征對物體的大小、位置和方向等敏感性更低,從而有助于分類性能的提高。這些抽象的特征對分類很有幫助,可以很好地判斷出一幅圖像中包含什么類別的物體,也就是說圖像分類是圖像級別任務(wù)(參考圖像語義分割入門)。
與分類不同的是,語義分割需要判斷圖像每個(gè)像素點(diǎn)的類別,進(jìn)行精確分割,圖像語義分割是像素級別的任務(wù),但是由于CNN在進(jìn)行convolution和pooling過程中丟失了圖像細(xì)節(jié),即feature map size逐漸變小,所以不能很好地指出物體的具體輪廓、指出每個(gè)像素具體屬于哪個(gè)物體,無法做到精確的分割。針對這個(gè)問題,Jonathan Long等人提出了Fully Convolutional Networks(FCN)用于圖像語義分割。自從提出后,F(xiàn)CN已經(jīng)成為語義分割的基本框架,后續(xù)算法其實(shí)都是在這個(gè)框架中改進(jìn)而來。
注意,本文僅對基于深度學(xué)習(xí)的經(jīng)典語義分割成果進(jìn)行梳理,之所以說是經(jīng)典,是因?yàn)?strong>本文幾乎沒有涉及18年及之后的最新進(jìn)展,故標(biāo)題也說了:只是入門基于深度學(xué)習(xí)的語義分割。
一、FCN
對于一般的分類CNN網(wǎng)絡(luò),如VGG和Resnet,都會(huì)在網(wǎng)絡(luò)的最后加入一些全連接層,經(jīng)過softmax后就可以獲得類別概率信息。但是這個(gè)概率信息是1維的,即只能標(biāo)識(shí)整個(gè)圖片的類別,不能標(biāo)識(shí)每個(gè)像素點(diǎn)的類別,所以這種全連接方法不適用于圖像分割。而FCN提出可以把后面幾個(gè)全連接都換成卷積,這樣就可以獲得一張2維的feature map,后接softmax獲得每個(gè)像素點(diǎn)的分類信息,從而解決了分割問題。
1、網(wǎng)絡(luò)特點(diǎn)
全卷積(Convolutional)
上采樣(Upsample)
跳躍結(jié)構(gòu)(Skip Layer)
2、網(wǎng)絡(luò)結(jié)構(gòu)
3、原理說明
全卷積
FCN將傳統(tǒng)CNN中的全連接層轉(zhuǎn)化成一個(gè)個(gè)的卷積層。如下圖所示,在傳統(tǒng)的CNN結(jié)構(gòu)中,前5層是卷積層,第6層和第7層分別是一個(gè)長度為4096的一維向量,第8層是長度為1000的一維向量,分別對應(yīng)1000個(gè)類別的概率。FCN將這3層表示為卷積層,卷積核的大小(通道數(shù),寬,高)分別為(4096,1,1)、(4096,1,1)、(1000,1,1)。所有的層都是卷積層,故稱為全卷積網(wǎng)絡(luò)。
上采樣——轉(zhuǎn)置卷積
可以發(fā)現(xiàn),經(jīng)過多次卷積(還有pooling)以后,得到的圖像越來越小,分辨率越來越低(粗略的圖像),那么FCN是如何得到圖像中每一個(gè)像素的類別的呢?為了從這個(gè)分辨率低的粗略圖像恢復(fù)到原圖的分辨率,F(xiàn)CN使用了上采樣。例如經(jīng)過5次卷積(和pooling)以后,圖像的分辨率依次縮小了2,4,8,16,32倍。對于最后一層的輸出圖像,需要進(jìn)行32倍的上采樣,以得到原圖一樣的大小。這個(gè)上采樣是通過反卷積(deconvolution)實(shí)現(xiàn)的。
另外補(bǔ)充一句,上采樣(upsampling)一般包括2種方式:
Resize,如雙線性插值直接縮放,類似于圖像縮放(這種方法在原文中提到)
Deconvolution,也叫Transposed Convolution
一張更為形象的說明如下:
跳躍結(jié)構(gòu)
對第5層的輸出(32倍放大)反卷積到原圖大小,得到的結(jié)果還是不夠精確,一些細(xì)節(jié)無法恢復(fù)。于是Jonathan將第4層的輸出和第3層的輸出也依次反卷積,分別需要16倍和8倍上采樣,結(jié)果就精細(xì)一些了。
其卷積過程類似:
image經(jīng)過多個(gè)conv和+一個(gè)max pooling變?yōu)閜ool1 feature,寬高變?yōu)?/2
pool1 feature再經(jīng)過多個(gè)conv+一個(gè)max pooling變?yōu)閜ool2 feature,寬高變?yōu)?/4
pool2 feature再經(jīng)過多個(gè)conv+一個(gè)max pooling變?yōu)閜ool3 feature,寬高變?yōu)?/8
......
直到pool5 feature,寬高變?yōu)?/32。
相對應(yīng)的:
對于FCN-32s,直接對pool5 feature進(jìn)行32倍上采樣獲得32x upsampled feature,再對32x upsampled feature每個(gè)點(diǎn)做softmax prediction獲得32x upsampled feature prediction(即分割圖)。
對于FCN-16s,首先對pool5 feature進(jìn)行2倍上采樣獲得2x upsampled feature,再把pool4 feature和2x upsampled feature逐點(diǎn)相加,然后對相加的feature進(jìn)行16倍上采樣,并softmax prediction,獲得16x upsampled feature prediction。
對于FCN-8s,首先進(jìn)行pool4+2x upsampled feature逐點(diǎn)相加,然后又進(jìn)行pool3+2x upsampled逐點(diǎn)相加,即進(jìn)行更多次特征融合。具體過程與16s類似,不再贅述。
下圖是這個(gè)卷積和反卷積上采樣的過程:
下圖是32倍,16倍和8倍上采樣得到的結(jié)果的對比,可以看到它們得到的結(jié)果越來越精確:
4、優(yōu)點(diǎn)(貢獻(xiàn))和不足
優(yōu)點(diǎn)和貢獻(xiàn)
1.為深度學(xué)習(xí)解決語義分割提供了基本思路,激發(fā)了很多優(yōu)秀的工作
2.輸入圖像大小沒有限制,結(jié)構(gòu)靈活
3.更加高效,節(jié)省時(shí)間和空間
不足
1.結(jié)果不夠精細(xì),邊界不清晰
2.沒有充分考慮到語義間的上下文關(guān)系
3.padding操作可能會(huì)引入噪聲
二、SegNet
基于FCN的一項(xiàng)工作,修改VGG-16網(wǎng)絡(luò)得到的語義分割網(wǎng)絡(luò),有兩種SegNet,分別為正常版與貝葉斯版,同時(shí)SegNet作者根據(jù)網(wǎng)絡(luò)的深度提供了一個(gè)basic版(淺網(wǎng)絡(luò))。
1、網(wǎng)絡(luò)結(jié)構(gòu)
作者提供了幾種網(wǎng)絡(luò)結(jié)構(gòu),上圖就是通用結(jié)構(gòu):對稱的encode-decode結(jié)構(gòu),想了解更為具體的實(shí)現(xiàn)建議查看開源實(shí)現(xiàn)。
2、創(chuàng)新點(diǎn)
SegNet的最大池化層和上采樣層不同于通常的處理,SegNet 中使用最大池化,并且同時(shí)輸出最大點(diǎn)的 index。同一層次的上采樣根據(jù) index 確定池化前 max 值的點(diǎn)的位置,并對其他丟失的點(diǎn)做插值。
補(bǔ)充一點(diǎn),tensorflow對于SegNet的上采樣方式并不支持(也許只是沒有封裝好而已,可以手動(dòng)實(shí)現(xiàn),不確定),所以我查到的實(shí)現(xiàn)一般就直接用普通的上采樣了,這樣tf版本的SegNet結(jié)構(gòu)相較U-Net簡單了不少(個(gè)人感覺兩者還是很相似的)。有趣的是帶索引最大池化tf是有封裝好的接口的,在nn包中。
作為對比,下左為SegNet,下右為FCN中的上采樣實(shí)現(xiàn)(FCN的上采樣相較現(xiàn)在成熟的上采樣方案也略有不同,多加了一個(gè)根據(jù)原始編碼得來并保存的y,這需要消耗額外的內(nèi)存):
此外還有貝葉斯SegNet變種,不太懂,就不畫蛇添足了。
三、U-Net
U-Net是原作者參加ISBI Challenge提出的一種分割網(wǎng)絡(luò),能夠適應(yīng)很小的訓(xùn)練集(大約30張圖)。U-Net與FCN都是很小的分割網(wǎng)絡(luò),既沒有使用空洞卷積,也沒有后接CRF,結(jié)構(gòu)簡單。
卷積網(wǎng)絡(luò)被大規(guī)模應(yīng)用在分類任務(wù)中,輸出的結(jié)果是整個(gè)圖像的類標(biāo)簽。然而,在許多視覺任務(wù),尤其是生物醫(yī)學(xué)圖像處理領(lǐng)域,目標(biāo)輸出應(yīng)該包括目標(biāo)類別的位置,并且每個(gè)像素都應(yīng)該有類標(biāo)簽。另外,在生物醫(yī)學(xué)圖像往往缺少訓(xùn)練圖片。所以,Ciresan等人訓(xùn)練了一個(gè)卷積神經(jīng)網(wǎng)絡(luò),用滑動(dòng)窗口提供像素的周圍區(qū)域(patch)作為輸入來預(yù)測每個(gè)像素的類標(biāo)簽。這個(gè)網(wǎng)絡(luò)有兩個(gè)優(yōu)點(diǎn):第一,輸出結(jié)果可以定位出目標(biāo)類別的位置;第二,由于輸入的訓(xùn)練數(shù)據(jù)是patches,這樣就相當(dāng)于進(jìn)行了數(shù)據(jù)增廣,解決了生物醫(yī)學(xué)圖像數(shù)量少的問題。 ?? 但是,這個(gè)方法也有兩個(gè)很明顯缺點(diǎn)。 ?? 第一,它很慢,因?yàn)檫@個(gè)網(wǎng)絡(luò)必須訓(xùn)練每個(gè)patch,并且因?yàn)閜atch間的重疊有很多的冗余(冗余會(huì)造成什么影響呢?卷積核里面的W,就是提取特征的權(quán)重,兩個(gè)塊如果重疊的部分太多,這個(gè)權(quán)重會(huì)被同一些特征訓(xùn)練兩次,造成資源的浪費(fèi),減慢訓(xùn)練時(shí)間和效率,雖然說會(huì)有一些冗余,訓(xùn)練集大了,準(zhǔn)確率不就高了嗎?可是你這個(gè)是相同的圖片啊,重疊的東西都是相同的,舉個(gè)例子,我用一張相同的圖片訓(xùn)練20次,按照這個(gè)意思也是增大了訓(xùn)練集啊,可是會(huì)出現(xiàn)什么結(jié)果呢,很顯然,會(huì)導(dǎo)致過擬合,也就是對你這個(gè)圖片識(shí)別很準(zhǔn),別的圖片就不一定了)。 ?? 第二,定位準(zhǔn)確性和獲取上下文信息不可兼得。大的patches需要更多的max-pooling層這樣減小了定位準(zhǔn)確性(為什么?因?yàn)槟闶菍σ赃@個(gè)像素為中心的點(diǎn)進(jìn)行分類,如果patch太大,最后經(jīng)過全連接層的前一層大小肯定是不變的,如果你patch大就需要更多的pooling達(dá)到這個(gè)大小,而pooling層越多,丟失信息的信息也越多;小的patches只能看到很小的局部信息,包含的背景信息不夠。
和SegNet格式極為相近,不過其添加了中間的center crop和concat操作實(shí)現(xiàn)了不同層次特征的upsample,目的同樣是使上采樣的層能夠更多的參考前面下采樣中間層的信息,更好的達(dá)到還原的效果。
U-Net的格式也不復(fù)雜,形狀如下,參看github開源實(shí)現(xiàn)不難復(fù)現(xiàn),注意用好相關(guān)張量操作API即可(如concet、slice等)。值得注意的是U-Net采用了與FCN完全不同的特征融合方式:拼接!與FCN逐點(diǎn)相加不同,U-Net采用將特征在channel維度拼接在一起,形成更“厚”的特征。所以:
語義分割網(wǎng)絡(luò)在特征融合時(shí)也有2種辦法:
FCN式的逐點(diǎn)相加,對應(yīng)caffe的EltwiseLayer層,對應(yīng)tensorflow的tf.add()
U-Net式的channel維度拼接融合,對應(yīng)caffe的ConcatLayer層,對應(yīng)tensorflow的tf.concat()
(1) 使用全卷積神經(jīng)網(wǎng)絡(luò)。(全卷積神經(jīng)網(wǎng)絡(luò)就是卷積取代了全連接層,全連接層必須固定圖像大小而卷積不用,所以這個(gè)策略使得,你可以輸入任意尺寸的圖片,而且輸出也是圖片,所以這是一個(gè)端到端的網(wǎng)絡(luò)。) ?? (2) 左邊的網(wǎng)絡(luò)是收縮路徑:使用卷積和maxpooling。 ?? (3) 右邊的網(wǎng)絡(luò)是擴(kuò)張路徑:使用上采樣產(chǎn)生的特征圖與左側(cè)收縮路徑對應(yīng)層產(chǎn)生的特征圖進(jìn)行concatenate操作。(pooling層會(huì)丟失圖像信息和降低圖像分辨率且是不可逆的操作,對圖像分割任務(wù)有一些影響,對圖像分類任務(wù)的影響不大,為什么要做上采樣?因?yàn)樯喜蓸涌梢匝a(bǔ)足一些圖片的信息,但是信息補(bǔ)充的肯定不完全,所以還需要與左邊的分辨率比較高的圖片相連接起來(直接復(fù)制過來再裁剪到與上采樣圖片一樣大?。@就相當(dāng)于在高分辨率和更抽象特征當(dāng)中做一個(gè)折衷,因?yàn)殡S著卷積次數(shù)增多,提取的特征也更加有效,更加抽象,上采樣的圖片是經(jīng)歷多次卷積后的圖片,肯定是比較高效和抽象的圖片,然后把它與左邊不怎么抽象但更高分辨率的特征圖片進(jìn)行連接)。 ?? (4) 最后再經(jīng)過兩次反卷積操作,生成特征圖,再用兩個(gè)1X1的卷積做分類得到最后的兩張heatmap,例如第一張表示的是第一類的得分,第二張表示第二類的得分heatmap,然后作為softmax函數(shù)的輸入,算出概率比較大的softmax類,選擇它作為輸入給交叉熵進(jìn)行反向傳播訓(xùn)練。
四、空洞卷積
『計(jì)算機(jī)視覺』空洞卷積
池化操作增大了感受野,有助于實(shí)現(xiàn)分類網(wǎng)絡(luò),但是池化操作在分割過程中也降低了分辨率,空洞卷積層則可以在不降低空間維度的前提下增大了相應(yīng)的感受野指數(shù)。
五、DeepLab
v1
面臨問題:
在DCNN進(jìn)行分割任務(wù)時(shí),有兩個(gè)瓶頸:
一個(gè)是下采樣所導(dǎo)致的信息丟失,通過帶孔卷積的方法解決;
另一個(gè)是CNN空間不變性所導(dǎo)致的邊緣不夠準(zhǔn)確,通過全連接的CRF解決(CRF是可以通過底層特征進(jìn)行分割的一個(gè)方法) 核心工作:空洞卷積 (計(jì)算的特征映射更加密集)+ 如何降低計(jì)算量 + CRF作為后處理(知乎文章:FCN(3)——DenseCRF) Deeplab: ??? 使用帶孔算法(空洞卷積)進(jìn)行特征提?。簩GG16的全連層轉(zhuǎn)換為卷積層,將最后兩個(gè)最大池化層的后的下采樣去掉,中間的卷積替換為帶孔卷積 ??? 對于空洞卷積,作者提到了兩個(gè)實(shí)現(xiàn)方法:在卷積核中間加0/ 先降采樣然后過正常卷積,第二種方法計(jì)算速度快。最后三個(gè)卷積層使用2倍的步長,第一個(gè)全連層使用4倍步長,這樣做的好處是不需要引入額外的近似算法。 ??? 感受野控制、加速卷積網(wǎng)絡(luò)的密集計(jì)算:將VGG16轉(zhuǎn)換為全卷積層后計(jì)算量變得非常大,為了降低運(yùn)算,將第一個(gè)全連層進(jìn)行降采樣。這個(gè)做法降低了感受野的大小 不是很懂CRF的具體做法,簡單的原文的圖貼上來,感受一下框架的pipline,
v2
相較于v1,簡單來說:
空洞卷積+全連接CRF+ASPP模塊
主干網(wǎng)絡(luò)從預(yù)訓(xùn)練的VGG變成了ResNet
首先在三個(gè)尺度上訓(xùn)練和測試(在給定的輸入上以不同采樣率的空洞卷積并行采樣,相當(dāng)于以多個(gè)比例捕捉圖像的上下文,稱為 ASPP (atrous spatial pyramid pooling) 模塊),得到的概率是輸入圖片的八分之一大小,然后是將概率圖進(jìn)行雙線性插值到原始輸入圖片大小,將三個(gè)尺度的概率圖進(jìn)行融合,融合策略是最簡單的取最大值,最后將融合之后的和原始輸入一樣大小的概率圖輸入到全連接條件隨機(jī)場中細(xì)化邊緣細(xì)節(jié)得到最終的分割結(jié)果。訓(xùn)練的時(shí)候?qū)T降采樣了8倍和CNN直接輸出的概率圖同樣的大小計(jì)算loss。
下面這張圖展示了不同方式的上下文信息獲取,最后一張圖是ASPP的原型:
1.Image Pyramid:將輸入圖片放縮成不同比例,分別應(yīng)用在 DCNN 上,將預(yù)測結(jié)果融合得到最終輸出。 2.Encoder-Decoder:利用 Encoder 階段的多尺度特征,運(yùn)用到 Decoder 階段上恢復(fù)空間分辨率,代表工作有 FCN、SegNet、PSPNet 等工。 3.Deeper w. Atrous Convolution:使用空洞卷積。 4.Spatial Pyramid Pooling:空間金字塔池化具有不同采樣率和多種視野的卷積核,能夠以多尺度捕捉對象。
v3
第三版相對于第二版的改動(dòng)不是很大,主要是借鑒了下面的兩篇論文的思想,然后分別對之前的空洞卷積和ASPP模塊就行了改進(jìn),然后整體加入了BN,需要注意的是從本版本開始已經(jīng)不要CRF進(jìn)行后處理了:
Understanding Convolution for Semantic Segmentation Pyramid Scene Parsing Network
另外文章指出了,在訓(xùn)練的時(shí)候?qū)T應(yīng)該保持不動(dòng),將概率圖插值之后再進(jìn)行計(jì)算loss,這樣不會(huì)導(dǎo)致金標(biāo)準(zhǔn)在降采樣過程中丟失細(xì)節(jié),畢竟8倍的降采樣還是很嚴(yán)重的。
v3+
鑒于對最后的概率圖依然使用大倍數(shù)的雙線性插值恢復(fù)到與原圖一樣的大小還是過于簡單了,因此在這個(gè)版本中,增加了一個(gè)恢復(fù)細(xì)節(jié)的解碼器部分。A是aspp結(jié)構(gòu),其中8x的上采樣可以看做是一個(gè)解碼器;B是編解碼結(jié)構(gòu),它集合了高層和底層的特征;C就是本文采取的結(jié)構(gòu):
下圖展示了具體的網(wǎng)絡(luò)表示:
該框架參考了spatial pyramid pooling(SPP) module和encoder-decoder兩種形式的分割框架。前一種就是PSPNet那一款,后一種更像是SegNet的做法。
ASPP方法的優(yōu)點(diǎn)是該種結(jié)構(gòu)可以提取比較dense的特征,因?yàn)閰⒖剂瞬煌叨鹊膄eature,并且atrous convolution的使用加強(qiáng)了提取dense特征的能力。但是在該種方法中由于pooling和有stride的conv的存在,使得分割目標(biāo)的邊界信息丟失嚴(yán)重。
Encoder-Decoder方法的decoder中就可以起到修復(fù)尖銳物體邊界的作用。
關(guān)于Encoder中卷積的改進(jìn): DeepLab V3+效仿了Xception中使用的depthwise separable convolution,在DeepLab V3的結(jié)構(gòu)中使用了atrous depthwise separable convolution,降低了計(jì)算量的同時(shí)保持了相同(或更好)的效果。
Decoder的設(shè)計(jì): 2.1. Encoder提取出的特征首先被x4上采樣,稱之為F1; 2.2. Encoder中提取出來的與F1同尺度的特征F2'先進(jìn)行1x1卷積,降低通道數(shù)得到F2,再進(jìn)行F1和F2的concatenation,得到F3;(為什么要進(jìn)行通道降維?因?yàn)樵趀ncoder中這些尺度的特征通常通道數(shù)有256或者512個(gè),而encoder最后提取出來的特征通道數(shù)沒有這么多,如果不進(jìn)行降維就進(jìn)行concate的話,無形之中加大了F2'的權(quán)重,加大了網(wǎng)絡(luò)的訓(xùn)練難度) 2.3. 對F3進(jìn)行常規(guī)的3x3convolution微調(diào)特征,最后直接x4upsample得到分割結(jié)果。
編輯:黃飛
?
評論
查看更多