赞
踩
BraTS全名是Brain Tumor Segmentation ,即脑部肿瘤分割。世界卫生组织(WHO)按细胞来源和行为对脑肿瘤进行分类:
从神经影像学方法对脑肿瘤进行分割是改善疾病诊断,治疗计划,监测和临床试验的关键步骤。需要可靠的脑肿瘤分割来检测肿瘤的位置和范围。
然而,脑肿瘤的准确分割极具挑战性,这些肿瘤几乎可以以任何形状和大小出现在不同的位置。另外,它们通常对比度差,并且肿瘤的强度值可能与健康的脑组织的强度值重叠。
因此,将健康组织与肿瘤区分开来并不容易。解决此问题的常用方法是整合从多种MR模态中获取的信息,模态包括:
根据所需的人机交互程度,脑肿瘤分割方法主要分为3类:
在MR图像中手动分割脑肿瘤是一项非常艰巨的任务,既耗时又受评估者差异的影响。因此,在过去的二十年中,可靠的脑肿瘤自动和半自动分割技术引起了人们的广泛关注,并产生了数百种不同的算法。
这些算法中有许多是在私有数据集上实现和评估的。私有数据集在输入数据(使用的成像方式),脑肿瘤的类型和疾病状态(治疗前或治疗后)方面差异很大,以至于很难比较所提出的分割方法的性能。
为了解决这个问题,自2012年以来,医学影像计算和计算机辅助干预协会(MICCAI)发起了多模态脑肿瘤影像分割挑战(BRATS)。BraTS
数据库包含大量的多模态脑部扫描,可公开获取,并用于开发和测试最新的脑肿瘤分割算法。
BraTS 比赛官方网址:http://www.braintumorsegmentation.org/
BraTS 2015下载地址:https://aistudio.baidu.com/aistudio/datasetdetail/26367
下面,我们就可以从上面的网址中,下载到我们需要的脑肿瘤数据了。若要查看下载下来的图像,我们可以使用标注软件ITK-SNAP
进行查看。其中每一个病例的文件夹下面,都是由这5个文件组成的,(除测试集外,测试集无标签文件),分别是:
文件格式都是.mha
,直接拖动mha
文件到ITK-SNAP
进行查看,记得需要拖动模态文件和OT标签文件,如下展示:
你可能会比较好奇其中的五颜六色的标签,各个颜色代表不同的标签,后面我们会对标签进行数据可视化处理,便于处理。这里可以先看如下描述:
注释:带有手动注释的三种成像模式(A = FLAIR,B = T2,C = T1c
)上的肿瘤外观,以及右侧的三个标签的融合(D)。从左到右,分别是:
医学影像中的数据,大多就那么几个行业标准的数据形式。比如dicom、nii、npz、mhd
等其他格式,尤其是以上述几种数据格式为多。
有些是可以存储二维数据的,例如x
光,有些是存储三维数据的,例如ct、mri
等断层扫描数据。当然在处理这些数据的时候,python
也有专门的第三方库。
更多关于医学数据处理的部分,比如图像转换等等,可以参考这里:nii、npz、npy、dcm 的数据处理,及多目标分割处理汇总
本数据的处理,主要遵循下面步骤:
完整代码如下:
import random
from PIL import Image
import SimpleITK as sitk
def load_mha_as_array(img_name):
"""
get the numpy array of brain mha image
:param img_name: absolute directory of 3D mha images
:return:
nda type: numpy size: 150 * 240 * 240
"""
img = sitk.ReadImage(img_name)
nda = sitk.GetArrayFromImage(img)
return nda
def get_subject():
# **************** get file ****************
path = r'F:\data_sample\HGG\brats_2013_pat0001_1\VSD.Brain.XX.O.MR_Flair.54512.mha'
img = load_mha_as_array(path)
print(img.shape)
for i in range(img.shape[0]):
oneImg_arr = img[i]
print(oneImg_arr.shape)
print(set(oneImg_arr[oneImg_arr != 0]))
np.savetxt(r"img.txt", oneImg_arr, delimiter=',', fmt='%5s')
max_pix = np.amax(oneImg_arr)
label_train = oneImg_arr / max_pix # 归一化
image = Image.fromarray(label_train * 255)
image = image.convert("L")
image.save("./data/Flair/" + "image_" + str(i) + ".png")
if __name__=='__main__':
get_subject()
保存好图像的截图如下:
同理,标签部分的保存同样如此,后面就是
标签文件就是那个带OT
字样的,这里记录了断层扫描每一层的类别标记情况。根据我们从前面用ITK_SNAP
软件可以猜想下,这个标签文件记录的应该是个三维数据,层数据x
每一层的宽x
每一层的高。
下面把这个标签文件单独处理下,直观的看看是什么样子的,代码部分和对上面图像处理的差不多,主要步骤如下:
0、1、2、3、4
,不利于显示直接看下面代码吧:
import random
from PIL import Image
import SimpleITK as sitk
def load_mha_as_array(img_name):
"""
get the numpy array of brain mha image
:param img_name: absolute directory of 3D mha images
:return:
nda type: numpy size: 150 * 240 * 240
"""
img = sitk.ReadImage(img_name)
nda = sitk.GetArrayFromImage(img)
return nda
def get_subject():
"""
label 4D numpy 155 * 240 * 240
"""
# **************** get file ****************
path = r'F:\data_sample\HGG\brats_2013_pat0001_1\VSD.Brain_3more.XX.O.OT.54517\VSD.Brain_3more.XX.O.OT.54517.mha'
img = load_mha_as_array(path)
print(img.shape)
for i in range(img.shape[0]):
oneImg_arr = img[i]
print(oneImg_arr.shape)
if oneImg_arr[oneImg_arr != 0].size > 0:
print(set(oneImg_arr[oneImg_arr != 0]))
np.savetxt(r"img.txt", oneImg_arr, delimiter=',', fmt='%5s')
max_pix = np.amax(oneImg_arr)
label_train = oneImg_arr / max_pix # 归一化
image = Image.fromarray(label_train * 255)
# image = Image.fromarray(oneImg_arr)
image = image.convert("L")
image.save("./data/ot/" + "image_" + str(i) + ".png")
if __name__=='__main__':
get_subject()
生成标签存储到本地的结果:
关于上述生成标签的数据处理详细部分,参考这里:nii、npz、npy、dcm 的数据处理,及多目标分割处理汇总
对医学数据了解多了,你就会发现。医学数据的存储形式、标签存储形式几乎都是大同小异,甚至可以说就是一样的。
本文中的脑补肿瘤分割挑战赛的数据不一样的地方就是,它是多模态的,光输入数据就是4个模态,每一个模态都是一个三维的断层扫描数据。
这也就意味着,输入数据更复杂了。4个模态输入,对应预测1个输出。一般的断层数据,比如CT数据预测肺癌结节的LIDC
数据,是1个三维数据,对应到1个输出,就简单了很多。
到这里,了解了一些基本的数据结构和内容,包括:
155*240*240
,150层240*240
的断层扫描由上面的不一样,自然也就成了后面设计网络时候的创新点。思考两个问题:
本系列接下来的几篇文章,就是对上述问题进行拆解。有训练和测试的代码?关注不迷路,敬请期待。
参考文章:
1.使用多模态脑部扫描数据的自动脑肿瘤分割
2. lstm_multi_modal_UNet
3.医学影像数据集集锦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。