1. 程式人生 > >影象語義分割技術

影象語義分割技術

https://www.leiphone.com/news/201705/YbRHBVIjhqVBP0X5.html

大多數人接觸 “語義” 都是在和文字相關的領域,或語音識別,期望機器能夠識別你發出去的訊息或簡短的語音,然後給予你適當的反饋和回覆。嗯,看到這裡你應該已經猜到了,影象領域也是存在 “語義” 的。

今天是 AI 大熱年,很多人都關注與機器人的語音互動,可是有沒有想過,將來的機器人如果不能通過影象來識別主人,家裡的物品、寵物,那該多沒意思。說近一些,假如掃地機器人能夠機智地繞開你丟在地上的臭襪子而掃走旁邊的紙屑,一定能為你的生活解決不少麻煩。

沒錯,影象語義分割是 AI 領域中一個重要的分支,是機器視覺技術中關於影象理解的重要一環,是不是聽上去即重要又牛 X 閃閃的。

近年的自動駕駛技術中,也需要用到這種技術。車載攝像頭探查到影象,後臺計算機可以自動將影象分割歸類,以避讓行人和車輛等障礙。

十分鐘看懂影象語義分割技術


十分鐘看懂影象語義分割技術

影象語義分割

影象語義分割的意思就是機器自動分割並識別出影象中的內容,比如給出一個人騎摩托車的照片,機器判斷後應當能夠生成右側圖,紅色標註為人,綠色是車(黑色表示 back ground)。

十分鐘看懂影象語義分割技術

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

在 Deeplearning 技術快速發展之前,就已經有了很多做影象分割的技術,其中比較著名的是一種叫做 “Normalized cut” 的圖劃分方法,簡稱 “N-cut”。

N-cut 的計算有一些連線權重的公式,這裡就不提了,它的思想主要是通過畫素和畫素之間的關係權重來綜合考慮,根據給出的閾值,將影象一分為二

下圖是將畫素間的關係資訊簡單描述成為距離,根據距離差距來劃分影象的示例:

十分鐘看懂影象語義分割技術

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

十分鐘看懂影象語義分割技術

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

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

這種需要人機互動的技術叫 Grab Cut

[敲黑板]~~ 注意,PS 裡就使用了這種技術。

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

十分鐘看懂影象語義分割技術

此技術中,摳出來的部分叫 “前景”,剔除的部分叫 “背景”。

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

十分鐘看懂影象語義分割技術

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

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

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

深度學習

深度學習是機器學習的一個分支,主要指深度神經網路演算法,深度神經網路比普通神經網路層次更多,能夠更好地捕捉資料中的深層次關係,得到的模型較為準確,主要用來進行特徵學習。

先別急著暈,我們先來看看神經網路是怎麼工作的。

神經網路是模仿人的神經元而建立的人工神經元系統,多輸入單輸出,同時輸出又作為下一個神經元的輸入……(請自行腦補那張牙舞爪妖孽的神經元細胞~ 什麼?沒見過?文科生,拖出去~~)

下圖表示的是一個單個神經元:

十分鐘看懂影象語義分割技術

把這些單個神經元組織在一起,便形成了神經網路。下圖便是一個三層神經網路結構:

十分鐘看懂影象語義分割技術

上圖中最左邊的原始輸入資訊稱之為輸入層,最右邊的神經元稱之為輸出層(上圖中輸出層只有一個神經元),中間的叫隱藏層

深度神經網路系統中的層數比較多,達到 8-10 層(普通神經網路的層數通常 3-4 層)。

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

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

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

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

我還是先來幫大家複習一下卷積。

我查了很多書,卷積有各種各樣的公式,還有各種各樣的推導演算法,但是為了降低本文的難讀指數,所以我直接跳到卷積的物理意義,不要太 care 那些公式,其實卷積的物理意義,就是 “加權疊加”。

在對影象處理進行卷積時,根據卷積核的大小,輸入和輸出之間也會有規模上的差異。

來看一張動圖(僅做示例)

十分鐘看懂影象語義分割技術

上圖左邊 5*5 的方塊視為影象輸入,黃色移動的 3*3 以及裡面的數字(*1/*0)是卷積核,該卷積核按照步長為 1 的順序依次從原始輸入的左上角一直移動計算疊加到右下角,卷積核一共移動 9 次。

九次的位置對應到右側的 3*3 的相應格內,格中的數字便是卷積值,(此處是卷積核所覆蓋的面積內元素相乘再累加的結果)。

9 次移動計算完畢後,右側 3*3 的新矩陣為此次卷積層的計算結果。

如果這麼說還是不太好理解,沒關係,我有更直觀的辦法 ^_^。

在實際計算過程中,輸入是一張原始圖片和濾波器 filter(一組固定的權重,也就是上面我們說的卷積核對應的實際意義)做內積後得到新的二維資料。

不同的濾波器 filter 會得到不同的輸出資料,比如輪廓、顏色深淺,如果想提取影象的不同特徵,需要用不同的濾波器 filter 提取想要的關於影象的特定資訊。

十分鐘看懂影象語義分割技術

上圖為一個卷積層中的卷積處理過程,注意上下兩次卷積核內容是不同的,所以得到兩種處理結果。

等號右邊的新的二維資訊在 CNN 網路中,會作為下一個卷積層的輸入,即在下一個卷積層計算時,右邊的影象會作為輸入的原始影象。

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

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

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

路人甲:什麼是全連線層?

沈 MM:全連線層,並不是一個二維影象,而是—— 一個一維向量

路人甲已哭暈在廁所。

這三個一維向量的前兩個向量長度是 4096,最後一個向量長度是 1000.

為什麼是 1000?

因為在 CNN 網路中,有 1000 個分類,最後的這個向量中的 1000 個元素表達的資訊是:這張原始輸入圖片中的東西可能是這 1000 個分類中的物體的概率。

是的,一張圖,算了半天,最後給出的是,這張圖是個什麼玩意的答案。

十分鐘看懂影象語義分割技術

右側綠色箭頭指向的表示最後一個全連線層的向量中,表示各種物體的概率,上圖被識別為一輛車。

好了,上面說的是卷積神經網路 CNN 的處理過程(相信我我已經很簡化了)。

那麼全卷積神經網路呢?

大家應該注意到,CNN 的輸入是影象,輸出是一個結果,或者說是一個值,一個概率值。

FCN 提出所追求的是,輸入是一張圖片是,輸出也是一張圖片,學習畫素到畫素的對映

十分鐘看懂影象語義分割技術

上圖上半部分是 CNN 網路,下半部分是 CN 網路

那麼 “全卷積” 又體現在哪裡呢?

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

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

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

十分鐘看懂影象語義分割技術

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

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

這就可以簡單看做每一個畫素所攜帶的資訊是多維的,比如顏色,就分為 3 層,分別對應 R、G、B 三個值。(不知道什麼是 RGB 的,鑑定為文科生,請迅速撤離,謝謝)

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

如果卷積核移動的步長為 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 的提出是一條很牛叉的路,但還是無法避免有很多問題,比如,精度問題,對細節不敏感,以及畫素與畫素之間的關係,忽略空間的一致性等問題。

於是更牛的大牛就出現了。

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

上面已經講過,池化操作能夠減少計算量,同時也能防止計算結果過擬合,那麼單純取消池化操作又會使單層網路的感受域縮小,但如果使用 “疏鬆的卷積核” 來處理卷積,可以達到在不增加計算量的情況下增加感受域,彌補不進行池化處理後的精度問題。

括弧:這種帶洞的卷積方式後來起了一個高雅的名字叫做:“Dilated Convolutions”。

這種方式人為加大了卷積核內部元素之間的距離,可參考下圖:

十分鐘看懂影象語義分割技術

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

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

上圖不太好理解的話再來看一張圖:(個人覺得下面這個圖非常好理解)

十分鐘看懂影象語義分割技術

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

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

這是水平 X 軸方向上的擴充套件,在 Y 軸上也會有同樣的擴充套件,感受域在沒有增加計算(相對於池化操作後)的情況下增大了,並且保留了足夠多的細節資訊,對影象還原後的精度有明顯的提升。

看一下對比圖:

十分鐘看懂影象語義分割技術

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

剛才還提到了第二個問題,即畫素與畫素之間的邏輯關係的問題,畢竟前面再牛叉的演算法也只是單純的計算沒有根據物理意義進行判斷在輸出的標註裡這些結果是否合法(符合現實邏輯)。

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

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

FCN 是畫素到畫素的影射,所以最終輸出的圖片上每一個畫素都是標註了分類的,將這些分類簡單地看成是不同的變數,每個畫素都和其他畫素之間建立一種連線,連線就是相互間的關係。

於是就會得到一個 “完全圖”:

十分鐘看懂影象語義分割技術

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

那麼在全連結的 CRF 模型中,有一個對應的能量函式:

十分鐘看懂影象語義分割技術

嗯,不要問我這個公式裡各種符號是啥,我看不懂。但是我知道這個公式是幹嘛滴:

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

這麼說太抽象,舉個簡單的例子,“天空”和 “鳥” 這樣的畫素在物理空間是相鄰的概率,應該要比 “天空” 和 “魚” 這樣畫素相鄰的概率大,那麼天空的邊緣就更應該判斷為鳥而不是魚(從概率的角度)。

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

優化後的對比圖:

十分鐘看懂影象語義分割技術

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

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

OK,說了這麼多,終於快要講完了(好累)。

以上就是目前較為前沿的影象語義分割技術。

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

在這條道路上,還有很多有趣的東西,比如示例級別(instance level)的影象語義分割問題也同樣熱門。

該類問題不僅需要對不同語義物體進行影象分割,同時還要求對同一語義的不同個體進行分割(例如需要對圖中出現的九把椅子的畫素用不同顏色分別標示出來)。

十分鐘看懂影象語義分割技術

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

對此有興趣的同學們自己去繼續研究吧,哈哈。

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

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

AI 的浪潮即將席捲而來,你,準備好了麼?

------ 附錄的分割線 -----

PASCAL VOC(patternanalysis,statistical modelling and computational learning visual objectclasses) 模式分析,統計建模,計算學習,視覺物體分類。

PASCAL VOC 挑戰賽是視覺物件的分類識別和檢測的一個基準測試,提供了檢測演算法和學習效能的標準影象註釋資料集和標準的評估系統。從 2005 年至今,該組織每年都會提供一系列類別的、帶標籤的圖片,挑戰者通過設計各種精妙的演算法,僅根據分析圖片內容來將其分類,最終通過準確率、召回率、效率來一決高下。如今,挑戰賽和其所使用的資料集已經成為了物件檢測領域普遍接受的一種標準。

委員會所提供的圖片集包括 20 個目錄:人類;動物(鳥、貓、牛、狗、馬、羊);交通工具(飛機、自行車、船、公共汽車、小轎車、摩托車、火車);室內(瓶子、椅子、餐桌、盆栽植物、沙發、電視)。都是一些日常中最常見的物體,為的就是能更好的體現演算法的實用性。

後記 

很多人跟我說過,不要寫那麼長的文章,因為現在沒人會看長文。

可是我卻 “變本加厲” 寫這麼長的技術文章。

為了寫這文章,中秋三天都在家裡查資料,碼字。除了圖片在網上能找到現成的,其他沒有從哪裡照搬過原話,6 千 6 百多字全是基於自己的理解然後儘量淺顯易懂滴寫出來~  

但還是太技術了,因為這本身就是技術。

18 號我做了一個關於此項技術非學術性非正式的小範圍交流,會上大家也覺得偏技術流,於是我又根據交流過程中一些沒有闡述清楚的點補全了這篇文章,即便不會有多少人看,卻也還是要寫,要發的。

因為什麼呢? 執著吧。

其實我也想寫諸如 “一張圖看懂全卷積神經網路” 這樣粗淺易讀的東西,但是我對資訊的精煉程度還達不到一張圖就能講清楚的水平,能力有限。

嗯,就醬。

雷鋒網(公眾號:雷鋒網)按:原作者沈MM,本文原載於微信公眾號沈MM的小喇叭(ID:VoiceOfShenMM)。本文參考了魏秀知乎專欄,部分圖片來自魏秀