412. NFL 1st and Future - Impact Detection | nfl-impact-detection
感谢比赛的组织者和所有的参赛者——向所有在假期期间努力工作的人表示祝贺!
@ilu000 和 @robikscube 现在是竞赛 Grandmaster 了!实至名归——恭喜!
以下是团队 @christofhenkel, @ilu000, @philippsinger, @robikscube, @fergusoci 的解决方案。
我们的解决方案采用两阶段方法。第一阶段是一个 YOLOv5 模型,用于检测视频每一帧中的头盔。第二阶段的集成模型由各种 3D CNN 模型组成,这些模型使用裁剪出的头盔位置以及该位置前后各 4 帧的图像。我们的第二阶段模型按冲击类型预测目标。最后,我们对集成后的第二阶段预测结果应用后处理。
下面我们给出解决方案的详细描述:
我们使用按 GameID 分组的 GroupKfold 创建了 5 折数据分割。
我们针对头盔检测训练了各种第一阶段模型,既使用了我们的 KFold 分割,也使用了整个训练集。我们确定,基于我们的第二阶段边界框,第二阶段模型可能达到的最高分数为 0.9868(在 1888 次冲击中,第一阶段模型预测了其中 1863 次的匹配框)。
我们通过协作的方式进行比赛,每个团队成员都基于一个中央流程管道工作。我们使用了以下工具:
我们计划在清理完成后不久发布我们的代码。
我们最好的第二阶段集成模型由 6 个不同的 EfficientNet 加上水平翻转 TTA 组成。我们将 EfficientNet 倒残差块中的前两层 2D 卷积层替换为 3D 卷积层,正如 @davletag 在 Deepfake 竞赛 中所做的那样。致敬 @davletag,这一招在这里似乎也很有效。
在最后时刻,我们训练了 3D Resnext50 和 3D Resnext101(使用 https://github.com/okankop/Efficient-3DCNNs) 的 Kinetics 数据集预训练权重)。虽然初步结果看起来很有希望,但我们缺乏时间来正确调整超参数,因此没有在我们选定的提交中使用它。
在比赛期间,我们使用 GroupKfold 分割每折训练 YOLOv5,但也添加了额外的图像。幸运的是,YOLO 开箱即支持 DDP,只需运行 torch.distributed.launch,因此我们可以大大加快训练速度。我们使用了带有预训练权重的标准配置,并应用了以下参数:
--batch-size 128
--img-size 704
--epochs 50
--data dataset_fold0.yaml
--weights yolov5x.pt
--single-cls
对于我们的最终提交,我们在没有验证集的完整数据上进行了训练。在推理时,我们发现使用内置的 TTA 标志并使用 1280 的 img-size 可以很好地改善框预测。我们保留所有置信度大于 0.05 或 0.1 的框,并继续分配标签。由于我们的第一阶段模型仅检测头盔,即是一个单类检测器,我们需要在生成框后分配冲击/非冲击标签。为此,我们获取 GT(真实标签)框,并将与冲击 GT 框具有 0.35 IOU 重叠的每个预测框分配为冲击。
我们 3D 模型的输入数据是来自第一阶段的 9 个头盔检测堆叠:中心