天池宫颈癌智能诊断赛后总结——目标检测

新年伊始,结束了这场持续两个多月的比赛。总体来说,收获蛮多,对于比赛也有了新的体会。

战绩是初赛排名12,复赛排名35,无缘决赛。

赛题背景:

数据探索性分析

解决方案

后记

赛题背景:

主办方要求综合运用目标检测、深度学习等方法对异常鳞状上皮细胞进行定位以及对宫颈癌细胞学图片分类,辅助医生进行诊断。

样本包括两大类:有目标的样本(1440个)和没有目标的样本(250个)。

其中有目标的又可以分为阳性和阴性两类,阳性包含{ ASC-H, ASC-UC, HSIL, LSIL},阴性包含{ Candida,Trichomonas }。通过对训练集的label统计分析,发现阳性和阴性的不会同时出现(显而易见的结论),同时阴性的两类也不会出现在同一个样本中,以上皆为统计数据,疾病原理上并不清楚。

所以就按照6类目标检测问题进行解答。

数据探索性分析

                 天池宫颈癌智能诊断赛后总结——目标检测_第1张图片                           天池宫颈癌智能诊断赛后总结——目标检测_第2张图片

                 天池宫颈癌智能诊断赛后总结——目标检测_第3张图片                           天池宫颈癌智能诊断赛后总结——目标检测_第4张图片

从上面几幅图可以看出:

  1. 不同类疾病的数量具有差距,最大的比例有1:7,考虑样本不平衡的问题
  2. 绝大多数样本尺寸过大,不能直接送进网络,考虑了滑窗切片
  3. bbox的尺寸分布范围大,且小目标占比也很大。我认为这是本次赛题的关键地方
  4. bbox的ratio并没有差距很大,所以以往改变anchor ratio的方法,效果应该不是很大
  5. 从病理图片来看,病灶和背景区别很不明显
  6. 同一疾病不同染色情况下,样本的色调差距较大(见下图样例)
  7. 病灶区并不是规则的矩形,没有填满bbox框

         天池宫颈癌智能诊断赛后总结——目标检测_第5张图片    天池宫颈癌智能诊断赛后总结——目标检测_第6张图片     天池宫颈癌智能诊断赛后总结——目标检测_第7张图片

解决方案

模型的选择

主要是找了别人造好的轮子,这里选择了mmdetection,试了两个模型Cascade-RCNN和Retinanet

天池宫颈癌智能诊断赛后总结——目标检测_第8张图片  天池宫颈癌智能诊断赛后总结——目标检测_第9张图片

初赛的时候两种都试过,表现差不多,Retinanet会好一点。复赛的时候Cascade-RCNN的效果一直很渣,所以就放弃了。考虑原因是评分标准的原因,初赛使用了0.3@mAP和0.5@mAP,所以Cascade-RCNN的多head优势可以发挥,复赛的评分只有0.5@mAP。另外由于Cascade模型太大,训练时间长,主办方只给了2张卡,8核的CPU,完全失去了初赛实验室8卡,22核的优势。

Tricks

Trick1:Deformable Convolutional Networks(DCN),这个trick的使用应该已经算是约定俗成的了吧,反正用了一般都会提分,这里也是为了解决问题7.

Trick2:NMS大法。因为问题2已经说明样本尺寸太大,采用了滑窗的方法,这样带来的问题必然是同一个病灶区会有多个bbox,所以需要滤掉。这个大法是实验室师兄大佬(斩获阿里达摩院高级算法工程师offer)告诉我的。这个涨分还是比较明显的。当然这个只能叫后处理,不能叫trick了吧。

以下的Trick试过之后,基本没啥用,所以呢可以看出我只是训了训模型而已。

Trick3,先使用二分类模型将样本分为两大类,这里没有效果的原因考虑是:复赛的时候样本差距比较大(1440:250),所以就用了初赛的预训练模型(初赛这个方法应该是涨了2个百分点)。但是初赛把阴性目标放在了没有目标里面,所以两个数据分布并不一样,初赛预训练权重应该是不能用,复赛也存在目标检测是结果为空的情况所以就没有使用二分类。

Trick4,Max Score Post-Process,这个是建立在先不进行二分类,直接对所有样本进行目标检测,然后看每个样本中最大的score是否大于某个阈值,如果不大于则认为该样本中没有目标。是存在一些样本的最大score小于0.3的情况,但是使用这个方法之后降分了,所以就弃用了

Trick5,Small Object Detection Expert Model,这个主要是针对小目标来做的,因为考虑到bbox较小的目标,所以滑窗的size设置了256*256, 512*512,结果不知道是因为切割的时候除了问题,还是这种思路就有问题,导致模型预测的结果表现出欠拟合的样子,稍微有点像病灶的细胞组织都被标出来了。可能是我的打开方式不对吧。

Trick6,设置不同的score阈值来过滤目标,即预测目标的score小于某个阈值的时候丢掉这个bbox。尝试了阈值从0.005 到 0.8的变化,还是0.005的阈值好,没有试过更小的阈值,如果更小的阈值还可以涨分,那我可就冤死了。可视化的结果表明,那些score低的bbox就是在瞎框,所以总觉得这个评分标准有问题。是不是应该研究一下,提个更好的指标,然后发篇CVPR,AAAI等等的顶会,哈哈哈.....我又在做梦。

Trick7, 分析不同标签之间的关系,鉴于最后实在是黔驴技穷了,所以就考虑再做一下后处理吧。分析了训练集的标签规律,发现阳性的目标不会和阴性的目标同时出现,阴性的两类目标也不会同时出现,线下一顿操作猛如虎,涨了3个千分点,线上一试,疯狂掉分。

后记

写到这里本次比赛的所有骚操作都写完了,并没什么创新点,菜鸟依旧是菜鸟,但是通过这次比赛能更理性地看待比赛这件事了,之前老幻想着比赛夺冠,喜提几十万奖金,现在想想,按照这样的技术水平能获奖就怪了。下面是自己的一些心得体会,用来自勉,别无它意。

  1. Trick终究只能是trick,本身的问题应该在于模型和实际问题的结合,这也是搞研究应该注重的。有时候在想,像何恺明这样的大牛,如果由他们出面解决这些很实际的问题会是怎样的,提高各种SOTA是很关键,但是如果不落地终是问题啊,所以后面应该不会怎么参加比赛了,可能更多的精力会放在对于模型的理解以及与实际问题结合上面了。
  2. 数据探索性分析的重要性,如果只用现有mAP高的模型,大模型,这样试图找出一个好的baseline应该是有问题的,只有对业务的充分理解,才能对症下药。关于本次赛题的小目标问题,是在比赛结束前10天分析到的,而且还训练了两版没有用的模型,就是吃了没有认真分析的亏。
  3. 模型复现的能力,关键的技术能力。拿别人的东西来用,终究只能小修小改,同时自己的思维也会受到限制,所以应该闲暇时候就多练练自己造模型的能力。
  4. 不要做一个坑比的人。初赛使用的是本地的IDE可以断点debug,复赛阿里云PAI平台就是个巨坑,不能debug,导致很多bug没有及时发现,出了问题只能一点一点的分析测试。所以写代码的时候还是要对每一部分精细思考,做好测试。另外便是答应了别人的事情就要尽力去完成,不要满嘴的答应,结果手上不行动,这样愿意合作的人只会越来越少。

你可能感兴趣的:(机器学习)