廖方舟谈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多线程生成随机数时种子一样,多个线程实际上生成完全一样的随机数