引用自:https://www.leiphone.com/news/201705/YbRHBVIjhqVBP0X5.htmlhtml
大多數人接觸 「語義」 都是在和文字相關的領域,或語音識別,指望機器可以識別你發出去的消息或簡短的語音,而後給予你適當的反饋和回覆。嗯,看到這裏你應該已經猜到了,圖像領域也是存在 「語義」 的。算法
今天是 AI 大熱年,不少人都關注與機器人的語音交互,但是有沒有想過,未來的機器人若是不能經過圖像來識別主人,家裏的物品、寵物,那該多沒意思。說近一些,假如掃地機器人可以機智地繞開你丟在地上的臭襪子而掃走旁邊的紙屑,必定能爲你的生活解決很多麻煩。網絡
沒錯,圖像語義分割是 AI 領域中一個重要的分支,是機器視覺技術中關於圖像理解的重要一環,是否是聽上去即重要又牛 X 閃閃的。框架
近年的自動駕駛技術中,也須要用到這種技術。車載攝像頭探查到圖像,後臺計算機能夠自動將圖像分割歸類,以避讓行人和車輛等障礙。dom
圖像語義分割iphone
圖像語義分割的意思就是機器自動分割並識別出圖像中的內容,好比給出一我的騎摩托車的照片,機器判斷後應當可以生成右側圖,紅色標註爲人,綠色是車(黑色表示 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 號我作了一個關於此項技術非學術性非正式的小範圍交流,會上你們也以爲偏技術流,因而我又根據交流過程當中一些沒有闡述清楚的點補全了這篇文章,即使不會有多少人看,卻也仍是要寫,要發的。
由於什麼呢? 執着吧。
其實我也想寫諸如 「一張圖看懂全卷積神經網絡」 這樣粗淺易讀的東西,可是我對信息的精煉程度還達不到一張圖就能講清楚的水平,能力有限。
嗯,就醬。