10分鐘看懂全卷積神經網絡( FCN ):語義分割深度模型先驅

大家好,我是爲人造的智能操碎了心的智能禪師。

今天是10月24日,既是程序員節,也是程序員感恩節。這一天,大家紛紛向那些無私奉獻、一心爲民的好人們,送出“好人一生平安”的美好祝願。而“1024”,既是這一句話的數字密碼。

今天,禪師也要感恩很多人。尤其要感恩一直以來支持禪師、支持人工智能頭條的粉絲們,能夠容忍人工智能頭條偶然出現的小失誤、枯燥無味的廣告而沒有取關。

禪師頭髮很茂盛

當然,更感謝大家對禪師本人和工作的認可!每次工作陷入瓶頸,深感無力、缺乏自信的時候,能夠得到大家的鼓勵和支持,心裏真的是無比的溫暖。

大家對我的信任,也是禪師一直做,做更好的唯一動力。在此禪師真心的向小姐姐小哥哥們,說一聲好人一生平安

同時特別要感謝粉絲羣裏的朋友們,每天都在熱烈的討論各種和人工智能相關的話題,成爲禪師靈感的重要來源。

甚至有的粉絲覺得光羣裏討論不夠,決定自己也開通公衆號開始寫內容,而且反響非常不錯!

好的內容,當然要讓更多人看到。所以今天帶來的文章,就是由西部世界羣裏,一位不願意透露姓名的 Blank 寫的。歡迎吐槽!

最後囉嗦3句:

  1. 歡迎投稿!只要你的內容質量夠好,我們會連同作者信息一起介紹給更多的讀者,給大家充足的曝光機會
  2. 感恩節當然還是得有實際行動的。GitChat 做了一個1024節的大促活動,很多非常棒的人工智能課程,包括會員都有非常誘人的優惠特價。除此之外,每天還會隨機抽取3位參與活動的用戶,贈送價值 399元的機械鍵盤,更多優惠和獎品信息在文末
  3. 今天的二條依舊是那旋律,依舊不曾離去,依舊是禪師爲大家帶來的人工智能電子書特價活動繼續。如果大家想看的書不在特價行列,也請回復告知禪師,禪師彙總後,會爲大家爭取優惠

溫馨提示:爲了讓大家能更理解深度模型,文章中會盡量避免使用專業術語和繁瑣的公式,盡力採用形象、準確的故事去理解,並學會學習的方法。

全文大約4500字。讀完可能需要好幾首下面這首歌的時間,也可能只需要2秒,?

?

語義分割

簡單地說,分割就是摳圖。語義分割,就是按圖像中物體表達的含義進行摳圖。

現在ps已經集成很多自動分割的功能,相比舊版本軟件,新軟件提高了美工人員的摳圖和美圖的效率。

如果我們能在更復雜的環境下,完成自動分割圖像進行分析,這將降低多少人工?這類場景我們很熟悉,比如現在快速發展的自動駕駛。

攝像頭採集到車前景象,通過模型分析,我們可以自動篩選出地面、交通線、人行道、行人、建築、樹、還有其他基礎設施。

相比傳統的目標識別,語義分割它更強大。語義分割模型不僅可以識別簡單的類別,而且還可以進行多目標、多類別、複雜目標以及分割目標。

比如圖中我們可以看到路面和交通標識線有清晰的分割,路面和人行道也同樣如此,甚至路燈和建築也可以清楚地分離出來。

這項技術在醫學上也同樣作用巨大,我們可以識別病竈並將其與正常組織分割,大腦神經系統內我們可以分離出同一組功能的神經結構,這些如何依賴人工去完成,所需的時間至少爲數小時,而交給機器,那麼數秒鐘即可完成。

因此依靠分離模型,我們可以把重複性的勞動交給它去完成,人工只需要對輸出結果進行二次分析和篩選,大大加快了提取過程和分析精度。

通過上面的介紹和例子,我們可以總結下優秀的語義分割摸應該具有的幾個特性:

  1. 分割出來的不同語義區域對某種性質如灰度、紋理而言具有相似性,區域內部比較平整相鄰語義區域對分割所依據的性質有明顯的差異
  2. 不同語義區域邊界上是明確和規整的
  3. 語義分割模型方法進階

圖像分割的歷史

所有的發展都是漫長的技術積累,加上一些外界條件滿足時就會產生質變。我們簡單總結了圖像分割的幾個時期:

2000年之前,數字圖像處理時我們採用方法基於幾類:閾值分割、區域分割、邊緣分割、紋理特徵、聚類等。

2000年到2010年期間, 主要方法有四類:基於圖論、聚類、分類以及聚類和分類結合。

2010年至今,神經網絡模型的崛起和深度學習的發展,主要涉及到幾種模型:

參考文獻:http://www/arocmag.com/article/02-2017-07-064.html

截至到2017年底,我們已經分化出了數以百計的模型結構。當然,經過從技術和原理上考究,我們發現了一個特點,那就是當前最成功的圖像分割深度學習技術都是基於一個共同的先驅:FCN(Fully Convolutional Network,全卷積神經網絡)。

2010年前,CNN 是非常高效的視覺處理工具,因爲它能夠學習到層次化的特徵。研究人員將全連接層替換爲卷積層來輸出一種空間域映射(反捲積)而非簡單輸出類別的概率,從而將圖像分割問題轉換爲端對端的圖像處理問題。

端對端

知識也是一步一步地積累的,學到這兒,我們就會產生新的疑問,什麼是端對端?

可能大家都對這個概念有一些心得,我簡單想了想大概是:解決問題時,輸入問題的原始數據,然後模型輸出所需結果,中間過程我們不加以考慮,這應該就是端對端最通俗的解釋。

我們詳細看一下模型的發展,瞭解下什麼是端對端,如下圖:

?淺色部分人蔘與,深色部分是機器自動完成

效果上來說,橫軸表示效果越來越好,複雜度上看,縱軸表示模型越來越複雜。下面我們分析一下端到端的優劣之處:

端對端的好處:通過縮減人工預處理和後續處理,儘可能使模型從原始輸入到最終輸出,給模型更多可以根據數據自動調節的空間,增加模型的整體契合度。

端對端的壞處:通過大量模型的組合,增加了模型複雜度,降低了模型可解釋性。

發展歷程

  1. 2014年 FCN 模型,主要貢獻爲在語義分割問題中推廣使用端對端卷積神經網絡,使用反捲積進行上採樣
  2. 2015年 U-net 模型,構建了一套完整 的編碼解碼器
  3. 2015年 SegNet 模型,將最大池化轉換爲解碼器來提高分辨率
  4. 2015年 Dilated Convolutions(空洞卷積),更廣範圍內提高了內容的聚合並不降低分辨率
  5. 2016年 DeepLab v1&v2
  6. 2016年 RefineNet 使用殘差連接,降低了內存使用量,提高了模塊間的特徵融合
  7. 2016年 PSPNet 模型
  8. 2017年 Large Kernel Matters
  9. 2017年 DeepLab V3

以上幾種模型可以按照語義分割模型的獨有方法進行分類,如專門池化(PSPNet、DeepLab),編碼器-解碼器架構(SegNet、E-Net),多尺度處理(DeepLab)、條件隨機場(CRFRNN)、空洞卷積(DiatedNet、DeepLab)和跳躍連接(FCN)。

FCN

CNN 最後輸出的是類別的概率值。

CNN 的強大之處在於它的多層結構能自動學習特徵,並且可以學習到多個層次的特徵:較淺的卷積層感知域較小,學習到一些局部區域的特徵。

較深的卷積層具有較大的感知域,能夠學習到更加抽象一些的特徵。這些抽象特徵對物體的大小、位置和方向等敏感性更低,從而有助於識別性能的提高。

什麼是FCN模型?

因爲模型網絡中所有的層都是卷積層,故稱爲全卷積網絡。

全卷積神經網絡主要使用了三種技術:

  1. 卷積化(Convolutional)
  2. 上採樣(Upsample)
  3. 跳躍結構(Skip Layer)

簡單的是就是將上述過程最後的 Fully Connected 換成了卷積,直接輸出目標物體所屬的像素範圍。

傳統 CNN 有幾個缺點:

  1. 存儲開銷大,滑動窗口較大,每個窗口都需要存儲空間來保存特徵和判別類別,而且使用全連接結構,最後幾層將近指數級存儲遞增
  2. 計算效率低,大量重複計算
  3. 滑動窗口大小是相對獨立的,末端使用全連接只能約束局部特徵。

爲了解決上面的部分問題,FCN 將傳統 CNN 中的全連接層轉化成卷積層,對應 CNN 網絡 FCN 把最後三層全連接層轉換成爲三層卷積層(4096,4096,1000)。

雖然通過上面兩個圖觀察,卷積核全連接數值沒有變化,但是卷積核全連接概念不一樣,所以表達的含義就截然不同。

我們不禁想問,將全連接層換成卷積有什麼好處呢?

這裏我們要理解一句比較專業的話:如果卷積核的 kernel_size 和輸入 feature maps 的 size 一樣,那麼相當於該卷積覈計算了全部 feature maps 的信息,則相當於是一個 kernel_size∗1 的全連接。

我們怎麼去理解這句話?

大概意思爲:當我們輸入的圖片大小和卷積核大小一致時,其實等價於建立全連接,但是還是有區別。

全連接的結構是固定的,當我們訓練完時每個連接都是有權重的。而卷積過程我們其實爲訓練連接結構,學習了目標和那些像素之間有關係,權重較弱的像素我們可以忽略。

全連接不會學習過濾,會給每個連接分權重並不會修改連接關係。卷積則是會學習有用的關係,沒用得到關係它會弱化或者直接 dropout。這樣卷積塊可以共用一套權重,減少重複計算,還可以降低模型複雜度。

反捲積

數學概念太多就不寫公式,我們直接看圖理解。

a 是輸入圖像,b 是經過卷積得到的特徵圖,分辨率明顯下降。經過上採樣(反捲積)提升分辨率得到同時,還保證了特徵所在區域的權重,最後將圖片的分辨率提升原圖一致後,權重高的區域則爲目標所在區域。

FCN 模型處理過程也是這樣,通過卷積和反捲積我們基本能定位到目標區域,但是,我們會發現模型前期是通過卷積、池化、非線性激活函數等作用輸出了特徵權重圖像,我們經過反捲積等操作輸出的圖像實際是很粗糙的,畢竟丟了很多細節。因此我們需要找到一種方式填補丟失的細節數據,所以就有了跳躍結構。

跳躍結構

我們通過回查學習過的知識,可以幫助理解當前的知識。這裏的原理也有些許類似,我們正向過程的卷積、池化等操作都會輸出每個層的特徵,我們使用反捲積然後和歷史中的池化和卷積數據結合,利用它們的數據填補我們缺失的數據。

三個技術都已經構建如模型之中,通過一定標記數據的訓練後,模型已經學會了如何識別類別,並且能反捲積得到對應類別所在的像素區域。輸出的效果?

Review

我們複習一下今天學到的內容:

卷積化:全連接層(6,7,8)都變成卷積層,適應任意尺寸輸入,輸出低分辨率的分割圖片。

反捲積:低分辨率的圖像進行上採樣,輸出同分辨率的分割圖片。

跳層結構:結合上採樣和上層卷積池化後數據,修復還原的圖像。

FCN 的缺點

  1. 分割的結果不夠精細。圖像過於模糊或平滑,沒有分割出目標圖像的細節
  2. 因爲模型是基於CNN改進而來,即便是用卷積替換了全連接,但是依然是獨立像素進行分類,沒有充分考慮像素與像素之間的關係
  3. 也是因爲每個模型都有自己的不足,所以纔會出現各式各樣的模型來解決它們的問題。大家如果能分析出每個模型的缺點,那我們也可以構建新的模型去完善他們的模型,這其實就是創新的過程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章