长久以来,一直对计算机视觉(CV)在体育领域的应用充满兴趣。这毕竟是热爱的两件事的结合。大约三年前,在个人博客上发表了一篇文章,当时还使用YOLOv3尝试在篮球场上检测和分类篮球运动员。
正在进行的FIFA世界杯激发了重新审视这个想法。这一次,使用了YOLOv5和ByteTRACK的组合来追踪足球场上的球员。这篇博客文章伴随着Roboflow视频,在视频中讨论了如何在足球场上追踪球员。
让开始一步步走过构建计算机视觉球员追踪项目的步骤。
步骤1:利用预训练的检测器。最初,希望跳过自定义模型训练。希望这是一个快速的项目,从开始到结束只需要几个小时。流行的COCO数据集,用于训练YOLOv5和YOLOv7模型,包含了最感兴趣的两个类别——人和运动球。这让非常乐观,认为可以从COCO检查点进行训练。
迅速从Bundesliga Data Shootout Kaggle竞赛下载了几十个短足球比赛视频,并将预训练模型进行了测试。尝试了各种配置的iou_threshold、confidence_threshold和input_resolution,但得到的结果令人失望。
在这个模型上,球几乎只在几个视频帧中被检测到,远远不足以可靠地追踪这样一个小而快速移动的物体。另一方面,模型检测到了许多球场外的冗余物体——教练、球迷、维护人员、摄影组,甚至备用球。所有这些都将迫使编写额外的检测过滤逻辑,而不想这样做。
尽管数据集包含了需要的类别,但用于推理的视频必须与用于训练的图像大相径庭。在这种情况下,别无选择,只能创建自己的数据集并训练自定义模型。
步骤2:构建自定义检测器。训练自定义模型是一项巨大的工作。主要是因为必须完成大量的手动工作来注释图像。由于急于求成,决定尽可能简化这个过程。选择了之前提到的Kaggle数据集中的一些视频,并使用FFmpeg从每个视频中提取10帧——每3秒一帧。
接下来,利用预训练的YOLOv5模型,通过执行自动初步注释图像并将检测到的物体保存到txt文件中。现在已经准备好进入第二阶段:完善数据。
尽管计算机已经完成了90%的工作,但手动校正花费了近5个小时。同时,引入了两个额外的物体类别——裁判和守门员。可以在Roboflow Universe中看到工作成果。数据集是开源的,任何人都可以免费使用。
自定义训练的结果让更加自信。它能够解决上述两个问题。
不幸的是,由于类别不平衡,模型在检测守门员类别时仍然存在问题。在整个项目中,将每个守门员视为普通足球运动员。如果有更多的时间,会应用数据集增强,尝试引入更多包含这个类别的图像。
如果觉得有点乐趣,可以测试模型。它在Roboflow Universe上可用,以及数据集。只需拖放测试图像。请注意,在线版本与在演示中使用的版本略有不同。
步骤3:追踪物体。决定使用ByteTRACK,这是SOTA多物体追踪器之一,用于视频中的物体追踪。在内部,ByteTRACK不使用任何神经网络。模型的力量纯粹来自简单的数学计算:比较各个帧上的边界框位置。
重要的是,ByteTRACK不负责检测,只负责追踪。因此,它不需要像其他一些追踪器那样单独训练。ByteTRACK允许轻松更换检测器,而无需重新设计整个代码架构。
下面是一个简化的代码片段,说明了需要使用ByteTRACK的启动代码。在ByteTRACK项目中,每个帧上的物体都会获得一个唯一的ID。
import torch
model = torch.hub.load(
'ultralytics/yolov5',
'custom',
WEIGHTS_PATH, device=0)
byte_tracker = BYTETracker(BYTETrackerArgs())
for frame in frames:
...
results = model(frame, size=1280)
detections = Detection.from_results(
pred=results.pred[0].cpu().numpy(),
names=model.names)
...
tracks = byte_tracker.update(
output_results=detections2boxes(detections=detections),
img_info=frame.shape,
img_size=frame.shape)
detections = match_detections_with_tracks(
detections=detections,
tracks=tracks)
这是模型的结果:
ByteTRACK单帧结果
每个球员都被分配了一个独特的数字,并在帧之间被追踪。
结论
检测和追踪只是开始。现在可以真正将其提升到下一个水平!现在可以快速分析行动的进程,知道球在球员之间是如何传递的,计算球员行进的距离,或者定位他们最常出现的场地区域。
使用Notebook中的代码来启动项目,并释放创造力。最重要的是,让知道已经构建了什么。