ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

YOLOv8跆拳道训练系统:动作识别、计数与部署全攻略

YOLOv8跆拳道训练系统:动作识别、计数与部署全攻略 简介基于YOLOv8的跆拳道训练系统是一套包含完整源码与配套数据的目标检测毕设项目面向计算机相关专业学生及深度学习入门者适用于毕业设计、课程设计或项目初期演示。压缩包共97个文件以Python脚本为主70个py文件辅以模型权重、XML配置、文本说明、界面图标及演示视频等整体仅24.21MB轻量易部署。项目内含完整训练代码、跆拳道动作数据集、可视化界面及部署教程代码模块涵盖模型训练、检测服务、工具函数等支持生成混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果与标签分布图等关键评估图表便于系统展示模型训练与检测效果。同时附有README部署说明与测试视频操作门槛低可快速上手并在此基础上进行二次开发。已有73人学习下载对需要快速搭建YOLOv8检测应用的学生具有实际参考价值。1. 基于YOLOv8的跆拳道训练系统动作识别与训练辅助的落地切面把摄像头架在跆拳道训练馆的角落学员踢出一记横踢屏幕里的检测框跟着腿的轨迹移动旁边的计数器自动加一——这是YOLOv8跆拳道训练系统最直观的形态。很多毕业生第一次接触这个题目时会疑惑动作识别不是应该用姿态估计吗实际上对于品势练习和基础腿法训练目标检测比姿态估计更实用它不需要精确到关节坐标只需要判断“某个动作正在发生”然后交给后端的时序逻辑去计数和评分。这个系统的价值在于把训练过程变成可量化的数据反馈让学员能看到自己的动作频率和完成度也让教练少做重复性的统计工作。本文会从数据集构建、模型训练、可视化界面到部署调优完整走一遍这套系统的技术路径适合正在做毕业设计、课程设计或者想快速验证YOLOv8在体育场景落地效果的人。2. YOLOv8模型结构与跆拳道动作数据集先想清楚“检测什么”2.1 为什么YOLOv8适合跆拳道训练场景跆拳道训练系统的核心任务是识别若干固定的腿法动作——前踢、横踢、下劈、后踢、侧踢、后旋踢。这些动作的共同特点是目标不是人体全身而是“正在发力的瞬间”。比如横踢的打击瞬间躯干旋转、腿横向弹出整个动作在视频中只持续十几帧。用姿态估计如YOLOv8-pose也能做但它输出17个关键点坐标后续还要自己计算关节角度判断动作类型逻辑链长、阈值难调。相比之下YOLOv8的输出直接就是“某个动作类别的边界框”配合时序状态机就能完成计数。检测框标在整个身体上而不是只标腿原因很简单跆拳道动作发力时全身协调躯干的旋转方向和位置变化比单纯腿部位置更稳定漏检率更低。2.2 YOLOv8网络结构中训练前必须了解的三个部件YOLOv8的版本迭代中有三个部件直接关系到训练效果和推理速度。第一是C2f模块它取代了YOLOv5的C3模块通过跨阶段连接把梯度流拆成多条支路在相同算力下梯度回传更充分收敛更稳。第二是SPPF它对特征图做多尺度池化聚合让网络对不同尺寸的踢腿动作更鲁棒——远景的全身和近景的腿部特写都能被正确处理。第三是anchor-free的Decoupled Head分类和回归分支解耦每个分支专注自己的任务。网络结构上的直观影响是检测小目标(比如视频里距离摄像头较远的学员)时YOLOv8n比YOLOv5s更容易在低置信度下保持召回。这决定了训练时的输入尺寸策略见第3章参数部分。 ### 2.3 数据集的类别设计与标注规范 数据集是这套系统里最花时间、也最影响结果的部分。公开的跆拳道检测数据集几乎没有热词里能搜到的多是桥墩病害、POI、Acne04一类的专用集直接用不上所以实际项目里最常见的做法是自采用手机固定机位录训练视频按每帧间隔抽帧再用labelImg或labelme标注。类别建议这样定义 | 类别ID | 英文标签 | 中文含义 | 标注要点 | |--------|-------------------|--------------|------------------------------| | 0 | front_kick | 前踢 | 膝盖提起、脚向前弹踢的瞬间 | | 1 | roundhouse_kick | 横踢 | 支撑脚旋转、腿横向扫出 | | 2 | axe_kick | 下劈 | 腿高抬后向下劈落 | | 3 | back_kick | 后踢 | 背对目标、腿向后蹬出 | | 4 | side_kick | 侧踢 | 身体侧向、腿平推 | | 5 | turning_kick | 后旋踢 | 旋转身体后腿画弧踢出 | 标注时框住整个人体而非只框腿因为动作判定依赖躯干旋转信息。每类动作建议不少于800帧有效样本单类样本过少时视频抽帧里同一动作连续帧高度相似虽然帧数多但信息量低需要隔几帧抽一次保证动作姿态多样性。 ### 2.4 数据目录结构和yaml配置 数据集按YOLO格式组织目录结构如下taekwondo_dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/train和val按8:2划分最好是“按视频划分”而不是“按帧随机划分”。同一视频连续帧几乎一样按帧随机划分会让模型把视频背景当作特征验证指标虚高。对应的taekwondo.yaml yaml path: /path/to/taekwondo_dataset train: images/train val: images/val nc: 6 names: 0: front_kick 1: roundhouse_kick 2: axe_kick 3: back_kick 4: side_kick 5: turning_kick注意path尽量写绝对路径相对路径在后续导出模型、换机器跑推理时容易踩坑。如果视频里有多个学员同时训练标注时要按动作把每个人单独框出后面的可视化界面里才好统计每个人各自的训练次数。3. 用ultralytics训练YOLOv8环境配置、训练命令与关键参数3.1 YOLOv8环境搭建步骤环境配置是初学者最常卡住的地方。核心是先装对PyTorch再装ultralytics。一个干净的做法是用conda建独立环境避免把系统Python搞乱conda create -n taekwondo python3.10 conda activate taekwondo # 先装torch去pytorch官网按CUDA版本选命令 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics如果只是CPU训练torch装CPU版本即可但YOLOv8在CPU上训练速度会慢很多毕设场景下最好找一张NVIDIA显卡。安装完成后用yolo命令或Python两种方式调用验证环境是否正常python -c from ultralytics import YOLO; model YOLO(yolov8n.pt); print(ok)3.2 最小可运行的训练脚本训练入口用Python脚本比命令行更灵活方便调试参数。下面是最小可运行的训练代码from ultralytics import YOLO model YOLO(yolov8n.pt) # 加载COCO预训练权重 model.train( datataekwondo.yaml, epochs150, imgsz640, batch16, device0, projectruns/taekwondo, nameexp )这段代码的逻辑是以yolov8n.pt预训练权重为起点在自己的跆拳道数据集上微调而不是从零训练。预训练权重已经学会了基本的纹理、边缘、人体形状特征迁移到腿部动作识别只需要调整高层语义收敛速度快、而且不容易因为样本量不足而欠拟合。device0表示使用第0张显卡CPU训练时改成devicecpu。3.3 训练参数怎么设以GTX 1660Ti为基准的参数表GTX 1660Ti是6GB显存的入门卡也是很多毕设机器的标配。这张卡跑YOLOv8n没问题但如果不调整参数直接套用默认batch16、imgsz640很可能显存溢出。实际项目中我一般这样给参数参数推荐值说明modelyolov8n.pt6GB显存跑yolov8s勉强n是稳妥选择imgsz640 → 480分辨率降低后显存占用明显下降mAP损失1~2个点batch8 ~ 166GB显存下batch8最稳batch16需要关闭其他显存占用epochs150~200数据量小epochs可以多一点配合早停防止过拟合optimizerAdamW小数据集AdamW收敛快SGD后期精度高但需要更多epochlr00.001预训练权重微调时这个初始学习率比较安全patience20连续20个epoch验证集没有提升就自动停止这里的关键是训练速度与精度的平衡。1660Ti上yolov8n imgsz640 batch8一轮epoch根据数据量不同大约3到8分钟150个epoch跑下来基本在十个小时量级晚饭后挂上训练早上起来看结果对于毕设节奏是能接受的。如果实在急性子把imgsz降到480。3.4 训练完看什么损失曲线与验证指标训练结束后所有产物在runs/taekwondo/exp/目录下。重点看三个文件results.png、confusion_matrix.png、weights/best.pt。results.png里包含训练损失、验证损失、精确率、召回率和mAP50的变化曲线。YOLOv8默认开启混合精度训练所以损失曲线会有轻微抖动这是正常的。需要警惕的是以下情况train_loss持续下降但val_loss先降后升 → 过拟合增大数据增强或加早停box_loss和cls_loss都在下降但mAP50不涨 → 类别样本不平衡检查哪几类样本少val损失曲线大幅震荡 → 学习率偏高把lr0降到0.0005验证指标里最值得关注的是mAP50和每个类别的单独召回率。跆拳道动作检测中漏检比误检更影响体验漏检一次意味着少计一次动作误检一般只在画面杂乱时出现。所以后续推理时置信度阈值不要设太高。4. 可视化界面与推理部署从模型到可运行的训练系统4.1 可视化界面的技术选型训练系统的“可视化界面”在标题里占了很大分量。实际项目中这个界面通常做成桌面应用或Web页面两种形态。常见做法是用PyQt5或PySide6做桌面端因为毕业答辩演示时不需要网络环境双击就能运行。界面组件包括视频源选择本地视频或摄像头、检测结果预览窗口、动作计数显示面板、置信度阈值滑块。也可以用Streamlit做Web端好处是界面代码量少但实时视频流处理会多一层浏览器延迟。桌面端更推荐我没有必要为Web端多引入一路前向推理的延迟。4.2 核心推理代码加载模型与实时预测界面背后最核心的代码是模型加载和逐帧推理逻辑。YOLOv8的Python接口封装得比较干净一段能直接用的推理代码如下from ultralytics import YOLO import cv2 # 加载训练好的最佳权重 model YOLO(runs/taekwondo/exp/weights/best.pt) cap cv2.VideoCapture(0) # 摄像头或换成视频文件路径 while cap.isOpened(): ret, frame cap.read() if not ret: break # 推理帧conf阈值0.4 results model.predict(frame, conf0.4, imgsz640, verboseFalse) annotated results[0].plot() # 在图像上绘制检测框和标签 cv2.imshow(Taekwondo Training, annotated) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()conf0.4的意思是只显示置信度高于0.4的检测框训练集质量高时可以提到0.5视频监控里有杂乱背景时降到0.3。predict内部会自动做预处理、推理、后处理results[0].plot()返回画好框的BGR图像直接交给OpenCV显示。这段逻辑已经覆盖了“可视化”的最低要求画面叠加实时检测框。4.3 接入界面用PyQt5做实时视频窗口为了让界面更像“训练系统”而不是“OpenCV弹窗”把上面的循环嵌入PyQt的定时器里。核心结构是界面组件用Qt布局QTimer每30毫秒触发一次视频帧读取和推理刷新画面计数结果通过信号更新标签。from PyQt5.QtCore import QTimer from PyQt5.QtGui import QImage, QPixmap import cv2 from ultralytics import YOLO class TrainingWindow(QMainWindow): def __init__(self): super().__init__() self.model YOLO(runs/taekwondo/exp/weights/best.pt) self.timer QTimer(self) self.timer.timeout.connect(self.update_frame) self.timer.start(30) # 约33fps def update_frame(self): ret, frame self.cap.read() if not ret: return results self.model.predict(frame, conf0.4, verboseFalse) annotated results[0].plot() rgb cv2.cvtColor(annotated, cv2.COLOR_BGR2RGB) h, w, c rgb.shape qimg QImage(rgb.data, w, h, c * w, QImage.Format_RGB888) self.video_label.setPixmap(QPixmap.fromImage(qimg))这里QTimer的间隔和推理耗时是联动的如果推理一帧要100毫秒实际帧率就是10fps左右。对于训练反馈场景这已经够用不需要刻意追求实时。如果觉得画面卡用yolov8n模型而不是s或m或者把imgsz从640降到480。4.4 部署形态导出ONNX与依赖收敛“简单部署即可运行”这个表述背后常见的做法是两种一种是源码部署把Python环境和依赖整理成requirements.txt另一种是导出模型然后用轻量级运行时部署。后者能解决很多问题Python环境在不同机器上版本不一致显卡驱动不一样甚至CUDA版本都对不上。模型导出命令yolo export modelruns/taekwondo/exp/weights/best.pt formatonnx imgsz640导出后得到best.onnx推理时可以用onnxruntime加载CPU也能跑到不错的帧率。如果部署机器有NVIDIA显卡且装好TensorRT还可以进一步导出engine格式推理延迟能再降一个量级。实际操作中毕设答辩演示机器往往没有配置好的CUDA环境所以准备一个ONNX CPU模式的推理入口很关键至少保证演示现场不会因为环境问题卡壳。5. 动作计数、低显存调优与答辩防坑实战5.1 动作计数逻辑用帧间状态机避免重复统计YOLOv8输出的是每一帧的检测结果它本身没有“次数”的概念。一个横踢动作持续十几帧每一帧都会检测到roundhouse_kick如果每帧都加一统计出来的次数会远超实际踢腿数。常见的解决方案是状态机每个动作类别维护一个“是否处于动作中”的布尔状态检测到动作时把状态置为True连续多帧没检测到才置为False状态从False变True的瞬间才计数。class ActionCounter: def __init__(self, lost_frames5): self.active {} self.lost_timer {} self.total {} self.lost_frames lost_frames def update(self, detected_classes): for cls_id in range(6): # 0~5对应6个动作 present cls_id in detected_classes if present and not self.active.get(cls_id, False): # 新动作开始且上一帧不在动作中才计一次 self.total[cls_id] self.total.get(cls_id, 0) 1 self.active[cls_id] True self.lost_timer[cls_id] 0 elif present: self.lost_timer[cls_id] 0 else: self.lost_timer[cls_id] self.lost_timer.get(cls_id, 0) 1 if self.lost_timer[cls_id] self.lost_frames: self.active[cls_id] False return self.totallost_frames5的意思是动作结束后连续5帧没检测到才认为动作真正结束。这个值需要根据视频帧率调整30fps的帧率下lost_frames5代表约160毫秒间隔动作切换足够灵敏且不容易产生二次计数。5.2 低显存设备上训练的三个实用技巧第一个技巧是关闭不必要的显存开销把workers调低系统中其他占用显存的应用全部退出。第二个技巧是使用yolov8n的预训练权重而不是随机初始化这能让模型更快收敛到低loss区域。第三个技巧用cacheTrue参数把数据缓存到内存硬盘读写慢的机器训练速度提升明显model.train(datataekwondo.yaml, epochs150, imgsz640, batch8, device0, workers4, cacheTrue)这组参数在1660Ti上是验证过能安心跑完整个训练流程的。如果中途显存溢出把imgsz640改成480比继续降batch效果更好因为分辨率降低后每帧计算量明显下降特征图也从N×80×80变成N×60×60。5.3 数据增强的固定配置与反直觉教训默认配置里有很多数据增强选项其中flipud上下翻转对跆拳道数据集是危险的。跆拳道的下劈动作是腿向上抬起再向下砍上下翻转后模型看到的是完全不同的运动形态这个增强会让验证指标虚高但实际视频里检测效果变差。另一个要注意的是Mosaic增强它把四张图拼在一起对小目标检测有明显帮助但如果训练样本里包含比较近景的腿部特写Mosaic拼图会把完整的动作肢解掉。推荐在model.train里显式关闭flipud0.0留fliplr0.5就够了。model.train(datataekwondo.yaml, epochs150, imgsz640, batch8, flipud0.0, fliplr0.5, mosaic1.0)答辩时被问到“数据增强为什么这样配置”这个回答是能加分的不是默认参数全开而是针对动作数据的运动学特征做了调整。整个项目做完runs/taekwondo/exp/weights/best.pt就是你所有工作的集结点它是训练系统、可视化界面、计数逻辑共用的唯一模型文件这个文件的大小通常在10MB以内拷到哪台机器都能配合部署教程重新跑起来。本文还有配套的精品资源点击获取
返回列表