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