kaggle Human Protein Atlas 比赛总结

前言

这个是要被队友借去改改发知乎上的
给别人写的不能像自己的凑合,所以这次写的总结会比以往的都正式很多。。
此次比赛和队友一起拿下了金牌,最终名次11/2172
原本是想着积分榜第一的巨佬bestfitting公开方案后写个方案汇总的
但怕是等不到了。。。
这个比赛是对于believe your cv的死教条的一个很好的反面示例
那些不会依据客观事实变通只知道守着死教条的人都死得很惨!!!

比赛介绍

任务介绍

本次比赛的问题是场景识别
定位的是蛋白质所处位置的识别,例如在细胞液,细胞核里之类的
依输出分所属多标签分类

难点及数据介绍

首先一张示例图如下
这里写图片描述

1) 一个样本由四个”通道图”组成(分成四张存储,每个”通道图”单通道),2048*2048大小,官方提供了插值缩小为512大小的数据
2) 外部数据70k(每个”通道图”都是rgb格式)
3) 图片伪重多,然后四个”通道图”,id相同但实例不同的情况也很多,如下
这里写图片描述

1),2)对比我们发现了外部数据总共有4 3个通道,而官方数据只有4 1个
这便带来了第一个难点,如何处理外部数据
2),3)最麻烦的是伪重问题,伪重造成验证集leak,不能制作一个好的验证集

外部数据处理后加入训练集,要制作一个好的验证集就得跨过两道坎

  1. 外部数据无论咋处理总是和测试集分布有些不一样的
  2. 训练集里伪重过多,如何保证验证集不leak

这个问题貌似只有bestfitting解决了,但是他还没公开方案。。。
1)2)3)共同造成的线下val的不可靠,这时候线上比线下可靠,但仍需注意不要过拟合线上

our solution

model config1

  1. 数据增广(亮度对比度调整,crop_resize,flip,other)
    我们总共用了12倍的TTA
    亮度对比度主要用于让模型对外部数据和官方数据差异的鲁棒性更好
    crop_resize对于显微镜下实例大小方差巨大的情况,带来了较好的线下收益
    受限于调试成本,为了不避免数据增广带来的分布偏移问题,于是只选择性的尝试了上述几种,不过也一蒙及中。
  2. Models
    res18 (batchsize=64)
    res34 (batchsize=32)
    bninception (batchsize=32)
    inceptionv3 (batchsize=32)
    xception (batchsize=24, P40-24G)
    se-resnext50(batchsize=24, P40-24G)
    其中模型对batchsize大小十份敏感,正确来说是模型对参与batchnorm计算的样本数十分敏感,需用sync-bn或者P40(24G)显存实现
  3. lr schedule
    Nadam优化器
    阶段性学习率衰减
    差分学习率(其中初层用于转换通道的卷积和最后的model head同学习率,中间的backbone学习率小一倍)

model config2

这个方案来自后来加入的队友shisu
只简述一下差异的部分

  1. lr schedule
    SGD 优化器
    cosine lr
  2. model
    res18/34 (96batchsize + softf1_loss + float16 + 过采样)
    巨型图片1024*1024上训练出来的(我们只有他成功下载了这部分数据,帮不了他了)

postprocess

基本是利用了伪重的性质
将测试集中的相似图片的预测进行共享,其中预测选择图片质量较高的那张,约0.002的收益

ensemble

外部数据灰度化和外部数据取高范数的通道两种方案得到了两份数据
两份数据上训练出来的模型进行差异化集成
model config1 和 config2进行集成

写到最后

附上其他高质量的分享,个人感觉都不是很新颖
8th place solution
7th place solution
4th place solution
3th place solution
12th place solution
看完这些,会看到有部分LSEP loss,GapNet,autoAugment等花哨的东西
但私以为仍不是重点
其中各种大小的图进行ensemble才是重点,特别是1024*1024 。。。
正确的数据增强和不要太低的线上

其中一个比较具有通用性的trick,可供大家参考
https://www.kaggle.com/c/human-protein-atlas-image-classification/discussion/76665
图片分成多个patch,将baseline模型对这些块输出分数
拿那些响应最高的patch重新训练一次模型
相当于一个hard attention