nnUnet 大模型学习笔记(续):训练网络(3d_fullres)以及数据集标签的处理

目录

1. 数据集处理

1.1 实现脚本

1.2 json文件

2. 设置读取路径

2.1 设置路径

2.2 数据集转换

2.3 数据集预处理

2.4 训练(3d_fullres)

3. 训练结果展示


关于nnUnet 数据集的处理和环境搭建,参考上文:第四章:nnUnet大模型之环境配置、数据集制作-CSDN博客

1. 数据集处理

因为上文数据集的标签有很多问题,虽然处理起来很简单,为了防止后续需要,这里记录下

观察上文发现,数据的标签是19类别,但是mask的绘制不是连续的0 1 2 3,这样在图像分割中是

不允许的,需要做灰度映射。

实际上,在做unet一些列多类别分割的时候,已经介绍过自适应的灰度映射,这里只做简单介绍,具体参考下文:Unet 实战分割项目、多尺度训练、多类别分割_unet实例分割-CSDN博客

如果数据没有问题的话,直接跳到第二章即可!!

1.1 实现脚本

如下

import SimpleITK as sitk
import numpy as np
import os
from tqdm import tqdm
import shutil


def main():
    root = 'labelsTr'
    images = [os.path.join(root, u) for u in os.listdir(root)]

    root_ret = 'ret_labelsTr'
    if os.path.exists(root_ret):
        shutil.rmtree(root_ret)
    os.mkdir(root_ret)

    # 计算灰度
    cl = []
    for i in tqdm(images, desc='process'):
        mask = sitk.ReadImage(i)
        mask = sitk.GetArrayFromImage(mask)
        mask = np.unique(mask)
        for h in mask:
            if h not in cl:
                cl.append(h)

    cl.sort()
    n = len(cl)
    print(cl)       # [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
    print('分割的个数:',n)

    if n == cl[n-1]:
        return

    # 灰度映射
    for i in tqdm(images, desc='process'):
        mask = sitk.ReadImage(i)
        mask = sitk.GetArrayFromImage(mask)

        for index,h in enumerate(cl):
            mask[mask==h] = index

        mask = sitk.GetImageFromArray(mask)
        ret_path = i.replace(root,root_ret)
        sitk.WriteImage(mask,ret_path)

    # 检查灰度
    cl_ret = []
    images = [os.path.join(root_ret, u) for u in os.listdir(root_ret)]
    for i in tqdm(images, desc='process'):
        mask = sitk.ReadImage(i)
        mask = sitk.GetArrayFromImage(mask)
        mask = np.unique(mask)
        for h in mask:
            if h not in cl_ret:
                cl_ret.append(h)

    cl_ret.sort()
    n = len(cl_ret)
    print(cl_ret)       # [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
    print('处理后分割的个数:',n)


if __name__ == '__main__':
    main()

摆放如下:脚本会将labelsTr的标签自动映射成0 1 2 3连续的,并且保存在新生成的ret下

运行如下:

可以看到mask的灰度已经进行了映射

通过itk打开,可以发现mask并没有改变,只是里面的数字变了,这样颜色显示也就变了

源标签:

处理完的:

1.2 json文件

更改如下:当然新的json文件可以用上文的脚本生成

{
    "labels": {
        "0": "background",
        "1": "L1",
        "2": "L2",
        "3": "L3",
        "4": "L4",
        "5": "L5",
        "6": "L6",
        "7": "L7",
        "8": "L8",
        "9": "L9",
        "10": "L10",
        "11": "L11",
        "12": "L12",
        "13": "L13",
        "14": "L14",
        "15": "L15",
        "16": "L16",
        "17": "L17",
        "18": "L18"
    },
    "modality": {
        "0": "CT"
    },
    "numTest": 0,
    "numTraining": 40,
    "tensorImageSize": "3D",
    "test": [],
    "training": [
        {
            "image": "./imagesTr/spine_001.nii.gz",
            "label": "./labelsTr/spine_001.nii.gz"
        },
        {
            "image": "./imagesTr/spine_002.nii.gz",
            "label": "./labelsTr/spine_002.nii.gz"
        },
        {
            "image": "./imagesTr/spine_003.nii.gz",
            "label": "./labelsTr/spine_003.nii.gz"
        },
        {
            "image": "./imagesTr/spine_004.nii.gz",
            "label": "./labelsTr/spine_004.nii.gz"
        },
        {
            "image": "./imagesTr/spine_005.nii.gz",
            "label": "./labelsTr/spine_005.nii.gz"
        },
        {
            "image": "./imagesTr/spine_006.nii.gz",
            "label": "./labelsTr/spine_006.nii.gz"
        },
        {
            "image": "./imagesTr/spine_007.nii.gz",
            "label": "./labelsTr/spine_007.nii.gz"
        },
        {
            "image": "./imagesTr/spine_008.nii.gz",
            "label": "./labelsTr/spine_008.nii.gz"
        },
        {
            "image": "./imagesTr/spine_009.nii.gz",
            "label": "./labelsTr/spine_009.nii.gz"
        },
        {
            "image": "./imagesTr/spine_010.nii.gz",
            "label": "./labelsTr/spine_010.nii.gz"
        },
        {
            "image": "./imagesTr/spine_011.nii.gz",
            "label": "./labelsTr/spine_011.nii.gz"
        },
        {
            "image": "./imagesTr/spine_012.nii.gz",
            "label": "./labelsTr/spine_012.nii.gz"
        },
        {
            "image": "./imagesTr/spine_013.nii.gz",
            "label": "./labelsTr/spine_013.nii.gz"
        },
        {
            "image": "./imagesTr/spine_014.nii.gz",
            "label": "./labelsTr/spine_014.nii.gz"
        },
        {
            "image": "./imagesTr/spine_015.nii.gz",
            "label": "./labelsTr/spine_015.nii.gz"
        },
        {
            "image": "./imagesTr/spine_016.nii.gz",
            "label": "./labelsTr/spine_016.nii.gz"
        },
        {
            "image": "./imagesTr/spine_017.nii.gz",
            "label": "./labelsTr/spine_017.nii.gz"
        },
        {
            "image": "./imagesTr/spine_018.nii.gz",
            "label": "./labelsTr/spine_018.nii.gz"
        },
        {
            "image": "./imagesTr/spine_019.nii.gz",
            "label": "./labelsTr/spine_019.nii.gz"
        },
        {
            "image": "./imagesTr/spine_020.nii.gz",
            "label": "./labelsTr/spine_020.nii.gz"
        },
        {
            "image": "./imagesTr/spine_021.nii.gz",
            "label": "./labelsTr/spine_021.nii.gz"
        },
        {
            "image": "./imagesTr/spine_022.nii.gz",
            "label": "./labelsTr/spine_022.nii.gz"
        },
        {
            "image": "./imagesTr/spine_023.nii.gz",
            "label": "./labelsTr/spine_023.nii.gz"
        },
        {
            "image": "./imagesTr/spine_024.nii.gz",
            "label": "./labelsTr/spine_024.nii.gz"
        },
        {
            "image": "./imagesTr/spine_025.nii.gz",
            "label": "./labelsTr/spine_025.nii.gz"
        },
        {
            "image": "./imagesTr/spine_026.nii.gz",
            "label": "./labelsTr/spine_026.nii.gz"
        },
        {
            "image": "./imagesTr/spine_027.nii.gz",
            "label": "./labelsTr/spine_027.nii.gz"
        },
        {
            "image": "./imagesTr/spine_028.nii.gz",
            "label": "./labelsTr/spine_028.nii.gz"
        },
        {
            "image": "./imagesTr/spine_029.nii.gz",
            "label": "./labelsTr/spine_029.nii.gz"
        },
        {
            "image": "./imagesTr/spine_030.nii.gz",
            "label": "./labelsTr/spine_030.nii.gz"
        },
        {
            "image": "./imagesTr/spine_031.nii.gz",
            "label": "./labelsTr/spine_031.nii.gz"
        },
        {
            "image": "./imagesTr/spine_032.nii.gz",
            "label": "./labelsTr/spine_032.nii.gz"
        },
        {
            "image": "./imagesTr/spine_033.nii.gz",
            "label": "./labelsTr/spine_033.nii.gz"
        },
        {
            "image": "./imagesTr/spine_034.nii.gz",
            "label": "./labelsTr/spine_034.nii.gz"
        },
        {
            "image": "./imagesTr/spine_035.nii.gz",
            "label": "./labelsTr/spine_035.nii.gz"
        },
        {
            "image": "./imagesTr/spine_036.nii.gz",
            "label": "./labelsTr/spine_036.nii.gz"
        },
        {
            "image": "./imagesTr/spine_037.nii.gz",
            "label": "./labelsTr/spine_037.nii.gz"
        },
        {
            "image": "./imagesTr/spine_038.nii.gz",
            "label": "./labelsTr/spine_038.nii.gz"
        },
        {
            "image": "./imagesTr/spine_039.nii.gz",
            "label": "./labelsTr/spine_039.nii.gz"
        },
        {
            "image": "./imagesTr/spine_040.nii.gz",
            "label": "./labelsTr/spine_040.nii.gz"
        }
    ]
}

2. 设置读取路径

回到正文,这里的Task下有如下数据,source nnunet/bin/activate 激活nnunet环境

Tips:这里的 labelsTr和dataset.json是第一节处理后的

任务名称为Task01_Spine

2.1 设置路径

这里设置为绝对路径,除了DATASET后面的,前面部分需要根据不同机器设定

在这里更改 vim .bashrc(vim ~/.bashrc 末尾最后面)

export nnUNet_raw_data_base="/*/DATASET/nnUNet_raw"
export nnUNet_preprocessed="/*/DATASET/nnUNet_preprocessed"
export RESULTS_FOLDER="/*/DATASET/nnUNet_trained_models"

这里设置后,如果想要训练其他模型,不需要在进行更改

添加完成后保存, source ~/.bashrc 更新环境变量,可以通过echo $RESULTS_FOLDER 检查是否修改成功

2.2 数据集转换

下面命令都是在environments 目录里进行操作

转换命令为

nnUNet_convert_decathlon_task -i DATASET/nnUNet_raw/nnUNet_raw_data/Task01_Spine/

转换完的数据在:

图像可能具有多种模态,nnU-Net通过其后缀(文件名末尾的四位整数)识别成像模态。因此,图像文件必须遵循以下命名约定:case_identifier_XXXX.nii.gz。

这里,XXXX是模态标识符。dataset.json文件中指定了这些标识符所属的模态。

标签文件保存为case_identifier.nii.gz

例如:BrainTumor。每个图像有四种模态:FLAIR(0000)、T1w(0001)、T1gd(0002)和T2w(0003)

2.3 数据集预处理

命令如下:(这里只会做训练集进行预处理,测试集不会处理

nnUNet_plan_and_preprocess -t 1

只需要一行命令,因为 Task_id是1,所以这里的数字就是1。这个过程会消耗很多的时间,速度慢的原因在于对要进行插值等各种操作。

生成的数据在crop和precocessed里面查看

2.4 训练(3d_fullres)

命令如下

nnUNet_train 3d_fullres nnUNetTrainerV2 1 0

1 指的是Task标号,5 指定训练的是5倍交叉验证的哪一倍。

会实时生成如下结果:在这里 nnUNet_trained_models

3. 训练结果展示

RTX 3090跑一个epoch大概100s,1000个epoch估计要一两天,等跑完下篇文章在贴训练结果吧

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

94、Python之异常:自定义异常以满足业务个性化需求

引言 前面介绍了Python中内置的异常类的继承体系,通常来说,这些异常类已经能够满足各种异常的场景需要。但是,有时还是需要自定义异常,来满足一些个性化的需求,以及更加可控、精细化的异常管理。 本文就来介绍一下如…

使用InternVL、LMDeploy和GTE搭建多模态RAG系统

如何将视觉大模型(VLM)与 多模态RAG 结合起来,创建服装搜索和搭配推荐!本文展示了InternVL模型在分析服装图像和提取颜色、款式和类型等关键特征方面的强大功能。 InternVL2是国内首个在MMMU(多学科问答)上突破60的模型&#xff0…

MT-Pref数据集:包含18种语言的18k实例,涵盖多个领域。实验表明它能有效提升Tower模型在WMT23和FLORES基准测试中的翻译质量。

2024-10-10,由电信研究所、里斯本大学等联合创建MT-Pref数据集,它包含18种语言方向的18k实例,覆盖了2022年后的多个领域文本。通过在WMT23和FLORES基准测试上的实验,我们展示了使用MT-Pref数据集对Tower模型进行对齐可以显著提高翻…

【云从】十、常见安全问题与云计算的计费模式

文章目录 1、常见安全问题1.1 DDoS攻击1.2 病毒攻击1.3 木马攻击1.4 代码自身漏洞 2、安全体系3、云计算的计费模式4、常见云产品的计费方案5、云产品计费案例 1、常见安全问题 1.1 DDoS攻击 通过分布在各地的大量终端,同时向目标发送恶意报包,以占满目…

【C++贪心】1536. 排布二进制网格的最少交换次数|1880

本文涉及知识点 C贪心 决策包容性 LeetCode1536. 排布二进制网格的最少交换次数 给你一个 n x n 的二进制网格 grid,每一次操作中,你可以选择网格的 相邻两行 进行交换。 一个符合要求的网格需要满足主对角线以上的格子全部都是 0 。 请你返回使网格满…

精通CSS布局:探索经典的网页布局样式和技术

一、经典两列布局样式 1.概念 许多网站有一些特点,如页面顶部放置一个大的导航或广告条,右侧是链接或图片,左侧放置主要内容,页面底部放置版权信息等。 一般情况下,页面布局的两列都有固定宽度,而且从内容…

7.hyperf安装【Docker】

- 前言:为了与容器中的mysql通信,先运行mysql,再使用 --link关联 一、 拉取 php版本为8.2的版本 8.3的版本,启动框架时,报错。 docker pull hyperf/hyperf:8.2-alpine-vedge-swoole-slim二、 运行hyperf环境容器 --l…

分布式理论基础

文章目录 1、理论基础2、CAP定理1_一致性2_可用性3_分区容错性4_总结 3、BASE理论1_Basically Available(基本可用)2_Soft State(软状态)3_Eventually Consistent(最终一致性)4_总结 1、理论基础 在计算机…

解决k8s集群中安装ks3.4.1开启日志失败问题

问题 安装kubesphere v3.4.1时,开启了日志功能,部署时有三个pod报错了 Failed to pull image “busybox:latest”: rpc error: code Unknown desc failed to pull and unpack image “docker.io/library/busybox:latest”: failed to copy: httpRead…

Java项目-基于springboot框架的学习选课系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…

【Petri网导论学习笔记】Petri网导论入门学习(八) —— 1.6 系统的Petri网模型

导航 1.6 系统的Petri网模型例 1.6 化学反应例 1.7 进程的通信协议例 1.8 P/V操作例 1.9 临界段互斥问题例 1.10 生产者/消费者问题例 1.11 哲学家就餐问题 1.6 系统的Petri网模型 理论的目的在于应用,接下来是一些关于用Petri网标识离散事件系统的例子 这里就直接…

C++ 游戏开发:从基础到进阶

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【鸡翅Club】项目启动

一、项目背景 这是一个 C端的社区项目,有博客、交流,面试学习,练题等模块。 项目的背景主要是我们想要通过面试题的分类,难度,打标,来评估员工的技术能力。同时在我们公司招聘季的时候,极大的…

平衡相图在矿物加工中的广泛应用,含材料设计、性能预测等

平衡相图是描述在特定温度和压力下,不同相(如固体、液体、气体等)之间平衡关系的图表。在矿物加工领域,通过分析相图可以详细了解不同成分的矿物在特定温度和压力条件下的相变行为,从而设计出更高效的提取和分离方法&a…

EasyExcel自定义下拉注解的三种实现方式

文章目录 一、简介二、关键组件1、ExcelSelected注解2、ExcelDynamicSelect接口(仅用于方式二)3、ExcelSelectedResolve类4、SelectedSheetWriteHandler类 三、实际应用总结 一、简介 在使用EasyExcel设置下拉数据时,每次都要创建一个SheetWr…

文件误删并清空回收站:全面解析与高效恢复策略

一、文件误删并清空回收站的遭遇 在日常使用电脑或移动设备的过程中,我们难免会遇到一些令人懊恼的数据丢失问题,其中文件误删并清空回收站便是最为常见的一种。当你不小心删除了某个重要文件,并且随后又毫不留情地清空了回收站,…

flutter camera 插件相机不占满屏幕的问题

当 CameraPreview 超出屏幕范围时,可以通过以下几种方法来处理超出部分被裁剪的问题: 使用 FittedBox:FittedBox 可以自动调整子组件的大小和比例,使其适应父容器。使用 BoxFit 属性:在 FittedBox 中使用不同的 BoxFi…

Rust初踩坑

一、下载 到官网https://www.rust-lang.org/zh-CN/tools/install下载你需要的版本 二、安装 执行rustup-init 文件,选择1 按提示直到安装完成 可以通过以下命令测试: rustc -V # 注意的大写的 V cargo -V # 注意的大写的 V三、在VScode中…

python + mitmproxy 爬手机app (1)

起因, 目的: 想爬手机上某鱼。 mitmproxy 简介: 一句话: mitmproxy 就是中间人攻击. (只不过, 你安装,就代表你愿意承担风险。)源码:https://github.com/mitmproxy/mitmproxy文档: https://mitmproxy.org/ 安装过程: 见聊天记…

【Vue】Vue3.0(十五)Vue 3.0 中 hooks 的概念

🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间:2024年10月22日21点50分 背景:在一些情况下,前台的组件是可以复用的,那这些复用的对象和数据,为…