主頁 > 後端開發 > [論文解讀] U-Net: Convolutional Networks for Biomedical Image Segmentation (用于生物醫學影像分割的卷積網路)

[論文解讀] U-Net: Convolutional Networks for Biomedical Image Segmentation (用于生物醫學影像分割的卷積網路)

2021-02-26 06:19:11 後端開發

Unet論文:http://www.arxiv.org/pdf/1505.04597.pdf
Unet源代碼:https://github.com/jakeret/tf_unet
發表于:2015年的MICCAI

一、基本介紹
1.1歷史背景
卷積神經網路(CNN)不僅對影像識別有所幫助,也對語意分割領域的發展起到巨大的促進作用, 2014 年,加州大學伯克利分校的 Long 等人提出全卷積網路(FCN),這使得卷積神經網路無需全連接層即可進行密集的像素預測,CNN 從而得到普及,使用這種方法可生成任意大小的影像分割圖,且該方法比影像塊分類法要快上許多,之后,語意分割領域幾乎所有先進方法都采用了該模型,

1.2 FCN(全卷積網路)
file
網路的整體結構分為:全卷積部分和反卷積部分,
全卷積部分:借用了一些經典的CNN網路并把最后的全連接層換成卷積,用于提取特征,形成熱點圖;
反卷積部分:將小尺寸的熱點圖上采樣得到原尺寸的語意分割影像,
總的來說:FCN對影像進行像素級的分類,從而解決了語意級別的影像分割問題,與經典的CNN在卷積層之后使用全連接層得到固定長度的特征向量進行分類(全聯接層+softmax輸出)不同,FCN可以接受任意尺寸的輸入影像,采用反卷積層對最后一個卷積層的feature map進行上采樣, 使它恢復到輸入影像相同的尺寸,從而可以對每個像素都產生了一個預測, 同時保留了原始輸入影像中的空間資訊, 最后在上采樣的特征圖上進行逐像素分類,
具體可參考:https://zhuanlan.zhihu.com/p/30195134
https://www.jianshu.com/p/14641b79a672

1.3提出的背景
雖然卷積網路已經存在很長時間了,但是由于可用訓練集的大小和網路結構的大小,它們的成功受到限制,在許多視覺任務中,特別是在生物醫學影像處理中,期望的輸出應包括位置,所以應該給每個像素都進行標注,然而在生物醫學任務中通常無法獲得數千個訓練影像,因此,提出了一種資料增強方法來有效利用標注資料,提出一種U型的網路結構可以同時獲取背景關系資訊和位置資訊

二、網路結構
2.1 網路組件
①U型結構
②編碼器-解碼器結構
編碼和解碼,早在2006年就發表在了Nature上,當時這個結構提出的主要作用并不是分割,而是壓縮影像和去噪聲,后來把這個思路被用在了影像分割的問題上,也就是現在我們看到的FCN或者U-Net結構,在它被提出的三年中,有很多很多的論文去講如何改進U-Net或者FCN,不過這個分割網路的本質的結構是沒有改動的, 即下采樣、上采樣和跳躍連接,
編碼器逐漸減少池化層的空間維度,解碼器逐步修復物體的細節和空間維度,編碼器和解碼器之間通常存在快捷連接,因此能幫助解碼器更好地修復目標的細節,U-Net 是這種方法中最常用的結構,
③skip-connection

2.2結構詳解
file
①U-net前半部分作用是特征提取,后半部分是上采樣,每一個藍色塊表示一個多通道特征圖,特征圖的通道數標記在頂部,X-Y尺寸設定在塊的左下邊緣,不同顏色的箭頭代表不同的操作,
②藍色箭頭代表3x3的卷積操作,channel的大小乘2,stride是1,padding為0,因此,每個該操作以后, feature map的大小會減2,輸入是572x572的,但是輸出變成了388x388,是因為灰色箭頭表示復制和剪切操作,在同一層左邊的最后一層要比右邊的第一層要大一些,這就導致了,想要利用淺層的feature,就要進行一些剪切,也導致了最終的輸出是輸入的中心某個區域,
③紅色箭頭代表2x2的max pooling操作,需要注意的是,如果pooling之前feature map的大小是奇數,那么就會損失一些資訊,
④綠色箭頭代表2x2的反卷積操作,操作會將feature map的大小乘2,channel的大小除以2,
⑤輸出的最后一層,使用了1x1的卷積層做了分類,把64個特征向量分成了2類(細胞類、背景類),

三、方法亮點
3.1同時具備捕捉背景關系資訊的收縮路徑和允許精確定位的對稱擴展路徑,并且與FCN相比,U-net的上采樣程序依然有大量的通道,這使得網路將背景關系資訊向更高層解析度傳播,
收縮路徑遵循卷積網路的典型架構,每一次下采樣后都把特征通道的數量加倍,擴展路徑中的每一步都首先使用反卷積,每次使用反卷積都將特征通道數量減半,特征圖大小加倍,反卷積過后,將反卷積的結果與收縮路徑中對應步驟的特征圖拼接起來,

3.2 Overlap-tile 策略,這種方法用于補全輸入影像的上下資訊,可以解決由于現存不足造成的影像輸入的問題,
file
為了預測影像邊界區域中的像素,通過鏡像輸入影像來推斷缺失的背景關系, 這種平鋪策略對于將網路應用于大影像非常重要,因為解析度會受到GPU記憶體的限制,
該策略的思想是:對影像的某一塊像素點(黃框內部分)進行預測時,需要該影像塊周圍的像素點(藍色框內)提供背景關系資訊,以獲得更準確的預測,簡單地說,就是在預處理中,對輸入影像進行padding,通過padding擴大輸入影像的尺寸,使得最后輸出的結果正好是原始影像的尺寸, 同時, 輸入影像塊(黃框)的邊界也獲得了背景關系資訊從而提高預測的精度,

3.3使用隨機彈性變形進行資料增強,
作者采用了彈性變形的影像增廣,以此讓網路學習更穩定的影像特征,因為資料集是細胞組織的影像,細胞組織的邊界每時每刻都會發生不規則的畸變,所以這種彈性變形的增廣是非常有效的,
file
如果 σ值很大,則結果值很小,因為隨機值平均為0;如果σ很小,則歸一化后該欄位看起來像一個完全隨機的欄位,
對于中間σ值,位移場看起來像彈性變形,其中σ是彈性系數,然后將位移場乘以控制變形強度的比例因子 α, 將經過高斯卷積的位移場乘以控制變形強度的比例因子 α,得到一個彈性形變的位移場,最后將這個位移場作用在仿射變換之后的影像上,得到最終彈性形變增強的資料,作用的程序相當于在仿射影像上插值的程序,最后回傳插值之后的結果,

3.4使用加權損失,(分離同一類別的接觸物體)
file
(a)原始影像
(b)標注影像實況分割 不同的顏色表示HeLa細胞的不同情況
(c)生成分割蒙版(白色:前景,黑色:背景)
(d)以像素為單位的權重映射,迫使網路學習邊界像素
方法:預先計算權重圖,一方面補償了訓練資料每類像素的不同頻率,另一方面是網路更注重學習相互接觸的細胞間邊緣,

因此,使用加權損失,其中接觸細胞之間的分離背景標簽在損失函式中獲得大的權重,預先計算每個真實分割的權重圖,以補償訓練資料集中某一類像素的不同頻率,并迫使網路學習,在觸摸細胞之間引入的小分離邊界(見圖c和d),
使用形態運算來計算分離邊界,權重圖計算如下:
file

四、網路模型主要應用及結果
4.1在電子顯微鏡記錄中分割神經元結構,在下圖中演示了資料集中的一個例子和我們的分割結果,我們提供了全部結果作為補充材料,資料集是EM分割挑戰提供的,這個挑戰是從 ISBI 2012開始的,現在依舊開放,訓練資料是一組來自果蠅幼蟲腹側腹側神經索(VNC)的連續切片透射電鏡的30張影像(512x512像素),每個影像都帶有一個對應的標注分割圖,細胞(白色)和膜(黑色),測驗集是公開可用的,但對應的標注圖是保密的,可以通過將預測的膜概率圖發送給組織者來獲得評估,通過在10個不同級別對結果進行閾值化和計算“warping error”, “Rand error”還有“pixel error”(預測的label和實際的label),u-net(輸入資料的7個旋轉版本的平均值)無需進行任何進一步的預處理或后處理即可獲得0.0003529的warping error和0.0382的Rand error,
file

4.2 ISBI細胞追蹤挑戰的結果
file
(a)" PHc-U373 "資料集輸入影像的一部分,(b)分割結果(青色mask)與人工真實(黃色邊框)(c)“DIC-HeLa”資料集的輸入影像,(d)分割結果(隨機彩色mask)與人工真實(黃色邊框),

4.3 ISBI細胞追蹤挑戰賽2015的分割結果(IOU)
file
將u-net應用于光顯微影像中的細胞分割任務,這項分離任務是2014年和2015年ISBI細胞追蹤挑戰的一部分,第一個資料集“PHc-U373”包含Glioblastoma-astrocytoma(膠質母細胞瘤-星形細胞瘤)細胞在聚丙烯酰亞胺基底上,通過相差顯微鏡記錄,它包含35個部分注釋的訓練影像,實作了92%的平均IOU,這明顯優于83%的第二好演算法,第二個資料集“DIC-HeLa”是平板玻璃上的HeLa細胞,通過微分干涉對比顯微鏡記錄,它包含20個部分注釋的訓練影像,在這里,實作了77.5%的平均IOU,這明顯優于第二好的演算法46%,

五、網路缺陷和不足
5.1 不足之處
感興趣的目標尺寸非常小,對于尺寸極小的目標,U-Net分割性能可能會不好,分割效果也不好,

5.2研習Unet
①FCN與Unet的區別
U-Net和FCN非常的相似,U-Net比FCN稍晚提出來,但都發表在2015年,和FCN相比,U-Net的第一個特點是完全對稱,也就是左邊和右邊是很類似的,而FCN的decoder相對簡單,只用了一個deconvolution的操作,之后并沒有跟上卷積結構,第二個區別就是skip connection,FCN用的是加操作(summation),U-Net用的是疊操作(concatenation),這些都是細節,重點是它們的結構用了一個比較經典的思路,也就是編碼和解碼(encoder-decoder)結構,
②U型結構到底多深,是不是越深越好?
關于到底要多深這個問題,還有一個引申的問題就是,降采樣對于分割網路到底是不是必須的?問這個問題的原因就是,既然輸入和輸出都是相同大小的圖,為什么要折騰去降采樣一下再升采樣呢?
比較直接的回答當然是降采樣的理論意義,我簡單朗讀一下,它可以增加對輸入影像的一些小擾動的魯棒性,比如影像平移,旋轉等,減少過擬合的風險,降低運算量,和增加感受野的大小,升采樣的最大的作用其實就是把抽象的特征再還原解碼到原圖的尺寸,最終得到分割結果,
參考https://zhuanlan.zhihu.com/p/44958351

六、個人思考總結
從2015年這篇文章發表以來,Unet被參考數千次,成為大多做醫療影像語意分割任務的baseline,也啟發了大量研究者去思考U型語意分割網路,
新穎的特征融合,對影像特征多尺度識別,skip connection,到現在依舊值得我們學習借鑒,

附錄:
①Unet-family:https://github.com/ShawnBIT/UNet-family

②醫學影像特點:
(1)影像語意較為簡單、結構較為固定,做腦部影像的,就用腦CT和腦MRI,做胸片的只用胸片CT,做眼底的只用眼底OCT,都是一個固定的器官的成像,而不是全身的,由于器官本身結構固定和語意資訊沒有特別豐富,所以高級語意資訊和低級特征都顯得很重要,

(2)資料量少,醫學影像的資料獲取相對難一些,很多比賽只提供不到100例資料,所以我們設計的模型不宜多大,引數過多,很容易導致過擬合,(原始UNet的引數量在28M左右(上采樣帶轉置卷積的UNet引數量在31M左右),而如果把channel數成倍縮小,模型可以更小,縮小兩倍后,UNet引數量在7.75M,縮小四倍,可以把模型引數量縮小至2M以內)非常輕量,個人嘗試過使用Deeplab v3+和DRN等自然影像語意分割的SOTA網路在自己的專案上,發現效果和UNet差不多,但是引數量會大很多,

(3)多模態,相比自然影像,醫療影像是具有多種模態的,以ISLES腦梗競賽為例,其官方提供了CBF,MTT,CBV,TMAX,CTP等多種模態的資料,比如CBF是腦血流量,CBV用于檢測巨細胞病毒的,

(4)可解釋性重要,由于醫療影像最終是輔助醫生的臨床診斷,所以網路告訴醫生一個3D的CT有沒有病是遠遠不夠的,醫生還要進一步的想知道,病在哪一層,在哪一層的哪個位置,分割出來了嗎,能不能求體積,

參考文章:https://blog.csdn.net/haoji007/article/details/78442088?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242
https://blog.csdn.net/qian99/article/details/85084686

本文由博客群發一文多發等運營工具平臺 OpenWrite 發布

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/263663.html

標籤:Python

上一篇:Python常用的8個高級函式

下一篇:資料分析與產品:論一份報表的誕生

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more