基于Unet的BraTS 3d 脑肿瘤医学图像分割,从nii.gz文件中切分出2D图片数据

1、前言

3D图像分割一直是医疗领域的难题,在这方面nnunet已经成为了标杆,不过nnunet教程较少,本人之前跑了好久,一直目录报错、格式报错,反正哪里都是报错等等。并且,nnunet对于硬件的要求很高,一般的电脑配置或者低配置的服务器完全带不起来

或者定义conv.3D的unet网络模型,但对显卡的要求也很高...

之前实现了unet的自适应多类别分割任务,博文如下

Unet 实战分割项目、多尺度训练、多类别分割_unet进行多类分割-CSDN博客

代码根据数据集的mask,可以自动计算出mask前景的类别,这样就能为unet的输出自动调整,不需要更改别的操作。

而3d的图像其实就是2d拼接起来的,或许可以将nii格式的3d图片切分,这样根据上文的代码就可以实现医疗图像3d的分割

提示:这里切分的2d分割,效果肯定不如3d图像的分割

就比如线性回归对图像的分类,忽略了像素点的空间信息。那么3D切割出2D,其实也是忽略了图像的空间信息,效果肯定不如3d的直接分割

2、 nii 文件的切分

import SimpleITK as sitk 

这里用itk 对3d数据进行读取

2.1 数据集

这里的3d数据是 BRATS 脑肿瘤分割数据(brain tumor segmentation challenge,BraTS Chanllenge),这里只对训练集进行操作

需要注意的是,一般的nii图像都是3D的,这里数据是4D的,好像是每个3D图像的模态,类似于官方的增强?

T1 成像,利于观察解剖结构,病灶显示不够清晰

T1gd 在受试者做磁共振之前向血液内注射造影剂,使成像中血流活跃的区域更加明显,是增强肿瘤的重要判据

T2 成像,病灶显示较为清晰,判断整颗肿瘤

FLAIR(抑制脑脊液的高信号),含水量大则更亮眼,可以判断瘤周水肿区域

mask模板是四分类的:

2.2 slice 切片代码

代码放在这里:

这里参考之前的博文:nii 文件的相关操作(SimpleITK)_如何使用nii文件做深度学习-CSDN博客

import SimpleITK as sitk
import numpy as np
import os
from tqdm import tqdm
import shutil
import cv2# 新建目录
def mkdir(rt):ret_path = rt + '_ret2D'if os.path.exists(ret_path):        # 删除之前的切片目录shutil.rmtree(ret_path)os.mkdir(ret_path)os.mkdir(os.path.join(ret_path,'images'))os.mkdir(os.path.join(ret_path,'labels'))def get_image_from_nii(x,y,name,thre):  # 传入nii文件,对nii进行切片img = sitk.ReadImage(x)img_array = sitk.GetArrayFromImage(img)  # nii-->arraylabel = sitk.ReadImage(y)label_array = sitk.GetArrayFromImage(label)  # nii-->arrayfor index,i in enumerate(range(img_array.shape[1])):    # TODO 需要根据img维度更改,4D设定为1,3D设置为0img_select = img_array[0,i, :, :]       # TODO 需要根据img维度更改,从x轴切分,[:,i,:]从y轴切分label_select = label_array[i, :, :]# 图片保存目录img_save_name = os.path.join(root+'_ret2D','images',name+'_'+str(index)+'.png')label_save_name = os.path.join(root+'_ret2D','labels',name+'_'+str(index)+'.png')h,w = label_select.shapetotal_pixel = h*w           # 总的像素点个数if label_select.max() == 0:     # 没有前景的像素点不保存continueelse:# 归一化img_select = (img_select - img_select.min()) / (img_select.max() - img_select.min())*255img_select = img_select.astype(np.uint8)label_select = label_select.astype(np.uint8)if (np.sum(label_select !=0 ) / total_pixel) > thre:cv2.imwrite(img_save_name,img_select)cv2.imwrite(label_save_name,label_select)# 切片函数
def sliceMain(rt,imgf,labf,thre):# 删除之前的切片目录,建立新的目录mkdir(rt)nii_list = [i for i in os.listdir(os.path.join(rt,imgf))]for image_nii in tqdm(nii_list):      # 遍历所有的nii文件name = image_nii.split('.nii.gz')[0]image_nii = os.path.join(rt,imgf,image_nii)label_nii = image_nii.replace(imgf,labf)       # 自动获取nii 的标签get_image_from_nii(image_nii,label_nii,name,thre)if __name__ == '__main__':root = 'BRATS'          # 待切分nii文件的父目录images_folder = 'imagesTr'      # 3d nii的数据labels_folder = 'labelsTr'       # 3d nii 的标签数据threshold = 0.03               # 分割的比例不超过阈值的数据删除# 切片函数sliceMain(rt=root,imgf=images_folder,labf=labels_folder,thre=threshold)

这里简单介绍一下:目录结构如下

具体数据的名称和后缀要严格对应!!!

 

threshold 是阈值处理,如果mask前景的像素点个数没有达到整个图片像素点的阈值,就不会被保存。这里默认是0.03

切分的时候,因为这里是4D的,所以img_array是四维的,我们默认取第一个维度的3D图像

同时,3D图像可以用x,y,z三个坐标表示,这里的shape1就是沿着x轴进行2D的切分

因为医学图像的灰度动态范围很多,可能到上千,因此这里将灰度值重新映射,变成np的uint8格式,再用cv保存

2.3 保存格式

图像的保存,这里搞了好久,要么格式问题,要么灰度有问题。这里做下总结

首先,png格式可以完整的保存2D切分的信息,而不会因为图像压缩导致mask灰度值改变。说人话就是,这里切分的2d像素值只有0 100 255,如果保存为其他格式,可能读取的时候,会产生0 1 2 3....等等灰度图像,而分割的mask是阈值图像!!

其次,plt保存的时候,会将图像重新映射,我们只想要0 1 2这种格式,但是他可能会把0变成0,1变成128.2变成255这样。虽说,这样看mask确实方便,不至于变成全黑的,但是本人测试的时候,总会莫名多出一个灰度。说人话就是,本来这里是四分类的,plt保存的时候,np.unique读取的时候,会变成5个类别

这里搞了半天,本人电脑太差,测试半天,只有这个代码是符合的。至于问题到底是不是我说的那样,可以自己测试

代码如下:

import os
from tqdm import tqdm
import numpy as np
import cv2root = './BRATS_ret2D/labels'             # 训练 mask的路径
masks_path = [os.path.join(root ,i) for i in os.listdir(root)]
gray = []           # 前景像素点
for i in tqdm(masks_path,desc="gray compute"):img = cv2.imread(i,0)img_uni = np.unique(img)        # 获取mask的灰度值for j in img_uni:if j not in gray:gray.append(j)
print(gray)

2.4 切分好的数据

上述代码,切分后会生成root的返回目录

这里的mask并不是全黑的,只是0 1 2 3这样导致很黑而已。这里的目录名称按照切分索引,而没有从0开始,这样就能看出来BRATS_001 里面,49之前的要么没有mask前景,要么前景的区域不足我们设定的阈值!

 

3、划分数据集

参考之前的代码:关于图像分割任务中按照比例将数据集随机划分成训练集和测试集_图像分割数据集怎么划分-CSDN博客

 

这里可以可视化一下:关于图像分割项目的可视化脚本-CSDN博客

4、训练

unet训练如下:

训练时间太长了, 这里只简单训练了10个epoch用作测试,结果如下:

代码是这篇的代码:Unet 实战分割项目、多尺度训练、多类别分割_unet进行多类分割-CSDN博客

训练日志里面,有每个类别的指标:

推理结果:

4、项目总结

1、准备好3D的nii.gz数据,然后根据本章第二节摆放好数据切分。根据项目的实际要求设定好阈值或者沿着哪个轴切分

2、划分数据很简单

3、训练的 train 脚本

4、推理的时候,把待推理的数据放在inference目录下即可

5、说点废话

对于项目的改进的思考,项目下载:

深度学习Unet实战分割项目:BraTS3d脑肿瘤图像切分的2D图片分割项目(4分类)资源-CSDN文库

因为医学图像的灰度值都很低,往往图像会很暗,这样图像的梯度信息啊、边缘信息啊都很模糊,效果不太好,可以利用医学图像常用的windowing方法,其实就是对比度拉伸

医学图像处理的windowing 方法_医学图像常用windowing和histogram equalization-CSDN博客

而且,不同于正常的分类图像,这里的normalize可能直接 - 0.5 在除以 2效果不太好,这可以手动计算好图像的mean和std,可以有效提升网络的性能

怎么计算数据的均值和方差_计算数据集均值和方差-CSDN博客

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

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

相关文章

mac、windows 电脑安装使用多个版本的node

我们为啥要安装多个不同版本的node? 开发旧项目时,使用低版本Nodejs。开发新项目时,需使用高版本Node.js。可使用n同时安装多个版本Node.js,并切换到指定版本Node.js。 mac电脑安装 一、全局安装 npm install -g n 二、mac电脑…

Elasticsearch 压测实践总结

背景 搜索、ES运维场景离不开压力测试。 1.宿主机层面变更:参数调优 & 配置调整 & 硬件升级2.集群层面变更:参数调优3.索引层面变更:mapping调整 当然还有使用层面变更,使用API调优(不属于该文章的讨论范围…

四川古力未来科技抖音小店:安全便捷,购物新体验

在数字化浪潮席卷全球的今天,电商平台的安全性与便捷性成为了消费者最为关心的问题。四川古力未来科技有限公司,凭借其强大的技术实力和深厚的行业经验,为广大消费者带来了一个安全可靠的购物新选择——古力未来科技抖音小店。 古力未来科技抖…

Twitter Api查询用户粉丝列表

如果大家为了获取实现方式代码的话可能要让大家失望了,这边文章主要是为了节省大家开发时间,少点坑。https://api.twitter.com/2/users/:id/followers ,这个接口很熟悉吧,他是推特提供的获取用户关注者(粉丝&#xff0…

基于AI智能识别技术的智慧展览馆视频监管方案设计

一、建设背景 随着科技的不断进步和社会安全需求的日益增长,展览馆作为展示文化、艺术和科技成果的重要场所,其安全监控系统的智能化升级已成为当务之急。为此,旭帆科技(TSINGSEE青犀)基于视频智能分析技术推出了展览…

再拓信创生态圈|宁盾身份域管与深信服桌面云完成兼容互认证

近日,宁盾国产化身份域管(即身份目录服务软件)与深信服桌面云系统aDesk完成产品兼容性互认证。经过共同严格测试,宁盾国产化身份域管能够与深信服桌面云系统兼容对接运行,双方相互兼容,共同为企事业单位提供…

H5面临的网络安全威胁和防范措施

H5,是基于HTML5技术的网页文件。HTML,全称Hyper Text Markup Language,即超文本标记语言,由Web的发明者Tim Berners-Lee与同事Daniel W. Connolly共同创立。作为SGML的一种应用,HTML编写的超文本文档能够独立于各种操作…

tomcat-连接器架构设计

一、NioEndpoint组件 Tomcat的NioEndPoint组件实现了I/O多路复用模型,接下来我会介绍NioEndpoint的实现原理。 1.总体工作流程 我们知道,对于Java的多路复用器的使用,无非是两步: 1.创建一个Seletor,在它身上注册各…

Cloud flare反向代理流量实验

前言 本实验将会为大家解析cloud flare的反向解析代理服务如何搭建,works如何创建等等。本文中教学创建的实例已在文章编写结束后释放,该项技术不可用于违法用途!违者自行承担后果!! 原理拓扑图 一、知识链条 1、Clou…

【深度学习|Pytorch】torchvision.datasets.ImageFolder详解

ImageFolder详解 1、数据准备2、ImageFolder类的定义transforms.ToTensor()解析 3、ImageFolder返回对象 1、数据准备 创建一个文件夹,比如叫dataset,将cat和dog文件夹都放在dataset文件夹路径下: 2、ImageFolder类的定义 class ImageFol…

目标跟踪——行人车辆数据集

一、重要性及意义 首先,目标跟踪对于个人和组织的目标实现至关重要。无论是个人职业发展、企业业务增长还是政府的社会发展,目标跟踪都能够帮助我们明确目标,并将其分解为可行的步骤和时间表。这有助于我们保持动力和专注,提高效…

数据质量决定大模型能力,景联文科技提供高质量大模型数据

随着大模型的深入发展,各类资源要素的配置状态已悄然变化。其中,数据的价值已被提升到一个新高度。 大模型往往拥有庞大的参数和复杂的网络结构,需要大量的数据来学习和优化。数据的质量和数量直接决定了模型的训练效果。若数据不足或质量不佳…

MySQL-视图:视图概述、创建、查看、更新、修改、删除

第14章 视图 1. 常见的数据库对象2. 视图概述2.1 为什么使用视图?2.2 视图的理解 3. 创建视图3.1 创建单表视图3.2 创建多表联合视图3.3 基于视图创建视图 4. 查看视图5. 更新视图的数据5.1 一般情况5.2 不可更新的视图 6. 修改、删除视图6.1 修改视图6.2 删除视图 …

详解网络攻击的发生原因、类型及如何防范

网络攻击是访问计算机系统或者大小,修改或窃取数据的未经授权的企图。网络破坏分子可以使用多种攻击媒介,推出包括网络攻击的恶意软件,网络钓鱼,勒索,以及人在这方面的中间人攻击。固有风险和残余风险使这些攻击中的每…

使用阿里云试用Elasticsearch学习:1.1 基础入门——入门实践

阿里云试用一个月:https://help.aliyun.com/search/?kelastic&sceneall&page1 官网试用十五天:https://www.elastic.co/cn/cloud/cloud-trial-overview Elasticsearch中文文档:https://www.elastic.co/guide/cn/elasticsearch/guide…

强大缓存清理工具 NetShred X for Mac激活版

NetShred X for Mac是一款专为Mac用户设计的强大缓存清理工具,旨在帮助用户轻松管理和优化系统性能。这款软件拥有直观易用的界面,即使是初次使用的用户也能快速上手。 软件下载:NetShred X for Mac激活版下载 NetShred X能够深入扫描Mac系统…

Django路由分发的三种方式以及命名空间namespce——附带源码解析

目录 1. 前言 2. include常规路由分发 3. include源码解析 4. 路由分发的第二种写法 5. 路由分发的第三种写法 6. 小结 7. 有关namespace 8. 最后 1. 前言 本篇文章主要是讲解路由分发的三种方式。当然,你可能在想,一般做路由分发只需要一个incl…

尚硅谷2024最新Git企业实战教程 | Git与GitLab的企业实战

这篇博客是尚硅谷2024最新Git企业实战教程,全方位学习git与gitlab的完整笔记。 这不仅仅是一套Git的入门教程,更是全方位的极狐GitLab企业任务流开发实战!作为一应俱全的一站式DevOps平台,极狐GitLab的高阶功能全面覆盖&#xff0…

2024-04-03 NO.4 Quest3 手势追踪抓取物体

文章目录 1 手势抓取方式1.1 Hand Grab1.2 Touch Hand Grab1.3 Distance Hand Grab 2 HandGrabExamples 示例场景2.1 Interactor 对象2.2 Interactable 对象2.2.1 父子结构2.2.2 “Hand Grab lnteractable” 脚本2.2.3 “Move Towards Target Provider” 脚本2.2.4 其他 Moveme…

5.5G,只比6G少0.5G

5.5G成为通信行业2024年开年的一大焦点。提到5.5G,多出来的0.5G又是啥?为什么不直接迈向6G时代?今天我们一探究竟! “0.5G”,现在与未来的桥梁 2021年,国际标准组织3GPP为通信技术的进一步发展定义了新的里…