白话详细解读(四)-----FCN
全卷積神經(jīng)網(wǎng)絡(luò)詳解(邏輯感超強)
大多數(shù)人接觸"語義"都是在和文字相關(guān)的領(lǐng)域,或語音識別,期望機器能夠識別你發(fā)出去的消息或簡短的語音,然后給予你適當?shù)姆答伜突貜?fù)。嗯,看到這里你應(yīng)該已經(jīng)猜到了,圖像領(lǐng)域也是存在"語義"的。
今天是AI大熱年,很多人都關(guān)注與機器人的語音交互,可是有沒有想過,將來的機器人如果不能通過圖像來識別主人,家里的物品、寵物,那該多沒意思。說近一些,假如掃地機器人能夠機智地繞開你丟在地上的臭襪子而掃走旁邊的紙屑,一定能為你的生活解決不少麻煩。
沒錯,圖像語義分割是AI領(lǐng)域中一個重要的分支,是機器視覺技術(shù)中關(guān)于圖像理解的重要一環(huán),是不是聽上去即重要又牛X閃閃的。
近年的自動駕駛技術(shù)中,也需要用到這種技術(shù)。車載攝像頭探查到圖像,后臺計算機可以自動將圖像分割歸類,以避讓行人和車輛等障礙。
圖像語義分割的意思就是機器自動分割并識別出圖像中的內(nèi)容,比如給出一個人騎摩托車的照片,機器判斷后應(yīng)當能夠生成右側(cè)圖,紅色標注為人,綠色是車(黑色表示back ground)。
所以圖像分割對圖像理解的意義,就好比讀古書首先要斷句一樣。
在Deeplearning技術(shù)快速發(fā)展之前,就已經(jīng)有了很多做圖像分割的技術(shù),其中比較著名的是一種叫做"Normalized cut"的圖劃分方法,簡稱"?N-cut?"。
N-cut的計算有一些連接權(quán)重的公式,這里就不提了,它的思想主要是?通過像素和像素之間的關(guān)系權(quán)重來綜合考慮?,根據(jù)給出的閾值,將圖像一分為二。
下圖是將像素間的關(guān)系信息簡單描述成為距離,根據(jù)距離差距來劃分圖像的示例:
在實際運用中,每運行一次N-cut,只能切割一次圖片,為了分割出圖像上的多個物體,需要多次運行,下圖示例了對原圖a進行7次N-cut后,每次分割出的結(jié)果。
但是可以很明顯的看到這種簡單粗暴的分割方式并不準確,趴在地上的運動員肢體在b圖中分割出來,而他的手臂則在h圖中被分割,顯然是錯誤的。
N-cut技術(shù)的缺陷很明顯,于是有了一種更新的優(yōu)化方式,這種優(yōu)化方式為了避免機器不能很好的分割類似上面例子中"衣服和肢體顏色反查太大導(dǎo)致分割錯誤"的情況,增加了人機交互,在分割過程中,需要人工干預(yù)參與完成。
這種需要人機交互的技術(shù)叫?Grab Cut?。
[敲黑板]~~?注意,PS里就使用了這種技術(shù)。
這種技術(shù)其實是這樣的,給定一張圖片,然后人工在想要摳圖(也就是我們說的分割)的區(qū)域畫一個紅框,然后機器會對略小于這個框的內(nèi)容進行"主體計算",嗯,這個"主體計算"是我起的名字,為了你們更好的理解背后復(fù)雜的設(shè)計和公式,因為機器會默認紅框中部是用戶期望得到的結(jié)果,所以將中部作為主體參考,然后剔除和主體差異較大的部分,留下結(jié)果。
此技術(shù)中,摳出來的部分叫"前景",剔除的部分叫"背景"。
有時候還挺好用的,但是稍微復(fù)雜一點的時候問題就來了:比如要摳下面這個戴頭盔的大兵,頭盔顏色和背后巖石顏色很相近,結(jié)果機器就會把頭盔部分剔除,同樣脖子附近的山巖也被當做了前景而保留了進來。
此時又需要進行人工干預(yù)了,需要手動在圖像上進行標注,畫白色線表示是希望保留的前景,紅色表示背景,指導(dǎo)輔助機器進行判斷,再次運算后,得到了較好的期望結(jié)果。
雖然看上去Grab Cut給出的結(jié)果還不錯,但缺點也很明顯,首先,它同N-cut一樣也只能做?二類語義分割?,說人話就是一次只能分割一類,非黑即白,多個目標圖像就要多次運算。其次,它需要人工干預(yù),這個弱點在將來批量化處理和智能時代簡直就是?死穴?。
OK,人類的智慧是無止境的,?DeepLearning?(深度學(xué)習(xí))終于開始大行其道了。
深度學(xué)習(xí)是機器學(xué)習(xí)的一個分支,主要指?深度神經(jīng)網(wǎng)絡(luò)算法?,深度神經(jīng)網(wǎng)絡(luò)比普通神經(jīng)網(wǎng)絡(luò)層次更多,能夠更好地捕捉數(shù)據(jù)中的深層次關(guān)系,得到的模型較為準確,主要用來進行特征學(xué)習(xí)。
先別急著暈,我們先來看看神經(jīng)網(wǎng)絡(luò)是怎么工作的。
神經(jīng)網(wǎng)絡(luò)是模仿人的神經(jīng)元而建立的人工神經(jīng)元系統(tǒng),多輸入單輸出,同時輸出又作為下一個神經(jīng)元的輸入……(請自行腦補那張牙舞爪妖孽的神經(jīng)元細胞~什么?沒見過?文科生,拖出去~~)
下圖表示的是一個單個神經(jīng)元:
把這些單個神經(jīng)元組織在一起,便形成了神經(jīng)網(wǎng)絡(luò)。下圖便是一個三層神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu):
上圖中最左邊的原始輸入信息稱之為?輸入層?,最右邊的神經(jīng)元稱之為?輸出層?(上圖中輸出層只有一個神經(jīng)元),中間的叫?隱藏層?。
深度神經(jīng)網(wǎng)絡(luò)系統(tǒng)中的層數(shù)比較多,達到8-10層(普通神經(jīng)網(wǎng)絡(luò)的層數(shù)通常3-4層)。
在此前使用的圖像識別算法中,主流的技術(shù)是?卷積神經(jīng)網(wǎng)絡(luò)算法?(Convolutional Neural Networks),簡稱?CNN?。?卷積神經(jīng)網(wǎng)絡(luò)就是一種深度神經(jīng)網(wǎng)絡(luò)?。
但是在2015年的CVPR上發(fā)表了一篇很牛X的論文(路人甲:請問CVPR是神馬?答:CVPR可以簡單理解為這個領(lǐng)域的最重量級的會議:國際計算機視覺與模式識別會議),提出了FCN即?全卷積神經(jīng)網(wǎng)絡(luò)?(Fully Convolutional Networks)。
為什么說這個FCN論文很牛叉呢?看起來只是多了一個字而已呀,有什么不得了的呢?
嗯,不得不說,真是"?差之毫厘,謬以千里?"啊。
我還是先來幫大家復(fù)習(xí)一下卷積。
我查了很多書,卷積有各種各樣的公式,還有各種各樣的推導(dǎo)算法,但是為了降低本文的難讀指數(shù),所以我直接跳到卷積的物理意義,不要太care那些公式,其實卷積的物理意義,就是"?加權(quán)疊加?"。
在對圖像處理進行卷積時,根據(jù)卷積核的大小,輸入和輸出之間也會有規(guī)模上的差異。
來看一張動圖(僅做示例)
上圖左邊5*5的方塊視為圖像輸入,黃色移動的3*3以及里面的數(shù)字(*1/*0)是卷積核,該卷積核按照步長為1的順序依次從原始輸入的左上角一直移動計算疊加到右下角,卷積核一共移動9次。
九次的位置對應(yīng)到右側(cè)的3*3的相應(yīng)格內(nèi),格中的數(shù)字便是卷積值,(此處是卷積核所覆蓋的面積內(nèi)元素相乘再累加的結(jié)果)。
9次移動計算完畢后,右側(cè)3*3的新矩陣為此次卷積層的計算結(jié)果。
如果這么說還是不太好理解,沒關(guān)系,我有更直觀的辦法^_^。
在實際計算過程中,輸入是一張原始圖片和濾波器filter(一組固定的權(quán)重,也就是上面我們說的?卷積核對應(yīng)的實際意義?)做內(nèi)積后得到新的二維數(shù)據(jù)。
不同的濾波器filter會得到不同的輸出數(shù)據(jù),比如輪廓、顏色深淺,如果想提取圖像的不同特征,需要用不同的濾波器filter提取想要的關(guān)于圖像的特定信息。
上圖為一個卷積層中的卷積處理過程,注意上下兩次卷積核內(nèi)容是不同的,所以得到兩種處理結(jié)果。
等號右邊的新的二維信息在CNN網(wǎng)絡(luò)中,會作為下一個卷積層的輸入,即在下一個卷積層計算時,右邊的圖像會作為輸入的原始圖像。
在CNN網(wǎng)絡(luò)中,一共會進行5次卷積層計算。
路人甲:那最后會得到一個什么鬼?
沈MM:咳咳,在連續(xù)的5個卷積層計算后,緊跟這的是3個全連接層。
路人甲:什么是全連接層?
沈MM:全連接層,并不是一個二維圖像,而是——?一個?一維向量?。
路人甲已哭暈在廁所。
這三個一維向量的前兩個向量長度是4096,最后一個向量長度是1000.
為什么是1000?
因為在CNN網(wǎng)絡(luò)中,有1000個分類,最后的這個向量中的1000個元素表達的信息是:這張原始輸入圖片中的東西可能是這1000個分類中的物體的概率。
是的,一張圖,算了半天,最后給出的是,這張圖是個什么玩意的答案。
右側(cè)綠色箭頭指向的表示最后一個全連接層的向量中,表示各種物體的概率,上圖被識別為一輛車。
好了,上面說的是卷積神經(jīng)網(wǎng)絡(luò)CNN的處理過程(相信我我已經(jīng)很簡化了)。
那么?全卷積?神經(jīng)網(wǎng)絡(luò)呢?
大家應(yīng)該注意到,CNN的輸入是圖像,輸出是一個結(jié)果,或者說是一個值,一個概率值。
FCN提出所追求的是,輸入是一張圖片是,輸出也是一張圖片,?學(xué)習(xí)像素到像素的映射?。
上圖上半部分是CNN網(wǎng)絡(luò),下半部分是CN網(wǎng)絡(luò)
那么"?全卷積?"又體現(xiàn)在哪里呢?
CNN網(wǎng)絡(luò)中的后三層,都是一維的向量,計算方式不再采用卷積,所以丟失了二維信息,而FCN網(wǎng)絡(luò)中,將這三層全部?轉(zhuǎn)化為1*1的卷積核所對應(yīng)等同向量長度的多通道卷積層?,使后三層也全部采用卷積計算,整個模型中,全部都是卷積層,沒有向量,所以稱為"全卷積"。
FCN將第6層和7層分別從4096長度的向量轉(zhuǎn)化為4096通道的卷積層,第8層則是21通道的卷積層。之所以第8層從1000縮減到21,是因為FCN使用的識別庫是PASCAL VOC,在PASCAL VOC中有20種物體分類,另外一個background分類。(關(guān)于PASCAL VOC參見附錄)
再多說一句,以下(甚至全文)所用到的分割圖片中不同的顏色就表示不同的物體類別,一共有21種顏色:
CNN的識別是圖像級的識別,也就是從圖像到結(jié)果,而?FCN的識別是像素級的識別?,對輸入圖像的每一個像素在輸出上都有對應(yīng)的判斷標注,標明這個像素最可能是屬于一個什么物體/類別。
在此處特別要指出的是,在實際的圖像語義分割測試時,輸入是一個H*W*3的三通道彩色圖像,而輸出是一個H*W的矩陣。
這就可以簡單看做每一個像素所攜帶的信息是多維的,比如顏色,就分為3層,分別對應(yīng)R、G、B三個值。(不知道什么是RGB的,鑒定為文科生,請迅速撤離,謝謝)
所以在進行卷積的時候,每一個通道都是要獨立計算的,計算完之后再疊加,得到最終卷積層結(jié)果。
如果卷積核移動的步長為1,那么卷積是按照像素排列去挨個計算的,計算量可想而知會有多么龐大。但是在實際中,相鄰的像素往往都是一類,按照像素依次計算就顯得冗余,所以在卷積之后會對輸出進行一次?池化(pooling)處理?。
那么什么又是?池化?呢?
來,我們再來看一張動圖:
池化簡單來說就是將輸入圖像切塊,大部分時候我們選擇不重疊的區(qū)域,假如池化的分割塊大小為?h*h,分割的步長為?j,那么一般?h=j,就像上圖,如果需要重疊,只需要?h>j?即可。
對完整圖像切分,再取切分區(qū)域中所有值的?均值或最大值?作為代表該區(qū)域的新值,放入池化后的二維信息圖中。得到的新圖就是池化結(jié)果。
在CNN和FCN的網(wǎng)絡(luò)模型中,每一個卷積層,都包含了[?卷積?池化]?處理,這就是傳說中的"?下采樣?",但這樣處理之后的結(jié)果是:圖像的像素信息變小了,每一層的像素信息都是前一層的1/2大小,到第五層的時候,圖像大小為原始圖像的?1/32?。
在CNN算法里,這并沒有什么要緊的,因為CNN最終只輸出一個結(jié)果:"這個圖上是個啥",但是FCN不同,FCN是像素級別的識別,也就是輸入有多少像素,輸出就要多少像素,像素之間完全映射,并且在輸出圖像上有信息標注,指明每一個像素可能是什么物體/類別。
所以就必須對這1/32的圖像進行?還原?。
這里用到個純數(shù)學(xué)技術(shù),叫"?反卷積?",對第5層進行反卷積,可以將圖像擴充至原來的大小(嚴格說是近似原始大小,一般會大一點,但是會裁剪掉,為什么會大的原理略復(fù)雜,這里先不提,以后寫進階版再放進來)。
——這個"反卷積"稱為"?上采樣?"。(和下采樣對應(yīng))
在技術(shù)上,我們可以對任一層卷積層做反卷積處理,得到最后的圖像,比如用第三層(8s-8倍放大),第四層(16s-16倍放大),第五層(32s-32倍放大)得到的分割結(jié)果。
來看一張各層還原后的對比圖,分別是:
通過對比可以很明顯看到:在16倍還原和8倍還原時,能夠看到更好的細節(jié),32倍還原出來的圖,在邊緣分割和識別上,雖然大致的意思都出來了,但細節(jié)部分(邊緣)真的很粗糙,甚至無法看出物體形狀。
為什么會這樣呢?
這里就涉及到一個?感受域?(receptive field)的概念。較淺的卷積層(靠前的)的感受域比較小,學(xué)習(xí)感知細節(jié)部分的能力強,較深的隱藏層(靠后的),感受域相對較大,適合學(xué)習(xí)較為整體的、相對更宏觀一些的特征。
所以在較深的卷積層上進行反卷積還原,自然會丟失很多細節(jié)特征。
于是我們會在反卷積步驟時,考慮采用一部分較淺層的反卷積信息輔助疊加,更好的優(yōu)化分割結(jié)果的精度:
盡管FCN的提出是一條很牛叉的路,但還是無法避免有很多問題,比如,精度問題,對細節(jié)不敏感,以及像素與像素之間的關(guān)系,忽略空間的一致性等問題。
于是更牛的大牛就出現(xiàn)了。
有牛人提出一種新的卷積計算方式,開始稱為"帶hole"的卷積,也就是使用一種"?疏松的卷積核"來計算,以此來取代池化的處理。
上面已經(jīng)講過,池化操作能夠減少計算量,同時也能防止計算結(jié)果過擬合,那么單純?nèi)∠鼗僮饔謺箚螌泳W(wǎng)絡(luò)的感受域縮小,但如果使用"疏松的卷積核"來處理卷積,可以達到在不增加計算量的情況下增加感受域,彌補不進行池化處理后的精度問題。
括弧:這種帶洞的卷積方式后來起了一個高雅的名字叫做:"Dilated Convolutions"。
這種方式人為加大了卷積核內(nèi)部元素之間的距離,可參考下圖:
紅點表示卷積核的元素,綠色表示感受域,黑線框表示輸入圖像。
a為原始卷積核計算時覆蓋的感受域,b為當卷積核覆蓋的元素間距離增大的情況,不再在連續(xù)的空間內(nèi)去做卷積,跳著做,當這個距離增加的越大時,單次計算覆蓋的感受域面積越大。
上圖不太好理解的話再來看一張圖:(個人覺得下面這個圖非常好理解)
上層綠色點表示輸入層像素點,下層黃色是輸出層(單次計算時的層級關(guān)系),當卷積核元素間距為0時(相鄰),123對應(yīng)輸出A,234對應(yīng)輸出B,345對應(yīng)輸出C,那么輸出ABC三個元素結(jié)果的感受域只覆蓋了12345這幾個原始像素點。
如果采用稀疏的卷積核,假設(shè)間距為1(相當于卷積計算時跳一個像素再取值計算),如圖示,那么結(jié)果A對應(yīng)的輸入是135,結(jié)果B對應(yīng)的輸入是246,結(jié)果C對應(yīng)的輸入是357,同樣輸出ABC三個結(jié)果,在原始圖像上取的像素點的長度就多了。
這是水平X軸方向上的擴展,在Y軸上也會有同樣的擴展,感受域在沒有增加計算(相對于池化操作后)的情況下增大了,并且保留了足夠多的細節(jié)信息,對圖像還原后的精度有明顯的提升。
看一下對比圖:
第一列是原始圖像,最后一列是手工標注的訓(xùn)練輸入圖像,第二列為FCN在1/8倍數(shù)下的還原,第三列則是采用了新的卷積算法的還原圖像,可以很明顯看到,第三列對細節(jié)的分割明顯優(yōu)于第二列FCN 8倍的圖像。
剛才還提到了第二個問題,即像素與像素之間的邏輯關(guān)系的問題,畢竟前面再牛叉的算法也只是單純的計算沒有根據(jù)物理意義進行判斷在輸出的標注里這些結(jié)果是否合法(符合現(xiàn)實邏輯)。
很多以深度學(xué)習(xí)為框架的圖像語義分割系統(tǒng)都使用了一種叫做"?條件隨機場?"(?Conditional Random Field,簡稱?CRF?)的技術(shù)作為輸出結(jié)果的優(yōu)化后處理手段。其實類似技術(shù)種類較多,比如還有馬爾科夫隨機場(MRF)和高斯條件隨機場(G-CRF)用的也比較多,但原理都較為類似。
簡單來介紹一下"條件隨機場"的概念。
FCN是像素到像素的影射,所以最終輸出的圖片上每一個像素都是標注了分類的,將這些分類簡單地看成是不同的變量,每個像素都和其他像素之間建立一種連接,連接就是相互間的關(guān)系。
于是就會得到一個"完全圖":
上圖是以4*6大小的圖像像素陣列表示的簡易版。
那么在全鏈接的?CRF?模型中,有一個對應(yīng)的能量函數(shù):
嗯,不要問我這個公式里各種符號是啥,我看不懂。但是我知道這個公式是干嘛滴:
其中等號右邊第一個一元項,表示像素對應(yīng)的語義類別,其類別可以由FCN或者其他語義分割模型的預(yù)測結(jié)果得到;而第二項為二元項,二元項可將像素之間的語義聯(lián)系/關(guān)系考慮進去。
這么說太抽象,舉個簡單的例子,"天空"和"鳥"這樣的像素在物理空間是相鄰的概率,應(yīng)該要比"天空"和"魚"這樣像素相鄰的概率大,那么天空的邊緣就更應(yīng)該判斷為鳥而不是魚(從概率的角度)。
通過對這個能量函數(shù)優(yōu)化求解,把明顯不符合事實識別判斷剔除,替換成合理的解釋,得到對FCN的圖像語義預(yù)測結(jié)果的優(yōu)化,生成最終的語義分割結(jié)果。
優(yōu)化后的對比圖:
上圖第二列是FCN網(wǎng)絡(luò)8倍還原分割結(jié)果,第三列是將CRF植入FCN處理后的結(jié)果。
可以很明顯的看到,第三列的物體識別無論是輪廓細節(jié)分割還是物體識別,都優(yōu)于第二列,特別是第二行的沙發(fā)中有奇怪的紅色東西的識別,在進行CRF優(yōu)化之后,還原成了綠色的沙發(fā)。
OK,說了這么多,終于快要講完了(好累)。
以上就是目前較為前沿的圖像語義分割技術(shù)。
目前的這種機器學(xué)習(xí)方式還屬于?監(jiān)督性學(xué)習(xí)?,牛叉閃閃的科學(xué)家們還是希望將來可以實現(xiàn)?半監(jiān)督?或?弱監(jiān)督式?學(xué)習(xí),這樣更類似人類的學(xué)習(xí)認知方式。
在這條道路上,還有很多有趣的東西,比如?示例級別(instance level)的圖像語義分割?問題也同樣熱門。
該類問題不僅需要對不同語義物體進行圖像分割,同時還要求對同一語義的不同個體進行分割(例如需要對圖中出現(xiàn)的九把椅子的像素用不同顏色分別標示出來)。
另外,在目前的計算技術(shù)水平下(硬件軟件),使用FCN訓(xùn)練建模的時間大約需要三周,這也說明在這個領(lǐng)域里還有很多值得探索和需要解決的問題。
對此有興趣的同學(xué)們自己去繼續(xù)研究吧,哈哈。
曾有一個業(yè)界大牛說過這樣一段話,送給大家:
"華人在計算機視覺領(lǐng)域的研究水平越來越高,這是非常振奮人心的事。我們中國錯過了工業(yè)革命,錯過了電氣革命,信息革命也只是跟隨狀態(tài)。但人工智能的革命,我們跟世界上的領(lǐng)先國家是并肩往前跑的。能身處這個時代浪潮之中,做一番偉大的事業(yè),經(jīng)常激動的夜不能寐。"
AI的浪潮即將席卷而來,你,準備好了么?
?
?
?
-----------------------------------分割線--------------------------------------------
?
?
?
?
背景
CNN能夠?qū)D片進行分類,可是怎么樣才能識別圖片中特定部分的物體,在2015年之前還是一個世界難題。神經(jīng)網(wǎng)絡(luò)大神Jonathan Long發(fā)表了《Fully Convolutional Networks for Semantic Segmentation》在圖像語義分割挖了一個坑,于是無窮無盡的人往坑里面跳。
全卷積網(wǎng)絡(luò)?Fully Convolutional Networks
CNN?與?FCN
通常CNN網(wǎng)絡(luò)在卷積層之后會接上若干個全連接層,?將卷積層產(chǎn)生的特征圖(feature map)映射成一個固定長度的特征向量。以AlexNet為代表的經(jīng)典CNN結(jié)構(gòu)適合于圖像級的分類和回歸任務(wù),因為它們最后都期望得到整個輸入圖像的一個數(shù)值描述(概率),比如AlexNet的ImageNet模型輸出一個1000維的向量表示輸入圖像屬于每一類的概率(softmax歸一化)。
栗子:下圖中的貓,?輸入AlexNet,?得到一個長為1000的輸出向量,?表示輸入圖像屬于每一類的概率,?其中在"tabby cat"這一類統(tǒng)計概率最高。
FCN對圖像進行像素級的分類,從而解決了語義級別的圖像分割(semantic segmentation)問題。與經(jīng)典的CNN在卷積層之后使用全連接層得到固定長度的特征向量進行分類(全聯(lián)接層+softmax輸出)不同,FCN可以接受任意尺寸的輸入圖像,采用反卷積層對最后一個卷積層的feature map進行上采樣,?使它恢復(fù)到輸入圖像相同的尺寸,從而可以對每個像素都產(chǎn)生了一個預(yù)測,?同時保留了原始輸入圖像中的空間信息,?最后在上采樣的特征圖上進行逐像素分類。
最后逐個像素計算softmax分類的損失,?相當于每一個像素對應(yīng)一個訓(xùn)練樣本。下圖是Longjon用于語義分割所采用的全卷積網(wǎng)絡(luò)(FCN)的結(jié)構(gòu)示意圖:
簡單的來說,FCN與CNN的區(qū)域在把于CNN最后的全連接層換成卷積層,輸出的是一張已經(jīng)Label好的圖片。
其實,CNN的強大之處在于它的多層結(jié)構(gòu)能自動學(xué)習(xí)特征,并且可以學(xué)習(xí)到多個層次的特征:較淺的卷積層感知域較小,學(xué)習(xí)到一些局部區(qū)域的特征;較深的卷積層具有較大的感知域,能夠?qū)W習(xí)到更加抽象一些的特征。這些抽象特征對物體的大小、位置和方向等敏感性更低,從而有助于識別性能的提高。下圖CNN分類網(wǎng)絡(luò)的示意圖:
這些抽象的特征對分類很有幫助,可以很好地判斷出一幅圖像中包含什么類別的物體,但是因為丟失了一些物體的細節(jié),不能很好地給出物體的具體輪廓、指出每個像素具體屬于哪個物體,因此做到精確的分割就很有難度。
傳統(tǒng)的基于CNN的分割方法:為了對一個像素分類,使用該像素周圍的一個圖像塊作為CNN的輸入用于訓(xùn)練和預(yù)測。這種方法有幾個缺點:一是存儲開銷很大。例如對每個像素使用的圖像塊的大小為15x15,然后不斷滑動窗口,每次滑動的窗口給CNN進行判別分類,因此則所需的存儲空間根據(jù)滑動窗口的次數(shù)和大小急劇上升。二是計算效率低下。相鄰的像素塊基本上是重復(fù)的,針對每個像素塊逐個計算卷積,這種計算也有很大程度上的重復(fù)。三是像素塊大小的限制了感知區(qū)域的大小。通常像素塊的大小比整幅圖像的大小小很多,只能提取一些局部的特征,從而導(dǎo)致分類的性能受到限制。
而全卷積網(wǎng)絡(luò)(FCN)則是從抽象的特征中恢復(fù)出每個像素所屬的類別。即從圖像級別的分類進一步延伸到像素級別的分類。
?
全連接層?->?卷積層
全連接層和卷積層之間唯一的不同就是卷積層中的神經(jīng)元只與輸入數(shù)據(jù)中的一個局部區(qū)域連接,并且在卷積列中的神經(jīng)元共享參數(shù)。然而在兩類層中,神經(jīng)元都是計算點積,所以它們的函數(shù)形式是一樣的。因此,將此兩者相互轉(zhuǎn)化是可能的:
-
對于任一個卷積層,都存在一個能實現(xiàn)和它一樣的前向傳播函數(shù)的全連接層。權(quán)重矩陣是一個巨大的矩陣,除了某些特定塊,其余部分都是零。而在其中大部分塊中,元素都是相等的。
-
相反,任何全連接層都可以被轉(zhuǎn)化為卷積層。比如,一個?K=4096?的全連接層,輸入數(shù)據(jù)體的尺寸是?7?7?512,這個全連接層可以被等效地看做一個?F=7,P=0,S=1,K=4096?的卷積層。換句話說,就是將濾波器的尺寸設(shè)置為和輸入數(shù)據(jù)體的尺寸一致了。因為只有一個單獨的深度列覆蓋并滑過輸入數(shù)據(jù)體,所以輸出將變成?1?1?4096,這個結(jié)果就和使用初始的那個全連接層一樣了。
全連接層轉(zhuǎn)化為卷積層:在兩種變換中,將全連接層轉(zhuǎn)化為卷積層在實際運用中更加有用。假設(shè)一個卷積神經(jīng)網(wǎng)絡(luò)的輸入是?224x224x3?的圖像,一系列的卷積層和下采樣層將圖像數(shù)據(jù)變?yōu)槌叽鐬?7x7x512?的激活數(shù)據(jù)體。AlexNet使用了兩個尺寸為4096的全連接層,最后一個有1000個神經(jīng)元的全連接層用于計算分類評分。我們可以將這3個全連接層中的任意一個轉(zhuǎn)化為卷積層:
-
針對第一個連接區(qū)域是[7x7x512]的全連接層,令其濾波器尺寸為F=7,這樣輸出數(shù)據(jù)體就為[1x1x4096]了。
-
針對第二個全連接層,令其濾波器尺寸為F=1,這樣輸出數(shù)據(jù)體為[1x1x4096]。
-
對最后一個全連接層也做類似的,令其F=1,最終輸出為[1x1x1000]
實際操作中,每次這樣的變換都需要把全連接層的權(quán)重W重塑成卷積層的濾波器。那么這樣的轉(zhuǎn)化有什么作用呢?它在下面的情況下可以更高效:讓卷積網(wǎng)絡(luò)在一張更大的輸入圖片上滑動,得到多個輸出,這樣的轉(zhuǎn)化可以讓我們在單個向前傳播的過程中完成上述的操作。
舉個栗子:如果我們想讓224×224尺寸的浮窗,以步長為32在384×384的圖片上滑動,把每個經(jīng)停的位置都帶入卷積網(wǎng)絡(luò),最后得到6×6個位置的類別得分。上述的把全連接層轉(zhuǎn)換成卷積層的做法會更簡便。如果224×224的輸入圖片經(jīng)過卷積層和下采樣層之后得到了[7x7x512]的數(shù)組,那么,384×384的大圖片直接經(jīng)過同樣的卷積層和下采樣層之后會得到[12x12x512]的數(shù)組。然后再經(jīng)過上面由3個全連接層轉(zhuǎn)化得到的3個卷積層,最終得到[6x6x1000]的輸出((12 – 7)/1 + 1 = 6)。這個結(jié)果正是浮窗在原圖經(jīng)停的6×6個位置的得分!
面對384×384的圖像,讓(含全連接層)的初始卷積神經(jīng)網(wǎng)絡(luò)以32像素的步長獨立對圖像中的224×224塊進行多次評價,其效果和使用把全連接層變換為卷積層后的卷積神經(jīng)網(wǎng)絡(luò)進行一次前向傳播是一樣的。
Evaluating the original ConvNet (with FC layers) independently across 224x224 crops of the 384x384 image in strides of 32 pixels gives an identical result to forwarding the converted ConvNet one time.
如下圖所示,FCN將傳統(tǒng)CNN中的全連接層轉(zhuǎn)化成卷積層,對應(yīng)CNN網(wǎng)絡(luò)FCN把最后三層全連接層轉(zhuǎn)換成為三層卷積層。在傳統(tǒng)的CNN結(jié)構(gòu)中,前5層是卷積層,第6層和第7層分別是一個長度為4096的一維向量,第8層是長度為1000的一維向量,分別對應(yīng)1000個不同類別的概率。FCN將這3層表示為卷積層,卷積核的大小?(通道數(shù),寬,高)?分別為?(4096,1,1)、(4096,1,1)、(1000,1,1)。看上去數(shù)字上并沒有什么差別,但是卷積跟全連接是不一樣的概念和計算過程,使用的是之前CNN已經(jīng)訓(xùn)練好的權(quán)值和偏置,但是不一樣的在于權(quán)值和偏置是有自己的范圍,屬于自己的一個卷積核。因此FCN網(wǎng)絡(luò)中所有的層都是卷積層,故稱為全卷積網(wǎng)絡(luò)。
下圖是一個全卷積層,與上圖不一樣的是圖像對應(yīng)的大小下標,CNN中輸入的圖像大小是同意固定resize成?227x227?大小的圖像,第一層pooling后為55x55,第二層pooling后圖像大小為27x27,第五層pooling后的圖像大小為13*13。而FCN輸入的圖像是H*W大小,第一層pooling后變?yōu)樵瓐D大小的1/4,第二層變?yōu)樵瓐D大小的1/8,第五層變?yōu)樵瓐D大小的1/16,第八層變?yōu)樵瓐D大小的1/32(勘誤:其實真正代碼當中第一層是1/2,以此類推)。
經(jīng)過多次卷積和pooling以后,得到的圖像越來越小,分辨率越來越低。其中圖像到?H/32?W/32?的時候圖片是最小的一層時,所產(chǎn)生圖叫做heatmap熱圖,熱圖就是我們最重要的高維特征圖,得到高維特征的heatmap之后就是最重要的一步也是最后的一步對原圖像進行upsampling,把圖像進行放大、放大、放大,到原圖像的大小。
最后的輸出是1000張heatmap經(jīng)過upsampling變?yōu)樵瓐D大小的圖片,為了對每個像素進行分類預(yù)測label成最后已經(jīng)進行語義分割的圖像,這里有一個小trick,就是最后通過逐個像素地求其在1000張圖像該像素位置的最大數(shù)值描述(概率)作為該像素的分類。因此產(chǎn)生了一張已經(jīng)分類好的圖片,如下圖右側(cè)有狗狗和貓貓的圖。
?
upsampling
相較于使用被轉(zhuǎn)化前的原始卷積神經(jīng)網(wǎng)絡(luò)對所有36個位置進行迭代計算,使用轉(zhuǎn)化后的卷積神經(jīng)網(wǎng)絡(luò)進行一次前向傳播計算要高效得多,因為36次計算都在共享計算資源。這一技巧在實踐中經(jīng)常使用,一次來獲得更好的結(jié)果。比如,通常將一張圖像尺寸變得更大,然后使用變換后的卷積神經(jīng)網(wǎng)絡(luò)來對空間上很多不同位置進行評價得到分類評分,然后在求這些分值的平均值。
最后,如果我們想用步長小于32的浮窗怎么辦?用多次的向前傳播就可以解決。比如我們想用步長為16的浮窗。那么先使用原圖在轉(zhuǎn)化后的卷積網(wǎng)絡(luò)執(zhí)行向前傳播,然后分別沿寬度,沿高度,最后同時沿寬度和高度,把原始圖片分別平移16個像素,然后把這些平移之后的圖分別帶入卷積網(wǎng)絡(luò)。
如下圖所示,當圖片在網(wǎng)絡(luò)中經(jīng)過處理后變成越小的圖片,其特征也越明顯,就像圖像中顏色所示,當然啦,最后一層的圖片不再是一個1個像素的圖片,而是原圖像?H/32xW/32?大小的圖,這里為了簡化而畫成一個像素而已。
?
如下圖所示,對原圖像進行卷積conv1、pool1后原圖像縮小為1/2;之后對圖像進行第二次conv2、pool2后圖像縮小為1/4;接著繼續(xù)對圖像進行第三次卷積操作conv3、pool3縮小為原圖像的1/8,此時保留pool3的featureMap;接著繼續(xù)對圖像進行第四次卷積操作conv4、pool4,縮小為原圖像的1/16,保留pool4的featureMap;最后對圖像進行第五次卷積操作conv5、pool5,縮小為原圖像的1/32,然后把原來CNN操作中的全連接變成卷積操作conv6、conv7,圖像的featureMap數(shù)量改變但是圖像大小依然為原圖的1/32,此時圖像不再叫featureMap而是叫heatMap。
現(xiàn)在我們有1/32尺寸的heatMap,1/16尺寸的featureMap和1/8尺寸的featureMap,1/32尺寸的heatMap進行upsampling操作之后,因為這樣的操作還原的圖片僅僅是conv5中的卷積核中的特征,限于精度問題不能夠很好地還原圖像當中的特征,因此在這里向前迭代。把conv4中的卷積核對上一次upsampling之后的圖進行反卷積補充細節(jié)(相當于一個差值過程),最后把conv3中的卷積核對剛才upsampling之后的圖像進行再次反卷積補充細節(jié),最后就完成了整個圖像的還原。
?
缺點
在這里我們要注意的是FCN的缺點:
是得到的結(jié)果還是不夠精細。進行8倍上采樣雖然比32倍的效果好了很多,但是上采樣的結(jié)果還是比較模糊和平滑,對圖像中的細節(jié)不敏感。
是對各個像素進行分類,沒有充分考慮像素與像素之間的關(guān)系。忽略了在通常的基于像素分類的分割方法中使用的空間規(guī)整(spatial regularization)步驟,缺乏空間一致性。
?
?
?
-----------------------------------分割線--------------------------------------------
?
?
?
?
從圖像分類到圖像分割
卷積神經(jīng)網(wǎng)絡(luò)(CNN)自2012年以來,在圖像分類和圖像檢測等方面取得了巨大的成就和廣泛的應(yīng)用。
CNN的強大之處在于它的多層結(jié)構(gòu)能自動學(xué)習(xí)特征,并且可以學(xué)習(xí)到多個層次的特征:較淺的卷積層感知域較小,學(xué)習(xí)到一些局部區(qū)域的特征;較深的卷積層具有較大的感知域,能夠?qū)W習(xí)到更加抽象一些的特征。這些抽象特征對物體的大小、位置和方向等敏感性更低,從而有助于識別性能的提高。
這些抽象的特征對分類很有幫助,可以很好地判斷出一幅圖像中包含什么類別的物體,但是因為丟失了一些物體的細節(jié),不能很好地給出物體的具體輪廓、指出每個像素具體屬于哪個物體,因此做到精確的分割就很有難度。
傳統(tǒng)的基于CNN的分割方法的做法通常是:為了對一個像素分類,使用該像素周圍的一個圖像塊作為CNN的輸入用于訓(xùn)練和預(yù)測。這種方法有幾個缺點:一是存儲開銷很大。例如對每個像素使用的圖像塊的大小為15x15,則所需的存儲空間為原來圖像的225倍。二是計算效率低下。相鄰的像素塊基本上是重復(fù)的,針對每個像素塊逐個計算卷積,這種計算也有很大程度上的重復(fù)。三是像素塊大小的限制了感知區(qū)域的大小。通常像素塊的大小比整幅圖像的大小小很多,只能提取一些局部的特征,從而導(dǎo)致分類的性能受到限制。
針對這個問題, UC Berkeley的Jonathan Long等人提出了Fully Convolutional Networks (FCN)[1]用于圖像的分割。該網(wǎng)絡(luò)試圖從抽象的特征中恢復(fù)出每個像素所屬的類別。即從圖像級別的分類進一步延伸到像素級別的分類。
?
FCN的原理
FCN將傳統(tǒng)CNN中的全連接層轉(zhuǎn)化成一個個的卷積層。如下圖所示,在傳統(tǒng)的CNN結(jié)構(gòu)中,前5層是卷積層,第6層和第7層分別是一個長度為4096的一維向量,第8層是長度為1000的一維向量,分別對應(yīng)1000個類別的概率。FCN將這3層表示為卷積層,卷積核的大小(通道數(shù),寬,高)分別為(4096,1,1)、(4096,1,1)、(1000,1,1)。所有的層都是卷積層,故稱為全卷積網(wǎng)絡(luò)。?
可以發(fā)現(xiàn),經(jīng)過多次卷積(還有pooling)以后,得到的圖像越來越小,分辨率越來越低(粗略的圖像),那么FCN是如何得到圖像中每一個像素的類別的呢?為了從這個分辨率低的粗略圖像恢復(fù)到原圖的分辨率,FCN使用了上采樣。例如經(jīng)過5次卷積(和pooling)以后,圖像的分辨率依次縮小了2,4,8,16,32倍。對于最后一層的輸出圖像,需要進行32倍的上采樣,以得到原圖一樣的大小。
這個上采樣是通過反卷積(deconvolution)實現(xiàn)的。對第5層的輸出(32倍放大)反卷積到原圖大小,得到的結(jié)果還是不夠精確,一些細節(jié)無法恢復(fù)。于是Jonathan將第4層的輸出和第3層的輸出也依次反卷積,分別需要16倍和8倍上采樣,結(jié)果就精細一些了。下圖是這個卷積和反卷積上采樣的過程:?
下圖是32倍,16倍和8倍上采樣得到的結(jié)果的對比,可以看到它們得到的結(jié)果越來越精確:?
?
FCN的優(yōu)點和不足
與傳統(tǒng)用CNN進行圖像分割的方法相比,FCN有兩大明顯的優(yōu)點:一是可以接受任意大小的輸入圖像,而不用要求所有的訓(xùn)練圖像和測試圖像具有同樣的尺寸。二是更加高效,因為避免了由于使用像素塊而帶來的重復(fù)存儲和計算卷積的問題。
同時FCN的缺點也比較明顯:一是得到的結(jié)果還是不夠精細。進行8倍上采樣雖然比32倍的效果好了很多,但是上采樣的結(jié)果還是比較模糊和平滑,對圖像中的細節(jié)不敏感。二是對各個像素進行分類,沒有充分考慮像素與像素之間的關(guān)系,忽略了在通常的基于像素分類的分割方法中使用的空間規(guī)整(spatial regularization)步驟,缺乏空間一致性。
?
FCN的擴展
雖然FCN不夠完美,但是其全新的思路開辟了一個新的圖像分割方向,對這個領(lǐng)域的影響是十分巨大的,從2015年3月在arxiv和6月在CVPR會議上發(fā)表到寫下這篇博客的時候一年的時間,該文章已被引用高達400次。
在FCN的基礎(chǔ)上,UCLA DeepLab的Liang-Chieh Chen[2]等在得到像素分類結(jié)果后使用了全連接的條件隨機場(fully connected conditional random fields),考慮圖像中的空間信息,得到更加精細并且具有空間一致性的結(jié)果。
Liang-Chieh的這篇文章有兩大特點,一是忽略下采樣過程,轉(zhuǎn)而使用稀疏的卷積核以增加感知范圍。如下圖所示:?
二是使用了Fully Connected CRF。CRF的能量函數(shù)中包括數(shù)據(jù)項和平滑項兩部分,數(shù)據(jù)項與各個像素屬于各類別的概率有關(guān),平滑項控制像素與像素間類別的一致性。傳統(tǒng)的CRF的平滑項只考慮相鄰像素類別的關(guān)聯(lián)性,而Fully Connected CRF將圖像中任意兩個像素之間的類別關(guān)聯(lián)性都考慮進來。
下圖是CNN與Fully Connected CRF結(jié)合的示意圖。?
實際上,CRF或者Fully Connected CRF是對CNN或者FCN輸出的一種后處理技術(shù)。像素分類和空間規(guī)整這兩步是分別進行的。Shuai Zheng[3]等人將Fully Connected CRF表示成回流神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)(recurrent neuron network,RNN),將CNN與這個RNN放到一個統(tǒng)一的框架中,可以一步到位地對兩者同時進行訓(xùn)練。將圖像分割中的三個步驟:特征提取、分類器預(yù)測和空間規(guī)整全部自動化處理,通過學(xué)習(xí)獲得,得到的結(jié)果比FCN-8s和DeepLab的方法的效果好了許多。如下圖結(jié)果:?
CNN、FCN與Fully Connected CRF的結(jié)合及統(tǒng)一的自動訓(xùn)練具有很不錯的應(yīng)用價值,已有很多的研究對這幾篇文章進行跟進([2]和[3]的引用都已過百)。例如,帝國理工的Konstantinos Kamnitsas,Daniel Rueckert等人在這幾篇文章的基礎(chǔ)上,提出了三維的多尺度CNN和全連接CRF結(jié)合的方法,稱為DeepMedic,?用于腦腫瘤的分割,最近(4月4號)剛發(fā)表于arXiv。
參考文獻?
1,Long, Jonathan, Evan Shelhamer, and Trevor Darrell. "Fully convolutional networks for semantic segmentation." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015.?
2,Chen, Liang-Chieh, et al. "Semantic image segmentation with deep convolutional nets and fully connected crfs." arXiv preprint arXiv:1412.7062 (2014).?
3,Zheng, Shuai, et al. "Conditional random fields as recurrent neural networks." Proceedings of the IEEE International Conference on Computer Vision. 2015.?
4,Kamnitsas, Konstantinos, et al. "Efficient Multi-Scale 3D CNN with Fully Connected CRF for Accurate Brain Lesion Segmentation." arXiv preprint arXiv:1603.05959 (2016).
總結(jié)
以上是生活随笔為你收集整理的白话详细解读(四)-----FCN的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年母婴行业洞察报告
- 下一篇: 2021年微信视频号生态趋势调查报告