返回列表

2nd place solution

567. Google Research - Identify Contrails to Reduce Global Warming | google-research-identify-contrails-reduce-global-warming

开始: 2023-05-10 结束: 2023-08-09 双碳与可持续发展 数据算法赛
2nd place solution - 谷歌Research: 识别凝结尾迹以减少全球变暖竞赛

2nd place solution

作者: Iafoss
发布日期: 2023-08-10
团队: Theo Viel, Iafoss, DrHB
竞赛排名: 第2名

摘要

  • 定制化U形网络,采用CoaT、NeXtViT、SAM-B和tf_efficientnetv2_s骨干网络
  • ×2(使用像素重排将预测上采样至256×256)和×4输入上采样:预测的像素级精度至关重要
  • 图像序列:LSTM、Transformer、卷积时序混合
  • 不使用翻转和90度旋转增强(也不使用TTA),因为掩码存在偏移
  • 在软标签上训练:标签 = 所有标注者的平均值
  • BCE + dice Lovasz损失

代码

我和@drhabib的部分(包含表现最佳的CoaT_ULSTM模型)
@theoviel的部分
推理

引言

我们的团队要感谢组织者和Kaggle使这场竞赛成为可能。同时,我想对我出色的队友@drhabib@theoviel表示诚挚的感谢,感谢他们为我们最终成绩做出的不可思议的贡献。

详细方案

本次竞赛面临两个主要挑战:(1)噪声标签;(2)像素级精度要求。(1)如果查看所有标注者的标注,会发现存在明显的意见分歧。通过使用软标签(所有标注者标签的平均值)进行训练,可以部分解决这个标签噪声问题。然而,由于评估需要使用硬标签,模型的主要失败案例集中在决策边界附近的凝结尾预测,这是无法避免的。(2)模型真正能够解决的问题是实现预测的像素级精度。由于凝结尾迹仅数像素宽,边界横向方向上即使一个像素的错误也可能导致作为评估指标的dice分数显著下降,因此像素级精度非常重要。对于这样的任务,典型的解决方案是对模型输入进行上采样,或在分割模型中用转置卷积或像素重排上采样替代最终线性上采样。与直接使用原始分辨率的模型相比,这一改进在初期实验中带来了显著提升。

数据

根据组织者的论文,我们使用"ash"假彩色图像,分别考虑12 μm波段、12与11 μm波段之差、以及11与8 μm波段之差。我们也尝试使用所有波段或将"ash"彩色图像扩展至8、10、12 μm,但性能反而下降(第一个卷积的预训练权重被复制)。我们推测"ash"彩色图像的最佳性能可能是由于标注者使用了这类图像,从而引入了标签噪声偏差。在我们的实验中,CoaT和NeXtViT模型通过双三次插值将输入上采样×2,SAM模型上采样×4。EfficientNet模型使用原始输入,但第一个卷积块的步幅设为1,相当于×4输入上采样。

模型

本次竞赛的有趣之处在于模型需要同时完成两个任务:(1)跟踪全局像素依赖关系,因为凝结尾迹非常细长;(2)能够生成像素级精度的预测,因为凝结尾迹仅数像素厚。(1)可以通过Transformer解决,而(2)则通过卷积网络或局部注意力解决。在竞赛中,我们尝试使用SAM-B ViT骨干网络和EfficientNet v2纯卷积网络独立解决这些问题。此外,还有一类具有层次结构的Transformer网络,能同时解决这两个问题,包括CoaT(在我们的实验中表现最佳的单模型)、NeXtViT、MaxViT(我们错过了)以及Segformer中的MiT Transformer(遗憾的是由于许可证问题无法在竞赛中使用)。

对于解码器,我们考虑了 vanilla U-Net解码器(EfficientNet模型)或更定制的U-blocks,使用像素重排上采样和因子化FPN(CoaT、NeXtViT、SAM)。在这些块中,我们将BatchNorm替换为LayerNorm2d,以便在低批量大小下获得适当的模型收敛性,并使用GELU替代ReLU激活函数。

时序混合

除了单帧模型的初始运行外,我们还进行了图像序列实验。在我们的最佳设置中,多帧模型获得了约0.01的改进。由于图像采集存在相当大的时间延迟,帧间云层的位移巨大(约10-30像素),且因输入上采样而恶化,因此基于3D卷积或窗口注意力(VideoSwin)的视频模型在此问题上效果不佳。同理,早期混合或混合顺序模型预测的方法也不太可能奏效。因此,在中间特征图尺度(如res/32和res/16)进行混合最有前景:即使云/凝结尾定位不准,低分辨率特征图仍能较好对齐。在CoaT模型的实验中,当考虑两个低分辨率特征图(res/32和res/16)时性能最佳。时序混合模块的输出以及其余特征图的输出在第4帧处汇集,解码器仅看到对应帧的输入。

作为时序混合模块,我们考虑了LSTM(性能最佳)、1D时序卷积和Transformer。LSTM(1层)和1D时序卷积仅沿时序维度进行混合,空间依赖关系由骨干网络和解码器处理。Transformer混合旨在通过同时处理时序和空间特征混合来实现隐式特征图配准,即使空间未对齐也能匹配。具体实现方式为:为每个帧的特征图添加编码以区分,然后将所有帧的标记展平为单个序列,通过2个Transformer解码器块处理。Transformer的Key和Value输入是所有帧的连接序列,而Query仅来自第4帧的标记序列。遗憾的是,基于Transformer的混合性能略低且训练稳定性较差。但我们仍保留两种方法在最终集成中,以获得更好的多样性。

在CoaT/NeXtViT实验中,我们遵循组织者的论文,选择前5帧作为输入。EfficientNet实验使用4帧输入(第2-5帧,标注帧前2帧和后1帧),采用双向LSTM。这种帧选择源于标注指南要求凝结尾迹至少在两个连续帧中出现。SAM模型因显存需求大,仅考虑3帧(标注前后各1帧)的1D卷积混合,这在推理时也是问题。

我们曾考虑显式配准输入帧以使凝结尾和云层在帧间对齐(时序混合最有效),例如使用光流。但图像不仅包含云层,还有不动的地表,或向不同方向移动的多层云,因此无法实现帧配准。我们也考虑过基于预测凝结尾进行配准,但由于凝结尾迹逐帧出现和消失,此方法也不可行。

伪标签(PL)

除了竞赛数据,我们还收集了"Contrails GOES16 Images May"数据集(单帧设置)。我们将图像分割为256×256的瓦片并部分重叠,基于最佳单帧模型集成生成掩码。该数据已共享为Kaggle数据集。该数据用于某些实验中单帧设置的模型预训练,随后在单帧或多帧设置中微调。使用伪标签显著提高了单个模型(fold)性能,但即使每个fold的微调模型使用独立训练的伪标签模型,模型多样性仍会降低。因此,所有fold平均预测的性能与不使用伪标签的设置相当。

我们还尝试在外部数据+未标注竞赛帧上进行伪标签训练,但在微调单帧模型时未带来收益。由于这种预训练可能影响多帧模型,生产实验中仅在伪标签步骤使用外部数据。

训练

CoaT和NeXtViT模型: 使用Over9000(Radam+LAMB+LookAhead)优化器训练24个epoch,学习率3.5e-4,权重衰减0.01。该优化器与CoaT兼容性极佳。伪标签预训练在外部数据上进行12个epoch,然后CoaT模型微调12个epoch,NeXtViT模型微调18个epoch。

EfficientNet模型: 在单帧设置下预训练100个epoch,使用CutMix增强,学习率1e-3,AdamW优化器,权重衰减0.2。预训练期间伪标签数据比例线性降至零。然后在图像序列设置中微调,编码器学习率3e-5,解码器学习率1e-4。外部数据预训练显著增强了2D模型,因此最终集成中未考虑多帧EfficientNet模型。为增加多样性,我们还预训练了200个epoch的模型,以及全量训练(包含验证集)的模型。

SAM模型: 最终提交仅包含单帧SAM-B ViT模型。训练时先冻结编码器训练10个epoch,然后解冻继续训练20个epoch。使用AdamW优化器,编码器学习率4e-6,解码器学习率4e-5。

训练中使用ShiftRotateScale、RandomGamma、RandomBrightnessContrast、MotionBlur和GaussianBlur增强。未使用翻转和90度旋转增强,因为它们导致性能下降。所有生产模型均进行5-6折训练,各折使用不同随机种子在整个训练集上训练,评估在提供的验证集上进行。此策略是因为标准K折分割的交叉验证会因训练数据中瓦片的空间重叠而高估CV。

损失函数

使用BCE + dice Lovasz损失。第二项是Lovasz损失的改进版:(1)ReLU替换为1 + ELU;(2)使用对称版本;(3)用dice最大化替代IoU。第二项对单个模型性能提升甚微,但使dice相对于阈值选择具有更宽的最大值,即性能对阈值选择的依赖性减弱。这一特性对避免因阈值不当在private leaderboard上的shakeup至关重要,也更有利于有效集成。

结果

最终模型性能如下表所示。Ex表示伪标签设置模型(EfficientNet仅使用伪标签训练)。后缀U表示单帧模型,UT表示基于Transformer的时序混合,ULSTM表示基于LSTM的时序混合。阈值选择基于最大化CV的搜索,大多数模型为0.46-0.50。

最佳单模型

我们最佳单模型是CoaT,5折获得0.7039 CV、0.71790 private LB和0.71243 public LB。单折CV为0.6960±0.0003(在验证集上评估)。仅用此单模型我们就能获得竞赛前4名

集成

最佳集成由8个模型组成,权重选择使各组件贡献大致相等:CV为0.7140(评估集),0.72574 public LB和0.72304 private LB。模型及其权重如下表所示。EfficientNet包含3种设置(100 epoch、200 epoch和全量训练),总权重为1。

模型执行时间

CoaT和NeXtViT模型: 单帧模型每折训练时间2小时,多帧模型8小时(2×RTX4090 GPU)。Kaggle(P100)上多帧模型推理时间5折共35分钟。

EfficientNet模型: 100 epoch每折训练时间3小时45分钟(8×V100 GPU)。Kaggle(P100)推理时间6折共20分钟(含数据加载)。

SAM模型: 每折训练时间16小时(2×A6000 GPU)。Kaggle(P100)推理时间5折共48分钟(含数据加载)。

我们错过的事项

(1)竞赛期间一个令人惊讶的发现是,翻转和90度旋转增强导致性能下降。我们将其归因于盛行风和云/凝结尾的特殊形状。赛后发现掩码偏移了0.5像素,使得翻转不适用。如果修复此问题,翻转/90度旋转增强可使有效训练数据集扩大8倍,并通过测试时增强进一步提升推理性能。因此,我们的模型性能还有显著提升空间。

(2)外部数据上的伪标签单模型预训练对单帧模型CV提升适中(但private LB提升显著)。然而,这种单帧预训练对序列模型帮助不大。因此,收集外部序列数据+适当重投影可能成为序列模型更好的预训练策略,我们有望获得与单帧模型相当的提升。

同比赛其他方案