肺结节3D图像分割-VNet(一)

article/2025/9/25 4:25:25

近期用Yolo训练肺结节检测模型感觉缺少3D结构信息,尝试一下3D图像分割,博文用以记录。

1、LUNA16数据集

1.1 Luna16数据集介绍

简介:来自于公开的LIDC/IDRI数据集。该数据集剔除了LIDC/IDRI数据集中切片厚度大于2.5mm的扫描数据,共产生了888套CT。Luna16数据集中结节的判定标准为四名放射科专家中至少有三名认定该结节半径大于3mm。因此在数据集的注释中,非结节、半径小于3mm的结节和被1名或两名放射科专家认为是半径大于3mm的结节被认定为无关的发现。

1.2 所用数据

Luna16数据集:

点此跳转

subset0-subset10:10个zip文件中包含的所有的CT图像。

annotations.csv:包含1186个结节的注释。

LIDC/IDRI数据集:

点此跳转

LIDC-XML-only.zip:放射科医生注释/分割(XML 格式)

1.3  mhd文件和raw文件

subset0-10中每一个病例的CT扫描都给出了.mhd和.raw

.mhd文件包含了CT图像的基本信息,.raw文件用来储存CT的图像

1.4 annotations.csv文件

文件包含了各个CT中结节的世界坐标和半径

2、图像预处理

2.1 读取结节图像信息

从subset0-9中找到.mhd文件,读取图像相关信息

def read_data(mhd_file):       #读取图像数据,img, origin, spacing, flagwith open(mhd_file) as f:mhd_data = f.readlines()for i in mhd_data:     if i.startswith('TransformMatrix'):tmp = i.split('=')[1]if tmp == '1 0 0 0 1 0 0 0 1\n':   #判断是否翻转flag = Trueelse:flag = Falseitkimage = sitk.ReadImage(mhd_file)numpyImage = sitk.GetArrayFromImage(itkimage)   #从mhd读取raw,图像print("读取数据,读取的图片大小(zyx):",numpyImage.shape)origin = itkimage.GetOrigin()print("读取数据,读取的坐标原点(xyz):",origin)  #x,y,zspacing = itkimage.GetSpacing()print("读取数据,读取的像素间隔(xyz):",spacing)  #x,y,zreturn numpyImage, origin, spacing, flag

2.2 坐标变换

从annotations.csv文件读取到的坐标是世界坐标系下的坐标,我们需要将其转换为图像坐标系下的坐标,像素间隔为[1,1,1].

需要注意的是一张CT图像可能包含不止一个结节,我们需要将其全部遍历完才能遍历下一张图

annos_all_list = []           #读取到的原始坐标for i in range(len(annos)):if annos[i][0] == img_name:  annos_all_list.append(list(annos[i])) print(annos_all_list)

读取到图像包含的所有结节后,将其进行坐标转换

    for annos_one_list in annos_all_list:       #其中一个结点print("annos_one_list:",annos_one_list) #世界坐标w_center = [annos_one_list[1], annos_one_list[2], annos_one_list[3]]  #世界坐标:[x,y,z]print("世界坐标:",w_center)#世界坐标 --> 图像坐标#(世界坐标中心 - 原点) / 像素间隔v_center = list(abs(w_center - np.array(origin)))#/np.array(spacing) 此处像素间隔为[1,1,1] 图像坐标:[x,y,z]if flag is False:  #图像翻转,拍CT时为俯拍,需转换为仰拍. #img.shape(z,y,x)   v_center(x,y,z)v_center = [(img.shape[2]-1 - v_center[0]), (img.shape[1]-1 - v_center[1]), v_center[2]]    #z轴不需要翻转diam = annos_one_list[4]   #直径print("结节直径:",diam)

将转换后的结节坐标保存下来

one_annos = []
one_annos.append(v_center[0])  #图像坐标x
one_annos.append(v_center[1])  #图像坐标y
one_annos.append(v_center[2])  #图像坐标z
return_list.append(one_annos)
print("one_annos:",one_annos,"[坐标(x,y,z)]")

2.3 结节信息保存 

所有结节全部转换完后,将保存的数据保存输出至nodule_annos.xls文件

nodule_annos = pd.DataFrame(nodule_list)  # 把nodule_list转换成excel文件
nodule_annos.to_excel(nodule_annos_path)   #保存至指定路径

查看输出文件

 

2.4  滤除不含结节图像

def annos_clean():annos = pd.read_excel(nodule_annos_path)annos = annos.tolist()annos_c = []for i in annos:if i[2] != "[]":annos_c.append(i[1])return annos_c


http://chatgpt.dhexx.cn/article/iIwpmcre.shtml

相关文章

V2VNet: Vehicle-to-Vehicle Communication for Joint Perception and Prediction

V2VNet:使用V2V通信提高自动驾驶车辆的感知和运动预测 任务: 感知和motion预测,SDV需要对3D场景进行推理,识别其他车辆/行人,并预测他们未来可能如何行动。 在一个深度网络模型中联合执行3D目标检测和motion预测可提高…

论文笔记A Liver Segmentation Method Based on the Fusion of VNet and WGAN

一种基于VNet和WGAN融合的肝脏分割方法 Computational and Mathematical Methods in Medicine 2021 虽然基于二维卷积神经网络的肝脏分割方法取得了不错的效果,但仍然存在层间信息的缺乏,在一定程度上造成分割精度的严重损失。同时,在2D…

经典论文解析——Unet和Vnet——图像分割

Unet & Vnet 1.Unet1.1 网络简介1.2 网络结构1.3 网络训练技巧 2.Vnet2.1 网络简介2.2 网络结构 前言说点题外话,最近在实习了,所以总结整理的时间不多,之前的系列也会继续做,只是更新速度会放慢一些。我尽量还是本着以质为主…

TAP/TUN Vnet veth

TAP 设备与 VETH 设备 TUN/TAP 设备是一种让用户态程序向内核协议栈注入数据的设备,一个工作在三层,一个工作在二层,使用较多的是 TAP 设备。VETH 设备出现较早,它的作用是反转通讯数据的方向,需要发送的数据会被转换成…

[深度学习论文笔记]3D AGSE-VNet: An Automatic Brain Tumor MRI Data Segmentation Framework

[深度学习论文笔记]3D AGSE-VNet: An Automatic Brain Tumor MRI Data Segmentation Framework 3D-AGSE-VNet:一种自动脑肿瘤MRI数据分割框架 Published: Jul 2021 Abstract by BMC Medical Imaging 论文:https://arxiv.org/abs/2107.12046 摘要&#x…

动手学习深度学习keras版——从零开始实现Vnet 2D版

从零开始实现Vnet 2D版 1. 数据处理1.1 数据集介绍1.2 数据提取和转换1.3 Keras的数据生成器(generator)构造 2. Vnet 2D版网络实现2.1 Loss函数设计2.2 网络结构实现 3. 开始训练啦4. 网络预测(inference)5. 结果展示6. 踩坑经验总结 工作需要,暂时换成keras来写网…

安卓 VNET 抓取 wskey 教程

图文示例机型:一加8 就设置可能长得不一样,功能均一致,请根据个人系统设置进行证书安装操作 wskey 相对于 cookie 的有效期更长,可以通过 wskey 转换智能化管理后台,省心 下载安装 VNET 抓包 APP 文件文件大小&#xf…

azure mysql on vnet_管理 VNet 终结点 - Azure 门户 - Azure Database for MySQL | Microsoft Docs

您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn. 使用 Azure 门户创建和管理 Azure Database for MySQL VNet 服务终结点和 VNet 规则Create and manage Azure …

【Microsoft Azure 的1024种玩法】六十三.通过全局 VNet 对等互连实现同一区域不同网段的虚拟网络实时打通

【简介】 虚拟网络对等互连是两个虚拟网络之间的网络连接, 虚拟网络对等互连可以通过 Azure 主干网络连接同一区域或不同区域的虚拟网络进行打通实现实时通信,本篇文章主要介绍了如何通过全局 VNet 对等互连的方式将同一区域不同网段的虚拟网络中虚拟机…

【Azure】微软 Azure 基础解析(七)Azure 网络服务中的虚拟网络 VNet、网关、负载均衡器 Load Balancer

本系列博文还在更新中,收录在专栏:「Azure探秘:构建云计算世界」 专栏中。 本系列文章列表如下: 【Azure】微软 Azure 基础解析(三)描述云计算运营中的 CapEx 与 OpEx,如何区分 CapEx 与 OpEx…

好用的Android抓包神器 VNET

很多网友要我发前几个青龙面板抓变量用到软件,马上安排。 黑科技VNET 最-好用的Android抓包神器 VNET是Android平台下功能最强大的网络抓包工具,支持HTTP&HTTPS,TCP&UDP,IPv6&IPv4,多终端显示&#xff0…

爬虫从入门到精通(19) |安卓手机端抓包软件VNET介绍

提前声明:该专栏涉及的所有案例均为学习使用,如有侵权,请联系本人删帖! 文章目录 一、前言二、介绍1.功能2.安装3.root和非root 一、前言 对于一些抓取较为严的软件,有时候我们不好抓到包,这个时候我们也可…

VNET原理与实现(1)

神经网络什么的早就不是新概念了,不过学了这么久,还一直在二维图像上打转,所以今天开始入手三维图像分割,先从可爱的VNET开始吧,从胖嘟嘟的外形看,这应该是个软柿子,那就试着捏一捏吧&#xff0…

UNet 、3D-UNet 、VNet 区别

UNet 、3D-UNet 、VNet 区别 医学图像的几个常用模型,简单总结一下。 三个model的代码在我的Github上,可以参考一下:https://github.com/VickyLLY/unet_and_vnet 文章目录 UNet 、3D-UNet 、VNet 区别一、UNet二、3D-UNet三、VNet 一、UNet…

程序员如何写一份更好的简历!!

概述 面试前要准备的第一件事就是写简历,从零开始写简历是一件痛苦的事,因为它既重要又耗时。现在就有求职者在电脑前急躁不安地搜索简历模版和参考例句,却不知道如何下笔。写得太短的话觉得没诚意,写得太长的话又无从下手。关键的是大多数求职者没有做面试官的经验,也没…

Java程序员简历模板

从「目标职位」的角度讲讲,如何做一份简历才能提高你拿到 Offer 的几率。 文章目录 简历重点一、HR如何刷简历二、简历排版顺序三、专业技能四、项目经验2013/06 -- 至今 伟业网上电商系统2012/03 -- 2012/08 人事管理系统 总结 简历重点 大家觉得简历就是自我赞歌…

程序员简历项目经验怎么写?

我是一个典型的互联网公司程序员,也见过无数的程序员简历,包括很多优秀的程序员简历,看了可以让人眼前一亮,优美简洁的简历模板,项目经验工作重点突出;也见过更多的写得不好的简历。程序员怎么写简历?程序员简历项目经…

程序员简历上写这种项目,难怪面试当炮灰。。。

目录: 高级工程师必备:系统设计能力如何让你的项目更有技术含量 上篇文章 《我只是把握好了这3点,1个月后成功拿下大厂offer!》我们聊了聊Java工程师在跳槽前的1个月,如何利用较短的时间从技术广度、技术深度、基础功…

程序员如何写简历|附10个模版

卷友们好,我是rumor。 今天卷到简历这个事情上来了。千万不要误会,我没有在写自己的简历。 而是我经常会收到一些简历,有些是发到了邮箱里求内推,有些是卷友让我帮忙看一下,直到最近的某一天,我打开了一份…

【无标题】程序员个人简历模板

程序员个人简历模板1 姓 名: 国 籍: 中国 目前住地: 广州 民 族: 汉族 户 籍 地: 茂名 身高体重: 168 cm kg 婚姻状况: 未婚 年 龄: 28 岁 求职意向及工作经历 人才类型&#x…