肺結節檢測:數據簡介和處理
為了便於后期的學習和交流從今天開始會記錄在肺結節檢測過程中的學習進展。
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)