返回列表

[3rd place solution] YOLOv5 + DeepSort + ICP + Hungarian algorithm

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

开始: 2021-08-10 结束: 2021-11-02 运动员表现 数据算法赛
[第三名方案] YOLOv5 + DeepSort + ICP + 匈牙利算法

[第三名方案] YOLOv5 + DeepSort + ICP + 匈牙利算法

作者: fantastic_hirarin
发布时间: 2021-11-03

感谢所有的参与者和组织者!
特别感谢 @its7171@robikscube 分享他们精彩的 Notebooks!

摘要

我的解决方案包含以下几个阶段。

  • (阶段 1) 使用 YOLOv5 检测头盔。

  • (阶段 2) 使用 DeepSort 跟踪头盔。

  • (阶段 3) 使用 ICP(迭代最近点算法)和匈牙利算法将检测到的头盔框分配给每一帧的跟踪数据。

  • (阶段 4) 基于头盔颜色使用 K-means 将头盔分为两类。

  • (阶段 5) 再次使用 ICP 和匈牙利算法分配头盔框到跟踪数据,这次结合了 DeepSort 的结果和头盔颜色信息。

  • (阶段 6) 使用匈牙利算法确定最终标签。

(阶段 1) 使用 YOLOv5 检测头盔

我训练了 yolov5l6 和 yolov5x6,图像大小设为 1280。
将视频转换为图像后,我训练了更多包含冲击画面的帧。
为了避免检测到场边的头盔,没有将其纳入训练。
在推理过程中,使用了 yolov5l6 和 yolov5x6,并且只使用了水平翻转作为 TTA(测试时增强)。
由于发生冲击的头盔往往只有部分可见,我不得不将置信度和 IoU 的阈值设置得更低。

(阶段 2) 使用 DeepSort 跟踪头盔

我在 YOLOv5 检测到的头盔上运行 DeepSort 来跟踪头盔。
此时,为了减少误报,我删除了在一定长度帧内无法被跟踪到的头盔。
我修改了 DeepSort 的代码,使其返回 ReID 提取的特征和置信度。
特征用于阶段 4,置信度用于阶段 3 和阶段 5。
我直接使用了 Git 上发布的 ReID 权重。

(阶段 3) 使用 ICP 和匈牙利算法将头盔框分配给每一帧的跟踪数据

我使用 ICP 和匈牙利算法将头盔框分配给跟踪数据。
ICP 用于调整头盔框的位置,以最小化头盔框与跟踪数据之间的总距离。
此时,x 和 y 的每个坐标都归一化为 0~1。
然后使用匈牙利算法将每个头盔框分配给每个跟踪数据。
通过根据每个头盔框与每个跟踪数据之间的距离建立并求解代价矩阵来分配标签。

为了使用 ICP 调整跟踪数据的位置,我需要移除误报(False Positive)的头盔框以及视频中未显示的跟踪数据。
为了移除视频中未显示的跟踪数据,我逐一移除最外层的跟踪数据并重复 ICP 过程。
同样地,为了移除误报的头盔框,我逐一移除置信度低于 0.5 的头盔框并重复 ICP。
此外,当头盔框的数量多于跟踪数据时,移除最外层的头盔框使数量相等。
这是因为大多数情况下检测到的是观众的头盔。
在重复 ICP 并获得多个结果后,选择头盔框与跟踪数据之间总距离最小的结果。
由于 ICP 高度依赖于初始值,我反转了上、下、左、右四个方向并以多种模式运行。
ICP 示意图

(阶段 4) 基于头盔颜色使用 K-means 将头盔分为两类

头盔框根据头盔颜色使用 K-means 分为两类。
为了计算每个头盔框之间的距离,我使用了 DeepSort 过程中计算出的特征。
将此结果与阶段 3 的结果结合,我可以确定每个头盔属于哪支球队(主队 H 或客队 V)。
头盔聚类结果

(阶段 5) 再次使用 ICP 和匈牙利算法分配头盔框,结合 DeepSort 结果和头盔颜色信息

我运行了与阶段 3 相同的过程。
与阶段 3 的不同之处在于它考虑了 DeepSort 的结果和头盔的颜色。
这是通过根据

同比赛其他方案