返回列表

11th place solution

461. NFL Health & Safety - Helmet Assignment | nfl-health-and-safety-helmet-assignment

开始: 2021-08-10 结束: 2021-11-02 运动员表现 数据算法赛
第11名解决方案
作者:D.Imanishi
比赛排名:第11名

首先,我要感谢主办方组织了如此精彩的比赛。我很高兴能赢得我的第一枚金牌!

概述

我的解决方案包含以下五个步骤:

  1. 头盔检测
  2. 跟踪与边界框插值
  3. 球队分类
  4. 球员映射
  5. 后处理

1. 头盔检测

  • 模型:YOLOv5l,输入尺寸:1280x1280
  • 训练数据:"images" 目录下的 9947 张图像
  • 验证数据:来自 120 个训练视频的大约 1000 张图像
  • 使用 TTA(YOLOv5 函数中的 "augment=True")

2. 跟踪与边界框插值

我创建了自己的原创跟踪算法。基本上,我的算法利用两帧之间边界框两点(左上角 LT,右下角 RB)的距离,同时利用光流预测下一帧的边界框。光流方法的灵感来源于上一场比赛的顶级解决方案。在实现光流边界框预测时,我参考了这个 GitHub 仓库。预测边界框与检测边界框之间的 IoU 与边界框的距离一起被使用。

当某些边界框丢失跟踪时,它们会像下图那样保留两帧。结果,边界框的数量增加了。这旨在减少边界框的假阴性。由于跟踪处理了两次(正向和反向),边界框在前后帧中进行了插值。

边界框插值示意图

3. 球队分类

我训练了一个球队分类 CNN,其输出尺寸为 2(球队)x len(gameKeys)。作为训练图像,我裁剪了头盔的边界框。为了利用球衣的颜色,我裁剪的边界框在底部方向上比原始边界框尺寸稍大。

  • 模型:MobileNet v2,输入尺寸:160x160
  • 损失函数:交叉熵
  • 数据增强:水平翻转、平移、缩放、旋转、剪切、亮度、对比度、Cutout
  • 特征尺寸:1280

训练好的 CNN 被用作特征提取器(移除了最后的全连接层)。提取的特征通过 K-means 分为两个簇。此时,我不知道哪一个是 "H" 队或 "V" 队。球队映射在下一步的“球员映射”中完成。

4. 球员映射

我的基础映射算法基于这个很棒的 Notebook。我对其进行了一些改进:

  • 二维映射(x 和 y)
  • 为了对边界框坐标的 x 轴进行加权,y 轴被归一化为 0~0.3,而不是 0~1。
  • 使用匈牙利算法最小化映射距离
  • 球队映射被用作距离的成本(球队不匹配会增加距离)。
  • 尝试了 K-means 结果与 H/V 之间的两种球队分配组合,并采用距离最小的那种。

5. 后处理

在此步骤中,通过合并跟踪结果和映射结果来确定每个边界框的最终球员标签。首先,通过 XGBoost 模型预测每一帧的映射准确率。作为 XGBoost 模型的输入特征,使用了以下内容:

  • 检测到的边界框数量
  • tracking.csv 中的球员数量
  • 帧号
  • 该帧号与最近跟踪帧号之间的绝对差值
  • 端区 或边线
  • tracking.csv 中所有球员的 x(y) 坐标的平均值
  • tracking.csv 中所有球员的 x(y) 坐标的标准差

其次,对于每个跟踪 ID,计算每个球员的总预测映射分数,并分配分数最高的球员。如果在同一帧中分配了相同的球员,则总分较低的边界框将被替换为分数第二高的球员。

同比赛其他方案