第五名解决方案(最佳单模型,私有榜 0.71443)
第五名解决方案(最佳单模型,私有榜 0.71443)
作者:Johnny Lee
队友:Ilya Makarov
发布日期:2023年8月10日
竞赛排名:第5名
得票:41票
感谢组织者举办了这场精彩的比赛。同时也感谢我的队友:Ilya Makarov。我从中获得了很多乐趣,也学到了很多知识。
我很乐意分享我们的解决方案以及从这场比赛中学到的东西,希望能对大家有所帮助。
我的解决方案概述
模型
我使用了5个模型,具体如下:
- 单帧模型1:EfficientNetV2L + UNet,512x512,训练时裁剪至480x480
- 单帧模型2:EfficientNetV2L + UNet,768x768,训练时裁剪至512x512
- 多帧模型1:EfficientNetV2L + 自定义3D UNet 1,256x256,使用全部8帧
- 多帧模型2:EfficientNetV2L + 自定义3D UNet 2,512x512,训练时裁剪至480x480,仅使用5帧
- 多帧模型3:EfficientNetV2L + 自定义3D UNet 3,512x512,训练时裁剪至480x480,仅使用5帧
(最佳单模型,延迟提交,私有榜:0.71443,公开榜:0.70803)
自定义3D UNet结构

- 对每一帧应用相同的编码器(骨干网络)
- 在每个层级上通过Conv3D组合编码器输出。ConvLSTM2D也有效,但速度更慢
- 使用UNet作为解码器以获得最终输出
数据增强
- 左右翻转、上下翻转、旋转90度(用于TTA8)
- 通道噪声、像素噪声
- 随机丢弃帧(仅多帧模型)
- 随机裁剪
在比赛初期,我注意到如果不使用翻转和rot90,模型会很快过拟合。但如果使用翻转和rot90,结果反而变得更差。这个问题困扰了我很久。最终,我找到了原因。正如其他讨论中提到的,图像和掩码没有对齐。掩码略微向右下方偏移。因此,如果使用翻转或rot90,我们需要对它们进行对齐。我使用的偏移参数是:x = 0.408,y = 0.453。
尝试过但未奏效的方法:
- 随机旋转
- CoarseDropout
- 通道Dropout
目标与损失函数
我使用了两个目标:
- 目标1:Sigmoid输出1个通道,权重75%(human_pixel_masks.npy)
- 目标2:Softmax输出5个通道,权重25%(human_individual_masks.npy。0表示无航迹云,1表示25%标注者,2表示50%标注者,3表示75%标注者,4表示100%标注者)
损失函数为加权二元交叉熵 + dice损失。
使用Lion优化器。(Lion:https://github.com/keras-team/keras/blob/v2.13.1/keras/optimizers/lion.py)
预测
- 通过5个模型集成,使用TTA8(左右翻转、上下翻转、旋转90度)
TTA8非常重要,可以将分数提高0.005~0.01
最佳结果是公开榜:0.71243,私有榜:0.71756。但很遗憾,我们未将其选为最终提交。
其他实验
- 我尝试使用了所有波段,可以带来0.000x的提升。但这会使提交过于复杂,耗时太长。因此最终提交中未使用。
- UNet + Transformer(256, 128:UNet,64, 32:Transformer)。使用Transformer获取其他帧的信息。虽然有效,但不如UNet好。可能是因为Transformer未经过预训练。
更新记录
- 2023年8月11日:添加了最佳单模型的延迟提交分数