掘金 人工智能 07月09日 10:20
热搜第一!常州队进球无效?用YOLO建个足球追踪系统试试看!
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文探讨了如何利用AI技术,特别是YOLO目标检测技术,来辅助足球比赛的判罚。文章详细介绍了从数据采集、模型训练、目标追踪到结果可视化的整个流程,并指出了传统流程中的痛点。最后,文章介绍了Coovally平台,该平台提供了一键式目标追踪系统,简化了AI足球辅助判罚的开发过程,并提供了RaaS服务,帮助用户快速实现AI应用。

⚽️ **AI辅助判罚的必要性:** 人眼观看有盲区,裁判可能错过关键细节,AI能识别球员、追踪球的运动轨迹,并精准分析越位、进球等事件,为争议判罚提供技术支持。

🛠️ **传统YOLO足球追踪系统搭建流程:** 包括数据采集与标注(使用视频帧截取工具、CVAT等工具标注球员、足球等目标)、微调YOLO模型(使用YOLOv8预训练模型进行迁移学习)、目标追踪(结合位置、外观、运动轨迹信息,实现跨帧目标ID一致性)以及绘制可视化框和导出等步骤。

💡 **传统流程的痛点:** 标注数据成本高、训练与追踪逻辑复杂、调参周期长、需要配置深度学习环境,对初学者不够友好。

🚀 **Coovally平台优势:** 提供一键式目标追踪系统,支持YOLO标注/图像/视频上传,内置多种模型,自动生成训练结果可视化,简化了开发流程,并提供RaaS服务,降低了AI应用的开发门槛,加速了AI在足球领域的应用。

【导读】

7月6日晚,“苏超”联赛第六轮,常州客场对战淮安,最终0∶0握手言和。这场高温下的鏖战,是常州队在“苏超”中拿下的首个积分。

然而,“常州进球无效”却在赛后登上微博热搜第一,引发大量讨论——这个进球到底应不应该算?
这一次,我们从AI的角度切入,试着用YOLO目标检测技术搭建一个足球比赛追踪系统,看看AI是否能还原现场,为争议判罚提供“技术支持”。>>更多资讯可加入CV技术群获取了解哦


一、为什么要用AI辅助足球判罚?

人眼观看有盲区,裁判也可能会错过某些细节。而现代AI视觉系统可以做到:

尤其是在“是否越过门线”、“是否越位”等边界判罚上,AI能发挥巨大作用。


二、传统流程:从零搭建一个YOLO足球追踪系统

数据采集与标注

/data  └── images/      └── match01_001.jpg  └── labels/      └── match01_001.txt  # YOLO格式标签

****

微调YOLO模型

      yolo task=detect mode=train model=yolov8n.pt data=match.yaml epochs=50 imgsz=640
from ultralytics import YOLOmodel = YOLO("../assets/weights/best.pt")result = model.predict(source="../assets/source_videos/B1606b0e6_1 (28).mp4",                        save=True,                       stream=True)
import cv2# Retrieve and visualize the first resultfirst_result = next(result)  # Get the first result from the generatorannotated_frame = first_result.plot()  # Overlay detections on the frame
# Display the annotated framecv2.imshow("YOLO Detection", annotated_frame)cv2.waitKey(0)cv2.destroyAllWindows()

目标追踪机制详解

检测模型可以在每一帧中识别出球员和足球,但不会“记住”谁是谁。YOLO是静态检测器,追踪需要跨帧关联。

什么是目标追踪?

目标追踪是指在视频序列中,保持同一物体ID一致,并绘制其移动轨迹。我们需要结合:

首先,我们应该从视频文件中提取帧。

# funcs.pyimport cv2import numpy as npfrom typing import Listdef read_video_frames(video_path: str) -> List[np.ndarray]:    cap = cv2.VideoCapture(video_path)    if not cap.isOpened():        raise IOError(f"Cannot open video: {video_path}")    frames = []    while True:        ret, frame = cap.read()        if not ret:            break        frames.append(frame)    cap.release()    return frames

批量推理并缓存,跟踪检测目标

import supervision as svfrom typing import Any, Dictdef run_tracking(detections: List[Any]) -> Dict[str, List[Dict[int, Dict[str, List[float]]]]]:    tracker = sv.ByteTrack()    results = {"players": [], "referees": [], "ball": []}    for det in detections:        cls_names = det.names        name2id = {v: k for k, v in cls_names.items()}        sv_det = sv.Detections.from_ultralytics(det)        for i, cls_id in enumerate(sv_det.class_id):            if cls_names[cls_id] == "goalkeeper":                sv_det.class_id[i] = name2id["player"]        tracked = tracker.update_with_detections(sv_det)        frame_result = {"players": {}, "referees": {}, "ball": {}}        for t in tracked:            bbox, cls_id, track_id = t[0].tolist(), t[3], t[4]            if cls_id == name2id["player"]:                frame_result["players"][track_id] = {"bbox": bbox}            elif cls_id == name2id["referee"]:                frame_result["referees"][track_id] = {"bbox": bbox}        for t in sv_det:            if t[3] == name2id["ball"]:                frame_result["ball"][1] = {"bbox": t[0].tolist()}        for key in results:            results[key].append(frame_result[key])    return results

绘制可视化框和导出

✅ 颜色聚类辅助身份识别

比赛中球衣颜色不同,我们使用 K-Means 聚类对图像上半部分进行颜色分割:

# 图像预处理upper_half = frame[0:int(h/2), :, :]  # 获取图像上半部分pixels = upper_half.reshape(-1, 3)# 聚类为两个颜色区域(假设为球衣+背景)kmeans = KMeans(n_clusters=2).fit(pixels)# 找出背景标签(角落像素最多的聚类中心)corner_pixels = frame[0:10, 0:10, :].reshape(-1, 3)corner_labels = kmeans.predict(corner_pixels)background_label = np.bincount(corner_labels).argmax()# 得到球员球衣颜色中心player_cluster_color = kmeans.cluster_centers_[1 - background_label]

DeepSORT集成

使用DeepSORT,可以将检测结果与颜色特征结合,自动分配ID并持续追踪:

features = extract_color_features(frame, box)tracker.update(box, features)

最终,我们可在视频中呈现出球员编号、实时轨迹线、速度变化等效果。

动态边框与行为分析

球员分割

可使用YOLACT、RTMDet等模型,对遮挡球员进行实例分割,辅助精确识别和ID保持。

球轨迹插值

处理掉帧、遮挡时足球的轨迹连续性,可使用插值方法:

# 示例:两帧之间线性插值ball_pos_frame1 = (x1, y1)ball_pos_frame2 = (x2, y2)interpolated = [(x1 + i*(x2-x1)/n, y1 + i*(y2-y1)/n) for i in range(1, n)]

* * *

三、这些流程的“痛点”


四、Coovally:一键启动目标追踪系统

当然Coovally还推出了RaaS(Result-as-a-Service)服务:

RaaS 是一种按任务计价、结果交付的AI服务模式,你只需提交需求,无需管模型、平台、训练、测试这些繁琐细节,我们帮你完成所有开发,按阶段交付结果,且效果有保障!

不论是研究型开发还是商用AI系统建设,都可以通过RaaS快速实现原型搭建与迭代,节省90%开发时间与成本。

欢迎扫描下方二维码,提交你的AI需求,开启你的多模态AI开发之旅!(详情可点击了解)

需求提交


五、对比总结表格

模块传统流程Coovally平台
模型训练YOLO下载 + 迁移学习 + 手动调参一键启动,支持预训练YOLOv8
目标追踪需接入DeepSORT、ReID模块平台内置多种追踪算法
轨迹渲染需OpenCV绘图脚本自动轨迹线、速度变化可视化
球衣颜色辅助K-Means聚类手动实现调用SSH本地修改
部署环境需显卡、PyTorch、依赖配置无需安装,云端训练

总结

这场0∶0背后的故事,不止是比分。

“我们从来不是因为看到希望才坚持,而是因为坚持,才能看到希望。”

而技术的价值也在于此:让争议判罚有“辅助证据”,让地方联赛也能享有“VAR级别”的智能辅助。

关注 Coovally AI Hub,探索AI+体育更多可能!后台回复关键词「足球追踪」,获取完整源码与平台体验通道。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

AI 足球 YOLO 目标检测 Coovally
相关文章