本文是对论文:DeepLung: Deep 3D Dual Path Nets for Automated Pulmonary Nodule Detection and Classification中所开源的代码的复现。
代码地址:https://github.com/wentaozhu/DeepLung
拿到代码首先运行./DeepLung-master/prepare.py进行数据预处理,将config_training.py中的地址改为自己本地的地址即可运行成功。
预处理的工作是使用LUNA16数据集中所有的肺部数据 (mhd格式),肺实质分割数据(mhd格式),肺结节标签数据(csv格式)转换为numpy格式。转换后的文件存储在subset0~subset9中。
每个文件夹中的每个case有6个对应的标签数据。_clean存储CT坐标(关于左边请参考上一篇文章)下裁剪肺实质的最大外接立方体后在扩充若干像素值的肺部数据,_extendbox存储肺实质的最大外接立方体扩充后的box,_label存储CT坐标下的肺结节坐标及半径,_mask存储肺实质的二值图,_origin,_spacing存储CT坐标下的原点与像素间隔。
预处理的重点函数为:
def savenpy_luna(id, annos, filelist, luna_segment, luna_data,savepath):
# 处理某个subset中的某个数据
islabel = True
isClean = True
resolution = np.array([1,1,1])
# resolution = np.array([2,2,2])
name = filelist[id]
# 读取CT图像并转换为numpy格式,在这个过程中直接把CT坐标下的图像转为图像坐标下
# 这步要理解坐标的转换,否则对后面的理解会很有困难
sliceim,origin,spacing,isflip = load_itk_image(os.path.join(luna_data,name+'.mhd'))
Mask,origin,spacing,isflip = load_itk_image(os.path.join(luna_segment,name+'.mhd'))
if isflip:
Mask = Mask[:,::-1,::-1]
# CT坐标下的图像大小 单位是mm
newshape = np.round(np.array(Mask.shape)*spacing/resolution).astype('int')
# 0代表背景 3代表左肺 4代表右肺 5代表血管
m1 = Mask==3
m2 = Mask==4
# 左肺右肺掩膜
Mask = m1+m2
# Mask中为True的三维坐标 索引,也就是肺实质的范围索引
xx,yy,zz= np.where(Mask)
# 含有肺实质的最小外接立方体
box = np.arra