寫在前面:html
一直沒有整理的習慣,致使不少東西會有所遺忘,遺漏。藉着這個機會,養成一個習慣。算法
對現有東西作一個整理、記錄,對新事物去探索、分享。數組
所以博客主要內容爲我作過的,所學的整理記錄以及新的算法、網絡框架的學習。基本上是深度學習、機器學習方面的東西。網絡
第一篇首先是深度學習圖像分割——U-net網絡方面的內容。後續將會盡量系統的學習深度學習而且記錄。框架
更新頻率爲每週大於等於一篇。機器學習
深度學習的圖像分割來源於分類,分割即爲對像素所屬區域的一個分類。函數
有別於機器學習中使用聚類進行的圖像分割,深度學習中的圖像分割是個有監督問題,須要有分割金標準(ground truth)做爲訓練的標籤。post
在圖像分割的過程當中,網絡的損失函數通常使用Dice係數做爲損失函數,Dice係數簡單的講就是你的分割結果與分割金標準之間像素重合個數與總面積的比值。學習
【https://blog.csdn.net/liangdong2014/article/details/80573234,醫學圖像分割中經常使用的度量指標】.net
U-net參考文獻:
U-net: Convolutional networks for biomedical image segmentation.
https://arxiv.org/pdf/1505.04597.pdf
U-net網絡結構
U-net網絡是一個基於CNN的圖像分割網絡,主要用於醫學圖像分割上,網絡最初提出時是用於細胞壁的分割,以後在肺結節檢測以及眼底視網膜上的血管提取等方面都有着出色的表現。
最初的U-net網絡結構如上圖所示,主要由卷積層、最大池化層(下采樣)、反捲積層(上採樣)以及ReLU非線性激活函數組成。整個網絡的過程具體以下:
最大池化層,下采樣過程:
假設最初輸入的圖像大小爲:572X572的灰度圖,通過2次3X3x64(64個卷積核,獲得64個特徵圖)的卷積核進行卷積操做變爲568X568x64大小,
而後進行2x2的最大池化操做變爲248x248x64。(注:3X3卷積以後跟隨有ReLU非線性變換爲了描述方便因此沒寫出來)。
按照上述過程重複進行4次,即進行 (3x3卷積+2x2池化) x 4次,在每進行一次池化以後的第一個3X3卷積操做,3X3卷積核數量成倍增長。
達到最底層時即第4次最大池化以後,圖像變爲32x32x512大小,而後再進行2次的3x3x1024的卷積操做,最後變化爲28x28x1024的大小。
反捲積層,上採樣過程:
此時圖像的大小爲28x28x1024,首先進行2X2的反捲積操做使得圖像變化爲56X56X512大小,而後對對應最大池化層以前的圖像的複製和剪裁(copy and crop),
與反捲積獲得的圖像拼接起來獲得56x56x1024大小的圖像,而後再進行3x3x512的卷積操做。
按照上述過程重複進行4次,即進行(2x2反捲積+3x3卷積)x4次,在每進行一次拼接以後的第一個3x3卷積操做,3X3卷積核數量成倍減小。
達到最上層時即第4次反捲積以後,圖像變爲392X392X64的大小,進行復制和剪裁而後拼接獲得392X392X128的大小,而後再進行兩次3X3X64的卷積操做。
獲得388X388X64大小的圖像,最後再進行一次1X1X2的卷積操做。
而後獲得的結果大概是這樣的(下圖),須要經過黃色區域的分割結果去推斷藍色區域的分割結果,固然在實際應用中基本上都是選擇保持圖像大小不變的進行卷積(卷積後周圍用0填充)。
【關於卷積、反捲積相關的內容能夠參考:https://blog.csdn.net/qq_38906523/article/details/80520950】
講完了具體怎麼作的,再來說講U-net的優缺點,能夠看到網絡結構中沒有涉及到任何的全鏈接層,同時在上採樣過程當中用到了下采樣的結果,
使得在深層的卷積中可以有淺層的簡單特徵,使得卷積的輸入更加豐富,天然獲得的結果也更加可以反映圖像的原始信息。
(CNN卷積網絡,在淺層的卷積獲得的是圖像的簡單特徵,深層的卷積獲得的是反映該圖像的複雜特徵)
像上面說的那樣,U-net網絡的結構主要是對RPN(Region Proposal Network)結構的一個發展,它在靠近輸入的較淺的層提取的是相對小的尺度上的信息(簡單特徵),
靠近輸出的較深的層提取的是相對大的尺度上的信息(複雜特徵),經過加入shortcut(直接將原始信息不進行任何操做與後續的結果合併拼接)整合多尺度信息進行判斷。
可是U-net網絡結構僅在單一尺度上進行預測,不能很好處理尺寸變化的問題。
【天池醫療第一名隊伍:https://tianchi.aliyun.com/forum/new_articleDetail.html?spm=5176.8366600.0.0.6021311f0WILtQ&raceId=231601&postsId=2947】
所以對於該網絡的改進,就我而言,嘗試過:一、在最後一層(最後一次下采樣以後,第一次上採樣以前)加入一個全鏈接層,目的是增長一個交叉熵損失函數,爲了加入額外的信息(好比某張圖是是否爲某一類的東西)
二、對於每一次的上採樣都進行一次輸出(預測),將獲得的結果進行一個融合(相似於FPN網絡(feature pyramid networks),固然這個網絡裏有其餘的東西)
三、加入BN(Batch Normalization)層
改進的結果天然是對於特定要處理的問題有一些幫助。
最後就是相應的代碼,因爲U-net網絡結構較爲簡單,因此通常使用Keras去寫的會比較多,我也是用Keras寫的。後續整理了以後將代碼的連接貼上。