返回列表

5th place summary

346. Severstal; Steel Defect Detection | severstal-steel-defect-detection

开始: 2019-07-25 结束: 2019-10-24 缺陷检测 数据算法赛
第5名方案总结

第5名方案总结

作者:Guanshuo Xu
比赛排名:第5名

很抱歉分享晚了。我在效率竞赛中败得很惨。哈哈。
我的解决方案简要介绍如下。

输入预处理与输入尺寸

由于我使用的是需要三通道彩色输入的 ImageNet 预训练模型,因此比赛中的每张输入图像都被复制了两次并转换为彩色图像。没有进行其他预处理。

模型训练的输入图像尺寸固定为图像的原始尺寸:256x1600。在模型开发的早期阶段,我粗略尝试过裁剪较小的尺寸,例如训练时使用 224x768,测试时使用原始尺寸,但裁剪输入的公共排行榜结果结果稍差。不使用裁剪版本进行训练的另一个原因是,这对推理速度没有好处。

图像增强

图像增强是深度神经网络成功训练的关键因素之一。对于这次比赛尤其如此,因为存在标签不平衡。与正样本相比,负样本要多得多。当使用随机输入采样形成训练批次时,在前几十个 epoch 的训练后,模型往往会以较低的置信度预测正样本,这意味着我们需要更小的阈值(而不是 0.5)来分割正区域,而这些阈值可能是我们想要避免的额外超参数。随着模型训练时间的延长,这个问题会逐渐消失,但过拟合(由于过度训练)的风险会增加,这可以借助重度增强来解决。

我使用的增强包括裁剪和调整回原尺寸、对比度和亮度、伽马校正、模糊和锐化、缩放和位移(无旋转和剪切)、水平和垂直镜像。裁剪和调整回原尺寸的增强(任何 train.py 中的 random_crop 函数)首先在水平和垂直方向裁剪随机部分,例如水平裁剪 90%,垂直裁剪 80%,然后调整回原始尺寸以引入一些变形效果。随机位移增强有点不寻常:不是使用小部分的位移(通常最多 20%),而是使用了 100% 的随机位移,并使边界填充为循环填充(cv2.BORDER_WRAP)。我期望这种循环位移增强能模拟制造流水线。

在测试期间,我使用水平或垂直翻转或两者进行增强。总共有四种变体,包括原始版本。

模型类型

我总共训练了八个 Unet 模型并平均了它们的结果。所有模型均基于 qubvel 的 GitHub:https://github.com/qubvel/segmentation_models.pytorch。使用的编码器包括 inception_resnet_v2、efficientnet_v4、se_resnext50、se_resnext101,均在 ImageNet 上预训练。我为每种类型的编码器训练了两个模型。

由于评估指标的性质,正确检测负样本的好处大于检测和分割正样本。因此,去除假阳性是获得高分的关键。为了实现这一点,我使用所有预测像素概率的最大值作为类似分类分数的指标,对平均(跨八个模型)最大概率进行阈值处理,从而排除假阳性。我还注意到很多参与者训练了一些分类器来专门执行这种假阳性去除,我没有这样做,因为训练分类器的额外成本以及测试期间运行它们的额外时间。请注意,为了进一步提高性能,我们可以使用前 K(K>1)个像素概率而不是单个最大概率来进行更可靠的估计,但在比赛期间我没有做到那一步。

训练

每个模型首先使用传统的 BCE Loss 训练 40-50 个 epoch。在模型权重训练到良好状态后,我降低了学习率并转为 Lovasz-hinge Loss(https://github.com/bermanmaxim/LovaszSoftmax),因为它对不平衡数据集具有鲁棒性。模型训练直到收敛,并在公共测试数据上使用伪标签进行了 10 个 epoch 的进一步微调。这也稍微有助于提高性能。

测试与后处理

在开始这次比赛的早期阶段,我注意到我的交叉验证结果比公共排行榜好得多。后来,一些参与者在 Kaggle 论坛上发帖称,训练集中存在一些重复或近似重复的图像,可能是由相同的制造流水线生成的,并且重复项之间的标签很可能相关。一方面,这在应用机器学习模型时破坏了数据的独立同分布假设,由于标签泄露导致验证估计过于乐观;另一方面,我们可以通过联合预测重复图像的簇而不是独立预测单个图像来利用重复项。

然而,训练集上的交叉验证性能远好于公共测试集这一事实表明,训练集和公共测试集中的重复项可能并不完全重叠,这意味着公共测试集中存在新的制造流水线。显然,训练集和公共测试集之间的差异不可能是巧合,这更像是故意为之,以模拟某些现实世界的场景,要求模型泛化到新数据而不是利用标签泄露。

所以我问自己,私有测试集是否会是一个新的集合。我的猜测是肯定的,因为如果公共和私有测试集非常相似,参与者仍然可以通过探测公共排行榜来利用标签泄露。因此,有必要采取某种方法利用私有集中的重复项。

为此,我使用 efficientnet_b4 的瓶颈特征(因为维度较低),这些特征是从编码器最后的输出为每张图像生成的。然后,我通过对测试数据的特征进行 K-means 聚类,将重复图像分组到簇中。在每个簇中,我计算了前面提到的最大像素概率的平均值。因此,对于

同比赛其他方案