返回列表

7th place solution

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

开始: 2023-05-10 结束: 2023-08-09 双碳与可持续发展 数据算法赛
第7名解决方案 - Artyom Malakhov

第7名解决方案

作者:Artyom Malakhov(Kaggle Master)
竞赛排名:第7名
发布时间:2023-08-10

总结:

  • 512x512输入分辨率,单帧模型(无2.5D分割,无输出序列融合)
  • 非二进制目标(human_individual_masks.npy文件的平均值);
  • 数据增强:Rotate90 + Flip + ShiftScaleRotate;
  • 使用正交化的9通道输入色彩空间替代ASH-RGB;
  • 5个UNet+EfficientNet模型的加权集成,通过损失函数和编码器多样化;
  • TTA x8均值。

输入预处理:

大量证据表明更高分辨率有助于提升效果,经过多次实验后,我决定512x512输入分辨率在质量和资源消耗之间似乎是最佳平衡点。

我未能检测到其他参赛者报告的目标像素偏移问题,但注意到看似"旋转无关"的数据域存在某些问题,因为任何数据增强都会使较小模型(尤其是256x256分辨率训练的模型)性能下降。
但同样的增强方法与更大模型/分辨率结合时效果显著:即使在已应用的[rot90 + flip]基础上轻微增加ShiftScaleRotate,也能提升泛化能力,这体现在训练样本/样本外性能差异和验证分数上。因此,我最终确定了上述组合方案。

考虑到标签性质和标注者严格指导,网格扭曲/CutMix/重度仿射变换等增强方式似乎并不合适,我甚至没有在这方面进行实验。

颜色空间:

最有趣的发现是ASH-RGB色彩空间实际上并非最佳选择(至少在我的流程中如此),尽管它被用于数据标注,这对我而言仍不清楚且相当令人困惑。
最初我考虑使用不同色彩空间有助于使最终集成更加多样化和稳健,因此我尝试了多种组合,包括原始的9通道band_{08-16}光谱(其效果与ASH-RGB相当甚至更差),并发现通过对该光谱进行正交化(然后进行标准化缩放),可以"免费"获得约0.007-0.008的全局Dice分数提升(例如,使用奇异值分解对训练数据中的像素值统计信息进行变换):

def transform(image, components=list(range(9))):
    """
    image是原始光谱形状为(H, W, C=9)的均值-标准差缩放输入图像
    components是要保留的奇异值列表,默认为全部
    """

    # U, S, V^T = scipy.linalg.svd((features - features.mean(axis=0)) / features.std(axis=0), full_matrices=False)
    # 其中features变量是numpy矩阵,形状为(H * W * #训练帧数, 9)
    # 表示9通道像素值的训练样本
    # H = W = 256 / 4,因为使用了图像的空间切片[::4, ::4]以节省内存

    V = np.array([[ 0.30724147,  0.62773895, -0.14635018, -0.573297  , -0.12886728,
                    0.28318524, -0.24109024,  0.08076485, -0.00325075],
                  [ 0.32459396,  0.4853799 ,  0.11397891,  0.12225674,  0.20599744,
                   -0.5490689 ,  0.48917454, -0.21825205,  0.01644508],
                  [ 0.33743936,  0.25824797,  0.17345208,  0.69666064,  0.19566149,
                    0.26690215, -0.37061185,  0.23752698, -0.02699725],
                  [ 0.33981836, -0.26328832,  0.09320887, -0.13211036,  0.4346729 ,
                    0.40927857,  0.03781459, -0.64806664, -0.10579388],
                  [ 0.32521746, -0.17938325, -0.89748853,  0.14396429,  0.04797046,
                   -0.16805825, -0.07169384,  0.00493852,  0.0116129 ],
                  [ 0.33889034, -0.28138953,  0.12123773, -0.22792031,  0.30711567,
                    0.11115608,  0.32205147,  0.57906854,  0.44001597],
                  [ 0.33982533, -0.25831598,  0.19543712, -0.18796755, -0.03050064,
                   -0.2750708 , -0.11629675,  0.27289057, -0.76136464],
                  [ 0.3408047 , -0.21771011,  0.25839126, -0.08075125, -0.29107442,
                   -0.40241462, -0.4987889 , -0.23310575,  0.4619281 ],
                  [ 0.34446737, -0.09409835,  0.04087918,  0.19765726, -0.7290119 ,
                    0.3184076 ,  0.43889487, -0.07267871, -0.03155228]]).astype(np.float32)

    # 归一化最终模型输入:
    std = np.array([2.4911032 , 0.63075846, 0.31504428, 0.15724187, 0.10641998,
                    0.0413455 , 0.02513309, 0.01830954, 0.00624112]).astype(np.float32)

    output = (np.dot(image, V[:, components]) / std[components]).astype(np.float32)
    return output

自从发现这一点后,我在所有模型中都只使用这个色彩空间。

模型:

解码器复杂度越高(UNet++/DeepLabV3/UperNet等),结果越差,因此最终集成只使用了UNet模型。EfficientNet编码器明显优于ResNeXt/ResNeSt/ConvNeXt(尤其是ConvNeXt:经过对不同编码器/自定义首层膨胀的一系列实验后,我提出一个假设——第一个跳跃连接到解码器之前的第一个特征图分辨率越低,样本外得分就越低,考虑到高像素级精度的要求,这个假设很有说服力)。

损失函数:

由于时间和资源有限,我没有对此进行充分研究,特别是256x256轻量实验的结果与512x512重量级实验不匹配。但总体而言,单独使用BCE优于BCE+Dice或BCE+Focal的任何组合。然而,在BCE中少量添加Dice损失可能有帮助:虽然会降低全局Dice分数,但能改善与BCE训练模型的集成效果。
提高BCE目标的pos_weight,并对更接近标签边界的像素加权,可使模型更快收敛,但最终得分相近(像素加权掩膜示例如下):
像素加权掩膜示例

优化:

AdamW优化器,学习率调度:1个epoch从2e-4到5e-4的warmup,然后余弦退火至结束。
所有最终模型均使用PyTorch Lightning训练50或64个epoch,采用bf16混合精度。

最终提交:

在比赛末期,我没有足够时间训练模型来构建合适的集成,因此不得不即兴发挥,包含早期实验中最成功的模型(这些模型的检查点也未丢失),这意味着最终的组合有些随意,所有"幸存"的模型都在默认的训练/验证分割上训练(没有在n折CV分割上训练的模型):

权重* 编码器 损失函数 数据增强 仅验证文件夹 LB(私有)
0.45 efficientnet-b7 (smp) BCE** Rot90 + Flip + ShiftScaleRotate 0.70030 0.70755
0.27 efficientnet-b7 (smp) 0.98 BCE + 0.02 DICE Rot90 + Flip + ShiftScaleRotate 0.69794 -
0.12 efficientnet-b7 (smp) BCE** Rot90 + Flip 0.69524 0.69823
0.08 tf_efficientnet_b7 (timm) BCE** Rot90 + Flip + ShiftScaleRotate 0.67948 0.67705
0.08 tf_efficientnet_b8 (timm) BCE** Rot90 + Flip + ShiftScaleRotate 0.68611 0.69415
集成 0.70749 0.71337

所有阈值都在对数空间而非概率空间上针对验证文件夹进行调整,预测的加权和也在转换为概率前计算于对数空间。

  • * 在验证文件夹上手动调整;
  • ** 所有这些实验在BCE损失中具有略微不同的像素加权参数。
同比赛其他方案