
简介这份YOLO足球和运动员检测数据集面向计算机视觉学习者、目标检测算法实践者以及体育视频分析方向的开发者用于训练和验证足球场景下的人体与足球目标检测模型。数据均来自真实比赛场景使用labelImg完成标注图片为jpg格式标签同时提供VOC格式的xml文件与YOLO格式的txt文件分别存放于两个文件夹方便直接接入不同检测框架。压缩包共199个文件包含66张jpg图像、66个xml标注和67个txt标签整体约75.96MB规模适中适合快速开展模型训练与效果验证。目前已有962人学习下载配套博文还给出了数据集与检测结果的参考链接便于对照查看实际检测表现。读者可借此省去自行采集与标注的成本直接用于YOLO系列模型的训练、调参与对比实验也可作为体育视频目标检测课题的入门数据基础。1. 从一场业余联赛的边线机位说起这套 YOLO 足球和运动员检测数据集到底能干什么去年帮一个做校园联赛直播的团队调检测模型他们最头疼的不是算力而是手头那点标注数据全是摆拍——球员站得整整齐齐球放在中圈模型在真实转播画面里一跑就废。后来换了一套真实场景的足球检测数据mAP 直接从 0.4 出头爬到 0.8 以上这才意识到YOLO 足球和运动员检测数据集的价值不在图片数量而在标注是否贴合比赛现场那种人挤人、球被遮挡、远景小目标的真实分布。这套资源用 labelImg 标注图片是 jpg标签同时给了 VOC 的 xml 和 YOLO 的 txt 两套分别放在两个文件夹里省掉了格式转换那一步。它适合三类人想跑通 yolov8训练自己的数据集 流程的新手、做足球视频分析神器类产品的工程师、以及需要足球机器人视觉模块做验证的研究者。下面我按「拿到手怎么用 → 参数怎么设 → 哪里会翻车」的顺序拆一遍。2. 数据集结构与格式选型VOC 和 YOLO 两套标签到底该用哪套2.1 目录长什么样先看清楚再动手拿到压缩包解压后典型结构是这样不同批次文件名会有差异但层级一致football_dataset/ ├── images/ # 全部 jpg 原图 │ ├── 6ty_f_65_we.jpg │ ├── 22d_f_85_fr.jpg │ └── ... ├── labels_voc/ # VOC 格式 xml │ ├── 6ty_f_65_we.xml │ └── ... └── labels_yolo/ # YOLO 格式 txt ├── 6ty_f_65_we.txt └── ...文件名里那些6ty、22d、fre、54r、we是采集批次或场景代号f后面跟的数字大概率是帧号或置信度筛选标记。不要手动改文件名因为 xml 和 txt 里虽然不直接引用文件名但训练脚本按同名匹配图片和标签改一个就断一对。2.2 VOC 与 YOLO 格式的差异以及为什么这套数据两套都给VOC 的 xml 存的是绝对像素坐标xmin, ymin, xmax, ymaxYOLO 的 txt 存的是归一化后的class x_center y_center width height取值范围 0~1。两套标签的换算关系是x_center (xmin xmax) / 2 / img_width y_center (ymin ymax) / 2 / img_height width (xmax - xmin) / img_width height (ymax - ymin) / img_height这套数据同时给两套实际是照顾两类流程用 MMDetection、Detectron2 或早期 TensorFlow 管线的人直接吃 VOC用 Ultralytics 系yolov5 / yolov8的人直接吃 YOLO txt。我一般会优先用 labels_yolo因为省一次转换而且 Ultralytics 的 dataloader 对 txt 的容错更好。但如果你要做数据增强后重新生成标签VOC 的绝对坐标在几何变换时更直观这时候用 xml 反而顺手。2.3 类别定义与标签文件内容核对这套数据标签有两种通常对应ball足球和player运动员部分批次可能把裁判、门将单独分出来。先跑一段脚本统计类别分布别急着开训import os from collections import Counter label_dir football_dataset/labels_yolo cls_counter Counter() empty_files [] for name in os.listdir(label_dir): if not name.endswith(.txt): continue path os.path.join(label_dir, name) with open(path, r) as f: lines [l.strip() for l in f if l.strip()] if not lines: empty_files.append(name) # 空标签 纯背景图别删 continue for line in lines: cls_id int(line.split()[0]) cls_counter[cls_id] 1 print(类别分布:, cls_counter) print(空标签文件数:, len(empty_files))逻辑说明逐行读 txt第一列是类别 id统计每个类出现次数。参数说明label_dir换成你实际的 labels_yolo 路径empty_files记录的是没有目标的纯背景图这类图对降低误检率有用不要当脏数据删掉。如果统计出来只有 0 和 1 两个类那 ball 和 player 的映射关系要在 data.yaml 里写清楚别猜。3. 从零跑通 yolov8 训练环境、data.yaml 与关键超参3.1 环境配置Anaconda 建环境 Ultralytics 安装yolo v8 anaconda环境配置要求 其实不高Python 3.8~3.11 都行关键是 PyTorch 和 CUDA 版本对齐。我习惯这么建conda create -n yolo_football python3.10 -y conda activate yolo_football # 按你的 CUDA 版本选下面以 cu118 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics opencv-python lxml逻辑说明先隔离环境避免和系统里的 torch 打架ultralytics一个包就把训练、验证、导出全带了。参数说明CUDA 版本用nvidia-smi右上角那个数字别照抄我的 cu118。装完跑yolo checks确认 GPU 被识别如果显示 CPU only八成是 torch 装成了 CPU 版。3.2 划分训练验证集并生成 data.yaml数据集不能一股脑全丢进去训得先切分。我一般按 8:2 切且按场景代号分层切避免同一场比赛的帧同时出现在训练和验证里导致指标虚高import os, random, shutil random.seed(42) img_dir football_dataset/images lbl_dir football_dataset/labels_yolo out_root dataset_split for split in [train, val]: os.makedirs(f{out_root}/images/{split}, exist_okTrue) os.makedirs(f{out_root}/labels/{split}, exist_okTrue) imgs [f for f in os.listdir(img_dir) if f.endswith(.jpg)] random.shuffle(imgs) cut int(len(imgs) * 0.8) for i, img in enumerate(imgs): split train if i cut else val shutil.copy(os.path.join(img_dir, img), f{out_root}/images/{split}/{img}) lbl img.replace(.jpg, .txt) src_lbl os.path.join(lbl_dir, lbl) if os.path.exists(src_lbl): shutil.copy(src_lbl, f{out_root}/labels/{split}/{lbl})逻辑说明先建好 train/val 的 images 和 labels 子目录打乱后按 8:2 复制。参数说明random.seed(42)保证可复现如果要做分层切分把imgs按文件名前缀6ty/22d/fre 等分组后再各自切 8:2。对应的 data.yamlpath: /abs/path/to/dataset_split train: images/train val: images/val names: 0: ball 1: player注意path必须写绝对路径Ultralytics 对相对路径的解析在不同版本里行为不一致这是血泪经验。3.3 启动训练与关键超参怎么设yolo detect train \ datadataset_split/data.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/football \ nameexp1逻辑说明modelyolov8s.pt用官方预训练权重做迁移小数据集别从零训。参数说明imgsz640是速度和精度的平衡点足球在远景里是小目标如果你显存够可以上 960 甚至 1280小目标召回会明显改善batch16按显存调爆显存就减半patience20是早停验证指标 20 轮不涨就停省时间lr00.01是初始学习率小数据集可以降到 0.005 更稳。训练时盯mAP50和mAP50-95两条曲线如果 loss 一直震荡先把 batch 调大或 lr 调小。3.4 推理与置信度门限调整训完拿验证集或自己的视频跑推理yolo detect predict \ modelruns/football/exp1/weights/best.pt \ sourcetest_video.mp4 \ conf0.35 \ iou0.5 \ saveTrue逻辑说明conf是置信度门限低于它的框直接丢iou是 NMS 的 IoU 阈值控制重叠框合并。参数说明足球检测里球经常被球员腿遮挡conf设太高会漏球我一般从 0.25 起调iou0.5是默认如果发现同一球员出两个框降到 0.4。yolo 检测 调整置信度门限 这件事没有万能值必须拿一段真实比赛视频边看边调。4. 避坑与排查这套数据最容易翻车的五个地方4.1 现象训练 loss 正常但 mAP 一直是 0原因data.yaml 里的names顺序和 txt 里的类别 id 对不上或者path写成了相对路径导致标签根本没加载。解决先跑 2.3 的统计脚本确认类别 id再把 data.yaml 的path改成绝对路径训练启动时看日志里train: xxx images的数量对不对数量为 0 就是路径错了。4.2 现象球几乎检不出来球员正常原因足球在 640 分辨率下往往只有十几个像素属于典型小目标加上运动模糊特征太弱。解决把imgsz提到 960 或 1280在 data.yaml 同级开mosaic和copy_paste增强如果还不行考虑用 yolov8 的 P2 小目标检测头或者把球单独切出来做一次超分再送检测。4.3 现象验证集指标很高一上真实视频就崩原因切分时没按场景分层同一场比赛的相邻帧同时进了训练和验证模型等于背答案。解决按文件名前缀6ty/22d/fre 等场景代号分组后再切分保证验证集里的场景训练时没见过。这是做视频类数据集最容易被忽略的坑。4.4 现象xml 转 txt 后框全偏了原因VOC 的坐标原点在左上角但有些标注工具导出的 xml 里width/height和实际图片尺寸不一致归一化时分母用错。解决转换时用cv2.imread读真实图片尺寸别信 xml 里的size字段转换完随机抽 10 张用脚本把框画回图上肉眼核对。4.5 现象训练到一半显存爆了原因imgsz调大后 batch 没同步降或者 dataloader 的workers开太多。解决显存不够时优先降 batch再降 imgszworkers在 Windows 上设 0 或 2Linux 上可以设 8设太高反而拖慢。另外cacheTrue会把整个数据集缓存进内存小显存机器别开。5. 进阶技巧用这套数据做足球视频分析时的两个实用招第一个招是跨帧 ID 关联。单纯逐帧检测出来的球和球员是没有身份的做战术分析必须把同一球员在连续帧里串起来。常见做法是检测框中心点做匈牙利算法匹配配合卡尔曼滤波预测下一帧位置。这套数据的帧号命名f_65、f_85暗示了帧序你可以按前缀分组后按帧号排序直接构造短序列做跟踪验证。我一般会先用 ByteTrack 跑一遍它不用额外训练对遮挡的鲁棒性也够用。第二个招是球场区域过滤。真实转播画面里观众席、广告牌、边裁都会干扰检测但足球和球员基本只出现在草地区域。可以用 HSV 阈值先粗分割出绿色场地把检测框中心不在场地内的结果滤掉误检率能降一截。代码不复杂import cv2 import numpy as np def is_on_pitch(frame, box): x1, y1, x2, y2 map(int, box) cx, cy (x1 x2) // 2, (y1 y2) // 2 hsv cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) h, s, v hsv[cy, cx] # 草地绿色大致范围按实际画面微调 return 35 h 85 and s 40 and v 40逻辑说明取检测框中心点的 HSV 值判断是否落在草地绿色区间。参数说明h的 35~85 是 OpenCV 的色相范围不同球场灯光下会漂移建议先截几帧用取色器量一下再定s和v的下限是排除灰暗的阴影区。这个过滤放在 NMS 之后、跟踪之前效果最好。最后说个验证方法别只看 mAP 数字拿一段 30 秒的真实比赛片段把检测结果和原视频叠在一起逐帧看重点看三处——球被遮挡时有没有丢、远景小目标有没有框、球员密集时有没有粘连。我踩过的最大一次坑就是 mAP 0.85 的模型实际视频里球一进人堆就消失后来把 imgsz 从 640 提到 1280 才解决。从那以后我每次训完足球检测模型都强制拿真实转播片段过一遍再决定要不要上线。希望帮到你。本文还有配套的精品资源点击获取