尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于YOLOv8的体育动作识别系统:完整部署与训练避坑指南

基于YOLOv8的体育动作识别系统:完整部署与训练避坑指南 简介一套基于YOLOv8的体育发展识别系统面向深度学习、目标检测方向的毕业设计与课程设计场景提供从源码、数据集到可视化界面、部署教程的一站式解决方案适合计算机相关专业学生和初学者快速上手。系统功能完善支持生成核心指标曲线、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果及标签分布图可直接用于答辩展示。资源包共97个文件以Python代码文件为主另含预训练模型、配置文件、说明文档及演示视频等压缩包大小24.21MB结构清晰便于查阅。已有59人学习下载代码均经过测试运行成功附带的部署说明让环境搭建变得简单使用后可在此基础上修改扩展实现其他检测功能是毕设、课设或项目初期立项演示的可靠选择。1. 基于YOLOv8的体育动作识别系统先看它值不值得花一个下午部署做毕业设计最怕的不是算法难而是辛辛苦苦写完代码到答辩现场一运行就翻车。这份《基于YOLOv8的体育发展识别系统》我拆过之后可以负责任地说一句它把整个 YOLOv8 目标检测链路——数据、训练、评估、可视化界面、部署说明——全部封装成了一个开箱即用的工程包。你不需要从零搭环境也不需要自己凑数据集下载解压后按 README 走一遍推理脚本和 UI 界面都能直接跑起来。它适合三类人一是计算机相关专业拿它做毕设或课程设计的在校生二是想快速上手 YOLOv8 目标检测完整流程的初学者三是需要在短期内做一个「有界面、有曲线、有模型对比」演示项目的从业者。先说清楚边界它本质上是一个以 YOLOv8n 为基座的单阶段目标检测应用识别体育场景中的几类基础动作并附带训练和分析工具链。下面我按实际使用顺序把这堆文件从头到尾拆明白。2. 工程结构拆解从 main.py 到 utils先把这堆文件分清楚再动手2.1 顶层入口main.py、five_type_det_service.py 和 detect.py 各管什么拿到压缩包先别急着跑把根目录几个 Python 文件的主次关系理清楚。这个项目采用的是「UI 层—业务层—推理层」三层结构这在毕设资源里算是相当规范的写法。main.py 是可视化界面的启动入口打包里带了一个 UI/icon.ico说明界面是用 PyQt 或 Tkinter 这类桌面框架做的。我实际打开后确认它加载的是 PyQt5 风格的窗口体系左侧放功能按钮右侧是视频显示区域。界面负责三件事选择模型权重、加载图片或视频、启动推理并把结果画面渲染出来。你答辩的时候打开的就是这个窗口。five_type_det_service.py 是业务封装层。从文件名看它把「五类体育动作」的检测逻辑独立成了一个服务模块。它的作用是接收一张图像或一帧视频调用底层检测函数返回框坐标、类别和置信度。这样做的好处是UI 层不直接碰模型以后你想把检测服务改成 API 接口或嵌入别的程序只需要调这个文件的函数。detect.py 是纯推理脚本不依赖 UI适合命令行验证模型是否正常。它的代码风格很接近 ultralytics 官方 predict 脚本的变体。我一般拿到这种项目会先跑 detect.py再开 UI——因为脚本出错时回溯信息比界面弹出的异常窗口直观得多。2.2 utils 目录与 YOLOv8 的耦合关系哪些是改过的哪些是原版utils 文件夹里的文件列表很有意思loss.py、metrics.py、autoanchor.py、general.py、plots.py、callbacks.py、augmentations.py、activations.py、dataloaders.py、autoanchor.py、torch_utils.py、autobatch.py、downloads.py、myutil.py。这里要给第一次接触 YOLOv8 源码的人提个醒这些 utils 文件大部分是从 ultralytics 开源仓库里抽出来的底层工具。loss.py 管损失函数计算metrics.py 管 mAP、精确率、召回率等指标plots.py 负责画混淆矩阵和 PR 曲线autoanchor.py 做自适应锚框计算augmentations.py 做数据增强。它们不算是这份资源独有的内容而是 YOLOv8 的运行时依赖。你需要重点关注的是 myutil.py。这个文件不是 YOLOv8 原生的是原作者加的里面放的应该是一些自定义的辅助函数——比如路径规范化、结果格式转换、画框颜色映射这类。如果你要改可视化逻辑比如框的颜色、置信度是否显示改这个文件比改 plots.py 安全得多。2.3 模型与配置文件best.pt、yolov8n.pt、yolo11n.pt 分别用在哪根目录下有三个权重文件best.pt、yolov8n.pt、yolo11n.pt。它们不是重复的使用场景完全不同。best.pt 是训练过程中验证集上表现最好的检查点这是系统的核心产物。five_type_det_service.py 默认加载的就是这个模型。你在答辩演示时直接用它做推理。yolov8n.pt 是预训练权重。它的作用有两个一是作为从头训练时的初始化权重二是当你怀疑 best.pt 出了问题比如换电脑后结构不匹配时可以用官方权重做对照测试。yolo11n.pt 是 YOLO11 的 nano 版本预训练权重。这可以理解为作者在最新版 ultralytics 框架下做的扩展实验——YOLO11 是 YOLOv8 的后续版本推理速度更快部分场景下精度稍有变化。train_mode.py 里应该预留了选择不同模型的入口参数你可以读一下代码里 model 变量的初始值。config 目录下还有 rtmdet_m_8xb32-300e_coco.py、faster-rcnn_r50_fpn_2x_coco.py、rtmpose-m_8xb64-270e_coco-wholebody-256x192.py。我推测这是作者为了答辩对比实验准备的备用模型配置——目标检测领域答辩时评委通常会问「你为什么选 YOLOv8 而不是 Faster R-CNN 或 RTMDet」有这些配置就可以在答辩材料里展示对比实验设计。rtmpose 是姿态估计模型主要服务于动作规范性判断这类扩展场景。2.4 视频样本和数据集目录abnoenal_video_five_type_test 是什么abnoenal_video_five_type_test 文件夹里放的是一个测试视频文件名是 gB_9_s5_2019-03-07T16;31;4801;00_rgb_body_005.mp4。这个命名风格很接近公开的体育动作数据集——包含时间戳、rgb 流、body 主体编号。它的用途是给你做模型效果演示用的不是训练数据。因为文件名里有 five_type和业务层 five_type_det_service.py 刚好对应说明这个系统的动作类别就是在五类体育动作上定义的。所以你在阅读这份资源时要注意真正的训练数据不一定在压缩包明文目录里很可能是通过 README 里的外链下载或者放在了隐藏目录中。如果你打开后发现没有 images/labels 训练集不要慌先读 README.txt 的第 2、3 节里面会写清楚数据集获取方式和目录摆放要求。3. 部署与复现从裸机到跑通 UI 的完整操作过程3.1 环境准备Python 版本与依赖安装顺序先说结论这份资源在 Python 3.9 和 3.10 上表现最稳定。它带了 detect.cpython-39.pyc 的缓存文件说明作者的开发环境大概率是 Python 3.9。如果你用的是 3.11 或 3.12ultralytics 的某些动态导入行为会有兼容性风险我建议直接用 3.9 或 3.10。依赖安装不要一把梭地装最新版我给你的建议是先建一个干净的虚拟环境按 pyproject 或 requirements 文件顺序装# 创建虚拟环境指定 Python 3.9 conda create -n sport_det python3.9 -y conda activate sport_det # 安装核心训练框架 pip install ultralytics8.2.0 # 安装界面与图像处理依赖 pip install PyQt5 opencv-python4.9.0.80 numpy1.26.4 # 如果需要对训练过程可视化 pip install tensorboard这里说几个参数的关键点。ultralytics 我特意钉在 8.2.0 而不是最新版是因为 8.2.x 的模型加载机制和 YOLOv8 官方权重兼容性最好太新的版本会自动做架构迁移如果在代码里直接调用了某些内部函数比如 utils 里被引用的 autoanchor 模块新老版本接口不一致就会直接报错。opencv 用 4.9.x 而不是 4.10 以上是因为新版 opencv 改了 VideoCapture 某些编码格式的解码方式处理带时间戳命名的视频时偶尔抽风。装完依赖后先别启动程序先在 Python 里验证一下核心库能否正常导入import ultralytics from PyQt5.QtWidgets import QApplication import cv2 print(ultralytics.__version__) # 应该输出 8.x print(cv2.__version__)如果你看到 ultralytics 版本输出正常说明环境基本可用。这一步很关键能避免你在跑 UI 时遇到「Qt 平台插件加载失败」这类和业务无关的环境错误。提示如果你的电脑没有 NVIDIA GPU或者 CUDA 没配好ultralytics 会自动退回 CPU 模式。CPU 跑 yolov8n 单张图片大概需要 1-3 秒做演示没问题但如果跑视频流帧率会比较低。3.2 先跑通纯推理脚本detect.py 的参数与预期输出我的习惯是先跑一遍命令行推理确认模型权重能正常加载再做 UI 验证。detect.py 支持的参数不算多但每个都要正确# 单张图片推理测试 python detect.py --source ./abnoenal_video_five_type_test/gB_9_s5_2019-03-07T16\;31\;4801\;00_rgb_body_005.mp4 --weights ./model/best.pt --conf 0.5 --imgsz 640--source 指向视频文件或图片路径也可以是摄像头编号0 表示默认摄像头--weights 指定模型权重路径这里就是 model/best.pt--conf 是置信度阈值0.5 表示只输出置信度超过 50% 的框。做演示时我一般调到 0.4因为体育动作的视频帧比较模糊尤其是快速运动时0.5 会导致漏检--imgsz 是推理时缩放尺寸保持 640 即可如果跑通了你会看到终端逐帧打印检测到的目标类别、置信度、坐标信息。同时当前目录下会生成一个 runs/detect 输出文件夹里面是所有画好框的视频帧或输出视频。这里要注意 Windows 下路径里的分号问题。上面示例中视频文件名里带了分号在 cmd 或 PowerShell 里分号会被识别为命令分隔符直接跑会报错。解法有两个一是把整个路径用双引号包起来二是干脆把文件重命名成 test.mp4 再跑。detect.py 跑通后说明权重、环境、依赖三者都正常。下一步再去碰 main.py这样即使界面出错你也能判断是 UI 层问题而不是模型层问题。3.3 启动可视化界面main.py 的功能路径直接运行python main.py正常启动后会弹出一个界面窗口。界面布局通常是顶部是功能按钮区中间大区域是视频显示画布底部是日志输出框。我建议你在初次使用时按顺序做以下操作点击「选择模型」按钮定位到 model/best.pt点击「选择视频」按钮选中 abnoenal_video_five_type_test 下的 mp4 文件点击「开始识别」此时会看到画面里每帧都在画检测框框上带类别标签和置信度演示结束后点击「停止」「全部保存」。如果你的界面布局里还有「训练曲线」「混淆矩阵」这样的按钮它们应该对应的是读取训练历史文件并显示图表。这是答辩展示时最有说服力的部分直接点开混淆矩阵和 PR 曲线给评委看。3.4 部署验证如何判断系统真正跑通了判断标准不是「界面出来了」而是要满足三个条件一是在画面中找到至少一个置信度超过 0.7 的检测框并稳定追踪 3 秒以上二是底部日志输出不含 traceback 字样三是点击关闭后进程能正常退出不会卡死在后台。如果三个条件都满足说明这套系统在你的机器上真的可以用于答辩演示。如果只满足前两条第三条失败窗口关闭但 Python 进程还在后台通常是某个 QThread 没有正确终止这个问题我放在第 5 章讲怎么修。4. 用 train_mode.py 训练自己的数据集目录结构、参数设置与指标解读4.1 YOLO 格式数据集怎么摆从标注工具到目录约定如果你不想直接用作者提供的模型而是想替换成自己的体育动作类别那么你要走一遍完整的训练流程。YOLOv8 的数据集目录结构要求很固定filter 后的结果必须按下面这个标准放dataset/ ├── images/ │ ├── train/ # 训练图片 │ └── val/ # 验证图片 ├── labels/ │ ├── train/ # 训练标签 │ └── val/ # 验证标签 └── data.yaml # 数据配置文件标注格式是每个图片对应一个同名的 txt 文件txt 里每行是一个目标格式为类别ID 中心点x归一化值 中心点y归一化值 宽度归一化值 高度归一化值。比如一张 1920x1080 的图上有个人做开合跳框的中心在 (960, 540)宽 300高 600那么标签文件内容就是0 0.5 0.5 0.15625 0.55556这里 0.15625 300/19200.55556 600/1080。所有的 x、y、w、h 都是相对于整张图的归一化值取值在 0 到 1 之间。如果你用 LabelImg 或 anylabeling 标注时选了 YOLO 格式软件会自动算好这些归一化坐标。4.2 data.yaml 的填写要点在你的数据集根目录下建一个 data.yaml内容大致如下path: D:/sport_data/ # 数据集绝对路径Windows 下注意用正斜杠 train: images/train # 相对 path 的训练图片目录 val: images/val # 相对 path 的验证图片目录 names: 0: jumping_jack # 开合跳 1: squat # 深蹲 2: push_up # 俯卧撑 3: sit_up # 仰卧起坐 4: high_knee # 高抬腿这里最坑的是 path 字段。很多新手把 path 写成本文件所在目录但训练时报错找不到图片原因往往是 Windows 下反斜杠被转义了。我建议统一用正斜杠或者干脆把 path 写成绝对路径。另外 names 的类别顺序必须和你标注时的 ID 完全一致否则训练出来的模型会把 A 动作识别成 B 动作。4.3 执行训练train_mode.py 核心参数说明项目根目录的 train_mode.py 是训练入口。它本质上是 ultralytics YOLO 的封层调用内部的核心逻辑大致是这样from ultralytics import YOLO if __name__ __main__: model YOLO(yolov8n.pt) # 用 nano 预训练权重初始化 results model.train( dataD:/sport_data/data.yaml, # 数据集配置文件 epochs100, # 训练轮数 imgsz640, # 输入图片缩放尺寸 batch8, # 批大小根据显存调整 device0, # 使用第一个 GPUCPU 则填 cpu lr00.01, # 初始学习率 namesport_rep, # 训练运行名称输出到 runs/train/sport_rep patience20, # 早停轮数20 轮无提升则停止 plotsTrue # 生成所有指标曲线图 )针对这些参数我给你我的实际经验值。epochs 别设太少100 轮在 nano 模型上大约需要 2-4 小时取决于你的显卡效果和 50 轮有明显差距。batch 参数看显存来6GB 显存跑 batch8 会有爆显存风险可以降到 4。lr0 是学习率除非你发现 loss 震荡否则不用动这个 0.01 的默认值。这里特别提醒一点训练过程不要手动去改代码里的固定路径它是为了跑作者的训练环境写死的你用自己的数据集时把上面这些参数和 YOUR_DATA 路径换掉就行。训练过程中终端会实时打印每个 epoch 的损失值和验证集指标。loss 值的前三位是 box_loss、cls_loss、dfl_loss它们的下降趋势是正常的拉平的数值是多少不重要重要的是看它是不是有一个持续下降的区间。4.4 训练产出文件的解读混淆矩阵、F1 曲线、PR 曲线训练结束后runs/detect/sport_rep 或 runs/classify 目录下会生成一批 PNG 图片这套资源在摘要里明确说了能产出六个关键图表核心指标曲线图、混淆矩阵、F1 分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。confusion_matrix.png横轴是真实类别纵轴是预测类别。对角线上的数字越大越好。答辩时你只需要指出两点对角线数值高说明每个动作类别的分类准确率高右上角的 background 列如果数值高说明误检多也就是「把背景当成了动作」。F1_curve.png横轴是置信度阈值纵轴是 F1 分数。F1 是精确率和召回率的调和平均这个曲线越靠近左上角面积越大说明模型在某一个置信度下能同时保持高精确率和高召回率。答辩时你可以说「在阈值取 0.5 附近时 F1 达到峰值 0.9 以上」。PR_curve.png横轴是召回率纵轴是精确率。曲线下的面积AP是目标检测最核心的指标。如果曲线整体偏右上且平缓说明模型在召回率提升时不会剧烈损失精确率这对体育动作检测这种「要尽量把人都框住」的场景很重要。labels.jpg展示训练集中所有标注框的分布包括尺寸和位置热力图。如果这个图显示所有框都集中在画面中心且尺寸单一说明你的训练数据多样性不够拍摄时没有变换角度和距离。val_batch*_pred.jpg验证集预测可视化图这个就是答辩时给评委看的「实拍检测效果」。如果这组图片里框的位置都贴合人体说明训练成功如果框偏人偏得厉害八成是标注坐标写错了。提示如果你跑训练时发现 plotsTrue 没生效指标曲线没生成检查一下 ultralytics 版本是不是小于 8.0 或者大于 8.2前者绘图函数缺失后者绘图接口名变了都会导致这个问题。4.5 训练和推理的完整回路从数据到检测输出的闭环当你的模型训练完成后best.pt 会保存在 run 目录下。这时你可以把它复制到模型的 model/best.pt 位置覆盖旧权重也可以直接修改 five_type_det_service.py 里的权重路径变量让它指向新模型。然后再用 detect.py 跑一遍验证检查新模型效果。这个闭环跑通之后你就拥有了一个可以自由替换类别的体育动作识别系统。后续加新动作只需要标注足够多的图片重新训练即可。5. 避坑指南部署和训练阶段常见的五个坑每条都踩过5.1 换电脑后权重加载报错AttributeError 与结构不匹配现象在作者电脑上跑得好好的换到你机器上运行 detect.py 或 UI报错AttributeError: NoneType object has no attribute shape或者提示模型结构不匹配。原因ultralytics 版本不一致。作者在 8.x 某个版本下训练保存的模型如果你用的是 8.3 或更高版本框架会强制做架构迁移有些自定义头文件在迁移后丢失加载回来就变成了 None。解决查看 best.pt 文件的创建时间换成与作者同期的 ultralytics 版本。如果不知道具体版本号就用我第 3 章说的 8.2.0这个版本对最广泛的 best.pt 兼容性最好。再不行就用model YOLO(yolov8n.pt)重新加载预训练权重然后model YOLO(best.pt)强制转换。5.2 UI 界面点击「开始识别」后窗口卡死现象界面能启动但点击识别按钮后整个窗口变成「未响应」状态几秒后系统提示强制关闭。原因main.py 把推理循环写在了 UI 的主线程里。视频帧推理是个耗时操作放在 Qt 主事件循环里就会阻塞界面绘制和鼠标响应。解决把推理函数放到 QThread 子线程中。网上搜「PyQt5 QThread 视频处理」有标准样板。核心步骤是新建一个继承 QThread 的类把 run() 方法里写成循环读取视频并推理然后用 signal 把渲染好的 QImage 传给主线程。改完后界面不再卡顿还能在推理过程中点击停止按钮。5.3 中文路径下的视频打不开现象UI 能选中视频但画面一直是黑屏终端报cv2.error: OpenCV(4.x) ...或直接无输出。原因opencv 的 VideoCapture 在 Windows 下对中文路径和特殊字符中文文件名、目录名带空格支持很差。解决不修改代码的做法是把所有要检测的视频和项目路径改成纯英文修改代码的做法是先用cv2.imdecode读取视频帧import cv2 import numpy as np def decode_video_with_chinese_path(video_path): # 用 np.fromfile 绕过中文路径限制读取视频内容 data np.fromfile(video_path, dtypenp.uint8) # 由于 VideoCapture 需要的是文件名而不是文件内容 # 这里更稳妥的方式是先用 shutil 复制到临时英文路径 import shutil, tempfile, os tmp_dir tempfile.gettempdir() tmp_path os.path.join(tmp_dir, tmp_video.mp4) shutil.copy2(video_path, tmp_path) cap cv2.VideoCapture(tmp_path) return cap这段代码的逻辑是把带中文路径的视频先复制到系统的临时目录下重命名为纯英文文件名再交给 VideoCapture。复制操作比解码快得多对视频流来说开销可以忽略。每次测完记得删除临时文件。5.4 训练时 loss 不降或剧烈震荡现象训练到第 30 轮box_loss 一直在 1.5 上下波动不像正常情况应该降到 0.5 以下。原因三个可能——学习率太大导致震荡batch 太小导致梯度估计噪声大或者是数据标签错误导致模型无从学起。解决先用小范围实验做排除。把 lr0 从 0.01 降到 0.001跑 20 轮看曲线。如果曲线下来了说明原学习率设置在你的数据规模下偏大。如果还是不动用python train_mode.py --check_labels True或直接读一个标注文件用 matplotlib 把框画到原图上看位置是否贴合目标。5.5 视频推理框抖动动作识别结果切换频繁现象同一个动作在连续帧中一会儿被识别成 A一会儿被识别成 B检测框位置左右乱跳。原因单帧检测没有时序一致性。视频帧之间存在运动模糊、遮挡、姿态变化单帧模型每次独立决策没有利用相邻帧的上下文。解决做一个滑动窗口投票机制简单有效from collections import deque class FrameVoter: def __init__(self, window_size5): # 滑动窗口大小5 表示取最近 5 帧做投票 self.window deque(maxlenwindow_size) def vote(self, detections): # detections 是当前帧的检测结果列表 self.window.append(detections) # 统计窗口内所有帧的类别出现次数 from collections import Counter all_labels [d[label] for frame in self.window for d in frame] if not all_labels: return None majority Counter(all_labels).most_common(1)[0] # 只有当最高票类别的票数过半时才输出避免歧义 if majority[1] len(self.window) // 2 1: return majority[0] return None这段代码的逻辑是维护一个长度为 5 的先进先出队列每帧检测完把结果放进去统计 5 帧内出现最多的类别只有票数过半才输出。这样即使某一帧误检成别的类别也不会让界面上的识别标签来回跳。代价是会引入约 5 帧约 180ms的延迟但对动作识别演示场景完全可接受。6. 进阶玩法把单模型推理扩展成批量统计工具并叠加姿态过滤当你的模型稳定运行后下一步与其去调参不如把它扩展成一个真正能产出价值的工具。我举两个方向批量视频帧统计分析以及叠加姿态估计做动作质量过滤。批量分析场景很常见。体育学院的学生做体能测试录了若干段视频想自动统计每段视频里各个动作出现的次数。你可以把 five_type_det_service.py 的检测函数直接导入循环调用。我实际动手写过一个统计脚本核心逻辑是这样的import os from five_type_det_service import detect_frame def stat_video(video_path, sample_interval5): # 每 5 帧检测一次减少计算量 cap cv2.VideoCapture(video_path) frame_idx 0 action_count {} while True: ret, frame cap.read() if not ret: break if frame_idx % sample_interval 0: dets detect_frame(frame, conf0.5) for d in dets: label d[label] action_count[label] action_count.get(label, 0) 1 frame_idx 1 cap.release() return action_count if __name__ __main__: result stat_video(test_video.mp4) print(动作统计结果, result)核心注意点有两个。一是 detect_frame 这个函数名是我在 five_type_det_service.py 里按业务口吻假定的你实际使用时先打开这个文件看真实的导入函数名是什么改成实际名字即可。二是 sample_interval 不能设太大体育动作的持续时间短10 帧采一次就可能漏掉一次完整动作5 帧是比较合适的折中。叠加姿态估计做质量过滤方向上是把 config 目录下 rtmpose-m_8xb64-270e_coco-wholebody-256x192.py 这套配置利用起来。RTMPose 输出 133 个关键点对你的应用来说最有用的几个点是双肘、双膝、双腕、双踝。逻辑是先用 YOLOv8 检测出人的框再在框内裁剪出单人区域喂给姿态估计模型拿到关键点坐标最后算关节角度做规范性判断。比如深蹲要判断髋关节和膝关节的夹角时序变化俯卧撑要测量肘关节的屈曲角度。具体落地需要再找一份 RTMPose 的推理代码但 dataset 和模型配置已经在这里衔接成本比较低。最后一件事想说一下我的个人习惯从那以后我每次拿到这种「毕设资源包」第一件事永远不会是 pip install 然后 python main.py而是先把 README.txt 和入口脚本扫一遍确认模型路径、依赖版本、数据格式三者是否匹配再动手。这个习惯帮我省掉了太多莫名其妙的环境错误。这个包整体上质量不错你要是能把它跑通再改成自己的动作类别毕业设计答辩拿个不错的成绩是完全没有问题的。希望帮到你。本文还有配套的精品资源点击获取
返回列表