当前位置: 首页 > news >正文

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割1(综述篇)

在上一个关于3D 目标的任务,是基于普通CNN网络的3D分类任务。在这个任务中,分类数据采用的是CT结节的LIDC-IDRI数据集,其中对结节的良恶性、毛刺、分叶征等等特征进行了各自的等级分类。感兴趣的可以直接点击下方的链接,直达学习:

  1. 【3D图像分类】基于Pytorch的3D立体图像分类1(基础篇)
  2. 【3D图像分类】基于Pytorch的3D立体图像分类2(数据增强篇)

在开始本次关于3D 目标的分割任务前呢,我还是建议先去看看上述较为简单的分类任务,毕竟大多数是相似的,有很高的借鉴意义。

一、导言

准备一个训练,需要下面这些内容组成:

  1. 准备数据
  2. 准备网络
  3. 搭建训练主模型
    • train one epoch
    • valid one epoch
    • 存储模型
    • 存储指标
  4. loss 函数
  5. dice coeff 评估指标
  6. optimizer优化方式

其中,在本项目中:

  1. 网络采用vnet 3d模型
  2. 数据采用patch裁剪大小
  3. loss函数未dice loss
  4. 评价指标是dice coeff
  5. optimizer优化方式是SGD

二、搭建主结构

训练的主体结构(骨架),总数包括几个部分:

  1. config:可调参数定义,包括数据路径、图像大小、类别数量、学习率、batch size等等;
  2. main:主函数,包括:
    • 构建模型
    • 构建数据
    • 优化器
    • 学习率变化方式
    • 损失函数
    • 评估指标
    • 训练batch循环
    • 验证batch循环
  3. 后处理:包括模型参数存储,指标走势绘图等等。

上面这些个内容,基本上是囊括了深度学习模型训练的整体结构了,后面的工作就是对每一部分进行补充。就犹如已经有了骨架,后续就是补充肉身了。

后面给出的这个pytorch骨架案例,也是后面再构建训练任务,一个可以参考的依据,可收藏。

2.1、导入库和配置参数

import os
import matplotlib.pyplot as plt
import torch.utils.data
import torch.optim as optimfrom datasets.datasets import myDatasetos.environ["CUDA_VISIBLE_DEVICES"] = "0, 1, 2, 3"  # 使用gpu0
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")  # 没gpu就用cpu
print(DEVICE)############################################################
# Configuration
############################################################
class Configuration(object):train_path = r"./database/sk_output/train"valid_path = r"./database/sk_output/valid"model_path = r'./checkpoints'Crop_Size = (48, 96, 96)num_outs = 2Batch_Train = 32Batch_Test = 16Max_epoch = 220Num_Workers = 8Dice_Best = 0LR = 0.0003momentum = 0.99weight_decay = 1e-8def display(self):"""Display Configuration values."""print("\nConfigurations:")print("")for a in dir(self):if not a.startswith("__") and not callable(getattr(self, a)):print("{:30} {}".format(a, getattr(self, a)))print("\n")

2.2、构建main主函数

def main():Config = Configuration()Config.display()train_loader, valid_loader = get_Dataloader(Config)model = get_model(Config).to(DEVICE)# ---- OPTIMIZER ----optimizer = optim.SGD(model.parameters(), lr=Config.LR, momentum=Config.momentum, weight_decay=Config.weight_decay)train_loss_list = []  # 用来记录训练损失valid_loss_list = []  # 用来记录验证损失valid_dice_list = []epoch_list = []for epoch in range(1, Config.Max_epoch + 1):epoch_list.append(epoch)train_loss = train_model(model, DEVICE, train_loader, optimizer, epoch)  # 训练valid_loss, valid_dice = valid_model(model, DEVICE, valid_loader, epoch)  # 验证train_loss_list.append(train_loss)valid_loss_list.append(valid_loss)valid_dice_list.append(valid_dice)draw_plot(epoch_list, valid_dice_list, 'valid_dice')draw_plot(epoch_list, valid_loss_list, 'valid_loss')draw_plot(epoch_list, train_loss_list, 'train_loss')if valid_dice > Config.Dice_Best:path_ckpt = os.path.join(Config.model_path, 'best_model.pth')save_model(path_ckpt, model)Config.Dice_Best = valid_diceelse:path_ckpt = os.path.join(Config.model_path, 'last_model.pth')save_model(path_ckpt, model)print('best val Dice is ', Config.Dice_Best)if __name__ == '__main__':main()

2.3、构建获取模型和数据的函数

def get_model(config):from models.vnet3d import VNet3Dmodel = VNet3D(num_outs=config.num_outs, channels=16)model = model.to(DEVICE)  # 模型部署到gpu或cpu里model = torch.nn.DataParallel(model).to(DEVICE)return modeldef get_Dataloader(config):# get train datadataset_train = myDataset(config.train_path, config.Crop_Size, isTrain=True)print(len(dataset_train))train_loader = torch.utils.data.DataLoader(dataset_train,batch_size=config.Batch_Train, shuffle=True,num_workers=config.Num_Workers, drop_last=False)# get valid datadataset_valid = myDataset(config.valid_path, config.Crop_Size, isTrain=False)valid_loader = torch.utils.data.DataLoader(dataset_valid,batch_size=config.Batch_Test, shuffle=False,num_workers=config.Num_Workers, drop_last=False)return train_loader, valid_loader

2.4、构建训练循环和验证循环

def train_model(model, device, train_loader, optimizer, epoch):config = Configuration()model.train()for batch_index, (data, target) in enumerate(train_loader):  # 取batch索引,(data,target),也就是图和标签data, target = data.to(device), target.to(device)output = model(data)loss = Loss(output, target)optimizer.zero_grad()  # 梯度归零loss.backward()  # 反向传播optimizer.step()  # 优化器走一步return losses.avg  # 返回平均损失,损失列表def valid_model(model, device, test_loader, epoch):config = Configuration()model.eval()with torch.no_grad():  # 不进行 梯度计算(反向传播)for batch_index, (data, target) in enumerate(test_loader):  # 枚举batch索引,(图,标签)data, target = data.to(device), target.to(device)output = model(data)loss = Loss(output, target)  # 计算损失return losses.avg, multi_dices.avg

2.5、后处理

保存模型的参数,和绘制训练过程中train loss、valid loss,以及valid dice走势图,如下:

def draw_plot(x_list, y_list, title_name):plt.plot(x_list, y_list, label=title_name)plt.xlabel('x', fontsize=15)plt.ylabel('y', fontsize=15)plt.title(title_name, fontsize=15)plt.savefig('./logs/cure.png')def save_model(path, model):if isinstance(model, torch.nn.DataParallel):state_dict = model.module.state_dict()else:state_dict = model.state_dict()torch.save(state_dict, path)

至此,每一个模块都有了对应的归宿,后面就是如何将缺漏的地方,补全过程了。反倒是这部分的代码相对较少,两大需要单独验证的数据和模型是大头,其他就好办了。

三、总结

本文是关于PytorchVNet 3D 图像分割的第一篇,也就是一个综述篇,主要是对这个项目的任务目的,以及其中的一个流程进行了梳理。

上述的骨干代码还不能够作为训练使用,还需要补充进去骨肉,才能够适应不同的任务,这一块的内容将会在后面的几个篇章中,一一陈述。

如果你也在做类似的事情,欢迎点赞、收藏,mark住。对于这部分的内容可以一起交流,欢迎多多评论。

相关文章:

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割1(综述篇)

在上一个关于3D 目标的任务,是基于普通CNN网络的3D分类任务。在这个任务中,分类数据采用的是CT结节的LIDC-IDRI数据集,其中对结节的良恶性、毛刺、分叶征等等特征进行了各自的等级分类。感兴趣的可以直接点击下方的链接,直达学习&…...

css之Flex弹性布局

文章目录 🐕前言:🏨定义flex容器 display:flex🏨在flex容器中子组件进行排列🪂行排列 flex-direction: row🪂将行排列进行翻转排列 flex-direction: row-reverse🏅按列排列 flex-direction: col…...

web.xml配置详解

在Java Web应用程序中,web.xml是一个XML配置文件,用于定义和配置Servlet、过滤器、监听器和其他Web应用程序组件的行为和属性。web.xml文件通常位于Web应用程序的WEB-INF目录下,用于描述Web应用程序的部署信息和配置。以下是一些web.xml配置的…...

关于我学习Go语言在CSDN分享的心得体会

最近我一直在学习Go语言,并通过CSDN平台分享我的学习心得和体会。在这篇博客中,我将与大家分享我在学习Go语言过程中的经验和收获。希望通过这篇博客能够帮助其他Go语言初学者更好地掌握这门语言,并与广大Go语言爱好者进行交流和互动。 选择…...

Java类的Builder应用以及使用@Data和@Builder高效应用Builder

⭐Java Builder模式:是Java设计模式之一,它属于对象创建型模式,是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 结论一:使用lombok的Data和Builder注解构建Java类的Builder简洁高效&am…...

【Qt控件之QTabWidget】介绍及使用

描述 QTabWidget类提供了一个带有选项卡的小部件堆栈。 选项卡小部件提供了一个选项卡栏(参见QTabBar)和一个“页面区域”,用于显示与每个选项卡相关联的页面。默认情况下,选项卡栏显示在页面区域的上方,但可以使用…...

Linux实战——网络连接模式的三种模式

Linux可以分为三种网络模式: 桥接模式 (vmnet0) 仅主机模式 (vmnet1) NAT模式 (vmnet8) 当我们下载了vmware之后,在电脑会出现两个虚拟网卡,VMware Network Adapter VMnet1、VMware Network Adapter VMnet8。 可以通过查找 控…...

嵌入式实时操作系统的设计与开发(任意大小的内存管理)

任意大小的内存管理是根据用户需要为其分配内存,即用户需要多大内存就通过acoral_malloc2()为之分配多大内存,同时每块分配出去的内存前面都有一个控制块,控制块里记录了该块内存的大小。 同时未分配出去的内存也有一个控制块,寻…...

文件读取结束的判定

大家好啊,我们今天来补充文件操作的读取结束的判定。 被错误使用的feof 牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾…...

《基于 Vue 组件库 的 Webpack5 配置》9.module.exports 可为数组类型且注意编译顺序

module.exports常见是对象类型,其实也可用数组类型;注意编译顺序,从后往前 编: 也就是说先编 another.js,再编 index.js;所以代码第 9 行不能设置为 true,仅在第一次,也就是代码第19…...

​CUDA学习笔记(四)device管理

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/,仅用于学习。 device管理 NVIDIA提供了集中凡是来查询和管理GPU device,掌握GPU信息查询很重要,因为这可以帮助你设置kernel的执行配置。 本博文将主要介绍下面两方面内容&…...

【算法练习Day25】 重新安排行程N 皇后 解数独

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 重新安排行程N 皇后解数独总…...

软考-访问控制技术原理与应用

本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加 by 2023年10月 访问控制概念 访问控制是计算机安全的一个重要组成部分,用于控制用户或程序如…...

优测云测试平台 | 有效的单元测试

一、前言 本文作者提出了一种评价单元测试用例的质量的思路,即判断用例是否达到测试的“四大目标”。掌握识别好的用例的能力,可以帮助我们高效地写出高质量的测试用例。 评判冰箱的好坏,并不需要有制造一台冰箱的能力。在开始写测试用例之…...

Java设计模式之外观模式

定义 又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,…...

MyBatis实现延时加载的方式

MyBatis实现延时加载的方式有两种: 使用resultMap的association和collection标签配置延时加载:在查询语句中,使用association标签配置一对一关联关系,使用collection标签配置一对多关联关系。然后在查询结果映射的resultMap中配置…...

计算未来:微软眼中的人工智能

计算未来 :人工智能及其社会角色(The Future Computed. Artificial Intelligence and its role in society )这本书于2018年09月由北京大学出版社出版。 书籍的作者是:沈向洋(微软全球执行副总裁),(美&…...

字号和磅的对应关系

字号「八号」对应磅值5 字号「七号」对应磅值5.5 字号「小六」对应磅值6.5 字号「六号」对应磅值7.5 字号「小五」对应磅值9 字号「五号」对应磅值10.5 字号「小四」对应磅值12 字号「四号」对应磅值14 字号「小三」对应磅值15 字号「三号」对应磅值16 字号「小二」对应磅值18 …...

Bag of Tricks for Efficient Text Classification(FastText)

主要的有点就是快,用途就是用于文本分类,模型结构如上,主要是通过embedding将文本转换成向量,然后进行mean-pooling,然后输入到hidden隐向量中,通过softmax输出多分类,损失函数是对数似然损失函…...

vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法

vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法 先看一下效果图&#xff08;想在表单里动态的增删 form-item&#xff0c;然后添加rules&#xff0c;校验其必填项&#xff1b; &#xff09;: html部分 <div v-for"(item, index) in …...

3分钟解锁Windows游戏手柄革命:ViGEmBus虚拟驱动颠覆你的游戏体验

3分钟解锁Windows游戏手柄革命&#xff1a;ViGEmBus虚拟驱动颠覆你的游戏体验 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾因心爱的Switch手柄无…...

Qwen3-14B私有部署镜像实战:WebUI可视化对话与API服务搭建指南

Qwen3-14B私有部署镜像实战&#xff1a;WebUI可视化对话与API服务搭建指南 1. 镜像概述与核心优势 Qwen3-14B作为通义千问系列的中等规模大语言模型&#xff0c;在14B参数规模下展现出优秀的语言理解与生成能力。本私有部署镜像针对RTX 4090D 24GB显存环境进行了专项优化&…...

lsp_signature.nvim快速上手:5分钟配置你的第一个签名帮助

lsp_signature.nvim快速上手&#xff1a;5分钟配置你的第一个签名帮助 【免费下载链接】lsp_signature.nvim LSP signature hint as you type 项目地址: https://gitcode.com/gh_mirrors/ls/lsp_signature.nvim lsp_signature.nvim是一款专为Neovim设计的LSP签名提示插件…...

PyTorch从零开始

欢迎来到 PyTorch 的世界&#xff01;如果你正准备踏入深度学习的大门&#xff0c;PyTorch 是你绕不开的工具。别被它看似高深的名字吓到&#xff0c;其实它非常 Pythonic&#xff08;符合 Python 的编程风格&#xff09;&#xff0c;上手难度并不高。 这篇文章将带你从零开始&…...

别再只盯着卫宁、东华了!这5家小而美的HIS厂商,可能是中小医院降本增效的宝藏选择

中小医院数字化转型的隐藏利器&#xff1a;5家垂直领域HIS厂商深度评测 在医疗信息化浪潮中&#xff0c;大型三甲医院往往占据聚光灯下的中心位置&#xff0c;而数量庞大的中小型医疗机构却面临着独特的数字化困境。预算有限、技术团队薄弱、专科需求特殊——这些现实挑战让标准…...

苍穹外卖|DAY6-Redis和店铺营业状态设置模块

目录 九、Redis 1. Redis入门 1.1 Redis下载与安装 1.2 Redis服务启动与停止 1.3 Redis图形化工具 2. Redis数据类型 3. Redis常用命令 3.1 字符串操作命令 3.2 哈希操作命令 3.3 列表操作命令 3.4 集合操作命令 3.5 有序集合操作命令 3.6 通用命令 4. 在Java中操…...

穿越机电调协议进化史:从PWM到DShot1200的性能对比实测

穿越机电调协议进化史&#xff1a;从PWM到DShot1200的性能对比实测 第一次接触穿越机时&#xff0c;最让我困惑的就是电调协议的选择。PWM、OneShot、DShot这些名词听起来像天书&#xff0c;直到亲眼看到不同协议在示波器上的波形差异&#xff0c;才真正理解它们对飞行性能的影…...

JavaScript中Nodejs环境内存限制与V8堆大小调整

...

零停机迁移:如何将服务器成本从 $1432 降至 $233

零停机迁移&#xff1a;如何将服务器成本从 $1432 降至 $233 在云计算大行其道的今天&#xff0c;"便利性"往往伴随着昂贵的溢价。对于初创公司和个人开发者而言&#xff0c;当业务规模趋于稳定&#xff0c;基础设施成本便成了不可忽视的利润黑洞。本文将详细复盘一次…...

Canvas水印实战:5分钟搞定前端图片防盗,附完整代码与避坑指南

Canvas水印实战&#xff1a;5分钟实现前端图片版权保护 在数字内容爆炸式增长的今天&#xff0c;图片盗用已成为困扰创作者的核心痛点。最近一位独立摄影师发现&#xff0c;其发布于社交平台的作品被某电商商家直接盗用&#xff0c;导致每月损失近万元订单。这样的案例并非孤例…...