返回列表

14th Place Solution

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

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

第14名解决方案

作者: Darkate (jihangz)
比赛: Severstal: Steel Defect Detection
排名: 14th Place

这一次,我试图更加有条理,而不是随机地从论文中挑选想法。在训练新模型之前,我花了更多时间思考和深入研究当前模型表现不佳的原因。加上运气,我终于拿到了我的第一块金牌。

数据增强与预处理

我使用 albumentation 进行数据增强:

def aug_medium(prob=1):
 return aug.Compose([
     aug.Flip(),
     aug.OneOf([
            aug.CLAHE(clip_limit=2, p=.5),
            aug.IAASharpen(p=.25),
            ], p=0.35),
     aug.OneOf([
         aug.RandomContrast(),
         aug.RandomGamma(),
         aug.RandomBrightness(),
         ], p=0.3),
     aug.OneOf([
         aug.ElasticTransform(alpha=120, sigma=120 * 0.05, alpha_affine=120 * 0.03),
         aug.GridDistortion(),
         aug.OpticalDistortion(distort_limit=2, shift_limit=0.5),
         ], p=0.3),
     aug.ShiftScaleRotate(rotate_limit=12),
     aug.OneOf([
            aug.GaussNoise(p=.35),
            SaltPepperNoise(level_limit=0.0002, p=.7),
            aug.ISONoise(p=.7),
            ], p=.5),
     aug.Cutout(num_holes=3, p=.25),
 ], p=prob)

然后,我从增强后的图像中裁剪出 256x512 的区域。请注意,许多图像包含大面积的黑色区域,并且图像的至少一端总是显示有钢材部分。简单的随机裁剪会降低训练效率,所以我采取了以下做法:

  1. 选取一个随机裁剪区域。
  2. 如果像素值小于10的比例大于85%,或者裁剪区域的平均像素值小于15,则根据哪一端满足标准,选择图像左端或右端的裁剪区域。如果都不满足,则选择右端的裁剪区域。

平衡采样

为了应对类别不平衡,我使用了平衡采样。我不喜欢以相同的概率随机选择缺陷类型(或无缺陷)的方法,这会让“Epoch”的概念变得随意。我更喜欢确定性的方法,所以在每个 epoch 中,我做了类似这样的操作:
0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 ...
直到每一个无缺陷样本(类别 0)都被采样过一次。

模型

模型 1:

仅在训练集上训练的端到端分类 + 分割非对称 U-Net。
主干网络: se-resnext50 32x4d
解码器: CBAM 注意力机制和超列(hyper-columns)。我认为最后一个解码器(以及可能倒数第二个解码器中的上采样)有点多余,所以我移除了它。这样,我模型的输出步长变成了 2。这节省了大量的 GPU 显存。

Model Architecture

我在 TGS Salt 竞赛中也使用了类似的设置。注意,与其他类别不同,我将所有图像都输入到了缺陷 3 的分支中,而不仅仅是包含缺陷 3 的图像。

模型 2:

与模型 1 相同,区别在于使用了 deep-stem 并将所有 ReLU 替换为 Mish。在训练集和公共测试集的伪标签上进行训练。

训练

  • 损失函数: 分类使用 BCE loss,分割使用对称 Lovasz-Hinge。
  • 优化器: Adam
  • 学习率调度: Warmup + Flat + Cosine。0.5 个 epoch 线性预热,49.5 个 epoch 保持平坦(1e-4),最后 50 个 epoch 余弦衰减至 0。
  • Batch size: