522. DFL - Bundesliga Data Shootout | dfl-bundesliga-data-shootout
首先,感谢组织者在这场精彩的比赛中所付出的努力,并祝贺所有的获胜者。虽然我们需要再等两个月才能看到最终结果,但请允许我分享我目前排名第4的解决方案。
我的解决方案的基本流程和模型摘要如下所示。
| 模块 | 模型 | 主干网络 | 输入 | 输出 |
|---|---|---|---|---|
| 帧提取 | NA | NA | 1920x1080 | 960x540 (仅奇数帧) |
| 候选帧选择 | 图像分类 | efficientnetv2_l | 512x512 | 4类概率 |
| 事件区域检测 | UNet | efficientnet_b5 | 512x512 | 热力图 |
| 事件分类 | CSN | ResNet152 | 224x224 ROI | 4类概率 |
我使用 FFmpeg 从视频中提取并保存帧。请注意,为了减少磁盘 I/O 的时间,我决定丢弃偶数帧并将帧的大小减小到 960x540(即原始大小的一半)。
这一步的目的是找到可能发生事件的候选帧。我简单地将每个提取的帧分为四类:背景(非事件)、play(比赛)、challenge(争抢)和 throwin(掷界外球)。主干网络是 timm 的 efficientnetv2_l,输入帧被调整为 512x512。
这个过程完全不使用时间信息,所以准确率本身并不高,但我在这里想做的是以高召回率找到事件帧。所以我忽略了分类分数的绝对值,而关注相对峰值。我使用了 scipy.signal.find_peaks,并选取分类分数峰值对应的帧作为候选帧。
通过一系列实验,我发现如果简单地使用整个帧,很难达到有竞争力的分数。由于本次比赛允许手工标注,我决定训练一个事件区域检测模型来从帧中提取 ROI(感兴趣区域)。我为训练集中的所有事件帧标注了事件区域(大致)中心的 xy 坐标(基本上是与事件最密切相关的球员的坐标)。这花了几周时间 :-(
事件区域检测器是一个简单的 UNet,它输出事件区域的热力图。主干网络是 timm 的 efficientnet_b5,输入帧被调整为 512x512。下图显示了一些示例结果。在图中,左边是输入,中间是叠加在输入上的输出热力图,右边是以热力图峰值为中心的放大图像。
检测球是本次比赛中比较有前景的方法之一,但正如这里