返回列表

[ABBA McCandless] - 2nd place solution overview

391. ALASKA2 Image Steganalysis | alaska2-image-steganalysis

开始: 2020-04-27 结束: 2020-07-20 网络安全 数据算法赛
[ABBA McCandless] - 第二名解决方案概述

[ABBA McCandless] - 第二名解决方案概述

作者: Eugene Khvedchenya (bloodaxe) | 比赛排名: 第2名 | 发布日期: 2020-07-21

我们的解决方案总结 - 公开/私有排行榜分数:0.945/0.932

简而言之:相信你的交叉验证(CV)

我使用了按图像大小和质量因子分层的4折交叉验证,并保留了2万个样本作为留出集(5千张载体图像 + 1.5万张对应的含密图像)。我的队友采用了不同的划分方式,没有使用折数但同样保留了留出集。我们使用二级堆叠的排名平均值来融合单个模型为集成模型,并合并它们的预测结果。

模型

我只使用了 EfficientNet B6/B7,而我的队友使用了 B4/B5/B6/B7/MixNet,加上 SRNet 和一些来自“经典”隐写分析的手工特征。

我在 RGB 输入上训练模型(使用 cv2.imread),然后在非取整的 RGB 图像上进行微调(通过手动解码 DCT->YCbCr -> RGB 并省略取整步骤)。最后,我将 Swish 激活函数替换为 Mish,这使得我集成中每个模型的分数平均提高了 +0.00044。

数据增强

可能和大家一样,我在训练中使用了带有粗粒度丢弃的 D4 增强,在推理过程中也使用了 D4 增强。

损失函数

我为模型训练了两个头来预测二分类(载体/含密)和多分类(4类)结果。基于早期实验,这被证明效果很好,并且稍微加快了收敛速度。我尝试了不同的损失函数,包括加权 BCE/CE、Focal Loss 以及直接优化 RoC AUC。但事实证明,普通的 BCE/CE 效果最好。

模型集成

在集成方面,我测试了许多想法,但最终的解决方案是使用我的 B6/B7 模型的预测结果训练 XGBoost 分类器。二级堆叠是使用留出集的预测完成的。特征矩阵大小为 20000x380,由二分类和多分类输出以及来自 TTA 的所有中间 logits 组成。我使用基于 image_id 的 groupkfold 分割进行了 5 折交叉验证,以找到 XGBoost 的最佳超参数,这就是我的集成模型。

我的团队对他们的模型库采用了类似的方法,但训练了 CatBoost 堆叠器。我们根据各自的 CV 分数和斯皮尔曼相关性选择了最终的集成方案。相关性系数越低,我们在公开排行榜上的得分就越高。

失败的尝试

为了得出这个解决方案,花了将近两个月的时间。在通往金牌的道路上,有几十次不成功的训练运行和实验。举几个例子:

  • 在 DCT 输入上训练模型(甚至没能超过 0.92)
  • 训练 ResNet 和 DenseNet 系列(勉强达到 0.935 LB)
  • 训练模型时确保批次中总是包含载体 + 含密图像对
  • 直接优化 Roc AUC
  • 使用 ArcFace 进行度量学习
  • 使用额外数据训练(iStego 100K)
  • B0-B7,更重的模型表现更好
  • 在嵌入上训练堆叠模型
  • 在 TPU 上训练。总的来说,它是可行的,但 Kaggle TPU 机器的 CPU/RAM 有限,因此训练速度非常慢。
同比赛其他方案