給定某個數(shù)據(jù)集罩锐,nnU-Net完全自動執(zhí)行整個分割過程,包括數(shù)據(jù)預(yù)處理
到模型配置
卤唉、模型訓(xùn)練
涩惑、后處理
到集成
的整個過程,而不需要人為干預(yù)桑驱。此外竭恬,訓(xùn)練好的模型還可以應(yīng)用到測試集中進(jìn)行推理。
博主強(qiáng)烈建議:==做醫(yī)學(xué)圖像分割的任何人熬的,都必須要會使用nnU-Net==
理由2個:
- 首先用nnU-Net測試一下痊硕。看一下該任務(wù)的大致效果押框,心里有個大致預(yù)測岔绸。
- 第二,寫論文的時候通常都要和nnU-Net對比橡伞,尤其是投英文期刊(SCI)盒揉。因為它太火了,審稿人都知道這個東西的骑歹,不要抱僥幸心理预烙。要么戰(zhàn)勝它,要么使用它??道媚。它的出現(xiàn)扁掸,真的是有好有壞,畢竟投論文更加難了~
開始之前最域,確保你已經(jīng)學(xué)習(xí)了以下內(nèi)容
論文解讀- nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation(附實現(xiàn)教程)
nnU-Net 如何安裝--傻瓜式安裝教程
nnU-Net實戰(zhàn)一使用預(yù)訓(xùn)練nnU-Net模型進(jìn)行推理
@[TOC]
1 數(shù)據(jù)準(zhǔn)備
nnU-Net 需要結(jié)構(gòu)化格式的數(shù)據(jù)集谴分。并將原始數(shù)據(jù)存放在文件夾
nnUNet_raw_data_base/nnUNet_raw_data/TaskXXX_MYTASK
在nnU-Net實戰(zhàn)一使用預(yù)訓(xùn)練nnU-Net模型進(jìn)行推理 ,3.1 nnU-Net支持的數(shù)據(jù)格式這一小節(jié)已經(jīng)講了你需要把數(shù)據(jù)轉(zhuǎn)換的格式镀脂。主要包含以下文件夾和文件牺蹄。
-
imagesTr
: 訓(xùn)練圖像。 -
imagesTs
(可選): 測試圖像 -
labelTr
: 訓(xùn)練集標(biāo)簽薄翅。 -
dataset.json
: 包含數(shù)據(jù)集的元數(shù)據(jù)沙兰, 如任務(wù)名字氓奈,模態(tài),標(biāo)簽含義鼎天,訓(xùn)練集包含的圖像地址??舀奶。
這里講一下,dataset.json
這個文件怎么弄斋射。一個合格的文件應(yīng)該包含如下信息:
- name: 數(shù)據(jù)集名字
- dexcription: 對數(shù)據(jù)集的描述
- modality: 模態(tài)育勺,0表示CT數(shù)據(jù),1表示MR數(shù)據(jù)罗岖。nnU-Net會根據(jù)不同模態(tài)進(jìn)行不同的預(yù)處理
- labels: label中涧至,不同的數(shù)值代表的類別
- numTraining: 訓(xùn)練集數(shù)量
- numTest: 測試集數(shù)量
- training: 訓(xùn)練集的image 和 label 地址對
- test: ==只包含==測試集的image. 這里跟Training不一樣
在這里插入圖片描述
現(xiàn)在我們知道長什么樣了,那么怎么把我們的數(shù)據(jù)準(zhǔn)備成這個樣子呢桑包。最簡單的方法就是copy別人的代碼南蓬,在前人的基礎(chǔ)上修改一下。如: dataset_conversion
當(dāng)然捡多,代碼能力強(qiáng)的可以自己寫一個~
2 一行命令數(shù)據(jù)預(yù)處理
使用命令: ==nnUNet_plan_and_preprocess==
nnUNet_plan_and_preprocess -t XXX --verify_dataset_integrity
作用: 它會自動讀取 ==數(shù)據(jù)集的屬性蓖康,例如圖像大小、體素間距垒手、強(qiáng)度信息==等。并轉(zhuǎn)換成模型需要的格式倒信。
==XXX==是與您的任務(wù)名稱相關(guān)聯(lián)的整數(shù)標(biāo)識符TaskXXX_MYTASK(如005科贬, 就寫5)。您可以一次傳遞多個任務(wù) ID鳖悠。
==--verify_dataset_integrity== 對數(shù)據(jù)集執(zhí)行一些檢查以確保它與 nnU-Net 兼容榜掌。如果此檢查已通過一次,則可以在以后的運行中省略乘综。如果您遵守數(shù)據(jù)集轉(zhuǎn)換指南(見上文)憎账,那么這應(yīng)該毫無問題地通過:-)
nnUNet_plan_and_preprocess
完成后,結(jié)果保存在文件夾
nnUNet_preprocessed / TaskXXX_MYTASK卡辰。
主要包含以下文件:
[圖片上傳失敗...(image-132680-1631149835878)]
3 一行命令開始訓(xùn)練
使用命令 ==nnUNet_train==
該命令參數(shù)很多胞皱,可以使用nnUNet_train -h
查看參數(shù)的含義
該命令的一般結(jié)構(gòu)為:
nnUNet_train CONFIGURATION TRAINER_CLASS_NAME TASK_NAME_OR_ID FOLD (additional options)
- CONFIGURATION: 模型架構(gòu),三種Unet:
2D U-Net
,3D U-Net
and aU-Net Cascade
(U-Net級聯(lián))九妈。 - TRAINER_CLASS_NAME: 使用的model trainer. 默認(rèn)為nnUNetTrainerV2就可以
- TASK_NAME_OR_ID: 任務(wù)全名TaskXXX_MYTASK或者是ID號
- FOLD: 第幾折交叉驗證反砌,可選 [0, 1, 2, 3, 4],一共五折萌朱。
舉例一: 2D U-Net 訓(xùn)練第三折
nnUNet_train 2d nnUNetTrainerV2 Task100_adrenal 3
或者
nnUNet_train 2d nnUNetTrainerV2 100 3
舉例二: 3D full resolution U-Net 訓(xùn)練第二折
nnUNet_train 3d_fullres nnUNetTrainerV2 Task100_adrenal 2
舉例三: 3D U-Net cascade 訓(xùn)練第二折
分為兩步
step1 : 3D low resolution U-Net 訓(xùn)練
nnUNet_train 3d_lowres nnUNetTrainerV2 TaskXXX_MYTASK FOLD
step2: 3D full resolution U-Net 訓(xùn)練
nnUNet_train 3d_cascade_fullres nnUNetTrainerV2CascadeFullRes TaskXXX_MYTASK FOLD
tips
: 3D full resolution U-Net 訓(xùn)練需要使用nnUNetTrainerV2CascadeFullRes
訓(xùn)練過程中宴树,終端會輸出以下信息:大致包括使用的模型,數(shù)據(jù)信息晶疼,損失函數(shù)酒贬,網(wǎng)絡(luò)架構(gòu)又憨,每個epoch的輸出。
我們將訓(xùn)練好的模型寫入 RESULTS_FOLDER/nnUNet 文件夾锭吨。每次訓(xùn)練都會獲得一個自動生成的輸出文件夾名稱:
nnUNet_preprocessed/CONFIGURATION/TaskXXX_MYTASKNAME/TRAINER_CLASS_NAME__PLANS_FILE_NAME/FOLD
文件樹大致如下
每一折里面蠢莺,又有圖上紅框所示內(nèi)容。大致包括
- debug.json:包含用于訓(xùn)練此模型的藍(lán)圖和推斷參數(shù)的摘要耐齐。不容易閱讀浪秘,但對調(diào)試非常有用;-)
- model_best.model / model_best.model.pkl:訓(xùn)練期間確定的最佳模型的檢查點文件。暫時沒用埠况。
- model_final_checkpoint.model / model_final_checkpoint.model.pkl:最終模型的檢查點文件(訓(xùn)練結(jié)束后)耸携。這是用于==驗證和推理==的內(nèi)容。
-
progress.png:訓(xùn)練過程中的訓(xùn)練(藍(lán)色)和驗證(紅色)損失圖辕翰。還顯示了評估指標(biāo)的近似值(綠色)夺衍。這個近似值是前景類的==平均 Dice 分?jǐn)?shù)==。
在這里插入圖片描述 - validation_raw:在這個文件夾中是訓(xùn)練完成后預(yù)測的驗證案例喜命。
在訓(xùn)練期間沟沙,觀察進(jìn)度通常很有用。因此壁榕,我們隨時可以查看 progress.png矛紫。它將在每個epoch后進(jìn)行更新。
4 一行命令從斷點開始訓(xùn)練
nnU-Net訓(xùn)練時間還是比較久的牌里,畢竟默認(rèn)跑1000epochs, 假如突然斷電了怎么辦颊咬,難道要重新來嗎?
當(dāng)然不是牡辽, nnU-Net 每 50 個 epoch 存儲一個檢查點喳篇。如果您需要繼續(xù)之前的訓(xùn)練,只需在訓(xùn)練命令中添加一個==-c==即可态辛。如:
nnUNet_train 2d nnUNetTrainerV2 100 3 -c
5 一行命令進(jìn)行預(yù)測
訓(xùn)練完成后麸澜,我們當(dāng)然要看看在測試集上的表現(xiàn)啦。
使用命令 ==nnUNet_predict==
nnUNet_predict -i INPUT_FOLDER -o OUTPUT_FOLDER -t TASK_NAME_OR_ID -m CONFIGURATION
INPUT_FOLDER: 測試數(shù)據(jù)地址
OUTPUT_FOLDER: 分割數(shù)據(jù)存放地址
CONFIGURATION: 使用的什么架構(gòu)奏黑,2d or 3d_fullres or 3d_cascade_fullres等
如:
nnUNet_predict -i /home/.../nnunet_file/nnUNet_raw/nnUNet_raw_data/Task100_adrenal/imagesTs -o /home/.../nnunet_file/output -t 100 -m 2d -f 2
分割結(jié)果保存在OUTPUT_FOLDER炊邦,自行打開查看吧~
總結(jié): 雖然寫了這么多,其實也就4行命令就搞定了攀涵,每個步驟一行命令铣耘。nnUNet有一個不好的地方是,他的預(yù)測是沒有Dice得分的以故,因為他不接收測試集的標(biāo)簽蜗细。
到這里,nnUNet的使用就分享結(jié)束了呀,歡迎評論區(qū)交流~
我是Tina, 我們下篇博客見~
最后炉媒,求點贊踪区,評論,收藏