使用U-Net进行肺结节分割案例分析:DSB3Tutorial
本文要分析的代码作者是jonrmulholland,这里是其链接地址
数据集:LUNA 2016,这里是LUNA2016数据集详细说明链接
重要文件介绍:LUNA_mask_extraction.py,LUNA_segment_lung_ROI.py,LUNA_train_unet.py
第一步:运行LUNA_mask_extraction.py,生产images_#.npy,masks_#.npy
该步骤主要是生产掩码文件,该掩码文件作为实验的输出结果,运行成功后,可以通过下列代码查看结果:
#查看掩码生成的文件
def CheckImageMask():
working_path = "./tutorial/"
imgs = np.load(working_path + 'images_0001_0009.npy')
lungmask = np.load(working_path + 'masks_0001_0009.npy')
# np.set_printoptions(threshold=np.inf)
# print("numpy 打印显示不全处理")
# print(lungmask)
# print(imgs[0])
# print(imgs[0] * lungmask[0])
for i in range(len(imgs)):
print("image:",i)
fig, ax = plt.subplots(2, 2, figsize=[8, 8])
ax[0, 0].imshow(imgs[i], cmap='gray')
ax[0, 1].imshow(lungmask[i], cmap='gray')
ax[1, 0].imshow(imgs[i] * lungmask[i], cmap='gray')
plt.show()
input("hit enter to cont : ")1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
得到结果如下:
第二步:运行LUNA_segment_lung_ROI.py,生产trainImages.npy,trainMasks.npy,testImages.npy,testMasks.npy
该步骤主要进行肺实质的分割,该代码的思路是采用基于二值化的方法,分割好肺实质的后,图像重新resize到512*512,同样的方法对mask结果也进行处理。
第二步完成后,可以通过下列代码查看结果:
def CheckLungMask():
imgs = np.load(working_path + 'images_0003_0024.npy')
masks = np.load(working_path + 'masks_0003_0024.npy')
lungmask = np.load(working_path + 'lungmask_0003_0024.npy')
# np.set_printoptions(threshold=np.inf)
# print("numpy 打印显示不全处理")
# print(lungmask)
for i in range(len(imgs)):
print("image:", i)
fig, ax = plt.subplots(2, 2, figsize=[8, 8])
ax[0, 0].imshow(imgs[i], cmap='gray')
ax[0, 1].imshow(lungmask[i], cmap='gray')
ax[1, 0].imshow(imgs[i] * lungmask[i], cmap='gray')
ax[1, 1].imshow(masks[i], cmap='gray')
plt.show()
input("hit enter to cont : ")1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
结果图如下:
第三步:运行LUNA_train_unet.py,训练U-Net模型
本文使用显卡为GTX1060,设置为20个epoch,训练集大小为307,批量大小为2。 运行后dice系数大约0.3
结果保存在masksTestPredicted.npy中,查看了一下结果:一片黑,没有任何东西
分割效果非常不理想,why? 步骤是完全按照文档一步步进行的
分析原理:
1.查看了部分肺实质分割结果,发现有一下分割效果很差的,难道是因为这样?
2.原实验是使用使用TitanX训练得到的,太贵了,我是买不起,我个人用的是GXT1060,难道是因为这样?
3.dice系数才0.3,这个也太低了
后续继续分析原因…