全网都在用的nnUNet V2版本改进了啥,怎么安装?(一)
nnUNet,这个医学领域的分割巨无霸!在论文和比赛中随处可见他的身影。大家对于nnUNet v1版本的教程都赞不绝口,因为它简单易懂、详细全面,让很多朋友都轻松掌握了使用方法。
最近,我也抽出时间仔细研究了nnUNet v2,并全程走过一遍流程。我努力将使用教程变得更加通俗易懂,希望能提高大家的学习效率。如果你正在进行分割任务,或者还没有尝试过nnUNet v2,那么现在是时候跟着我一起学习啦!
我们将一步步解析nnUNet v2的改进之处和操作步骤,用简洁明快的语言让你轻松理解。无论你是医学专业背景还是计算机科学领域的新手,都能够轻松上手,掌握这个强大的工具。
内容稍长,我把它分为三个章节,拆解难点
- nnUNet v2的不同之处,安装以及环境变量设置(这次内容)
- nnUNet v2的数据准备(下一篇)
- nnUNet v2的训练及推理(下下篇)
nnUNet v2版本与V1版有什么不同?
-
支持层次标签 ‘hierarchical labels’(在nnUNet中称为 ‘regions’)。例如,在 BraTS 这个数据集中,给定的 label 是“水肿”、“坏死”和“增强肿瘤”。但是对于临床应用而言,他们关注的不是这三个 label,而是整个肿瘤、肿瘤核心和增强肿瘤。 那么,这里的整个肿瘤就是 水肿+坏死+增强肿瘤; 肿瘤核心是 坏死+增强肿瘤。如果想按临床的这个进行分割,他的 label 是有重叠的。如下图:

适用于某些有重叠任务的分割,具体详见 github -
支持跨平台, Cuda, mps (Apple M1/M2) and CPU
-
支持更多的输入/输出数据格式。
-
通过基于
BaseReaderWriter实现新的适配器,可以扩展I/O格式。 -
nnUNet_raw_cropped文件夹不再存在,这样可以节省磁盘空间,而且没有性能损失 -
在解压缩时,预处理数据和分割结果存储在不同的文件中。分割结果以int8的格式存储,因此每个像素占用的磁盘空间(和I/O吞吐量)只有v1版本的四分之一。
-
原生支持多GPU(DDP)训练。但是,多GPU推断仍然需要使用
CUDA_VISIBLE_DEVICES=X nnUNetv2_predict [...] -num_parts Y -part_id X来运行。在推断过程中,没有跨GPU的通信,所以增加DDP会增加额外的复杂性是没有意义的。 -
所有nnU-Net的功能现在也可以通过API进行访问。请查看
setup.py中对应的入口点,以了解需要调用哪些函数。 -
数据集指纹现在明确地创建并保存在一个json文件中(参见nnUNet_preprocessed文件夹)。
其实大改动不多,如果你只是一个初级用户,很多改进功能根本用不到。
如何安装
虽然 官方说 nnunet 的两个版本可以同时使用,但我还是建议将两个版本分开,放在不同的虚拟环境中。
安装需求
- 操作系统:nnU-Net 已在 Linux(Ubuntu 18.04、20.04、22.04;centOS、RHEL)、Windows 和 MacOS 上进行了测试!它应该开箱即用!
- 硬件要求:GPU(推荐)、CPU 和 Apple M1/M2 作为设备(目前 Apple mps 不实现 3D 卷积,因此您可能必须在这些设备上使用 CPU)。
- Python 3.9 或更高版本
在第一版本中,nnunet v1 安装教程介绍了如何在虚拟环境中安装 nnUNet, 但是略显复杂。这一次直接用 conda 安装
安装步骤
- 首先新建一个 conda 环境,命名为 nnunet2(名字由你决定)
conda create -n nnunet2 python==3.9
- 激活该环境,并安装 nnunetv2
conda activate nnunet2
pip install nnunetv2
设置环境变量/路径
nnU-Net 依靠环境变量来了解原始数据、预处理数据和训练模型权重的存储位置。要使用 nnU-Net 的完整功能,必须设置以下三个环境变量:
V1,v2 版本中路径有所不同。如果你已经装了 V1 版本,那么 V2 版本的路径最好和 V1不同,以防打架。
具体地,V2 应该包含以下三个路径:
-
nnUNet_raw:这是放置原始数据集的地方。该文件夹将为每个数据集名称创建一个子文件夹
DatasetXXX_YYY,其中 XXX 是 3 位标识符(例如 001、002、043、999…),YYY 是(唯一)
数据集名称。数据集必须采用 nnU-Net 格式树结构示例:
nnUNet_raw/Dataset001_NAME1 ├── dataset.json ├── imagesTr │ ├── ... ├── imagesTs │ ├── ... └── labelsTr├── ... nnUNet_raw/Dataset002_NAME2 ├── dataset.json ├── imagesTr │ ├── ... ├── imagesTs │ ├── ... └── labelsTr├── ... -
nnUNet_preprocessed:这是保存预处理数据的文件夹。数据也将从中读取
训练期间使用此文件夹。重要的是,该文件夹位于访问延迟低且高的驱动器上
吞吐量 -
nnUNet_results:指定 nnU-Net 保存模型权重的位置。如果下载了预训练模型,则此
就是保存他们的地方。
V1 版本的路径设置见之前的文章:给出了永久设置环境变量的方法
nnU-Net v1 如何安装–傻瓜式安装教程
注意:如果设置永久变量的话,V1和V2版本都安装了的话,其实有一个文件夹命名是相同的(nnUNet_preprocessed),那你调用的时候就分不清 V1和V2的文件夹了。
这里,再给一种更方便的临时路径设置办法
- step1: 创建一个 setPath.sh 文件,里面包含如下内容,
#!/bin/bashexport nnUNet_raw="/media/nunet2_folder/nnUNet_raw"
export nnUNet_preprocessed="/media/nnunet2_folder/nnUNet_preprocessed"
export nnUNet_results="/media/nnunet2_folder/nnUNet_results"
tips:怎么创建一个setPath.sh文件
要创建一个名为"setPath.sh"的文件,你可以按照以下步骤进行操作:
-
打开一个文本编辑器,例如记事本或者终端上的文本编辑器。
-
创建一个新的空白文件。
-
在文件中输入上述内容
-
保存并关闭文件。
当然,前提是,你要手动创建这个三个文件夹,再把地址告诉环境变量
- step2: 每次运行 nnunetv2 之前运行一下此文件
source setPath.sh
- step3: 检验是否起效
echo $nnUNet_results
如果返回的是我们设置的地址,则起效
V1和V2路径对比如下

好了,炼丹炉已就位。带上你的数据,下一篇进行数据预处理。

文章持续更新,可以关注微信公众号【医学图像人工智能实战营】获取最新动态,一个关注于医学图像处理领域前沿科技的公众号。坚持已实践为主,手把手带你做项目,打比赛,写论文。凡原创文章皆提供理论讲解,实验代码,实验数据。只有实践才能成长的更快,关注我们,一起学习进步~
我是Tina, 我们下篇博客见~
白天工作晚上写文,呕心沥血
觉得写的不错的话最后,求点赞,评论,收藏。或者一键三连

相关文章:
全网都在用的nnUNet V2版本改进了啥,怎么安装?(一)
nnUNet,这个医学领域的分割巨无霸!在论文和比赛中随处可见他的身影。大家对于nnUNet v1版本的教程都赞不绝口,因为它简单易懂、详细全面,让很多朋友都轻松掌握了使用方法。 最近,我也抽出时间仔细研究了nnUNet v2,并全…...
iOS开发Swift-4-IBAction,group,音乐播放器-木琴App
1.使用素材创建木琴App的UI。 2.连接IBAction。 其余按钮直接拖拽到play里边。 当鼠标置于1处时2处显示如图,表示成功。当用户按下任一按钮都会触发play中的内容。 3.将7个按钮的View中的Tag值分别调为1、2、3、4、5、6、7. 4.将音频文件拖入项目文件中。 Create gr…...
【linux】pid 文件的作用ing
文章目录 一. pid文件简介1. pid 文件是什么2. 作用 二. pid文件的使用 一. pid文件简介 1. pid 文件是什么 打开系统(Linux) 的 “/var/run/” 目录可以看到有很多已 “.pid” 为结尾的文件,只有一行,它记录的是相应进程的 pid,即进程号。…...
K8s简介之什么是K8s
目录 1.概述 2.什么是容器引擎? 3.什么是容器 4.什么是容器编排? 5.容器编排工具 6.到底什么是K8s? 7.为什么市场推荐K8s 8.K8s架构 9.K8s组件 Pods API 服务器 调度器 控制器管理器 Etcd 节点 Kubelet Kube代理 Kubectl 1.概述 Kub…...
说说Flink双流join
分析&回答 Flink双流JOIN主要分为两大类 一类是基于原生State的Connect算子操作另一类是基于窗口的JOIN操作。其中基于窗口的JOIN可细分为window join和interval join两种。 基于原生State的Connect算子操作 实现原理:底层原理依赖Flink的State状态存储&…...
I2C与I3C的对比
I2C与I3C的对比 电气特性 I2C 1.半双工 2.串行数据线(SDA)和串行时钟线(SCL) 3.数据线漏极开路,即I2C接口接上拉电阻 4.I2C总线运行速度:**标准模式100kbit/s,快速模式400kbit/s,快速模式plus 1Mbit/s,**高速模式…...
睿趣科技:抖音开小店大概多久可以做起来
随着移动互联网的快速发展,社交媒体平台成为了人们分享生活、交流信息的主要渠道之一。在众多社交平台中,抖音以其独特的短视频形式和强大的用户粘性受到了广泛关注。近年来,越来越多的人通过在抖音上开设小店来实现创业梦想,这种…...
CCF-CSP 26次 第三题【角色授权】
计算机软件能力认证考试系统 20分: #include<bits/stdc.h> using namespace std; const int N440; int n,m,q,nv,no,nn,ns,ng; struct Node {string name;map<string,int>op;map<string,int>res_kind;map<string,int>res_name; }role[N];…...
Ansible学习笔记11
Command和Shell模块: 两个模块都是用于执行Linux命令的,这个对于命令熟悉的工程师来说,用起来非常high。 Shell模块跟Command模块差不多(Command模块不能执行一类$HOME、> 、<、| 等符号,但是Shell是可以的。&…...
Vue中如何为Echarts统计图设置数据
在前端界面接收后端数据后,将数据赋值给ECharts中的data时出现了,数据读取失败的问题(可能是由于数据渲染的前后顺序问题)。后通过如下方式进行了解决: 1、接下来将介绍UserController中的countUsers方法,…...
力扣141. 环形链表
141. 环形链表 简单 2K 相关企业 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链…...
4.1 链式栈StackT
C关键词:内部类/模板类/头插 C自学精简教程 目录(必读) C数据结构与算法实现(目录) 栈的内存结构 空栈: 有一个元素的栈: 多个元素的栈: 成员函数说明 0 clear 清空栈 clear 函数负责将栈的对内存释放…...
算法练习(10):牛客在线编程10 贪心算法
package jz.bm;import java.util.ArrayList; import java.util.Arrays;public class bm10 {/*** BM95 分糖果问题*/public int candy (int[] arr) {int res 0;int n arr.length;int[] nums new int[n];//每个人都分配一个糖果for (int i 0; i < n; i) {nums[i] 1;}//从…...
Java8新特性1——函数式接口lambda表达式
Java8新特性1——函数式接口&lambda表达式 注:以下内容基于Java 8,所有代码都已在Java 8环境下测试通过 目录: Java8新特性1——函数式接口&lambda表达式方法引用Stream 1. 函数式接口 如果在一个接口中,有且只有一个抽…...
文本标注技术方案(NLP标注工具)
Doccano doccano 是一个面向人类的开源文本注释工具。它为文本分类、序列标记和序列到序列任务提供注释功能。您可以创建用于情感分析、命名实体识别、文本摘要等的标记数据。只需创建一个项目,上传数据,然后开始注释。您可以在数小时内构建数据集。 支持…...
03-使用一个不可变对象作为key,红黑树怎么比较大小?
使用一个不可变对象作为key,红黑树怎么比较大小? 答:Java 中的红黑树是通过左旋、右旋的方式来维护树的平衡性,而左旋、右旋又依赖于节点大小的比较。对于使用不可变对象作为key实际上是可以的,因为比较key的大小本身…...
2021江苏省赛热身赛 C Magic Rabbit(数形结合)
2021江苏省赛热身赛 C Magic Rabbit(数形结合) Magic Rabbit 非常好且巧妙地一道题。 大意:给出三种溶液 , 三种溶液分别含有不同浓度的 x ,y 两种物质。 溶液x (mg/ml)y (mg/ml)溶液1x1y1溶液2x2y2溶液3x3y3 给出 Q 组询问 ,…...
AES加密(2):AES代码实现解析
在我的上一篇文章AES基础知识和计算过程中,大概介绍了AES(Rijndael)加密的整个过程。那么在这一篇文章中,就来看一下AES在代码中是如何实现的,也有助于我们理解其中的一些细节。 本篇文章所用的AES代码来源于Szymon Stefanek的开源C代码 文章…...
SpringBoot项目通过分词器生成词云
目录 前言一、词云是什么?二、使用步骤1.引入依赖2.application.yml3.Controller4.分词工具类4.词云生成工具类、支持输出文件和字节流 注意 前言 公司项目涉及到员工任务管理,需要从员工任务中获取任务信息生成个人词云图,可以把员工任务中…...
Nacos 配置管理及相关使用
文章目录 Nacos 配置管理一、统一配置管理1、在Nacos 中添加配置文件2、从微服务拉取配置3、配置实现步骤(1)引入 nacos-config 依赖(2)添加 bootstrap.yml(4)在 nacos 中添加配置 二、配置热更新1、配置热…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
