廖方舟谈Kaggle结节识别比赛经验
20170511@FIT小报告厅 logged by Sijie
一、基本背景:
1)肺癌早筛的重要性
2)比赛训练数据集包含
- 每个病人的二值数据,1/0(一年内病人是否得病);
- 每个结节的位置;
- 辅助数据集——没有标结节的位置的CT图(但是他们把它人为标了一下)
3)从数据的角度看,比赛的难点:
- 病灶尺寸差异非常得大;
- 病灶形态学特征差异非常大
- 有病灶未必就有病,没病灶未必就没病;
二、数据预处理
1)二值化,分出肺区域和非肺区域
2)形态学运算填充气管
三、分析流程
1)Nodule Detection(粗筛)
基于3D CNN,用128x128x128的cube扫描扫描整个肺区域,返回每个cube中包含结节的概率。
2)Nodule Classification(精筛)
将概率最高的5个cube拿来,并且引入一个dummy nodule,用Fast-CNN来计算出这个病人有癌症的概率(廖方舟称之为confidence)。
引入dummy nodule是为了对付没病灶但是有病的情况。
注意,detection和classification的网络是连在一起的(上图绿色部分和双层蓝色),训练过程中梯度能够传递。
3)判断是否是癌症:
再根据confidence做个贝叶斯二分类(cancer/non-cancer)
四、样本不平衡的问题
1)大结节数量少,但是对于判断癌症的重要性高(图中可以看出cancer group的结节直径要偏大一点),所以在采样的时候多采大尺寸结节。
•Balancing sample numbers
•Diameter>6: x 1
•Diameter>30: x 3
•Diameter>40: x 7
2) 扔负样本
Detection 结果中概率排名top5以外还有一些概率排名较高的cube,从这些cube中取负样本。
3) 强化正样本
在正样本cube中,选取其他点作为cube中心,作新cube作为新正样本。
五、其他问题
1) 比赛的“黑幕”
有的人偷数据刷lead board, 结果过拟合了,搬起石头砸自己的脚。
2) PyTorch多线程生成随机数时种子一样,多个线程实际上生成完全一样的随机数