返回列表

12th place solution overview

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

开始: 2019-07-25 结束: 2019-10-24 缺陷检测 数据算法赛
第12名解决方案概述

第12名解决方案概述

团队成员: @delpro @pavel92 @ilyadobrynin

我们在合并截止日期的最后一天才最终组队并开始共同开发解决方案。当时,比较流行的做法是第一步进行分类(去除大部分无缺陷图像),第二步进行分割以定位缺陷。但最终我们提出了一个三步走的解决方案。我们的多标签 FPN 和 PSPNet 分割模型在像素级分割上表现一般,但在第一步分类之后减少假阳性预测方面表现出色,因此我们决定将它们用作中间的分类步骤。

以下是每个步骤的详细说明。

第一阶段:多标签分类

@ilyadobrynin 实现

在第一阶段,使用多标签分类器来检测至少包含一种缺陷类型的图像。

模型:

  • 在调整大小的图像 (128x800) 上训练的 5 折交叉验证中最好的 3 个 Senet154 模型,使用简单的 BCE 损失函数。

数据增强:

  • 归一化
  • 调整大小
  • 水平翻转,垂直翻转
  • 无 TTA (测试时增强)

训练后,我们通过最大化给定类别的 F1 分数找到了二值化的阈值,因此每个类别都有自己的阈值。这使我们能够排除几乎一半的图像并加快推理速度。

第二阶段:多标签分割

@delpro @ilyadobrynin 实现

在第二阶段,存在一些过拟合的“魔法”。这里我们使用了多标签分割网络的平均集成:

  • 基于 se_resnext101_32x4d 的 4 折 PSPNet(Qubvel 的出色实现),在完整图像上训练,使用 BCE + Jaccard 损失;
  • 基于 senet154 的自定义 FPN,在裁剪图像 (256x256) 上训练,使用简单的 BCE 损失。
  • 基于 senet154 的自定义 PSPNet,在裁剪图像 (256x256) 上训练,使用简单的 BCE 损失。

训练

  • 在裁剪图像 (256x256) 上预训练,Batch size 为 32,损失函数为 BCE + Jaccard。
  • 在全尺寸图像上微调,学习率为 0.1 * lr,Batch size 为 4,梯度累积至 20 张图像。

数据增强:

  • 归一化
  • CropNonEmptyMaskIfExists:如果存在缺陷区域则裁剪该区域,否则进行随机裁剪(我们在比赛期间将此变换贡献给了 Albumentations)。
  • 水平翻转,垂直翻转
  • TTA 仅使用水平翻转

细节:

在自定义 FPN 和 PSPNet 训练中有一个技巧。首先,我们在裁剪图像上训练了一个多标签 Senet154 分类器。之后,我们将此分类器用作分割器的骨干网络。这在质量相同的情况下显著加快了训练速度。

后处理:

首先,我们从图像中移除了小对象和孔洞。然后,如果正像素的总和小于最小阈值(每个类别唯一),我们假设不存在对象。这提高了我们在公共排行榜上的分数,但可能导致过拟合。在此阶段,我们没有对模型集成进行阈值优化,因为默认阈值给了我们更好的结果。

第二阶段使我们能够去除许多假阳性图像。

第三阶段:二值分割

@pavel92 实现

在第三阶段,我们使用二值分割模型,针对每个类别的非空掩码进行训练:2 个 Unet(seresnext50),2 个 FPN(seresnext50),1 个 Unet(SeNet154)。

训练:

  • 损失函数:SoftDice + BinaryFocal(gamma=2.)
  • 优化器:RAdam
  • 学习率调度器:Reduce on plateau
  • 采样:非空样本
  • 裁剪:256x768

数据增强:

  • 归一化
  • 水平翻转,垂直翻转