【nnUNetv2实践】二、nnUNetv2快速入门-训练验证推理集成一条龙教程

nnUNet是一个自适应的深度学习框架,专为医学图像分割任务设计。以下是关于nnUNet的详细解释和特点:

自适应框架:nnUNet能够根据具体的医学图像分割任务自动调整模型结构、训练参数等,从而避免了繁琐的手工调参过程。
自动化流程:nnUNet包含了从数据预处理到模型训练、验证及测试的全流程自动化工具,大大简化了使用深度学习进行医学图像分割的复杂度。
自适应网络结构调整:根据输入数据集的特点,nnUNet能够自动选择和配置合适的网络深度、宽度等超参数,确保模型在复杂性和性能之间取得平衡。
Patch-Based Training and Inference:nnUNet使用基于patch级别的训练方法,通过滑窗的方式遍历整个图像进行训练。在推理阶段,也采用类似的方法来生成整个图像的分割结果。这种方法对于处理大尺寸图像或有限显存的情况非常有效。
集成学习与交叉验证:nnUNet还采用了交叉验证策略以最大程度利用有限的数据集,并结合集成学习技术来提高模型预测的稳定性和准确性。
此外,nnUNet还提供了丰富的文档和示例,帮助用户更好地了解和使用该框架。要使用nnUNet,用户需要安装Python和相应的深度学习框架,然后按照官方文档提供的步骤进行操作即可。

总的来说,nnUNet是一个功能强大、易于使用的深度学习框架,特别适用于医学图像分割任务。它的自适应特性、自动化流程和先进的训练策略使得用户能够更高效地构建和训练模型,同时获得更好的性能表现。

本文介绍nnunetv2的使用方法,快速学会nnunet的使用。

请确保您已经完成:【nnUNetv2实践】一、nnUNetv2安装

一、准备数据

1、下载数据集

        本文使用MSD挑战赛的Task04_Hippocampus数据集作为测试,该数据集较小,非常适合做学习只用,首先下载Task04_Hippocampus数据集到本地并解压,如下图(我这里把数据集放到了nnUNet_raw里面,可以随意放置,记住路径)。

2、转换数据格式

接下来开始转换数据格式(路径更改为自己的数据集路径):

nnUNetv2_convert_MSD_dataset -i D:\DeepLearning\nnUNet\nnUNet_raw\Task04_Hippocampus

报以下错误说明环境变量未设置,这是因为【nnUNetv2实践】一、nnUNetv2安装中设置的环境变量是临时的:

设置环境变量(路径更改为自己的,我的是windows环境,如果是linux环境可以参考 【nnUNetv2实践】一、nnUNetv2安装):

set nnUNet_raw=D:/DeepLearning/nnUNet/nnUNet_raw
set nnUNet_preprocessed=D:/DeepLearning/nnUNet/nnUNet_preprocessed
set nnUNet_results=D:/DeepLearning/nnUNet/nnUNet_results

设置完成环境变量后重新运行本小结的数据格式转换代码,可以在nnUNet_raw下找到处理后的数据集:

处理后的图片会有0000后缀,如下图:

数据格式转换完成。

3、预处理并生成plan

完成数据格式转换后,使用如下命令进行预处理并生成plan:

nnUNetv2_plan_and_preprocess -d 4 --verify_dataset_integrity

过程如下,生成了2d和3d_fullres的plan,但是没有cascade unet的plan,这是因为这个数据集比较小,不需要生成级联网络:

可以在nnUNet_preprocessed文件夹下查看处理好的数据集:

可以看到该文件夹中有3个json文件,其中的nnUNetPlans.json是网络结构相关的配置文件,可自行查阅。

至此数据准备完成。

二、训练

完成以上步骤准备好数据集之后,就准备训练模型。

注意

1、对于本文的数据集来说nnunet有2d和3d_fullres共两个模型,且nnunet默认使用五折交叉验证的方式训练模型,既对2d和3d_fullres来说,各自训练五次。(对于部分数据集来说,还有3d_lowres, 3d_cascade_fullres模型)

2、本文的数据没有验证集,因为MSD挑战赛都是把测试集结果提交到官网进行评估的。

下面开始训练模型:

首先训练2d模型(4表示数据集编号,最后面的数字0,1,2,3,4表示五折的编号):

nnUNetv2_train 4 2d 0  
nnUNetv2_train 4 2d 1 
nnUNetv2_train 4 2d 2  
nnUNetv2_train 4 2d 3 
nnUNetv2_train 4 2d 4  

然后训练3d_fullres模型:

nnUNetv2_train 4 3d_fullres 0  
nnUNetv2_train 4 3d_fullres 1  
nnUNetv2_train 4 3d_fullres 2  
nnUNetv2_train 4 3d_fullres 3 
nnUNetv2_train 4 3d_fullres 4  

训练好之后,在nnUNet_results文件夹下有了以下内容,分别对应着2d和3d_fullres两个模型的训练结果:

打开2d文件夹,可以看到五折的训练结果:

打开任意一个文件夹,里面有权重和日志以及其他的训练结果:

三、验证并推理

训练好模型之后,可以使用nnunet的自动寻找最优模型的功能。其原理如下:

训练好2d\3d_fullres\3d_lowres\3d_cascade_fullres之后,每个模型都是五折,可以将模型的预测结果相加求平均作为新的预测结果(叫做ensemble),然后得到多个预测结果,选择精度最高的模型作为最终的推理模型。

注意:精度验证时,是把每折的验证集保存下来,5折得到的预测结果和训练集完全一致,直接和训练集一起计算相关指标。

nnunet的原理可以参考:nnunet原理讲解_哔哩哔哩_bilibili

1、验证

由于有ensemble的策略,所有需要模型预测的概率图(属于某个类别的概率,在0到1之间)而不是分割结果(0,1,2。。。),先每折生成npz文件(每个模型都要,本文只有2d和3d_fullres):

nnUNetv2_train 4 2d 0  --val --npz
nnUNetv2_train 4 2d 1  --val --npz
nnUNetv2_train 4 2d 2  --val --npz
nnUNetv2_train 4 2d 3  --val --npz
nnUNetv2_train 4 2d 4  --val --npz
nnUNetv2_train 4 3d_fullres 0  --val --npz
nnUNetv2_train 4 3d_fullres 1  --val --npz
nnUNetv2_train 4 3d_fullres 2  --val --npz
nnUNetv2_train 4 3d_fullres 3  --val --npz
nnUNetv2_train 4 3d_fullres 4  --val --npz

运行以上命令后,nnUNet_results文件夹的每折validation文件夹出现npz文件:

2、推理

nnunet可以自己找寻最优模型并给出推理命令,使用如下命令自动寻优:

nnUNetv2_find_best_configuration 4 -c 2d  3d_fullres -f 0 1 2 3 4

稍等等片刻,出现如下结果,我这里显示ensemble的结果比较好,提示我运行以下的命令(下面所有的命令都参考下图):

首先运行两个推理命令(-i指向的是转换格式后的文件夹目录,既文件名以0000结尾的,-o指向推理结果保存的位置):

nnUNetv2_predict -d Dataset004_Hippocampus -i nnUNet_raw\Dataset004_Hippocampus\imagesTs -o hippocampus_2d_predict -f  0 1 2 3 4 -tr nnUNetTrainer -c 2d -p nnUNetPlans --save_probabilities
nnUNetv2_predict -d Dataset004_Hippocampus -i nnUNet_raw\Dataset004_Hippocampus\imagesTs -o hippocampus_3d_fullres_predict -f  0 1 2 3 4 -tr nnUNetTrainer -c 3d_fullres -p nnUNetPlans --save_probabilities

因为要五折推理,可以看到每个图片推理都进行了5次:

2个模型各自推理完成后,进行ensemble(-i是上面推理的保存路径,-o指向输出的保存位置):

nnUNetv2_ensemble -i hippocampus_2d_predict hippocampus_3d_fullres_predict -o hippocampus_ensemble -np 8

等待运行完成后,进入最后一步:后处理,命令和上面那个图中的一致(-i是ensemble的保存位置,-o指向后处理结果的保存位置):

nnUNetv2_apply_postprocessing -i hippocampus_ensemble -o hippocampus_ensemble_pp -pp_pkl_file D:/DeepLearning/nnUNet/nnUNet_results\Dataset004_Hippocampus\ensembles\ensemble___nnUNetTrainer__nnUNetPlans__2d___nnUNetTrainer__nnUNetPlans__3d_fullres___0_1_2_3_4\postprocessing.pkl -np 8 -plans_json D:/DeepLearning/nnUNet/nnUNet_results\Dataset004_Hippocampus\ensembles\ensemble___nnUNetTrainer__nnUNetPlans__2d___nnUNetTrainer__nnUNetPlans__3d_fullres___0_1_2_3_4\plans.json

至此,完成了Task04_Hippocampus测试集的预测,可以提交到官网验证精度。

nnunet入门教程到此结束,后续可能会出高阶教程,如何修改网络结构和损失函数,如有疑问可私聊解答。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/799869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++流程控制语句:嵌套循环案例分析【九九乘法表】

在C++编程中,循环语句的嵌套是一种常见且强大的技术手段,它允许我们将多个循环结构相互嵌套,形成多维循环。不论是for循环、while循环还是do…while循环,均可以进行嵌套。 而在实践中,由于for循环具有明确的循环变量初始化、条件判断和更新机制,因此在嵌套循环中,for循…

封装单独的树操作栏组件

文章目录 概要整体架构流程 概要 把公共的部分单独拆出来&#xff0c;封装到一个新的vue文件夹中&#xff0c; 里面的数据通过父传子的方式传递&#xff0c;子通过props接受&#xff08;静态代码实现的树状图细看代码展示&#xff09; 整体架构流程 <template><!-- …

C语言第四十一弹---猜数字游戏

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 猜数字游戏 1、随机数生成 1.1、rand 1.2、srand 1.3、time 1.4、设置随机数的范围 2、猜数字游戏的分析和设计 2.1、猜数字游戏功能说明 2.2、猜数字游戏…

如何用Java后端处理JS.XHR请求

Touching searching engine destroies dream to utilize php in tomcat vector.The brave isn’t knocked down&#xff0c;turn its path to java back-end. Java Servlet Bible schematic of interaction between JS front-end and Java back-end Question 如何利用Java…

阿里巴巴Java开发MySQL 数据库 (整理版)

目录 前言 1.MySQL 数据库 1.1 建表规约 1.2 索引规约 1.3 SQL 语句 1.4 ORM 映射 前言 MySQL 数据库使用建议标识依次分为【重要】、【建议】、【参考】,有助于 MySQL 建表、索引、SQL 语句使用。 1.MySQL 数据库 1.1 建表规约 1.【重要】表达是与否概念的字段,必…

想创业在视频号开店,需要哪些条件,一篇详解!

大家好&#xff0c;我是电商糖果 视频号小店是2020年下半年才出现的平台&#xff0c;因为实在过于火爆&#xff0c;今年它就成了电商行业的黑马&#xff0c;吸引了不少商家入驻。 就是因为是新平台&#xff0c;网上关于它开店条件的说明并不多&#xff0c;官网上写的又太杂乱…

[C++][算法基础]最大异或对(Trie树)

在给定的 N 个整数 &#xff0c;...... 中选出两个进行 xor&#xff08;异或&#xff09;运算&#xff0c;得到的结果最大是多少&#xff1f; 输入格式 第一行输入一个整数 N。 第二行输入 N 个整数 ~ 。 输出格式 输出一个整数表示答案。 数据范围 1≤N≤, 0≤< 输…

【数据结构与算法】力扣 19. 删除链表的倒数第 N 个结点

题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a; head [1,2,3,4,5], n 2 输出&#xff1a; [1,2,3,5]示例 2&#xff1a; 输入&#xff1a; head [1], n 1 输出&#xff1a; []示例…

渗透测试漏洞之XSS漏洞

目录 1.1 XSS漏洞原理 1.2 XSS漏洞分类 1.3 XSS漏洞危害 1.4 XSS漏洞的防范 1.5 XSS各类别的区别 1.1 XSS漏洞原理 Cross-site Scripting&#xff0c;简称XSS 原理&#xff1a;就是程序对输入输出没有做合理的过滤限制&#xff0c;导致攻击者构造的字符输出到前端时被浏…

Mamba入局遥感图像分割 | Samba: 首个基于SSM的遥感高分图像语义分割框架

文章目录 1、导读 2、背景 3、动机 4、方法 5、实验 6、总结 标题&#xff1a;《Samba: Semantic Segmentation of Remotely Sensed Images with State Space Model》论文&#xff1a;https://arxiv.org/abs/2404.01705源码&#xff1a;https://github.com/zhuqinfeng1999…

在展会上如何介绍产品和公司,柯桥俄语培训

1.Приглашаем Вас… 邀请您…… 2. Позвольте пригласить Вас… 请允许邀请您…… 3.Имеем честь пригласить Вас … 诚挚邀请您…… 4. Посылаем Вам приглашение на… 给您&#xff0…

Vue - 你知道Vue中key的工作原理吗

难度级别:中级及以上 提问概率:80% 在Vue项目开发中,并不推荐使用索引做为key,以为key必须是唯一的,可以使用服务端下发的唯一ID值,也不推荐使用随机值做为key,因为如果每次渲染都监听到不一样的key,那么节点将无法复用,这与Vue节省…

android gradle版本无法下载

android gradle版本无法下载问题解决方法 在引入一个新的android项目的时候&#xff0c;通常会因为无法下载gradle版本而一直卡在同步界面&#xff0c;类似于下面的情况。 这是因为gradle运行时首先会检查distributionUrlhttps://services.gradle.org/distributions/gradle-5.6…

JavaScript逆向爬虫——无限debugger的原理与绕过

debugger 是 JavaScript 中定义的一个专门用于断点调试的关键字&#xff0c;只要遇到它&#xff0c;JavaScript 的执行便会在此处中断&#xff0c;进入调试模式。 有了 debugger 这个关键字&#xff0c;就可以非常方便地对 JavaScript 代码进行调试&#xff0c;比如使用 JavaSc…

LeetCode-热题100:139. 单词拆分

题目描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 **注意&#xff1a;**不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s “leet…

从MySQL5.7平滑升级到MySQL8.0的最佳实践分享

一、前言 升级需求&#xff1a;将5.7.35升级到8.0.27, 升级方式 in-place升级【关闭现有版本MySQL&#xff0c;将二进制或包替换成新版本并在现有数据目录上启动MySQL并执行升级任务的方式&#xff0c;称为in-place升级】 原版本 5.7.35 CentOS Linux release 7.9.2009 新版本…

OpenHarmony实战开发-多设备自适应能力

介绍 本示例是《一次开发&#xff0c;多端部署》的配套示例代码&#xff0c;展示了页面开发的一多能力&#xff0c;包括自适应布局、响应式布局、典型布局场景以及资源文件使用。 说明&#xff1a; 自适应布局能力仅可以保证在外部容器大小在一定范围内变化时&#xff0c;容…

✌2024/4/3—力扣—整数转罗马数字

代码实现&#xff1a; 方法一&#xff1a;硬编码数字 const char *thousands[] {"", "M", "MM", "MMM"}; const char *hundreds[] {"", "C", "CC", "CCC", "CD", "D",…

STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档)

目录 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 2.2 设计电路规范 3、代码 4、资料清单 资料下载地址&#xff1a;STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档) 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 经过一个星期的画PCB&#xff0c;今…

C++模仿qq界面

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口的大小this->resize(645,497);//设置窗口名字this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:\\zhouzhouMyfile\\qt_proj…