返回列表

18th Solution : YoloV5 and filtering using tracking data

412. NFL 1st and Future - Impact Detection | nfl-impact-detection

开始: 2020-11-16 结束: 2021-01-04 运动员表现 数据算法赛
第18名方案:YoloV5与利用追踪数据进行过滤

第18名方案:YoloV5与利用追踪数据进行过滤

作者:AnhMeow, Mathurin Ache, Matthieu Planté
比赛排名:第18名

我的队友(@mathurinache@matthieuplante)和我想要感谢 Kaggle 和主办方组织了这场比赛。
我们还要感谢 @its7171 在比赛初期提供的公共基线 notebook。

我们将以迭代的方式描述我们的解决方案,以展示我们是如何从这个公共基线出发,最终达到 Private LB 0.42+ 的成绩。

公共基线改进

我们采用了 @its7171 分享的想法,将撞击标注扩展到 [-4, 4] 的范围。但是,我们不仅仅在包含撞击的帧上进行训练,还在训练集中加入了对应 -5 和 +5 偏移量的帧。在我们看来,这有助于模型理解撞击与非撞击之间的边界。使用在 512x512 图像尺寸上训练的 EfficientDetB5,并进行简单的 80/20 划分,我们得到的 CV/Public/Private 结果为:0.18/0.22/0.18。

基于之前的模型,增加了将在最后一节描述的后处理步骤,我们的 CV/Public/Private 结果达到了 0.22/0.25/0.22。

随后,我们将基础模型转为 YoloV5,并针对我们的 2 类检测问题使用原始分辨率,达到了 CV/Public/Private 结果:0.25/0.28/0.24。

最后,我们进行了一些模型融合(结果证明这对 Private LB 不利),结合了一个 0.226 的公共 notebook,我们的 Public LB 达到了 0.35+,但 Private LB 只有 0.26+。

利用追踪数据作为帧选择器

追踪数据对于检测撞击帧来说似乎是一个很好的切入点,因为提供了球员层面的速度和加速度等信息。

为了处理这个文件,我们决定稍微改变其结构,从:
[时间, 球员信息]

变为:
[时间, 球员信息, 最近的对手信息, 全局聚合特征, 撞击标记]

全局聚合特征是给定时间戳下球员速度/加速度等的均值/标准差。
我们还特意移除了任何依赖平移或旋转的特征,例如:x, y, direction, orientation。对于方向和朝向,我们添加了球员和对手数值之间的标量积。
撞击标记是通过与训练 csv 文件核对获得的。

然后,我们建立了一个基于简单 Transformer encoder 架构(6 个注意力层,8 个头)的模型,带有一个线性分类头,用于处理 9 个连续时间步的新追踪数据(9 是一个参数)。

我们对此数据进行了 5 折训练,通过下采样来处理类别不平衡。每一折大约提供了 0.4 的 F1 分数,精确率和召回率也都在 0.4 左右。起初这看起来很差,但因为我们在球员层面,回到帧层面时,我们得到以下结果:召回率为 0.7,精确率为 0.1。接受将召回率的上限设为 0.7,我们现在处于这样的情况:10 帧中有 1 帧包含至少一次撞击(训练数据的原始情况是 100 帧中有 3 帧)。

使用 5 折策略重新训练我们的 Yolo 模型(不使用与帧选择器相同的种子)并使用此帧选择器进行过滤,起初并没有改善我们的结果!
实际上,当我们改变了“预测空间”时,我们也需要改变验证空间,将其限制在帧选择器的范围内。

这一策略使我们的 CV/Public/Private 分数达到了 0.3711/0.3749/0.3767。

最后,我们通过添加帧选择器的假阳性(FP)样本增强了训练集(猜测其中包含一些困难样本),达到了以下 CV/Public/Private 分数:0.4117/0.3636/0.4220。
在后处理上的一些小调整使我们的最佳 Public LB 达到 0.4666,Private 分数为 0.4244。

后处理

我们的后处理由以下几个步骤组成:

  • 1 - 基础模型置信度过滤
  • 2 - 5-85% 过滤:排除视频中低于 5% 或高于 85% 的所有帧
  • 3 - 端区 - 边线约束:仅保留在边线和端区都有预测的帧,且最多允许 3 帧的误差
  • 4 - NMS(使用 torch 实现):在 9 帧的滑动窗口上进行,IoU 阈值为 0.
同比赛其他方案