持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
说一下Unet网络,在其被提出之后,包括Unet++在内,几乎没有像Unet这样有如此大的突破,后期的创新也多围绕Unet展开,对于nnUNet来说,虽然仍然带有Unet的字眼,但是框架的效果还是非常不错的。
nnUNet对比其他的网络的改进,更加注重图像的预处理工作,nnUNet可以自动判断影像的模态,并进行相应的归一化操作,然后根据三次样条插值对不同的图像体素间距进行采样。
本博客主要介绍一下在Ubantu系统下如何运行自己的nnUNet网络。
1.安装CUDA+CUDNN+pytorch
这一步是基础,我用的是实验室的服务器,CUDA和CUDNN早就已经安装好,我只列举一下我的版本,具体的安装过程我就不再详细的叙述,网络上也有相应的安装教程,可以进行参考。
CUDA 10.2
CUDNN 7.6.5
pytorch直接使用官网的命令行安装即可,我直接使用默认安装的操作,整个nnUNet的配置过程没有遇到障碍。
2.安装Apex,这个插件的作用主要用于混合训练。这个没有办法通过pip进行安装,要去这个网站
https://gitcode.net/mirrors/nvidia/apex?utm_source=csdn_github_accelerator
下载apex的代码包,然后放置到本地进行安装。
代码包的内容大概如下
下载之后,进入到该文件夹的主目录,也就是setup.py所在的目录,然后在终端下执行下面的命令
python setup.py install --cuda_ext --cpp_ext
然后耐心等一会儿,如果顺利的话就会看到显示安装成功了。我在安装过程性还比较顺利,一次就过了,没什么问题。
3.安装hiddenlayer
这个库的安装相对比较省事,直接通过pip进行安装即可,包非常小,很容易就安装完成了。
4.下载nnUNet的代码,解压并放到本地,
https://github.com/MIC-DKFZ/nnunet
随后,进入nnunet文件夹下面,激活conda虚拟环境(未使用conda忽略此步骤),然后执行下面的操作
pip install -e .
5.下载需要的数据集
https://drive.google.com/drive/folders/1HqEgzS8BV2c7xYNrZdEAnrHk7osJJ--2
如下,随机选择一个进行下载,我选择的是02进行下载,主要原因是数据集小,目前仅做测试的话完全够用,不然进行数据预处理之后,会占用非常大的空间。
6.首先回到nnUNet代码包,新建一个DATASET文件夹,然后进入到DATASET文件夹,继续创建nnUNet_preprocessed、nnUNet_raw和nnUNet_trained_models三个文件夹,其中第一个用来存放我们的预处理数据,第二个用于存放的是数据集以及crop之后的数据集,第三个用于存放训练的结果
完成上述步骤之后,进入第二个文件夹,然后创建两个文件夹nnUNet_cropped_data和nnUNet_raw_data,其中第一个用于存放crop之后的数据,第二个用于存放原始的数据集数据,刚刚下载的数据集即可解压到此文件夹下,注意名字不要修改,还是Task02_Heart,这其中02表示任务号,这个后面会用到。
7.这一步就是告诉nnUNet,去哪里读取数据,也就是我们刚刚建立的三个文件夹的位置。我以我的情况为例,管理员在服务器中为我创建了一个账户,比如名字就是abc,在/home/abc账户下有一个.basnrc文件,这个是当前账户的环境变量,通过vim编辑器打开此文档,在文件的最后插入下面三句话。
export nnUNet_raw_data_base="/home/abc/PythonWorkSpace/nnunet/DATASET/nnUNet_raw"
export nnUNet_preprocessed="/home/abc/PythonWorkSpace/nnunet/DATASET/nnUNet_preprocessed"
export RESULTS_FOLDER="/home/abc/PythonWorkSpace/nnunet/DATASET/nnUNet_trained_models"
加入之后,关闭文件,然后执行source ./bashrc
在执行完成之后会自动退出conda虚拟环境,此时需要重新登陆一下,也就是conda activate envname(自己虚拟环境的名称)
8.上述都执行完成之后,就是对数据集的操作了,执行下面的语句,对数据集进行处理。
nnUNet_convert_decathlon_task -i /home/abc/nnunet/DATASET/nnUNet_raw/nnUNet_raw_data/Task02_Heart
前面的nnUNet_convert_decathlon_task -i不需要修改,只需要把后面的路径替换为自己的即可。
执行完成之后,你会发现在nnUnet_raw_data下面多了一个目录,名字为Task002_Heart,这时候就表示成功了,然后就可以将原来的Task02_Heart目录删除了,此处注意,如果不删除,一定要将当前目录切换到Task002_Heart里面再执行下面的步骤,否则系统会优先默认去找Task02_Heart路径下的数据文件,导致报错。
9.执行预训练
执行下面的命令,注意2就是下载的数据集中数据集名称中数字的对应的名称,也就是任务号。由于数据集较小,这一步不会执行很长时间,我在服务器上执行了大概一分钟左右就可以了。
nnUNet_plan_and_preprocess -t 2
10.训练
执行下面的命令即可,2前面的命令无需改变,2表示任务号,2后面的4表示使用五折交叉验证的第四折。
nnUNet_train 3d_fullres nnUNetTrainerV2 2 4
运行的结果如下,我是在2080ti的单卡中训练的
训练大概1000个epoch就结束了,时间比较慢,当然,也可以使用预训练模型,直接在下面下载
https://zenodo.org/record/3734294#.Y0UasnZByUn
下面就结束了,至此,nnUNet最终是跑起来了,关于对其改进、如何训练自己的数据集,我会在后面的博客中继续详细的讲述。