返回列表

5th place solution overview: One stage CenterNet

345. Kuzushiji Recognition | kuzushiji-recognition

开始: 2019-07-18 结束: 2019-10-14 计算机视觉 数据算法赛
第5名解决方案概览:单阶段 CenterNet

第5名解决方案概览:单阶段 CenterNet

作者: See-- | 排名: 第5名

感谢人文开放数据中心和 Kaggle 提供这次精彩的挑战。祝贺获奖者以及所有在这次挑战中获得乐趣的人。以下是我方法的一些细节:

我已经为 Keras 创建了一个 CenterNet 的移植版本:https://github.com/see--/keras-centernet,但我从未真正用这个仓库训练过模型。所以我决定也让训练跑起来。我从头开始重新实现了 CenterNet,并进行了以下修改:

  • 用 ResNet50 和 ResNet101 + FPN 解码器替换了 Hourglass 网络。Hourglass 对硬件要求太高。不过你可能仍然可以用它获得更好的结果。

  • 使用了更简单的损失函数。我将带有 focal loss 的惩罚减少像素级逻辑回归替换为二元交叉熵。这对我很有效,并且去掉了一些超参数。

  • 我还移除了回归高度 & 宽度以及 x & y 偏移量的检测头。你可以用 L2 loss 轻松回归它们,但评估指标只需要中心点。我们也不需要高于 +-2 像素的精度(这正是偏移量的用途)。这带来了一点加速。

  • CenterNet 在中心点周围使用高斯核。我不确定这是否必要。我仍然使用以下 3x3 内核:

    pos_kernel = np.float32([[0.5, 0.75, 0.5], [0.75, 1.0, 0.75], [0.5, 0.75, 0.5]])
    
    但是仅使用精确中心点也给出了非常相似的结果(即:
    pos_kernel = np.float32([[0.0, 0.0, 0.0],
                             [0.0, 1.0, 0.0],
                             [0.0, 0.0, 0.0]])
    
    )。只需要降低阈值即可。

我训练了 125 个 epoch 的单个 ResNet101 可以达到:0.938。我使用了《Bag of Tricks for Image Classification》论文中的改进版本:https://arxiv.org/abs/1812.01187。感谢 timm,这变得非常简单:timm.create_model('gluon_resnet101_v1d', pretrained=pretrained)

Albumentations 也非常有用。正确获得边界框的几何变换并非易事。我使用了以下增强方法(不包含验证集):

    self.aug = Compose([
      ShiftScaleRotate(p=0.9, rotate_limit=10,
          scale_limit=0.2, border_mode=cv2.BORDER_CONSTANT),
      RandomCrop(512, 512, p=1.0),
      ToGray(),
      CLAHE(),
      GaussNoise(),
      GaussianBlur(),
      RandomBrightnessContrast(),
      RandomGamma(),
      RGBShift(),
      HueSaturationValue(),
    ], bbox_params=BboxParams(format='coco', min_visibility=0.75))

设置较高的 min_visibility 是为了不预测部分字母(这就是数据的标注方式)。

最后,尺度 TTA(尺度为 [0.75, 1.0, 1.25])有一点帮助 0.938 -> 0.939

什么没有奏效

  • 将检测和分类分开的多阶段方法。我只得到了约 0.85。单阶段总是效果更好。我认为这是有道理的,因为模型可以从图像中学习某种语言模型。

  • 进一步提高分辨率。我在 1536x1536 分辨率下运行预测,但没有看到更高分辨率带来的任何改进。

  • 创建更多字母。这在鲸鱼比赛中是一个流行的技巧。我们通过添加翻转版本将类别数量增加了一倍。然而,验证分数大致相同,所以我删除了它,因为它增加了代码和复杂性。

硬件

最终模型可以在单个 V100 VM 上约 8 小时内训练完成。我主要使用 vast.ai 和 G

同比赛其他方案