前言

记录一下最近课设做的心脏组织分割的工作。


一、数据集

数据是分为三类(HCM) (DCM) (NOR) 的心脏MRI图像。每类十五组,一组8~10张图片。前两类是患有心脏疾病的,后一类是正常人的心脏。(其实在对心脏分割完后还有一个在分割基础上对三类心脏病分类的任务),但我做的效果实在是太差了,就不记录了。


原图像



分割后的图像(中间白色的是左心室(像素为0),白色外面一层是心肌(像素为85)
深灰色是右心室(像素为170),黑色是背景(255) 大概,记不清了)


其实数据是被我们老师处理过的,原数据是一种三维的切片,老师可能从里面挑出了一些图片作为数据。


二、模型

我是采用了一位俄罗斯程序猿写的一个分割的库的unet++模型。(基于pytorch的)

import segmentation_models_pytorch as smp
model = smp.UnetPlusPlus(in_channels=1, #这里因为我们的数据是灰度图,所以是单通道。classes=4,   #输出的分割后的图像像素是四种,0,85,170,255.#其实我感觉这本质上就是一种分类。
)

这个库的详情可以看看这个博客。

PyTorch图像分割模型——segmentation_models_pytorch库的使用

虽然讲的不全,但算一个启蒙。

三、数据处理

做了一些深度学习的作业,我觉得都数据的处理算是最有挑战的部分了。因为模型我现在也写不出来自己构建的模型,都是调用一些现成的模型,有些甚至都不明白模型的原理。在用了一些模型后,发现模型之间的区别不是很大,你数据处理的不好,特征不明显,用什么模型效果都不好。所以之后在做完cv方面一些常见的问题后,我也要试着去搭建一些自己的模型。

数据处理的思路:
1、标签的像素只有四种,首先就要将标签对应的四种像素设置成0,1,2,3。还要进行one-hot处理,因为标签有四类,最后模型产生的output格式是(c,4,h,w),不进行one-hot的话,标签是(c,1,h,w)这样无法计算loss。(交叉熵loss除外,因为交叉熵loss可以自动将标签转成one-hot形式的)
2、对于图片的话,他的像素分布是从0~255的,没有固定的几种。处理的话看下面。

self.image_transform = transforms.Compose([transforms.CenterCrop(image_size),#中心裁剪,因为要分割的心脏大部分在中心位置。transforms.PILToTensor(),#将PIL数据转化为tensor类型,不要用transforms.ToTensor(),#因为这会将0~255的数值映射到0~1,虽然我不知道图片映射到0~1对计算会不会有什么不好的影响。#但是在下面对标签处理时,标签映射到0·1,但我不知道,所以接下来依然是对标签中像素值为#0,85,170,255分别赋值0,1,2,3。但标签中已经没有85,170,255了。所以他们还都是原值。#接下来在训练时,发现训练出来的图片只有两种颜色,不是白就是黑。#不知道是不是这四个像素之间差距过大导致的。毕竟他们很0,1,2,3之间的区别就是他们之间的差距过大。transforms.Lambda(lambda y: y.to(dtype=torch.float32)),#转成flaot32格式的,因为下面计算要这种格式,如果报错了,转成它提示成的格式就行。])
self.label_transform = transforms.Compose([transforms.CenterCrop(image_size),transforms.PILToTensor(),transforms.Lambda(lambda y: y.to(dtype=torch.int64).squeeze())#.squeeze()处理是将多余的维或指定的维度压缩掉,正常来说这里不需要。#因为标签被PIL读出来是两维的(h,w)不需要这处理。但如果读出来是三维的(h,w,1)就需要压缩了])

对应的图片和数据处理完后就可以分割数据,设置模型参数进行训练了。
还有一个地方就是图片从模型出来是4通道的,我想把它显示出来看看,所以就需要把四通道的原图转回一通道灰度图,再显示。下面就是我写的转换函数。

#将预测后的四通道图片转化为一通道并还原像素 用来显示图片。
def onehot_to_mask(mask):num0 = 0num1 = 0num2 = 0num3 = 0x = np.zeros([mask.shape[0],mask.shape[1]])for i in range (mask.shape[0]):for j in range (mask.shape[1]):if (np.argmax(mask[i][j])==0):x[i][j] = 0num0 = num0 + 1elif (np.argmax(mask[i][j])==1):x[i][j] = 80num1 = num1 + 1elif (np.argmax(mask[i][j])==2):x[i][j] = 170num2 = num2 + 1elif (np.argmax(mask[i][j])==3):x[i][j] = 255num3 = num3 + 1# print("0:{},1:{},2:{},3:{}".format(num0,num1,num2,num3))return x

转回来的图片数据格式是numpy,我使用了plt来显示

 #这里第几个是 先行后列,比如第二行第一列,就是第三个。plt.figure(1)   #设置显示1plt.subplot(121)  #一行两列,第一个plt.imshow(outimage, cmap ='gray')  #传上去plt.subplot(122)  #第二个plt.imshow(target, cmap ='gray')  #传上去plt.show()  #显示


四、划分数据

MyData = Train_Dataset(data_dir=r"./data")
train_size = int(0.8 * len(MyData))  #8:2划分
test_size = len(MyData) - train_size
train_data, test_data = torch.utils.data.random_split(MyData, [train_size, test_size])
# length 长度
train_data_size = len(train_data)
test_data_size = len(test_data)print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))

这里主要就是,torch.utils.data.random_split()划分数据集。


五、评价函数:

我们使用的是macro-f1,我没调用现成的f1,因为不会用。
所以我自己写了一个,但好像不太对,就没贴上来,反正以后不同的任务还要写不同的f1函数。

总结

训练什么的和之前的任务差不多。没什么特点。
奥,感谢fsb同学的铺垫工作。

磁共振成像(MRI)影像心脏组织分割相关推荐

  1. MRI影像学习笔记(三)

    欢迎扫码关注微信公众号"医影杂记" 按照解剖部位划分 颅脑 Brain MRI是最常用也是最重要的颅脑病变检查手段.与CT相比,MRI没有骨性伪影,具有更好的软组织分辨能力.并且可 ...

  2. 基于多阈值注意U-Net(MTAU)的MRI多模态脑肿瘤分割模型

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 小白导读论文是学术研究的精华和未来发展的明灯.小白决心每天为大家带 ...

  3. 磁共振成像(MRI)连接组学的应用

    前言 如何将磁共振成像(MRI)连接组学应用于研究典型的大脑结构和功能,并在临床环境中用于诊断.预后或治疗?本文将讨论MRI连接组学在评估功能和结构连接方面的可能应用.简而言之,功能连接是一种测量功能 ...

  4. 磁共振成像MRI的简单介绍

    磁共振成像MRI的简单介绍 如果你看美剧<豪斯医生>,对MRI这个词一定感到很熟悉,在豪斯的诊断中几乎是必不可少的环节.那么什么是MRI,它又是怎样工作的呢? 因为工作的关系,我曾经接触过 ...

  5. MRI影像学习笔记(五.完结)

    欢迎扫码关注微信公众号"医影杂记" 按照阅片增强功能划分 挂片协议与自动布局 Hanging Protocol and Smart Layout 即使是常规的单次MRI检查,也会包 ...

  6. MRI影像学习笔记(四)

    欢迎扫码关注微信公众号"医影杂记" 前列腺Prostate MRI是前列腺增生和前列腺癌诊断的常用检查手段之一,通常使用T1和T2扫描,使用最多的扫描方向为横轴位.此外,也会选用动 ...

  7. MRI影像学习笔记(一)

    *推荐搜索关注微信公众号:医影杂记 MRI影像检查有一个突出特点,就是有着多种多样的成像序列.这些成像序列能够产生各具特点的MRI图像,不仅能够反映人体解剖形态,而且能够反映人体血流和细胞代谢等生理功 ...

  8. 大幅面遥感影像多尺度分割与尺度转换-初探

    概述 首先谴责某无良网站盗用本文的内容,同时还删除关键性的论文信息.联系方式等. 本篇博文介绍最近刚接收的一个工作,发表在IEEE Transactions on Geoscience and Rem ...

  9. 超声影像皮肤层次分割调研

    超声影像皮肤层次分割调研 表皮层分割 提出了一种具有非线性滤波器的递归方法来自动检测表皮,改进水平集的方法自动检测真皮层: 真皮层分割 比较了三种分割真皮层的方法 Chan-Vese模型,基于区域的主 ...

  10. U-Net编程实战——CT影像的肿瘤分割

        本文将介绍如何使用tf2.0的keras框架实现典型的U-net网络,并以CT影像的肿瘤分割为案例进行讲解.本文将详细地介绍UNet肿瘤分割的实现过程,这将有助于读者快速掌握UNet这一网络, ...

最新文章

  1. 产生0到1之间均匀分布的一个随机数原理与实现
  2. 中国程序员人数将增长50%,过半500强都要卖软件,边缘应用程序增长8倍丨IDC预测下一个五年...
  3. 【工具】55种开源数据可视化工具简介
  4. 【Spring】Spring 如何更改动态更改运行中某个类的日志级别
  5. 备忘:SharePoint默认的欢迎WebPart中超链接样式
  6. bootstrap 常用的导航组件
  7. 这不是海市蜃楼,这是平地雾
  8. Oracle数据库出现“本地计算机上的OracleOraDB11g_homeTNSListener服务启动后停止.....”问题解决方案...
  9. NSString 与 Unicode
  10. 转换到coff期间_“fatal error lnk1123 转换到coff期间失败”的解决方法
  11. 【经验分享】基于创龙AM5708多核间通信的IPC例程通用开发流程
  12. 网络工程师考试大纲的考试要求有哪些
  13. 短除法求解最大公约数c语言,[编程入门]最大公约数与最小公倍数-题解(C语言代码)(短除法)...
  14. tif文件转csv文件
  15. 铁道部新客票系统设计
  16. 追根溯源之最好的Spring AOP解析
  17. 部署Guacamole远程控制桌面
  18. Maltrail恶意流量检测系统
  19. 数据链路层------基于TCP/IP五层模型
  20. ✠OpenGL-10-增强表面细节

热门文章

  1. linux gzip、bzip2常用压缩、解压缩指令总结
  2. 《Spring开发指南》(夏昕著)学习总结
  3. 面经 - 计算机网络知识点
  4. YOLOv3 网络搭建Darknet53 训练自己的数据集
  5. 免费!全网!真正的听歌下载神器
  6. 早悟兰因(兰因絮果)
  7. 基于simulink的模糊PID控制器设计与实现
  8. 设置模式之UML中的类图及类图之间的关系
  9. PowerDesigner生成java类图
  10. C++ opencv基于帧差法的关键帧提取