Data Science Bowl 2018 比赛小结
Contents
Kaggle 实例分割比赛小结. 比赛花了我1800在阿里云上训练模型, 最后还因为没提交模型的checksum而取消了成绩.
包大人, 冤啊!
难点
- 训练数据少. 黑白600, 彩色100
- 细胞核形状多样, 有的十分细长
- 细胞核紧挨, 有重叠部分, 难以使用unet区分(unet先预测mask再用watershed(分水岭算法)分割)
- 黑白染色和彩色染色的图片细胞核区别显著. 彩色图片训练数据少, 颜色种类不同, 模型表现差
- 测试集具备训练集没有的细胞核类型. 甚至教科书中的手绘插图
解决方案
实例分割可用选项:
- U-Net, 比赛初期的主流选择. 这是二分类网络, 且只能用于语义分割而不是instance level的实例分割(无法区分不同细胞核), 需要用后处理(watershed算法)分割拥挤细胞核. 直觉上比Mask RCNN这种自带目标检测的有劣势
- FCIS(全卷积网络用来做实例分割), 比U-Net的优势是可以做实例分割, 实际上就是先detection之后, 开一个新分支, 把ROI进一步划分(成9块), 专门判断ROI里面那些内容是前景. 这么做还是比较粗糙, Mask RCNN论文里也提到 But FCIS exhibits systematic errors on overlapping instances. 对重叠部分表现很差.
敲定Mask RCNN之后, 选择合适的Backbone.
Mask-RCNN base model
- SE-ResNeXt50-FPN BackBone, 训练集不大, 所以需要一个尽量小巧并且高效的Backbone. 最初想到的是ResNet50. 做了一些research之后发现还可以用Xception里depthwise conv进一步减肥, 于是使用ResNeXt50. 这场比赛比较大的困难是不同图片里的细胞核大小天差地别, 因此很自然上FPN. 最后实验性地加入了SE 模块, 免费提分的工具何不试试.
- 图片尺寸只有256, 而coco数据集图片一般是1024*1024尺寸的. 因此取消ResNeXt的conv1的pooling层获得类似尺寸的FPN-Feature Map
- 更多细长比例Anchor Boxes捕捉细长并紧挨的细胞核, 并且根据mask绘制更紧密的gt(训练集只提供了mask). 但是考虑到太过细长的anchorbox超出了3x3卷积核的感受野, 是不是需要更丰富的卷积核呢?(提升点)
- RPN的cls head使用了focal loss, 这样也避免了OHEM的复杂性. reg head使用了weighted_smooth_l1, 加上了权重, 给foreground和scale较小的实例更高的权重
- UnitBox用于bbox regression, UnitBox: An Advanced Object Detection Network: RPN的Reg Head原来使用的是weighted_smooth_l1, (未来得及使用iou loss替代, 提升点. 因为有大量紧密重叠的细胞核, 类似于人群中人脸识别的特点, iou loss对小的细胞核有帮助, 可以回归得更准确) 使用UnitBox的encoding方式主要是因为没有exp, 而训练伊始exp这部分很容易爆炸, 强制做clip收敛又慢, 因此做了这样的改进.
- 因为是细胞核(偏向于圆形)且为二分类, Mask Head使用Dice Loss, 比cross entropy效果更好一些. dice loss蕴含了强调了中心点的重要性. 因为最难处理的情况是proposal包含了拥挤的细胞核, mask head的任务是找出中心的细胞核.此时mask的每一个pixel都是相同的权重, 这不符合直觉, 需要dice loss来进行强调
预处理
- CLAHE(限制对比度自适应直方图均衡算法), 对医学图像增强效果好
- Stain Normalize: A. Vahadane et al., ‘Structure-Preserving Color Normalization and Sparse Stain Separation for Histological Images 维持不同染色细胞颜色统一
Train Time Augment
- 随机裁剪到256*256, 若不够则zero padding维持长宽比
- 0.5~1.5的随机缩放
- 水平/垂直翻转
- 90°旋转
- 随机高斯模糊
- 高斯噪音
- 随机对比度
- random_hue_transform做数据增强: 有彩色和黑白图同时存在, 彩色图片染色风格不同
Test Time Augment
- padding 到anchor的整数倍, 保证anchor可以覆盖到边缘
- scale: 0.6, 0.8, 1.0, 1.2, 1.4, rotate: 90, 180, 270
- 把做了各种增强之后的rpn proposal ensemble, 之后再nms
- mask instance clustering. 以iou为依据进行聚类, 聚类核心为所有mask的交集(按交集/并集处理之后发现交集比较好)
- mask instance ensemble, 叠加之后取均值. 最佳阈值根据验证集计算出
- 根据mask 尺寸进行false positive suppression, 由于基本策略是先提升recall, 再抑制FP, 由于同一张图里的细胞大小差异不会过于悬殊, 因为是显微镜拍摄的图片, 显微镜中是切片, 细胞核距离镜头都是一样的. 直接使用一维异常值检测算法MAD(平均绝对偏差)过滤小的mask. 一开始使用DBSCAN, 后来发现MAD更快而且效果差不多. 因为这个任务比较简单.
训练策略
- Cyclical Learning Rates for Training Neural Networks, SetpLR, DecayLR, etc, 最后还是用了StepLR
- 训练时的run-in: 初始阶段每个batch中掺入了小部分gt, 既保证了RCNN能有输出, 也保证了Mask head快速收敛. 否则需要很长时间才能收敛. 后期撤除gt
- 训练流程是依次训练三个head, 最后一起训练
Winner Strategy
待续