肺结节检测:数据简介和处理
为了便于后期的学习和交流从今天开始会记录在肺结节检测过程中的学习进展。
1、相关数据集的介绍
1.1 LUNA2016
LUNA 2016 数据集来自2016年 Lung Nodule Analysis 比赛, LUNA16数据集是最大公用肺结节数据集LIDC-IDRI的子集,LIDC-IDRI它包括1018个低剂量的肺部CT影像。LIDC-IDRI删除了切片厚度大于3mm和肺结节小于3mm的CT影像,剩下的就是LUNA16数据集了。
数据链接:https://pan.baidu.com/s/1Kn-sllpFlYRQ3iLlPitBWg 提取码:wkwa
其数据集的文件内容如下:
- subset0.zip~subset9.zip 包含所有CT图像的10个zip文件,数据格式为“.mhd”,“.raw”, mhd 是说明文件(下面将详细的介绍)、raw是具体的数据信息。
- CSVFILES文件夹,包括3文件:annotations.csv,candidates.csv,sampleSubmission.csv
- annotations.csv:1186个肺结节信息,字段有seriesuid, coordX, coordY, coordZ, diameter_mm
- candidates.csv:一共551065条数据。其中,正例(class:1):1351条,其余都是负例(class:0)
- sampleSubmission.csv:正确格式的提交文件示例。
1.1.1 mhd 文件的介绍
1 ObjectType = Image 2 NDims = 3 #三维数据 3 BinaryData = True #二进制数据 4 BinaryDataByteOrderMSB = False 5 CompressedData = False 6 TransformMatrix = 1 0 0 0 1 0 0 0 1 #100,010,001 分别代表x,y,z 7 Offset = -195 -195 -378 #原点坐标 8 CenterOfRotation = 0 0 0 9 AnatomicalOrientation = RAI 10 ElementSpacing = 0.7617189884185791 0.7617189884185791 2.5 #像素间隔 x,y,z 11 DimSize = 512 512 141 #数据的大小 x,y,z 12 ElementType = MET_SHORT 13 ElementDataFile = 1.3.6.1.4.1.14519.5.2.1.6279.6001.173106154739244262091404659845.raw #数据存储的文件名
1.1.2 python读取mdh的方法
mhd已经交代了图像数据的信息,接下来对图像数据进行读取,这里主要用的Python中的SimpleITK库。在这里要注意SimpleITK 读出的数据是(在,y, x),因此在数据进行转换的时候一定要注意。
def load_itk_image(filename):
# filename 是mhd文件地址, 返回的是图像矩阵信息和相关的偏移信息 with open(filename) as f: contents = f.readlines() offset = [k for k in contents if k.startswith('Offset')][0] # 偏移值 EleSpacing = [k for k in contents if k.startswith('ElementSpacing')][0] # 把值进行提取 offArr = np.array(offset.split(' = ')[1].split(' ')).astype('float') # (x,y,z) eleArr = np.array(EleSpacing.split(' = ')[1].split(' ')).astype('float') # (x, y,z) itkimage = sitk.ReadImage(filename) numpyimage = sitk.GetArrayFromImage(itkimage) # (z, y, x) return numpyimage, offArr, eleArr
1.1.3 坐标转换
annotations.csv中提供了医生标注肺结节位置信息, 其中 seriesuid:表示每个病例图像对应的文件名,coordX,coordX,coordX,diameter_mm:表示医生标注的结节位置信息和直径。在使coordX用卷积网络对肺结节进行检测时,我们需要根据医生提供的标注信息,在图像中找到相应的肺结节位置,接下来说医生标注的坐标与图像中的坐标的关系。mhd中给定了图像中的原点坐标为(-195 ,-195 ,-378) #x,y,z, 像素间隔为(0.7617189884185791,0.7617189884185791,2.5) #x,y,z。通过以上信息可以计算结节相对原点的坐标,然后用这个坐标除以像素间隔,即为在图像中对应的结节位置。
1 import numpy as np 2 3 def worldToVoxelCoord(worldCoord, origin, spacing): 4 # 将世界坐标转化为图像坐标 5 stretchedVoxelCoord = np.absolute(worldCoord - origin) 6 voxelCoord = stretchedVoxelCoord / spacing 7 return voxelCoord 8 9 def VoxelToWorldCoord(voxelCoord, origin, spacing): 10 # 将图像坐标转化为世界坐标 11 strechedVocelCoord = voxelCoord * spacing 12 worldCoord = strechedVocelCoord + origin 13 return worldCoord
1.1.4 LUNA2016 数据的批处理以及肺结节图像显示
我们采用深度学习的方法先将肺部区域分割出来(具体见下面代码),然后再利用标注的信息将其写入到XML文件中用于后期的检测任务。
肺部分割模型:
整个处理过程的输出有4个:1)AddLabel 用于记录肺结节结果的显示;2)npy 用于记录原始的图像信息(未经过调窗的);3)4)的结果放在同一个文件夹下,bmp图像是调窗后的医学图像,XML对应的是其标注的相关信息
2、天池大赛肺部结节智能诊断数据
天池大赛肺部结节智能诊断(https://tianchi.aliyun.com/competition/entrance/231601/information)