1. 程式人生 > >圖像語義分割的前世今生(轉載)良心之作

圖像語義分割的前世今生(轉載)良心之作

解釋 運行 明顯 視覺 缺點 事情 img 裏的 deep

   1998年以來,人工神經網絡識別技術已經引起了廣泛的關註,並且應用於圖像分割。基於神經網絡的分割方法的基本思想是通過訓練多層感知機來得到線性決策函數,然後用決策函數對像素進行分類來達到分割的目的。這種方法需要大量的訓練數據。神經網絡存在巨量的連接,容易引入空間信息,能較好地解決圖像中的噪聲和不均勻問題。選擇何種網絡結構是這種方法要解決的主要問題。

圖像分割是圖像識別和計算機視覺至關重要的預處理。沒有正確的分割就不可能有正確的識別。

    • 普通分割

      將不同分屬不同物體的像素區域分開。
      如前景與後景分割開,狗的區域與貓的區域與背景分割開。

    • 語義分割

      在普通分割的基礎上,分類出每一塊區域的語義(即這塊區域是什麽物體)。
      如把畫面中的所有物體都指出它們各自的類別。

    • 實例分割

      在語義分割的基礎上,給每個物體編號。
      如這個是該畫面中的狗A,那個是畫面中的狗B。

  這裏先說一下圖像語義分割和普通的圖像分割的關系:

  我們先看一下對傳統圖像分割的定義:所謂圖像分割是指根據灰度、彩色、空間紋理、幾何形狀等特征把圖像劃分成若幹個互不相交的區域,使得這些特征在同一區域內表現出一致性或相似性,而在不同區域間表現出明顯的不同。簡單的說就是在一副圖像中,把目標從背景中分離出來。

  關於傳統圖像分割,想系統了解更多的,請參考:https://www.cnblogs.com/ariel-dreamland/p/9428434.html

  普通的圖像分割,通常意味著傳統語義分割,這個時期的圖像分割(大概2010年前),由於計算機計算能力有限,早期只能處理一些灰度圖,後來才能處理rgb圖,這個時期的分割主要是通過提取圖片的低級特征,然後進行分割,湧現了一些方法:Ostu、FCM、分水嶺、N-Cut等。這個階段一般是非監督學習,分割出來的結果並沒有語義的標註,換句話說,分割出來的東西並不知道是什麽。

  隨後,隨著計算能力的提高,人們開始考慮獲得圖像的語義分割,這裏的語義目前是低級語義,主要指分割出來的物體的類別,這個階段(大概是2010年到2015年)人們考慮使用機器學習的方法進行圖像語義分割。

  隨著FCN的出現,深度學習正式進入圖像語義分割領域,這裏的語義仍主要指分割出來的物體的類別,從分割結果可以清楚的知道分割出來的是什麽物體,比如貓、狗等等。

  現在還有一種叫instance segmentation, 可以對同一類別的不同物體進行不同的劃分,可以清楚地知道分割出來的左邊和右邊的兩個人不是同一個人。

  普通的圖像分割往往是根據圖像的顏色紋理進行劃分區域,而語義分割是基於一個語義單元,例如將人,車等目標從圖像中分割出來,如果目標存在多種顏色,在普通分割中往往是分割成多個區域。而上面提到的instance segmentation還要跟進一步,比如一排車連在一起,語義分割的結果是整個一排車在一個分割區域裏,而instances segmentation還要將車與車分割開來。

圖像語義分割是 AI 領域中一個重要的分支,是機器視覺技術中關於圖像理解的重要一環。近年的自動駕駛技術中,也需要用到這種技術。車載攝像頭探查到圖像,後臺計算機可以自動將圖像分割歸類,以避讓行人和車輛等障礙。圖像語義分割的意思就是機器自動分割並識別出圖像中的內容比如給出一個人騎摩托車的照片,機器判斷後應當能夠生成右側圖,紅色標註為人,綠色是車(黑色表示 back ground)。

技術分享圖片

  所以圖像分割對圖像理解的意義,就好比讀古書首先要斷句一樣

  在 Deeplearning 技術快速發展之前,就已經有了很多做圖像分割的技術,其中比較著名的是一種叫做 “Normalized cut” 的圖劃分方法,簡稱 “N-cut”。N-cut 的計算有一些連接權重的公式,這裏就不提了,它的思想主要是通過像素和像素之間的關系權重來綜合考慮,根據給出的閾值,將圖像一分為二。

  下圖是將像素間的關系信息簡單描述成為距離,根據距離差距來劃分圖像的示例:

技術分享圖片

  在實際運用中,每運行一次 N-cut,只能切割一次圖片,為了分割出圖像上的多個物體,需要多次運行,下圖示例了對原圖 a 進行 7 次 N-cut 後,每次分割出的結果。

技術分享圖片

  但是可以很明顯的看到這種簡單粗暴的分割方式並不準確,趴在地上的運動員肢體在 b 圖中分割出來,而他的手臂則在 h 圖中被分割,顯然是錯誤的。

  N-cut 技術的缺陷很明顯,於是有了一種更新的優化方式,這種優化方式為了避免機器不能很好的分割類似上面例子中 “衣服和肢體顏色反查太大導致分割錯誤” 的情況,增加了人機交互,在分割過程中,需要人工幹預參與完成。這種需要人機交互的技術叫 Grab Cut

  這種技術其實是這樣的,給定一張圖片,然後人工在想要摳圖(也就是我們說的分割)的區域畫一個紅框,然後機器會對略小於這個框的內容進行 “主體計算”,嗯,這個 “主體計算” 是我起的名字,為了你們更好的理解背後復雜的設計和公式,因為機器會默認紅框中部是用戶期望得到的結果,所以將中部作為主體參考,然後剔除和主體差異較大的部分,留下結果。

技術分享圖片

  此技術中,摳出來的部分叫 “前景”,剔除的部分叫 “背景”。有時候還挺好用的,但是稍微復雜一點的時候問題就來了:比如要摳下面這個戴頭盔的大兵,頭盔顏色和背後巖石顏色很相近,結果機器就會把頭盔部分剔除,同樣脖子附近的山巖也被當做了前景而保留了進來。

技術分享圖片

  此時又需要進行人工幹預了,需要手動在圖像上進行標註,畫白色線表示是希望保留的前景,紅色表示背景,指導輔助機器進行判斷,再次運算後,得到了較好的期望結果。

  雖然看上去 Grab Cut 給出的結果還不錯,但缺點也很明顯,首先,它同 N-cut 一樣也只能做二類語義分割,說人話就是一次只能分割一類,非黑即白,多個目標圖像就要多次運算。其次,它需要人工幹預,這個弱點在將來批量化處理和智能時代簡直就是死穴

  OK,人類的智慧是無止境的,DeepLearning(深度學習)終於開始大行其道了。

  在此前使用的圖像識別算法中,主流的技術是卷積神經網絡算法(Convolutional Neural Networks),簡稱 CNN卷積神經網絡就是一種深度神經網絡

  但是在 2015 年的 CVPR 上發表了一篇很6的論文(路人甲:請問 CVPR 是神馬?答:CVPR 可以簡單理解為這個領域的最重量級的會議:國際計算機視覺與模式識別會議),提出了 FCN 即 全卷積神經網絡(Fully Convolutional Networks)。

  為什麽說這個 FCN 論文很牛叉呢?看起來只是多了一個字而已呀,有什麽不得了的呢?

  嗯,不得不說,真是 “差之毫厘,謬以千裏” 啊。

  關於深度學習、神經網絡等的其他相關知識不在介紹,有興趣自己下去了解一下好了。下面直接進入卷積神經網絡CNN的介紹。

  先來復習一下卷積:

  卷積有各種各樣的公式,還有各種各樣的推導算法,但是為了降低本文的難讀指數,所以直接跳到卷積的物理意義,不要太 care 那些公式,其實卷積的物理意義,就是 “加權疊加”。在對圖像處理進行卷積時,根據卷積核的大小,輸入和輸出之間也會有規模上的差異。

技術分享圖片

  上圖左邊 5*5 的方塊視為圖像輸入,黃色移動的 3*3 以及裏面的數字(*1/*0)是卷積核,該卷積核按照步長為 1 的順序依次從原始輸入的左上角一直移動計算疊加到右下角,卷積核一共移動 9 次。九次的位置對應到右側的 3*3 的相應格內,格中的數字便是卷積值,(此處是卷積核所覆蓋的面積內元素相乘再累加的結果)。9 次移動計算完畢後,右側 3*3 的新矩陣為此次卷積層的計算結果。

  在實際計算過程中,輸入是一張原始圖片和濾波器 filter(一組固定的權重,也就是上面我們說的卷積核對應的實際意義)做內積後得到新的二維數據。不同的濾波器 filter 會得到不同的輸出數據,比如輪廓、顏色深淺,如果想提取圖像的不同特征,需要用不同的濾波器 filter 提取想要的關於圖像的特定信息。

技術分享圖片

  上圖為一個卷積層中的卷積處理過程,註意上下兩次卷積核內容是不同的,所以得到兩種處理結果。等號右邊的新的二維信息在 CNN 網絡中,會作為下一個卷積層的輸入,即在下一個卷積層計算時,右邊的圖像會作為輸入的原始圖像。

  看一個有趣的段子:

  在 CNN 網絡中,一共會進行 5 次卷積層計算。

  路人甲:那最後會得到一個什麽鬼?

  沈 MM:咳咳,在連續的 5 個卷積層計算後,緊跟這的是 3 個全連接層。

  路人甲:什麽是全連接層?

  沈 MM:全連接層,並不是一個二維圖像,而是—— 一個一維向量

  路人甲已哭暈在廁所。。。

  初初讀來,是不是有點懵,It doesn‘t matter。不妨先放著,以後自會懂得,trust me!

  接下來介紹全卷積神經網絡

  應該註意到,CNN 的輸入是圖像,輸出是一個結果,或者說是一個值,一個概率值。而FCN 提出所追求的是:輸入是一張圖片,輸出也是一張圖片,學習像素到像素的映射

技術分享圖片

   那麽 “全卷積” 又體現在哪裏呢?

  CNN 網絡中的後三層,都是一維的向量,計算方式不再采用卷積,所以丟失了二維信息,而 FCN 網絡中,將這三層全部轉化為 1*1 的卷積核所對應等同向量長度的多通道卷積層,使後三層也全部采用卷積計算,整個模型中,全部都是卷積層,沒有向量,所以稱為 “全卷積”。

  FCN 將第 6 層和 7 層分別從 4096 長度的向量轉化為 4096 通道的卷積層,第 8 層則是 21 通道的卷積層。之所以第 8 層從 1000 縮減到 21,是因為 FCN 使用的識別庫是 PASCAL VOC,在 PASCAL VOC 中有 20 種物體分類,另外一個 background 分類。

  以下(甚至全文)所用到的分割圖片中不同的顏色就表示不同的物體類別,一共有 21 種顏色:

技術分享圖片

   CNN 的識別是圖像級的識別,也就是從圖像到結果,而 FCN 的識別是像素級的識別,對輸入圖像的每一個像素在輸出上都有對應的判斷標註,標明這個像素最可能是屬於一個什麽物體 / 類別。

  在此處特別要指出的是,在實際的圖像語義分割測試時,輸入是一個 H*W*3 的三通道彩色圖像,而輸出是一個 H*W 的矩陣。

  這就可以簡單看做每一個像素所攜帶的信息是多維的,比如顏色,就分為 3 層,分別對應 R、G、B 三個值。 

  所以在進行卷積的時候,每一個通道都是要獨立計算的,計算完之後再疊加,得到最終卷積層結果。

  如果卷積核移動的步長為 1,那麽卷積是按照像素排列去挨個計算的,計算量可想而知會有多麽龐大。但是在實際中,相鄰的像素往往都是一類,按照像素依次計算就顯得冗余,所以在卷積之後會對輸出進行一次池化(pooling)處理

  那麽什麽又是池化呢?我們來看:

  技術分享圖片

   池化簡單來說就是將輸入圖像切塊,大部分時候我們選擇不重疊的區域,假如池化的分割塊大小為 h*h,分割的步長為 j,那麽一般 h=j,就像上圖,如果需要重疊,只需要 h>j 即可(這個步驟請停留一秒理解一下,很好懂的)。

  對完整圖像切分,再取切分區域中所有值的均值或最大值作為代表該區域的新值,放入池化後的二維信息圖中。得到的新圖就是池化結果。

  在 CNN 和 FCN 的網絡模型中,每一個卷積層,都包含了 [卷積 + 池化] 處理,這就是傳說中的 “下采樣”,但這樣處理之後的結果是:圖像的像素信息變小了,每一層的像素信息都是前一層的 1/2 大小,到第五層的時候,圖像大小為原始圖像的 1/32

  在 CNN 算法裏,這並沒有什麽要緊的,因為 CNN 最終只輸出一個結果:“這個圖上是個啥”,但是 FCN 不同,FCN 是像素級別的識別,也就是輸入有多少像素,輸出就要多少像素,像素之間完全映射,並且在輸出圖像上有信息標註,指明每一個像素可能是什麽物體 / 類別。

  所以,就必須對這 1/32 的圖像進行還原

  這裏用到個純數學技術,叫 “反卷積”,對第 5 層進行反卷積,可以將圖像擴充至原來的大小(嚴格說是近似原始大小,一般會大一點,但是會裁剪掉,為什麽會大的原理略復雜,這裏先不提,有興趣且有資歷可再行理解)。

  ——這個 “反卷積” 稱為 “上采樣”。(和下采樣對應)

技術分享圖片

  在技術上,我們可以對任一層卷積層做反卷積處理,得到最後的圖像,比如用第三層 (8s-8 倍放大),第四層 (16s-16 倍放大),第五層 (32s-32 倍放大) 得到的分割結果。

技術分享圖片

  來看一張各層還原後的對比圖,分別是:

技術分享圖片

   通過對比可以很明顯看到:在 16 倍還原和 8 倍還原時,能夠看到更好的細節,32 倍還原出來的圖,在邊緣分割和識別上,雖然大致的意思都出來了,但細節部分(邊緣)真的很粗糙,甚至無法看出物體形狀。

  那麽為什麽會這樣呢?這裏就涉及到一個感受域(receptive field)的概念。較淺的卷積層(靠前的)的感受域比較小,學習感知細節部分的能力強,較深的隱藏層 (靠後的),感受域相對較大,適合學習較為整體的、相對更宏觀一些的特征。所以在較深的卷積層上進行反卷積還原,自然會丟失很多細節特征。

  於是我們會在反卷積步驟時,考慮采用一部分較淺層的反卷積信息輔助疊加,更好的優化分割結果的精度:

  技術分享圖片

   盡管 FCN 的提出是一條很6的路,但還是無法避免有很多問題,比如,精度問題,對細節不敏感,以及像素與像素之間的關系,忽略空間的一致性等問題。

  於是更牛的大牛就出現了。有牛人提出一種新的卷積計算方式,開始稱為 “帶 hole” 的卷積,也就是使用一種 “疏松的卷積核” 來計算,以此來取代池化的處理。

  上面已經講過,池化操作能夠減少計算量,同時也能防止計算結果過擬合,那麽單純取消池化操作又會使單層網絡的感受域縮小。如果使用 “疏松的卷積核” 來處理卷積,可以達到在不增加計算量的情況下增加感受域,彌補不進行池化處理後的精度問題。(這種帶洞的卷積方式後來起了一個高雅的名字叫做:“Dilated Convolutions”。)這種方式人為加大了卷積核內部元素之間的距離,可參考下圖:

技術分享圖片

   紅點表示卷積核的元素,綠色表示感受域,黑線框表示輸入圖像。  

  a 為原始卷積核計算時覆蓋的感受域,b 為當卷積核覆蓋的元素間距離增大的情況,不再在連續的空間內去做卷積,跳著做,當這個距離增加的越大時,單次計算覆蓋的感受域面積越大。

  上圖不太好理解的話再來看一張圖:

技術分享圖片

   上層綠色點表示輸入層像素點,下層黃色是輸出層(單次計算時的層級關系),當卷積核元素間距為 0 時(相鄰),123 對應輸出 A,234 對應輸出 B,345 對應輸出 C,那麽輸出 ABC 三個元素結果的感受域只覆蓋了 12345 這幾個原始像素點。

  如果采用稀疏的卷積核,假設間距為 1(相當於卷積計算時跳一個像素再取值計算),如圖所示,那麽結果 A 對應的輸入是 135,結果 B 對應的輸入是 246,結果 C 對應的輸入是 357,同樣輸出 ABC 三個結果,在原始圖像上取的像素點的長度就多了。

  這是水平 X 軸方向上的擴展,在 Y 軸上也會有同樣的擴展,感受域在沒有增加計算(相對於池化操作後)的情況下增大了,並且保留了足夠多的細節信息,對圖像還原後的精度有明顯的提升。是不是很有趣O(∩_∩)O哈哈~

  看一下對比圖:

技術分享圖片

   第一列是原始圖像,最後一列是手工標註的訓練輸入圖像,第二列為 FCN 在 1/8 倍數下的還原,第三列則是采用了新的卷積算法的還原圖像,可以很明顯看到,第三列對細節的分割明顯優於第二列 FCN 8 倍的圖像。

  剛才還提到了第二個問題,即像素與像素之間的邏輯關系的問題,畢竟前面再6的算法也只是單純的計算,而沒有根據物理意義,去進行判斷。比如需要判斷在輸出的標註裏面,這些結果是否合法(符合現實邏輯)。

  很多以深度學習為框架的圖像語義分割系統都使用了一種叫做 “條件隨機場”( Conditional Random Field,簡稱 CRF)的技術作為輸出結果的優化後處理手段。其實類似技術種類較多,比如還有馬爾科夫隨機場 (MRF) 和高斯條件隨機場 (G-CRF) 用的也比較多,原理都較為類似。

  繼續,簡單來介紹一下 “條件隨機場” 的概念。

  FCN 是像素到像素的影射,所以最終輸出的圖片上每一個像素都是標註了分類的,將這些分類簡單地看成是不同的變量,每個像素都和其他像素之間建立一種連接,連接就是相互間的關系。於是就會得到一個 “完全圖”:

技術分享圖片

   上圖是以 4*6 大小的圖像像素陣列表示的簡易版。

  那麽在全連接的 CRF 模型中,有一個對應的能量函數:

  技術分享圖片

   相信廣大理工科學生對這個公式裏各種符號是熟悉的。如若不是,也沒關系,不知道符號就暫且不必知道了,我們先解決問題,當務之急就是一定要首先知道這個公式是幹嘛的:

  其中等號右邊第一個一元項,表示像素對應的語義類別,其類別可以由 FCN 或者其他語義分割模型的預測結果得到;而第二項為二元項,二元項可將像素之間的語義聯系 / 關系考慮進去。

  這麽說太抽象,舉個簡單的例子,“天空”和 “鳥” 這樣的像素在物理空間是相鄰的概率,應該要比 “天空” 和 “魚” 這樣像素相鄰的概率大,那麽天空的邊緣就更應該判斷為鳥而不是魚(從概率的角度)。看到這句話,很好理解了吧~

  通過對這個能量函數優化求解,把明顯不符合事實的識別判斷剔除掉,替換成合理的解釋,最後可以得到對 FCN 的圖像語義預測結果的優化,生成最終的語義分割結果。

  優化後的對比圖:

技術分享圖片

  

   上圖第二列是 FCN 網絡 8 倍還原分割結果,第三列是將 CRF 植入 FCN 處理後的結果。

  可以很明顯的看到,第三列的物體識別無論是輪廓細節分割還是物體識別,都優於第二列,特別是第二行的沙發中有奇怪的紅色東西的識別,在進行 CRF 優化之後,還原成了綠色的沙發。

  目前的這種機器學習方式還屬於監督性學習,科學家們還是希望將來可以實現半監督或弱監督式學習,這樣更類似人類的學習認知方式。

  在這條道路上,還有很多有趣的東西,比如示例級別(instance level)的圖像語義分割問題也同樣熱門。該類問題不僅需要對不同語義物體進行圖像分割,同時還要求對同一語義的不同個體進行分割(例如需要對圖中出現的九把椅子的像素用不同顏色分別標示出來)。

技術分享圖片

  

   另外,在目前的計算技術水平下(硬件軟件),使用 FCN 訓練建模的時間大約需要三周,這也說明在這個領域裏還有很多值得探索和需要解決的問題。

  對此有興趣的同學們自己去繼續研究吧,你可以的,哈哈!

  曾有一個業界大牛說過這樣一段話,送給大家:

  “華人在計算機視覺領域的研究水平越來越高,這是非常振奮人心的事。我們中國錯過了工業革命,錯過了電氣革命,信息革命也只是跟隨狀態。但人工智能的革命,我們跟世界上的領先國家是並肩往前跑的。能身處這個時代浪潮之中,做一番偉大的事業,經常激動的夜不能寐。”

  最後,我也想說點什麽與君共勉,人的一生,每個階段做每個階段的事情,就像莊稼,春種秋收,春天不抓住機會好好紮根,汲取營養,努力生長,到了秋天,只有被遺棄的下場,而那時想再好好汲取營養已經晚了,大自然不會因為你沒生長飽滿沒做好準備就為你停留等待,無論你長成何種樣子,都要被一同收割。命運總體是公平的,欠下的始終要還,有多少人,此生再無力償還,所以,不要欠。身處這個階段的時候,一定要好好珍惜,這是我們唯一能做的。求學,鉆研,為人,處事,交友……無一不是如此。勸君莫惜金縷衣,勸君惜取少年時。花開堪折直須折,莫待無花空折枝。我很慶幸我對人工智能感興趣,而我又恰好為計算機專業,做自己喜歡的事情本身就是一件快樂的事情。

  年輕沒有失敗,奮鬥創造未來。AI浪潮業已來臨,Are you ready?

圖像語義分割的前世今生(轉載)良心之作