寫在前面
本人初步接觸深度學(xué)習(xí)與醫(yī)學(xué)圖像分割領(lǐng)域,第一個項(xiàng)目就是運(yùn)用nnUNet網(wǎng)絡(luò)對BrainTumour的數(shù)據(jù)集進(jìn)行分割,在學(xué)習(xí)的過程中,學(xué)了很多資料,踩了很多坑,也解決了很多bug,在此把自己的學(xué)習(xí)經(jīng)驗(yàn)分享出來,希望有需要的同學(xué)可以少走一些彎路。
本篇博客的操作均在服務(wù)器的linux系統(tǒng)(Ubuntu)上進(jìn)行。作者的建議也是使用linux系統(tǒng)。
本篇文章使用的數(shù)據(jù)集為Medical Segmentation Decathlon比賽的Task01_BrainTumour數(shù)據(jù)集,如果你想訓(xùn)練自己的數(shù)據(jù)集,請參考我的另一篇博客。
抱歉,今年一直忙著競賽和保研,現(xiàn)在有時間寫了,但是nnUNet v2已經(jīng)發(fā)布,關(guān)于v1的教程就有些沒必要了,大家可以自行研究v2,歡迎在評論區(qū)或私信交流!
才疏學(xué)淺,如有錯誤,歡迎批評指正??!
nnUNet是什么?
nnU-Net是由德國癌癥研究中心、海德堡大學(xué)以及海德堡大學(xué)醫(yī)院研究人員(Fabian Isensee, Jens Petersen, Andre Klein)提出來的一個自適應(yīng)任何新數(shù)據(jù)集的醫(yī)學(xué)影像分割框架,該框架能根據(jù)給定數(shù)據(jù)集的屬性自動調(diào)整所有超參數(shù),整個過程無需人工干預(yù)。僅僅依賴于樸素的U-Net結(jié)構(gòu)(就是原始U-Net)和魯棒的訓(xùn)練方案,nnU-Net在六個得到公認(rèn)的分割挑戰(zhàn)中實(shí)現(xiàn)了最先進(jìn)的性能。
- 關(guān)于nnUNet,如果你想更加深入的了解,我推薦看一下這篇博客論文解讀- nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation(附實(shí)現(xiàn)教程)_Tina姐的博客-CSDN博客,是比較概括性的講解,更深入的學(xué)習(xí)還是建議精讀論文。
一、配置虛擬環(huán)境
首先,我們想實(shí)現(xiàn)nnUNet的使用,需要配置類似如下的環(huán)境:
-
上圖所示為nnUNet的官方readme文檔建議的環(huán)境配置,如果你對cuda,cudnn,torch之類的詞語還不算熟悉,可以看一下我的另一篇博客用人話講解深度學(xué)習(xí)中CUDA,cudatookit,cudnn和pytorch的關(guān)系_江江ahh的博客-CSDN博客
-
至于為什么要在虛擬環(huán)境中安裝nnUNet,當(dāng)我們在安裝包的時候,
pip install django
安裝一個包會附帶安裝數(shù)個其他關(guān)聯(lián)的包。但是當(dāng)我們刪除這個包的時候,我們之后僅僅刪除這一個包,安裝時附帶的其他包并不會刪除。**簡單來說,當(dāng)我們的環(huán)境使用時間長的時候,我們的包是很難進(jìn)行管理的。**所以非常建議在一個全新的虛擬環(huán)境中來完成接下來的操作?。?! -
如果你對虛擬環(huán)境還比較陌生,建議看一下這位大佬的視頻安裝不算完事,只有理解了虛擬環(huán)境才算真正掌握 Python 環(huán)境_嗶哩嗶哩_bilibili
-
當(dāng)你了解虛擬環(huán)境的作用以后,可以參考我的另一篇博客來配置nnUNet所需的環(huán)境在conda虛擬環(huán)境中配置cuda+cudnn+pytorch深度學(xué)習(xí)環(huán)境(新手必看!簡單可行?。江江ahh的博客-CSDN博客_在虛擬環(huán)境中安裝cuda
二、安裝nnUNet框架
此時,你應(yīng)該已經(jīng)配置好了自己的虛擬環(huán)境并且可以打印出類似上圖的環(huán)境版本(可以更高,但最好不要太低),注意,后續(xù)的操作均要在你激活你想要使用的那個虛擬環(huán)境的前提下進(jìn)行?。。。?/strong>
1.安裝nnUNet
根據(jù)readme文檔,這里應(yīng)該有兩種方案可供選擇:
(1)用作標(biāo)準(zhǔn)化基線、開箱即用的分割算法或使用預(yù)訓(xùn)練模型進(jìn)行推理:
pip install nnunet
(2)用作集成框架(這將在您的計算機(jī)上創(chuàng)建nnU-Net代碼的副本,以便您可以根據(jù)需要對其進(jìn)行修改)
你想把nnUNet的文件夾放在哪,就在哪個路徑下運(yùn)行這些命令!
git clone https://github.com/MIC-DKFZ/nnUNet.git
cd nnUNet
pip install -e .#最后這個點(diǎn)也不能忽略
對于我來說,因?yàn)槲液罄m(xù)是要改網(wǎng)絡(luò)代碼的,所以我選擇第二種方法,下面詳細(xì)說明一下這三行命令都是什么意思:
git clone其實(shí)就是把人家github上的代碼克隆過來,這一步其實(shí)和直接復(fù)制粘貼代碼文件是一樣的,總共也就1Mb
cd nnUNet不用說了,就是進(jìn)入文件夾
其實(shí)這個時候就已經(jīng)有一個nnUNet完整的文件夾了,里面包含這些東西:
最后pip install -e .相當(dāng)于python setup.py,也就是運(yùn)行上圖這個setup.py文件
這個文件是用來干什么的呢?
- 安裝nnUNet需要的python包
- 向終端添加幾個新命令。這些命令用于運(yùn)行整個nnU-Net pipeline。您可以從系統(tǒng)上的任何位置執(zhí)行它們。所有nnU-Net命令都帶有前綴“nnUNet_”,以便于識別。
這一步我遇到的兩個問題:
(1)從github上git clone代碼的時候速度慢的離譜(20kb/s),這個問題主要是github的域名在國內(nèi)被限制了,網(wǎng)上有很多方法解決,比如下面這個網(wǎng)址可以參考https://www.jianshu.com/p/d58ab49ba98b/
(2)運(yùn)行pip命令的時候速度很慢,這個問題導(dǎo)致我運(yùn)行pip install -e .
的時候超時報錯了,同樣給出解決方法的鏈接解決Linux,Ubuntu下使用python包管理工具pip命令安裝和下載包速度很慢、失敗或者connection timeout等問題_一點(diǎn)兒也不萌的萌萌的博客-CSDN博客_linux 下載python failed: connection timed out.
2.安裝隱藏層hiddenlayer(可選)
隱藏層使nnU-net能夠給出其生成的網(wǎng)絡(luò)拓?fù)鋱D(后面會細(xì)說),安裝命令如下(這是一整行命令,請務(wù)必一起復(fù)制粘貼)
pip install --upgrade git+https://github.com/FabianIsensee/hiddenlayer.git@more_plotted_details#egg=hiddenlayer
這里我遇到的唯一問題就是上面說的pip命令速度太慢,也是根據(jù)上述解決方案來解決的。
三、數(shù)據(jù)集準(zhǔn)備
nnUNet對于你要訓(xùn)練的數(shù)據(jù)是有嚴(yán)格要求的,這第一點(diǎn)就體現(xiàn)在我們保存數(shù)據(jù)的路徑上,請初學(xué)者務(wù)必按照我下面的樣式來創(chuàng)建相應(yīng)的文件夾并存入數(shù)據(jù)!?。?/h5>
? 第一步:你現(xiàn)在應(yīng)該有一個名為nnUNet的文件夾(上面有圖),進(jìn)入它,在里面創(chuàng)建一個名為nnUNetFrame的文件夾
? 第二步:在nnUNetFrame文件夾中創(chuàng)建一個名為DATASET的文件夾,后面我們會用它來存放數(shù)據(jù)
? 第三步:在DATASET文件夾中創(chuàng)建三個文件夾,它們分別是nnUNet_raw,nnUNet_preprocessed,nnUNet_trained_models
? 第四步:進(jìn)入上面第二個文件夾nnUNet_raw,創(chuàng)建nnUNet_cropped_data文件夾和nnUNet_raw_data文件夾,右邊存放原始數(shù)據(jù),左邊存放crop以后的數(shù)據(jù)。
? 第五步:進(jìn)入右邊文件夾nnUNet_raw_data,創(chuàng)建一個名為Task01_BrainTumour的文件夾(解釋:這個Task01_BrainTumour是nnUNet的作者參加的一個十項(xiàng)全能競賽的子任務(wù)名,也是我要實(shí)踐的分割任務(wù),類似的還有Task02_Heart,就是分割心臟的。如果你想分割自己的數(shù)據(jù)集,建議Task_id從500開始,這樣以確保不會與nnUNet的預(yù)訓(xùn)練模型發(fā)生沖突(ID不能超過999))
? 第六步:將下載好的公開數(shù)據(jù)集或者自己的數(shù)據(jù)集放在上面創(chuàng)建好的任務(wù)文件夾下,下面還以Task01_BrainTumour競賽為例,解釋下數(shù)據(jù)應(yīng)該怎么存放和編輯:
- 進(jìn)入這個網(wǎng)站http://medicaldecathlon.com/.下載對應(yīng)的數(shù)據(jù)集(<–網(wǎng)上學(xué)科議建<–),取代上面你自己創(chuàng)建的Task01_BrainTumour文件夾。
- 你會發(fā)現(xiàn)目錄是這個樣子的:json文件是對三個文件夾內(nèi)容的字典呈現(xiàn)(關(guān)乎你的訓(xùn)練),imagesTr是你的訓(xùn)練數(shù)據(jù)集,打開后你會發(fā)現(xiàn)很多的有序的nii.gz的訓(xùn)練文件,而labelsTr里時對應(yīng)這個imagesTr的標(biāo)簽文件,同樣為nii.gz。目前只能是nii.gz文件,nii文件都不行。訓(xùn)練階段的imageTs文件夾先不管,其實(shí)這個文件夾出現(xiàn)在任何位置都可以。(解釋:nnUNet使用的是五折交叉驗(yàn)證,并沒有驗(yàn)證集)
四、設(shè)置nnUNet讀取文件的路徑
nnUNet是如何知道你的文件存放在哪兒呢,當(dāng)然要在環(huán)境中創(chuàng)建一個路徑,這個路徑你唯一需要更改的是/nnUNet之前的路徑,因?yàn)楹竺娴穆窂侥愫臀沂且粯拥摹?br> 第一步:在home目錄下按ctrl + h,顯示隱藏文件
第二步:找到.bashrc文件,打開
第三步:在文檔末尾添加下面三行,保存文件。
export nnUNet_raw_data_base="/home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw"
export nnUNet_preprocessed="/home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_preprocessed"
export RESULTS_FOLDER="/home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_trained_models"
? 第四步:在home下打開終端,輸入source .bashrc
來更新該文檔
現(xiàn)在nnUNet已經(jīng)知道怎么讀取你的文件了。
五、數(shù)據(jù)集轉(zhuǎn)換
1.數(shù)據(jù)集轉(zhuǎn)換是什么,為什么要進(jìn)行數(shù)據(jù)集轉(zhuǎn)換?
nnUNet要求將原始數(shù)據(jù)轉(zhuǎn)換成特定的格式,以便了解如何讀取和解釋數(shù)據(jù)。
每個分割數(shù)據(jù)集存儲為單獨(dú)的“任務(wù)”。命名包括任務(wù)與任務(wù)ID,即三位整數(shù)和相關(guān)聯(lián)的任務(wù)名稱。
比如Task001_BrainTumour的任務(wù)名稱為“腦瘤”,任務(wù)ID為1。
在每個任務(wù)文件夾中,預(yù)期的結(jié)構(gòu)如下:
Task001_BrainTumour/
├── dataset.json
├── imagesTr
├── (imagesTs)
└── labelsTr
圖像可能具有多種模態(tài),這對于醫(yī)學(xué)圖像來說尤其常見。
nnU-Net通過其后綴(文件名末尾的四位整數(shù))識別成像模態(tài)。因此,圖像文件必須遵循以下命名約定:case_identifier_XXXX.nii.gz。
這里,XXXX是模態(tài)標(biāo)識符。dataset.json文件中指定了這些標(biāo)識符所屬的模態(tài)。
標(biāo)簽文件保存為case_identifier.nii.gz
此命名方案產(chǎn)生以下文件夾結(jié)構(gòu)。用戶有責(zé)任將其數(shù)據(jù)轉(zhuǎn)換為這種格式!
下面是MSD的第一個任務(wù)的示例:BrainTumor。每個圖像有四種模態(tài):FLAIR(0000)、T1w(0001)、T1gd(0002)和T2w(0003)。請注意,imagesTs文件夾是可選的,不必存在。
nnUNet_raw_data_base/nnUNet_raw_data/Task001_BrainTumour/
├── dataset.json
├── imagesTr
│ ├── BRATS_001_0000.nii.gz
│ ├── BRATS_001_0001.nii.gz
│ ├── BRATS_001_0002.nii.gz
│ ├── BRATS_001_0003.nii.gz
│ ├── BRATS_002_0000.nii.gz
│ ├── BRATS_002_0001.nii.gz
│ ├── BRATS_002_0002.nii.gz
│ ├── BRATS_002_0003.nii.gz
│ ├── BRATS_003_0000.nii.gz
│ ├── BRATS_003_0001.nii.gz
│ ├── BRATS_003_0002.nii.gz
│ ├── BRATS_003_0003.nii.gz
│ ├── BRATS_004_0000.nii.gz
│ ├── BRATS_004_0001.nii.gz
│ ├── BRATS_004_0002.nii.gz
│ ├── BRATS_004_0003.nii.gz
│ ├── ...
├── imagesTs
│ ├── BRATS_485_0000.nii.gz
│ ├── BRATS_485_0001.nii.gz
│ ├── BRATS_485_0002.nii.gz
│ ├── BRATS_485_0003.nii.gz
│ ├── BRATS_486_0000.nii.gz
│ ├── BRATS_486_0001.nii.gz
│ ├── BRATS_486_0002.nii.gz
│ ├── BRATS_486_0003.nii.gz
│ ├── BRATS_487_0000.nii.gz
│ ├── BRATS_487_0001.nii.gz
│ ├── BRATS_487_0002.nii.gz
│ ├── BRATS_487_0003.nii.gz
│ ├── BRATS_488_0000.nii.gz
│ ├── BRATS_488_0001.nii.gz
│ ├── BRATS_488_0002.nii.gz
│ ├── BRATS_488_0003.nii.gz
│ ├── BRATS_489_0000.nii.gz
│ ├── BRATS_489_0001.nii.gz
│ ├── BRATS_489_0002.nii.gz
│ ├── BRATS_489_0003.nii.gz
│ ├── ...
└── labelsTr
├── BRATS_001.nii.gz
├── BRATS_002.nii.gz
├── BRATS_003.nii.gz
├── BRATS_004.nii.gz
├── ...
如果對于數(shù)據(jù)集轉(zhuǎn)換這件事還是不明白,打開你的nnUNet文件夾,在/nnUNet/documentation/文件夾下找到dataset_conversion這個文件來進(jìn)一步學(xué)習(xí)。
2.運(yùn)行數(shù)據(jù)集轉(zhuǎn)換的命令
依舊以Task01_BrainTumour為例:
nnUNet_convert_decathlon_task -i /home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task01_BrainTumour
轉(zhuǎn)換操作完成以后,你會發(fā)現(xiàn)在你的Task01_BrainTumour文件夾旁邊,出現(xiàn)了一個Task001_BrainTumour文件夾,打開看一下,里面的格式應(yīng)該和我上面展示的一樣。
3.關(guān)于dataset.json文件
這個文件包含你的訓(xùn)練數(shù)據(jù)信息和任務(wù)信息,如果你按照我的建議下載了Task01的數(shù)據(jù)集,那里面是包含dataset.json文件的,如果你有訓(xùn)練自己的數(shù)據(jù)集的需求,在我的另一篇博客里會有詳細(xì)的說明。
六、數(shù)據(jù)預(yù)處理
nnUNet_plan_and_preprocess -t 1 --verify_dataset_integrity
只需要一行命令,因?yàn)槲覀兊腡ask_id是1,所以這里的數(shù)字就是1。這個過程會消耗很多的時間,速度慢的原因在于對要進(jìn)行插值等各種操作。
根據(jù)nnUNet框架,三維醫(yī)學(xué)圖像分割的通用預(yù)處理可以分為四步,分別是數(shù)據(jù)格式的轉(zhuǎn)換,裁剪crop,重采樣resample以及標(biāo)準(zhǔn)化normalization。如果你想進(jìn)一步學(xué)習(xí),推薦學(xué)習(xí)這篇文章如何針對三維醫(yī)學(xué)圖像分割任務(wù)進(jìn)行通用數(shù)據(jù)預(yù)處理:nnUNet中預(yù)處理流程總結(jié)及代碼分析 - 知乎 (zhihu.com)
運(yùn)行“nnUNet_plan_and_preprocess”將使用預(yù)處理數(shù)據(jù)填充文件夾。
我們將在nnUNet_preprocessed/Task001_BrainTumour中找到這條命令的輸出結(jié)果。使用2D U-Net以及所有適用的3D U-Net的預(yù)處理數(shù)據(jù)創(chuàng)建子文件夾。它還將為2D和3D配置創(chuàng)建“plans”文件(結(jié)尾為.pkl)。這些文件包含生成的分割 pipeline 配置,將由nnUNetTrainer讀?。ㄒ娤挛模?。請注意,預(yù)處理的數(shù)據(jù)文件夾僅包含訓(xùn)練案例。測試圖像沒有經(jīng)過預(yù)處理。測試集的預(yù)處理將會在推理過程中實(shí)時進(jìn)行。
另外,`–verify_dataset_integrity”應(yīng)至少在給定數(shù)據(jù)集上首次運(yùn)行命令時運(yùn)行。這將對數(shù)據(jù)集執(zhí)行一些檢查,以確保其與nnU-Net兼容。如果此檢查通過一次,則可以在以后的運(yùn)行中省略。如果您遵守數(shù)據(jù)集轉(zhuǎn)換指南(請參見上文),那么這條命令一定會通過的。
七、模型訓(xùn)練
1.寫在訓(xùn)練前:更改epoch
nnUNet默認(rèn)原始的epoch是1000,這太久了,我們打開nnUNet/nnunet/training/network_training/nnUNetTrainerV2.py
第48行的max_epoch來修改epoch
2.關(guān)于訓(xùn)練的運(yùn)行命令
nnU-Net在5倍交叉驗(yàn)證中訓(xùn)練所有U-Net配置。這使nnU-Net能夠確定訓(xùn)練數(shù)據(jù)集的后處理和集合(參見下文)。
如果你不清楚什么是K折交叉驗(yàn)證,可以學(xué)習(xí)這篇博客【技術(shù)分享】什么是K折交叉驗(yàn)證?_AISec鹽究員的博客-CSDN博客_k折交叉驗(yàn)證
我們在數(shù)據(jù)預(yù)處理那一步的時候創(chuàng)建了三個U-Net配置:2D U-Net、對全分辨率圖像進(jìn)行操作的3D U-Net以及3D U-Net級聯(lián),其中級聯(lián)的第一個U-Net在下采樣圖像中創(chuàng)建粗分割圖,然后由第二個U-Net進(jìn)行細(xì)化。我們在訓(xùn)練的時候可以自由選用它們。
訓(xùn)練模型使用“nnUNet_train”命令完成。命令的一般結(jié)構(gòu)為:
nnUNet_train CONFIGURATION TRAINER_CLASS_NAME TASK_NAME_OR_ID FOLD --npz (additional options)
- CONFIGURATION是一個字符串,用于標(biāo)識所請求的U-Net配置。
- TRAINER_CLASS_NAME是model trainer的名稱。如果您實(shí)施定制trainers(nnU-Net作為一個框架),您可以在此處指定您的定制trainers。
- TASK_NAME_OR_ID指定應(yīng)訓(xùn)練的數(shù)據(jù)集,F(xiàn)OLD指定訓(xùn)練的是5倍交叉驗(yàn)證的哪一倍。
- “–npz”使模型在最終驗(yàn)證期間保存softmax輸出。它僅適用于計劃在之后運(yùn)行“nnUNet_find_best_configuration”的訓(xùn)練
(這是nnU Nets自動選擇最佳性能(集合)配置,見下文)。
對于我們的Task01來說,應(yīng)該運(yùn)行的命令如下
nnUNet_train 3d_fullres nnUNetTrainerV2 1 0 --npz
- 3d_fullres代表我們選用對全分辨率圖像進(jìn)行操作的3D U-Net
- nnUNetTrainerV2是我們選用的訓(xùn)練器
- 1代表你的任務(wù)ID
- 0代表五折交叉驗(yàn)證中的第0折
下面給出各種配置的nnUNet網(wǎng)絡(luò)需要的訓(xùn)練命令
2D U-Net
For FOLD in [0, 1, 2, 3, 4], run:
nnUNet_train 2d nnUNetTrainerV2 TaskXXX_MYTASK FOLD --npz
3D full resolution U-Net 3D全分辨率U-Net
For FOLD in [0, 1, 2, 3, 4], run:
nnUNet_train 3d_fullres nnUNetTrainerV2 TaskXXX_MYTASK FOLD --npz
3D U-Net cascade 3D U-net級聯(lián)
①3D low resolution U-Net
For FOLD in [0, 1, 2, 3, 4], run:
nnUNet_train 3d_lowres nnUNetTrainerV2 TaskXXX_MYTASK FOLD --npz
②3D full resolution U-Net
For FOLD in [0, 1, 2, 3, 4], run:
nnUNet_train 3d_cascade_fullres nnUNetTrainerV2CascadeFullRes TaskXXX_MYTASK FOLD --npz
注意,級聯(lián)的3D全分辨率U-Net需要預(yù)先完成低分辨率U-Net的five folds!
3.訓(xùn)練結(jié)果
訓(xùn)練后的模型將寫入RESULTS_FOLDER/nnUNet文件夾。對于我們的項(xiàng)目來說,就是會存在/home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_trained_models/nnUNet這個路徑下。
每次訓(xùn)練都會獲得一個自動生成的輸出文件夾名稱,根據(jù)我們的訓(xùn)練配置,我們會得到3d_fullres/Task001_BrainTumour這個文件夾。關(guān)于它的樹狀圖如下(為簡潔起見,有些文件僅在一個文件夾下詳細(xì)展開):
RESULTS_FOLDER/nnUNet/
├── 2d
│ └── Task001_BrainTumour
│ └── nnUNetTrainerV2__nnUNetPlansv2.1
│ ├── fold_0
│ ├── fold_1
│ ├── fold_2
│ ├── fold_3
│ └── fold_4
├── 3d_cascade_fullres
├── 3d_fullres
│ └── Task001_BrainTumour
│ └── nnUNetTrainerV2__nnUNetPlansv2.1
│ ├── fold_0
│ │ ├── debug.json
│ │ ├── model_best.model
│ │ ├── model_best.model.pkl
│ │ ├── model_final_checkpoint.model
│ │ ├── model_final_checkpoint.model.pkl
│ │ ├── network_architecture.pdf
│ │ ├── progress.png
│ │ └── validation_raw
│ │ ├── BRATS_010.nii.gz
│ │ ├── BRATS_010.pkl
│ │ ├── BRATS_018.nii.gz
│ │ ├── BRATS_018.pkl
│ │ ├── summary.json
│ │ └── validation_args.json
│ ├── fold_1
│ ├── fold_2
│ ├── fold_3
│ └── fold_4
└── 3d_lowres
如果你的訓(xùn)練成功了,應(yīng)該會得到和我下圖一樣的結(jié)果
下面詳細(xì)講講這些訓(xùn)練后得到的文件都是什么
-
debug.json:包含用于訓(xùn)練此模型的藍(lán)圖和推斷參數(shù)的摘要。不容易閱讀,但對調(diào)試非常有用。
-
model_best.model/model_best.model.pkl:訓(xùn)練期間識別的最佳模型的檢查點(diǎn)文件。
-
model_final_checkpoint.model/model_final_checkpoint.model.pkl:最終模型的檢查點(diǎn)文件(訓(xùn)練結(jié)束后)。這是用于驗(yàn)證和推理的。
-
networkarchitecture.pdf(僅當(dāng)安裝了hiddenlayer時?。阂粋€pdf文檔,其中包含網(wǎng)絡(luò)架構(gòu)圖。
-
progress.png:訓(xùn)練期間訓(xùn)練(藍(lán)色)和驗(yàn)證(紅色)損失的圖。還顯示了評估指標(biāo)的近似值(綠色)。這個近似值是前景類的平均Dice分?jǐn)?shù)。
-
validation_raw:在這個文件夾中是訓(xùn)練完成后預(yù)測的驗(yàn)證案例。summary.json包含驗(yàn)證度量(文件末尾提供了所有情況的平均值)。
-
training_log:訓(xùn)練過程中不斷打印,nnunet的loss函數(shù)默認(rèn)是趨向-1的,也就是說在訓(xùn)練的過程中,我們通過每輪訓(xùn)練的日志可以查看到每輪的loss函數(shù),這個數(shù)值應(yīng)該是負(fù)數(shù),而且越趨向于-1,效果越好。
現(xiàn)在我們想看看我們訓(xùn)練的結(jié)果怎么樣,有兩種方法:
? 第一種是打開progress.png來從圖像上直觀的感受一下,它大概長這樣:

? 第二種是打開validation_raw/summary.json,從里面我們不僅可以看到對每一個驗(yàn)證數(shù)據(jù)的評價,更可以在最末尾看到它們的平均值。
這里我們主要關(guān)注這個Dice分?jǐn)?shù),之前說到了腦瘤數(shù)據(jù)集分為四個模態(tài),而labels的數(shù)量也是4(參見dataset.json):
"labels": {
"0": "background",
"1": "edema",
"2": "non-enhancing tumor",
"3": "enhancing tumour"
包含背景在內(nèi)的4個標(biāo)簽,分別是背景、壞疽(NET,non-enhancing tumor)、浮腫區(qū)域(ED,peritumoral edema)、增強(qiáng)腫瘤區(qū)域(ET,enhancing tumor),如下圖,它們的平均dice分?jǐn)?shù)約為0.9994,0.8770,0.7780,0.8728
八、確定最佳U-Net配置
本文只說明了3d_fullres的訓(xùn)練,完整的nnUNet流程還需要跑2d和3d級聯(lián)的,然后進(jìn)行三種的擇優(yōu)。不過從實(shí)際性能來說,一般3d級聯(lián)≥3d>2d,是否跑其他兩種需要自己考慮。
訓(xùn)練完所有模型后,使用以下命令自動確定用于測試集預(yù)測的U-Net配置:
nnUNet_find_best_configuration -m 2d 3d_fullres 3d_lowres 3d_cascade_fullres -t 1
- 所有指定配置都需要完成所有的5折訓(xùn)練!
- 對于未配置級聯(lián)的數(shù)據(jù)集,請改用“-m 2d 3d_fullres”。如果您只想探索配置的某些子集,可以使用“-m”命令指定。
所以說,如果你訓(xùn)練完所有模型,才可以使用這一步,如果沒有,那可以直接推理
九、運(yùn)行推理
1.準(zhǔn)備測試集
讓我們回到你剛剛做好數(shù)據(jù)集轉(zhuǎn)換的那個數(shù)據(jù)集:/home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task001_BrainTumour,在里面創(chuàng)建inferTs這個文件夾,用于存放待推理測試集的推理結(jié)果。然后,我會選擇將原本的imagesTs重命名為imagesTs0,它是我們下載數(shù)據(jù)集時給我們的幾十個測試集,然后新建一個imagesTs,里面只放一個測試集。(解釋:這個道理其實(shí)很明顯,推理太多數(shù)據(jù)集太久了,先用一個試試)
這個時候我們在imagesTs里存放的待推理的測試集,它的格式應(yīng)該是經(jīng)過數(shù)據(jù)集轉(zhuǎn)換那一步的格式,忘記了的話可以翻上去看一下,如下圖所示,四個模態(tài)都要有,且重命名過:
2.運(yùn)行推理的最簡單方法是簡單地使用下面這一條命令:
nnUNet_predict -i 要預(yù)測數(shù)據(jù)的文件夾路徑 -o 輸出文件夾路徑 -t 1 -m 3d_fullres -f 0
對于我們這個項(xiàng)目,它就應(yīng)該是:
nnUNet_predict -i /home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task001_BrainTumour/imagesTs/ -o /home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task001_BrainTumour/inferTs -t 1 -m 3d_fullres -f 0
你會在inferTs里得到模型生成的預(yù)測結(jié)果
3.如果你想集成多個模型的推理結(jié)果
如果你已經(jīng)訓(xùn)練出了多個模型,并且像上一步一樣進(jìn)行了推理,現(xiàn)在你想集成它們的推理結(jié)果,首先需要在上面的命令后面加入“–save_npz”。`–save_npz”將使命令保存softmax概率以及需要大量磁盤空間的預(yù)測分割掩碼。
然后請為每個配置選擇單獨(dú)的“OUTPUT_FOLDER”!
最后使用以下命令集合來自多個配置的預(yù)測:
nnUNet_ensemble -f FOLDER1 FOLDER2 ... -o OUTPUT_FOLDER -pp POSTPROCESSING_FILE
您可以指定任意數(shù)量的文件夾,但請記住,每個文件夾都需要包含由“nnUNet_predict”生成的npz文件。對于集成,還可以指定一個文件,告訴命令如何進(jìn)行后處理。
這些文件是在運(yùn)行“nnUNet_find_best_configuration”時創(chuàng)建的,位于相應(yīng)的訓(xùn)練模型目錄中(RESULTS_FOLDER/nnUNet/CONFIGURATION/TaskXXX_MYTASK/TRAINER_CLASS_NAMEPLANS_FILE_IDENTIFIER/postprocessing.json or
RESULTS_FOLDER/nnUNet/ensembles/TaskXXX_MYTASK/ensemble_XYZ–XY__Z/postprocessing.json).
您也可以選擇不提供文件(只需省略-pp),nnU-Net將不會運(yùn)行后處理。
因此,在運(yùn)行集成推理之前,必須對所有5個折進(jìn)行訓(xùn)練。在推理開始時,將打印找到的可用的nnU-Net folds列表。
十、評估推理結(jié)果
依舊是一行命令完成
nnUNet_evaluate_folder -ref 金標(biāo)準(zhǔn)文件夾 -pred 預(yù)測結(jié)果文件夾 -l 1 2 3
-l 表示要計算的label的類別,正常就是背景-0腫瘤-1,所以設(shè)置1,如果有兩類就是 -l 1 2,以此類推,所以我們這里是1 2 3
這個是nnUNet自帶的評估命令,計算分割DSC,可以不用這個,另寫代碼去算需要的評估指標(biāo)即可
我在相應(yīng)路徑下創(chuàng)建了seg_0文件夾和seg_p文件夾,分別用來存放金標(biāo)準(zhǔn)和預(yù)測結(jié)果
運(yùn)行如下命令
nnUNet_evaluate_folder -ref /home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task001_BrainTumour/seg_0 -pred /home/work/nnUNet/nnUNetFrame/DATASET/nnUNet_raw/nnUNet_raw_data/Task001_BrainTumour/seg_p -l 1 2 3
在seg_p文件夾中,我們會得到和訓(xùn)練結(jié)果文件夾里validation_raw/summary.json一樣格式的summary.json文件,它包含了每一個評估數(shù)據(jù)的指標(biāo),文檔末尾是其平均值。
參考資料
https://blog.csdn.net/u014264373/article/details/116792649
(四:2020.07.28)nnUNet最舒服的訓(xùn)練教程(讓我的奶奶也會用nnUNet(上))(21.04.20更新)_花卷湯圓的博客-CSDN博客_nnuet
(五:2020.07.31)nnUNet最簡單的推理教程(讓我的奶奶也會用nnUNet(下))_花卷湯圓的博客-CSDN博客_nnunet推理
醫(yī)學(xué)圖像分割 3D nnUNet全流程快速實(shí)現(xiàn)_打南邊來了個阿楠的博客-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-779396.html
論文解讀- nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation(附實(shí)現(xiàn)教程)_Tina姐的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-779396.html
醫(yī)學(xué)圖像分割 3D nnUNet全流程快速實(shí)現(xiàn)_打南邊來了個阿楠的博客-CSDN博客
論文解讀- nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation(附實(shí)現(xiàn)教程)_Tina姐的博客-CSDN博客
碼字不易,您的點(diǎn)贊是對我最好的支持,如果有問題也歡迎在評論區(qū)或私信與我交流!
到了這里,關(guān)于nnUNet保姆級使用教程!從環(huán)境配置到訓(xùn)練與推理(新手必看)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!