返回列表

[6th place solution] EfficientDet + resnet18

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

开始: 2020-11-16 结束: 2021-01-04 运动员表现 数据算法赛
[第6名方案] EfficientDet + resnet18

[第6名方案] EfficientDet + resnet18

作者:fantastic_hirarin | 比赛:NFL Impact Detection | 排名:第6名

感谢所有的参与者和组织者!
特别感谢 @its7171@nvnnghia 分享了精彩的笔记本代码!

我的解决方案由以下两个阶段组成:
(阶段1) 使用 EfficientDet-d5 检测所有的头盔
(阶段2) 使用 resnet18 将所有头盔分类为受撞击或未受撞击

Solution Diagram

阶段1

我训练了 EfficientDet-d5 用于单类头盔检测。
在训练中,我使用了存在碰撞的帧和不存在碰撞的帧。训练图像是从视频中每隔10帧提取一次,以及碰撞帧的前后5帧提取的。
图像被放大到 1280*1280,并且只使用了水平翻转进行增强,因为这样损失收敛得更快。
推理过程是在两张图像上进行的,即原始图像和水平翻转后的图像,结果使用 WBF(加权框融合)进行合并。

阶段2

我训练了 resnet18 用于2类分类(撞击或非撞击),并用它来分类目标头盔是否发生了碰撞。
对于 resnet18 的输入,我裁剪了头盔周围的图像,并从前后的4帧中准备了9张图像。
裁剪图像的大小是头盔矩形最长边的三倍(max(w,h) * 3)。
裁剪后的图像被填充为正方形,并调整为 112*112 大小。

与阶段1一样,训练图像是从视频中每隔10帧提取一次,并且只提取碰撞帧。
在创建训练数据时,使用相同的评估标准来标记是否发生了碰撞(impact=1, confidence>1, visibility>0)。
关于数据增强,我使用了 alubumentation 库并应用了以下操作:

  • 水平翻转
  • 随机亮度
  • 随机对比度
  • 以下之一:运动模糊、中值模糊、高斯模糊、高斯噪声
  • 色调饱和度数值
  • 平移缩放旋转
  • Cutout

除了上述内容,我还使用了以下增强方法:

  • 随机改变裁剪尺寸 (max(w,h) * 2.5 ~ max(w,h) * 3.5)
  • 随机移动裁剪位置 (-max(w,h) * 0.07 ~ max(w,h) * 0.07)
  • 将随机的一帧图像替换为黑色图像(全0的numpy数组)

在进行数据增强时,9帧中的所有图像都应用相同的增强。

我训练了两个 resnet18 模型(2d卷积和3d卷积)。
对于 2d 卷积 resnet18 输入,9帧图像在 RGB 通道中组合形成 27 通道的图像。
对于 3d 卷积 resnet18 输入,9帧图像被转换为9帧的电影片段。

推理过程在这两个模型上进行,最终输出是各自输出的集成。
我还使用了与阶段1相同的翻转 TTA(测试时增强)。

后处理

如果在4帧内在相同位置检测到了头盔,则只保留中间的一帧,其他的将被忽略。
此外,我忽略了视频最开始和最后10帧,因为预计这些位置发生碰撞的概率较低。

分数

EfficientDet-d5 的 CV 分数:0.926(针对所有头盔)
2d 卷积 resnet18 的 roc_auc:0.964
3d 卷积 resnet18 的 roc_auc:0.967
本地 CV 分数:0.53
公开榜单分数:0.56
私有榜单分数:0.59

同比赛其他方案