由於項目需要,用U-NET跑一個程序來對醫學影像進行分割(segmentation),因此跑去看了下這篇論文(paper),下面會介紹一下U-Net的框架及要點,如果哪里有寫的不對的,或者好的建議,歡迎提出並糾正。
論文地址:https://arxiv.org/abs/1505.04597
1. 概要
U-Net通俗來講也是全卷積神經網絡的一種變形,主要其結構經論文作者畫出來形似字母U(見圖 1),因而得名U-Net。整個神經網絡主要有兩部分組成:搜索路徑(contracting path)和擴展路徑(expanding path)。搜索路徑主要是用來捕捉圖片中的上下文信息(context information),而與之相對稱的擴展路徑則是為了對圖片中所需要分割出來的部分進行精准定位(localization)。U-Net誕生的一個主要前提是,很多時候深度學習的結構需要大量的sample和計算資源,但是U-Net基於FCN(Fully Convultional Neural Network:全卷積神經網絡)進行改進,並且利用數據增強(data augmentation)可以對一些比較少樣本的數據進行訓練,特別是醫學方面相關的數據(醫學數據比一般我們所看到的圖片及其他文本數據的獲取成本更大,不論是時間還是資源的消耗),所以U-Net的出現對於深度學習用於較少樣本的醫學影像是很有幫助的。
2. 網絡結構及原理解析
就如前面所說的U-Net是基於FCN進行改進的,比較tricky的地方就是U-Net不是簡單地像FCN那樣子對圖片進行encode和decode,U-Net為了能精准的定位,收縮路徑上提取出來的局部像素特征會在升采樣(upsampling)過程中與新的特征圖(feature map)進行結合(其實比較直白的說法就是結合局部信息和全局信息,通過信息整合提高像素點類別的預測的准確性),以最大程度的保留前面降采樣(downsampling)過程一些重要的特征信息。而為了能使網絡結構能更高效的運行,結構中是沒有全連接層(fully connected layers),這樣子可以很大程度上減少需要訓練的參數,並得益於特殊的U形結構可以很好的保留圖片中的所有信息。
收縮路徑上是每兩個 3 * 3 的卷積層(unpadded convolutional layers)后會跟一個2 * 2的最大池化層(Maxpooling layer: 步長為2),並且每個卷積層后面采用relu激活函數來對原始圖片進行降采樣操作,除此之外,每一次降采樣都會增加一杯通道數(double the number of feature channel)。
在擴展路徑的向上采樣(deconvolution)中,每一步會有一個 2 * 2 的卷積層(激活函數也是relu)和一個兩個 3 * 3 的卷積層,於此同時,每一步的升采樣都會加入來自相對應收縮路徑的特征圖(經裁剪以保持相同的形狀shape)。
在網絡的最后一層是一個 1 * 1 的卷積層,通過這一操作可以將64通道的特征向量轉換為所需要的分類結果的數量(例如2),最終,U-Net的整個網絡一共有23層卷積層。U-Net有一個很重要的有點是其基本可以對任意形狀大小的圖片進行卷積操作,特別是任意大的圖片。
文末附上自己寫的基於TensorFlow的UNet模型,另外本文只是進行了比較簡要的概括,如今也衍生出了很多UNetd的變種,所以有需要的話大家可以搜索查看下,例如2019年比較不錯的nnUnet,提出了一個自動化和generalized的Unet框架,該論文就用簡單的UNet框架完勝了許多新的UNet變種模型,推薦大家閱讀。