返回列表

1st place solution

379. Herbarium 2020 - FGVC7 | herbarium-2020-fgvc7

开始: 2020-03-09 结束: 2020-05-26 作物智能识别 数据算法赛
第一名解决方案

第一名解决方案

作者:NguyenThanhNhan (Grandmaster)
比赛排名:第 1 名

首先,我要感谢主办方团队和 Kaggle 举办了如此有趣的比赛,同时也感谢我的队友(@dattran2346@moewie94)的辛勤工作和贡献。

模型架构

我们使用了 EfficientNet B3/4/5(Noisy Student 版本),输入为原始图像尺寸(320x320, 380x380, 456x456),以及 Inception V4 和 SEResNeXt50,图像尺寸为 448x448,作为我们的骨干网络。

对于 EfficientNets,我们首先从第 4、5 和 6 块提取特征图,通过单压缩多激励模块(OSME)进行前向传播,然后进行池化并将它们连接成一个“局部”特征向量。接着使用 ArcFace(s=16, m=0.1) 损失 + BNNeck 组合,以“头部”块特征作为输入,帮助我们的模型学习更好的“全局”表示。

该流程通过交叉熵损失(无标签平滑)和熵损失进行端到端的联合训练;在推理时,我们对 3 个分类器的 logits(局部分类器、ArcFace 和 BNNeck)取平均值。

模型架构图

训练

我们采用了类似于第 4 名团队的两阶段训练方法。在第一阶段,仅使用频率最高的前 5000 个类别的样本。在获得良好的模型(以验证集 f1-score 衡量)后,我们使用权重压印技巧为剩余的 27093 个类别初始化分类器权重,然后重新训练整个网络直到收敛。以下是我们的训练配置:

  • 阶段 1:75 个 epoch,batch size = 2048(梯度累积),带线性预热的余弦调度器和 AdamW 优化器,平衡采样(每个类别每个 epoch 随机采样 75 张图像)。
  • 阶段 2:将 epoch 数量增加到 105,平衡采样(每个类别每个 epoch 随机采样 25 张图像)。
  • 数据增强:ResizeShorterSide(random.randint(img_size + 32, img_size + 128)), RandomCrop(img_size), RandAugment(num_ops=2, magnitude=random.randint(1, 11)), RandomErasing()

分数

我们在此报告了一些未经任何后处理的单模型分数:

  • Inception V4 - 公榜 0.79712 - 私榜 0.77781
  • B3 - 公榜 0.80570 - 私榜 0.78182
  • B4 - 公榜 0.83014 - 私榜 0.81488
  • B5 - 公榜 0.84774 - 私榜 0.83309

集成

我们采用了去年 RSNA 挑战赛中这个 notebook 中的代码和思路,并对其进行了修改,构建了一个简单的 2 层堆叠网络来组合单模型的预测结果。该堆叠集成获得了公榜分数 0.85505 和私榜分数 0.84180。

KERNEL_SIZE = 9
NUM_CHANNELS = 128

class StackingCNN(nn.Module):
    def __init__(self, num_models, num_channels=NUM_CHANNELS):
        super(StackingCNN, self).__init__()
        self.base = nn.Sequential(OrderedDict([
            ('conv1', nn.Conv2d(1, num_channels,
                kernel_size=(