nnUNet
缺狠,這個(gè)醫(yī)學(xué)領(lǐng)域的分割巨無(wú)霸!在論文和比賽中隨處可見(jiàn)他的身影。大家對(duì)于nnUNet v1版本的教程都贊不絕口萍摊,因?yàn)樗?jiǎn)單易懂挤茄、詳細(xì)全面,讓很多朋友都輕松掌握了使用方法冰木。
最近穷劈,我也抽出時(shí)間仔細(xì)研究了nnUNet v2,并全程走過(guò)一遍流程踊沸。我努力將使用教程變得更加通俗易懂歇终,希望能提高大家的學(xué)習(xí)效率。如果你正在進(jìn)行分割任務(wù)逼龟,或者還沒(méi)有嘗試過(guò)nnUNet v2评凝,那么現(xiàn)在是時(shí)候跟著我一起學(xué)習(xí)啦!
我們將一步步解析nnUNet v2的改進(jìn)之處和操作步驟腺律,用簡(jiǎn)潔明快的語(yǔ)言讓你輕松理解奕短。無(wú)論你是醫(yī)學(xué)專(zhuān)業(yè)背景還是計(jì)算機(jī)科學(xué)領(lǐng)域的新手宜肉,都能夠輕松上手,掌握這個(gè)強(qiáng)大的工具翎碑。
內(nèi)容稍長(zhǎng)崖飘,我把它分為三個(gè)章節(jié),拆解難點(diǎn)
- nnUNet v2的不同之處杈女,安裝以及環(huán)境變量設(shè)置(這次內(nèi)容)
- nnUNet v2的數(shù)據(jù)準(zhǔn)備(下一篇)
- nnUNet v2的訓(xùn)練及推理(下下篇)
nnUNet v2版本與V1版有什么不同?
-
支持層次標(biāo)簽 'hierarchical labels'(在nnUNet中稱(chēng)為 'regions')吊圾。例如达椰,在 BraTS 這個(gè)數(shù)據(jù)集中,給定的 label 是“水腫”项乒、“壞死”和“增強(qiáng)腫瘤”啰劲。但是對(duì)于臨床應(yīng)用而言,他們關(guān)注的不是這三個(gè) label檀何,而是整個(gè)腫瘤蝇裤、腫瘤核心和增強(qiáng)腫瘤。 那么频鉴,這里的整個(gè)腫瘤就是 水腫+壞死+增強(qiáng)腫瘤; 腫瘤核心是 壞死+增強(qiáng)腫瘤栓辜。如果想按臨床的這個(gè)進(jìn)行分割,他的 label 是有重疊的垛孔。如下圖: [圖片上傳失敗...(image-d4afac-1693736127587)]
適用于某些有重疊任務(wù)的分割藕甩,具體詳見(jiàn) github[1]
支持跨平臺(tái), Cuda, mps (Apple M1/M2) and CPU
支持更多的輸入/輸出數(shù)據(jù)格式周荐。
通過(guò)基于
BaseReaderWriter
實(shí)現(xiàn)新的適配器狭莱,可以擴(kuò)展I/O格式。nnUNet_raw_cropped
文件夾不再存在概作,這樣可以節(jié)省磁盤(pán)空間腋妙,而且沒(méi)有性能損失在解壓縮時(shí),預(yù)處理數(shù)據(jù)和分割結(jié)果存儲(chǔ)在不同的文件中讯榕。分割結(jié)果以int8的格式存儲(chǔ)骤素,因此每個(gè)像素占用的磁盤(pán)空間(和I/O吞吐量)只有v1版本的四分之一。
原生支持多GPU(DDP)訓(xùn)練愚屁。但是谆甜,多GPU推斷仍然需要使用
CUDA_VISIBLE_DEVICES=X nnUNetv2_predict [...] -num_parts Y -part_id X
來(lái)運(yùn)行。在推斷過(guò)程中集绰,沒(méi)有跨GPU的通信规辱,所以增加DDP會(huì)增加額外的復(fù)雜性是沒(méi)有意義的。所有nnU-Net的功能現(xiàn)在也可以通過(guò)API進(jìn)行訪問(wèn)栽燕。請(qǐng)查看
setup.py
中對(duì)應(yīng)的入口點(diǎn)罕袋,以了解需要調(diào)用哪些函數(shù)改淑。數(shù)據(jù)集指紋現(xiàn)在明確地創(chuàng)建并保存在一個(gè)json文件中(參見(jiàn)nnUNet_preprocessed文件夾)。
其實(shí)大改動(dòng)不多浴讯,如果你只是一個(gè)初級(jí)用戶(hù)朵夏,很多改進(jìn)功能根本用不到。
如何安裝
雖然 官方說(shuō) nnunet 的兩個(gè)版本可以同時(shí)使用榆纽,但我還是建議將兩個(gè)版本分開(kāi)仰猖,放在不同的虛擬環(huán)境中。
安裝需求
- 操作系統(tǒng):nnU-Net 已在 Linux(Ubuntu 18.04奈籽、20.04饥侵、22.04;centOS衣屏、RHEL)躏升、Windows 和 MacOS 上進(jìn)行了測(cè)試!它應(yīng)該開(kāi)箱即用狼忱!
- 硬件要求:GPU(推薦)膨疏、CPU 和 Apple M1/M2 作為設(shè)備(目前 Apple mps 不實(shí)現(xiàn) 3D 卷積,因此您可能必須在這些設(shè)備上使用 CPU)钻弄。
- Python 3.9 或更高版本 在第一版本中佃却,nnunet v1 安裝教程[2]介紹了如何在虛擬環(huán)境中安裝 nnUNet, 但是略顯復(fù)雜窘俺。這一次直接用 conda 安裝
安裝步驟
- 首先新建一個(gè) conda 環(huán)境双霍,命名為 nnunet2(名字由你決定)
<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">conda create -n nnunet2 python==3.9
</pre>
- 激活該環(huán)境,并安裝 nnunetv2
<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">conda activate nnunet2 pip install nnunetv2
</pre>
設(shè)置環(huán)境變量/路徑
nnU-Net 依靠環(huán)境變量來(lái)了解原始數(shù)據(jù)批销、預(yù)處理數(shù)據(jù)和訓(xùn)練模型權(quán)重的存儲(chǔ)位置洒闸。要使用 nnU-Net 的完整功能,必須設(shè)置以下三個(gè)環(huán)境變量:
V1均芽,v2 版本中路徑有所不同丘逸。如果你已經(jīng)裝了 V1 版本,那么 V2 版本的路徑最好和 V1不同掀宋,以防打架深纲。
具體地,V2 應(yīng)該包含以下三個(gè)路徑:
-
nnUNet_raw
:這是放置原始數(shù)據(jù)集的地方劲妙。該文件夾將為每個(gè)數(shù)據(jù)集名稱(chēng)創(chuàng)建一個(gè)子文件夾 DatasetXXX_YYY湃鹊,其中 XXX 是 3 位標(biāo)識(shí)符(例如 001、002镣奋、043币呵、999...),YYY 是(唯一) 數(shù)據(jù)集名稱(chēng)侨颈。數(shù)據(jù)集必須采用 nnU-Net 格式樹(shù)結(jié)構(gòu)示例:
<pre class="custom" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">
nnUNet_raw/Dataset001_NAME1 ├── dataset.json ├── imagesTr │ ├── ... ├── imagesTs │ ├── ... └── labelsTr ├── ... nnUNet_raw/Dataset002_NAME2 ├── dataset.json ├── imagesTr │ ├── ... ├── imagesTs │ ├── ... └── labelsTr ├── ...
</pre> nnUNet_preprocessed
:這是保存預(yù)處理數(shù)據(jù)的文件夾余赢。數(shù)據(jù)也將從中讀取 訓(xùn)練期間使用此文件夾芯义。重要的是,該文件夾位于訪問(wèn)延遲低且高的驅(qū)動(dòng)器上 吞吐量nnUNet_results
:指定 nnU-Net 保存模型權(quán)重的位置妻柒。如果下載了預(yù)訓(xùn)練模型扛拨,則此 就是保存他們的地方。
V1 版本的路徑設(shè)置見(jiàn)之前的文章:給出了永久設(shè)置環(huán)境變量的方法 nnU-Net v1 如何安裝--傻瓜式安裝教程[3]
注意:如果設(shè)置永久變量的話举塔,V1和V2版本都安裝了的話绑警,其實(shí)有一個(gè)文件夾命名是相同的(nnUNet_preprocessed
),那你調(diào)用的時(shí)候就分不清 V1和V2的文件夾了央渣。
這里计盒,再給一種更方便的臨時(shí)路徑設(shè)置辦法
- step1: 創(chuàng)建一個(gè) setPath.sh 文件,里面包含如下內(nèi)容痹屹,
<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">#!/bin/bash export nnUNet_raw="/media/nunet2_folder/nnUNet_raw" export nnUNet_preprocessed="/media/nnunet2_folder/nnUNet_preprocessed" export nnUNet_results="/media/nnunet2_folder/nnUNet_results"
</pre>
tips:怎么創(chuàng)建一個(gè)setPath.sh文件 要?jiǎng)?chuàng)建一個(gè)名為"setPath.sh"的文件,你可以按照以下步驟進(jìn)行操作:
打開(kāi)一個(gè)文本編輯器枉氮,例如記事本或者終端上的文本編輯器志衍。
創(chuàng)建一個(gè)新的空白文件。
在文件中輸入上述內(nèi)容
保存并關(guān)閉文件聊替。
當(dāng)然楼肪,前提是,你要手動(dòng)創(chuàng)建這個(gè)三個(gè)文件夾惹悄,再把地址告訴環(huán)境變量
- step2: 每次運(yùn)行 nnunetv2 之前運(yùn)行一下此文件
<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">source setPath.sh
</pre>
- step3: 檢驗(yàn)是否起效
<pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; text-align: left;">echo $nnUNet_results
</pre>
如果返回的是我們?cè)O(shè)置的地址春叫,則起效
V1和V2路徑對(duì)比如下 [圖片上傳失敗...(image-40951-1693736127588)]
好了,煉丹爐已就位泣港。帶上你的數(shù)據(jù)暂殖,下一篇進(jìn)行數(shù)據(jù)預(yù)處理。
[圖片上傳失敗...(image-66e115-1693736127588)]
參考資料
[1]
層次標(biāo)簽: https://github.com/MIC-DKFZ/nnUNet/blob/master/documentation/region_based_training.md [2]
nnunet v1 安裝教程: https://blog.csdn.net/u014264373/article/details/117126627 [3]
nnU-Net v1 如何安裝--傻瓜式安裝教程: https://blog.csdn.net/u014264373/article/details/117126627