返回列表

9th place solution: Tiled Training + Seq-NMS

476. TensorFlow - Help Protect the Great Barrier Reef | tensorflow-great-barrier-reef

开始: 2021-11-22 结束: 2022-02-14 环境监测 数据算法赛
第9名方案:分块训练 + Seq-NMS

第9名方案:分块训练 + Seq-NMS

作者: Bilzard | 排名: 第9名

非常感谢主办方组织这次比赛,也感谢所有参与这个项目的人。

我将与大家分享我的解决方案。

流程

预处理

  • 分块训练
    • 将原始图像分割成 320x320 大小的图块,每个图块之间有重叠。
    • 步长选择为 = (240, 200),这为每张图像生成了 5x3 个图块。此设置参考了文献 [6]。
  • 重新标记
    • 我注意到训练数据集中存在大量不一致的标签和缺失的标签,所以我认为重新标记可以提高模型的性能。
    • 我结合原始标签和训练模型生成的伪标签进行了重新标记:
      • NMS(原始标签(阈值0.501) + 伪标签)
      • 阈值筛选 (置信度 > 0.5)

折划分

  • 将序列分割成连续的 400 帧数据块,然后分配到各个折中,以平衡 COTS(棘冠海星)的总数,使其几乎相同。分配算法类似于文献 [4] 的贪心算法。我知道这是一种有泄露的划分方式,但我认为平衡目标计数更重要。这是因为根据论文 [5],当使用 WBF(加权框融合)时,集成性能各异的模型会产生较差的预测结果。

数据加载器

采样器

  • 类别平衡采样
    • 我通过实现受文献 [1] 启发的类别平衡采样器来控制前景/背景比例。
      • 正/负样本比例 = 1:0.3
      • 1个 epoch = 1.3 * 正样本图像数量

数据增强

  • 重度畸变
    • 缩放偏移:0.3-1.7
    • Mosaic、Mixup、透视变换、颜色偏移等。
  • 带椭圆掩码的透视变换
    • 在透视变换中,我使用了由 @hengck23 分享的椭圆掩码。当配合强畸变使用时,它显著减少了框损失。

训练

  • 输入图像尺寸:640px(原始尺寸的 2 倍)
  • 模型:yolov5l [2]
  • 轮数:45-60
  • 机器:Tesla T4, 16GB (EC2 实例 g4dn.xlarge)

推理

  • 图像尺寸:2560px(原始尺寸的 2 倍)
    • 注意:尽管是分块训练,YOLOv5 模型在输入整张图像时仍能准确检测物体。
  • TTA(测试时增强)
    • (缩放, 变换) = (0.7, None), (1.0, hflip), (1.3, None) [注1]
  • 后处理
    • 清除低置信度、靠近边缘的框
      • 由于我是用图块训练模型的,与使用整张图像训练相比,它的预测更有可能在边缘附近产生框。这在使用 Seq-NMS 时会产生负面影响,因为模型会在目标物体离开画面后继续在边缘附近预测误报。
    • Seq-NMS [3]
      • 原始的 Seq-NMS 算法并非为实时处理设计。所以我使用了过去 20 帧,衰减因子为 0.9。度量标准为 max

[注1]: 原始 YOLOv5 TTA 算法有点棘手,因为缩放比例设置为 (1.0, 0.83, 0.67)。平均缩放比例小于原始尺寸。在官方文档中,说使用 TTA 时应将输入图像缩放 x1.3。但这过程较慢。所以我固定为 (0.7