使用 Roboflow 上的数据集完成 YOLO v8 模型训练
使用上的公开数据集,直接导出为 YOLOv8 所需的格式。train/valid/test/images/labels/data.yamldata.yamldata.yamltrainvalncnames**数据增强 **这些参数的默认值已经能取得不错的效果。对于这个网球数据集,我们可以直接使用默认值,或者稍微调整一下来获得更好的泛化能力。yolov8cddata.yamlyolov8n.ptep
第一步:获取公开数据集
使用 Roboflow 上的公开数据集,直接导出为 YOLOv8 所需的格式。
-
访问 Roboflow 数据集页面
- 访问:https://universe.roboflow.com
搜索网球数据集
- 访问:https://universe.roboflow.com
-
下载数据集
- 在数据集页面,点击右上角的 “Download Dataset” 按钮。
- 在弹出的下载窗口中,你需要选择导出格式。请在 “Format” 下拉菜单中,选择 “YOLO v8”。
- 选择好格式后,点击 “Download ZIP” 按钮。
- 注意:可能需要注册一个 Roboflow 账号才能下载,注册是免费的。
-
解压数据集
- 下载完成后,会得到一个名为
tennisball.v1i.yolov8的压缩文件。(名字可能会不一样) - 将这个文件解压到你电脑上的一个固定位置。推荐路径是
~/datasets/。 - 解压后,会得到一个名为
tennisball.v1i.yolov8的文件夹(或类似名称)。进入该文件夹,会看到以下结构:tennis-ball-1/ ├── train/ │ ├── images/ │ └── labels/ ├── valid/ │ ├── images/ │ └── labels/ ├── test/ │ ├── images/ │ └── labels/ └── data.yamltrain/,valid/,test/:分别存放训练集、验证集和测试集。images/:存放图片文件(.jpg)。labels/:存放对应的标注文件(.txt),每个图片都有一个同名的标注文件。data.yaml:非常重要的配置文件,它定义了数据集的类别、训练集和验证集的路径。
- 下载完成后,会得到一个名为
第二步:数据集准备与增强
-
检查
data.yaml文件- 用文本编辑器打开
data.yaml文件,它的内容应该如下所示:train: ../train/images val: ../valid/images nc: 1 names: ['tennis ball']train和val:指定了训练集和验证集图片的相对路径。这个路径是相对于你运行训练命令时所在的目录而言的。nc(number of classes):类别数量,这里是 1,因为我们只识别网球。names:类别名称列表。
- 用文本编辑器打开
-
**数据增强 **
- 为什么需要数据增强? 我们的目标是让训练出的模型在真实世界中也能准确识别网球。但真实世界的情况是多变的:网球可能在强光下、阴影里、不同角度、不同距离,甚至可能被部分遮挡。我们下载的数据集虽然很好,但可能无法覆盖所有这些情况。
- 什么是数据增强? 数据增强是在训练过程中,通过对原始图片进行一系列随机的、但又符合真实世界变化的修改,来“创造”出新的训练样本。这相当于扩充了你的数据集,让模型“见多识广”。
- YOLOv8 的自动增强:YOLOv8 在训练时会自动对图片进行数据增强。不需要手动修改任何图片或编写额外的代码。
- 如何控制增强策略? 在启动训练的命令中可以添加参数来调整增强的强度和类型。例如:
--hsv_h 0.015:随机调整图片的色相。--hsv_s 0.7:随机调整图片的饱和度。--hsv_v 0.4:随机调整图片的明度。--degrees 0.5:随机旋转图片(±0.5度)。--translate 0.1:随机平移图片(±10%的宽度和高度)。--scale 0.5:随机缩放图片(范围从 0.5 到 1.5 倍)。--flipud 0.2:随机上下翻转图片(概率为 20%)。--fliplr 0.5:随机左右翻转图片(概率为 50%)。--mosaic 1.0:开启马赛克增强(将4张图片拼接成1张,增加背景多样性)。
这些参数的默认值已经能取得不错的效果。对于这个网球数据集,可以直接使用默认值,或者稍微调整一下来获得更好的泛化能力。
第三步:启动模型训练
-
打开终端并激活环境
- 打开你的终端(Terminal)。
- 激活之前创建的
yolov8conda 环境:conda activate yolov8
-
进入数据集目录
- 使用
cd命令,进入你刚刚解压的数据集根目录。例如:cd ~/datasets/tennisball.v1i.yolov8/ - 非常重要:确保终端当前路径就在
tennisball.v1i.yolov8目录下。因为data.yaml文件中指定的路径是相对路径,训练脚本会根据当前的位置来查找图片。
- 使用
-
执行训练命令
-
在终端中,输入并执行以下命令:
yolo detect train \ data=data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ patience=15 \ project=~/runs/train \ name=tennis_best \ exist_ok=True -
命令参数详解:(这里的参数设置要量力而行,不然因为系统资源不足(比如什么内存 / 显存耗尽)的原因训练失败后电脑会很卡很卡很卡很卡很卡很卡很卡)
yolo detect train:调用 YOLOv8 的检测模型训练功能。data=data.yaml:指定数据集配置文件。model=yolov8n.pt:指定预训练模型。yolov8n.pt是 YOLOv8 系列中最小、最快的模型(nano)。epochs=100:指定训练轮数。模型将遍历整个训练集 100 次。对于这个数据集,100 轮通常足够模型收敛。imgsz=640:指定输入图片的尺寸(640x640像素)。这是一个标准尺寸,也与我们后续在 RK3566 上部署的要求一致。batch=16:指定批次大小。即每一次训练迭代,模型会同时处理 16 张图片。这个值可以根据电脑的显存大小进行调整。如果训练时显存不足,可以减小这个值(例如batch=8)。patience=15:早停耐心值。如果在 15 轮训练内,模型在验证集上的性能(mAP)没有提升,训练会自动停止,以防止过拟合并节省时间。project=~/runs/train:指定训练结果的保存路径。name=tennis_best:为这次训练命名。结果将保存在~/runs/train/tennis_best/目录下。exist_ok=True:如果tennis_best目录已存在,则覆盖它。
-
-
观察训练过程
- 命令执行后,训练就会开始。终端会有一系列输出信息,包括每一轮的训练损失(loss)、验证集上的精度(mAP)等。
50 epochs completed in 0.280 hours.
Optimizer stripped from /home/robot/runs/train/tennis_light/weights/last.pt, 6.2MB
Optimizer stripped from /home/robot/runs/train/tennis_light/weights/best.pt, 6.2MB
Validating /home/robot/runs/train/tennis_light/weights/best.pt...
Ultralytics 8.3.228 🚀 Python-3.9.25 torch-2.8.0+cu128 CUDA:0 (NVIDIA GeForce RTX 4060, 7783MiB)
Model summary (fused): 72 layers, 3,005,843 parameters, 0 gradients, 8.1 GFLOPs
Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 25/25 35.7it/s 0.7s
all 194 204 0.974 0.98 0.989 0.781
Speed: 0.1ms preprocess, 0.8ms inference, 0.0ms loss, 0.3ms postprocess per image
Results saved to /home/robot/runs/train/tennis_light
训练过程中,可以访问 http://localhost:6006 来看 TensorBoard 可视化界面,里面有更直观的损失曲线和精度曲线,还可以在终端输入nvitop 查看显存使用率,合理安排训练命令参数。
- 训练结果
- 当训练完成或达到
patience次数后,程序会自动退出。 - 由于box_loss、cls_loss、dfl_loss 均持续下降并趋于平稳(最后 10 轮波动极小,无反弹),所以没有继续增加训练轮数
- 最佳的模型权重文件
best.pt会保存在~/runs/train/tennis_best/weights/目录下。这个best.pt文件就是训练好的、可以用于后续部署的模型。
- 当训练完成或达到
第四步:模型验证(可选)
训练完成后,可以用独立的测试集来评估一下模型的最终性能。
-
在
tennis-ball-1/目录下,执行以下命令:yolo detect val \ data=data.yaml \ model=~/runs/train/tennis_best/weights/best.pt \ imgsz=640 -
命令会加载
best.pt模型,并在test/文件夹中的图片上进行推理。 -
执行完毕后,终端会打印出最终的评估指标,其中最重要的是
mAP@0.5。mAP@0.5是目标检测任务中衡量模型精度的核心指标。对于这个网球检测任务,期望这个值能达到 0.95 以上,这代表模型在真实场景下有非常高的识别准确率。
遇到的问题:训练命令的参数设置的不合理导致电脑变得很卡很卡很卡
下面是我当时的解决方法:
- 按
Ctrl+Alt+F2切到纯命令行界面(图形界面卡所以要绕开,秒进) - 输账号密码登录(盲输也能识别,输完回车)
- 直接执行杀进程+清缓存命令(复制粘贴或盲输):
sudo killall -9 python && sudo echo 3 > /proc/sys/vm/drop_caches - 等10秒,按
Ctrl+Alt+F7切回图形界面,已恢复流畅 - 若仍卡,执行
sudo reboot强制重启或物理层面强制关机重启,重启后资源全释放,回到训练前状态 - 换参数,换成轻量级的
# 先进入数据集根目录
cd ~/datasets/tennisball.v1i.yolov8
# 执行轻量训练
yolo detect train \
data=data.yaml \
model=yolov8n.pt \
epochs=50 \
imgsz=480 \
batch=4 \
workers=0 \
cache=False \
project=~/runs/train \
name=tennis_light \
exist_ok=True
测试训练好的 YOLOv8 网球模型, 3种测试方式:
核心前提
- 模型路径:
~/runs/train/tennis_light/weights/best.pt(你的最优模型) - 确保已激活 YOLOv8 环境:
conda activate yolov8
方式1:快速测试(单张/多张图片,秒出结果)
适合快速验证模型是否能识别网球,支持本地图片、网络图片、文件夹批量测试。
1.1 测试单张本地图片
# 替换为你的图片路径(如桌面的网球图片)
yolo detect predict \
model=~/runs/train/tennis_light/weights/best.pt \
source=~/Desktop/tennis_test.jpg \ # 本地图片路径
save=True \ # 保存识别后的图片(带边界框)
conf=0.5 \ # 置信度阈值(只显示置信度≥50%的结果)
show=True # 弹出窗口显示识别结果
- 执行后会弹出窗口,显示图片中识别到的网球(红色边界框+置信度);
- 识别后的图片会保存在
runs/detect/predict/目录下。
1.2 测试文件夹内所有图片(批量验证)
如果有多个测试图片,放在一个文件夹(如 ~/test_images/),批量测试:
yolo detect predict \
model=~/runs/train/tennis_light/weights/best.pt \
source=~/test_images/ \ # 测试图片文件夹路径
save=True \
conf=0.5 \
show=False # 批量测试时关闭弹窗,只保存结果
- 所有识别后的图片会保存在
runs/detect/predict2/(自动递增编号),可打开文件夹查看整体识别效果。
方式2:真实场景测试(USB摄像头实时识别)
最接近部署后的使用场景,用电脑的 USB 摄像头实时拍摄网球,测试模型的动态识别效果。
2.1 启动摄像头实时测试
yolo detect predict \
model=~/runs/train/tennis_light/weights/best.pt \
source=0 \ # 0 表示默认USB摄像头(多个摄像头可试 1、2)
save=True \ # 可选:保存实时识别的视频
conf=0.5 \
show=True \ # 弹出窗口显示实时识别画面
vid_stride=1 # 每帧都识别(不跳帧,保证实时性)
- 执行后弹出窗口,显示摄像头画面,移动网球时会实时识别并画框;
- 若想关闭弹窗,将
show=False,同时开启save=True,视频会保存在runs/detect/predict3/。
2.2 关键测试场景(验证泛化能力)
重点测试以下场景,确保模型在真实环境中能用:
- 网球在不同距离(0.5m、1m、2m);
- 不同角度(正面、侧面、倾斜);
- 不同光照(室内灯光、室外自然光、逆光);
- 复杂背景(放在桌面、地面、草地等)。
- 若某些场景漏检,可降低
conf=0.4(置信度阈值),再测试。
方式3:量化测试(精度+速度,部署前必做)
测试模型的 识别精度 和 推理速度,确保满足 RK3566 板卡的部署要求(重点看速度)。
3.1 用测试集量化精度(推荐)
用训练时的 test/ 数据集(独立于训练集/验证集),量化模型的官方指标:
yolo detect val \
model=~/runs/train/tennis_light/weights/best.pt \
data=~/datasets/tennis-ball-1/data.yaml \ # 你的数据集配置文件
imgsz=480 \ # 和训练时一致的输入尺寸
batch=4
- 执行后会输出详细精度报告,核心看:
mAP50:≥0.98 为优秀(你的模型训练后是 0.989,完全达标);mAP50-95:≥0.75 为良好(你的模型是 0.781,符合要求);Speed:推理速度(你的模型在 GPU 上是 0.8ms/张,板卡上会稍慢,但完全满足实时性)。
3.2 测试推理速度(单独看帧率)
如果只关心速度,可关闭精度计算,仅测试推理帧率:
yolo detect predict \
model=~/runs/train/tennis_light/weights/best.pt \
source=0 \ # 摄像头实时测试帧率
conf=0.5 \
show=True \
verbose=False \ # 关闭详细日志
save=False # 不保存视频,只看实时帧率
- 窗口标题栏会显示
FPS(帧率),GPU 下通常≥30FPS,板卡上 RK3566 运行.rknn模型时,帧率≥15FPS 即可满足网球跟随(人眼无卡顿)。
测试结果判断标准(是否合格)
- 精度合格:
- 单张图片测试:网球在视野内时,识别率≥95%(几乎不漏检);
- 无网球时,无假阳性(不把其他物体误判为网球);
- 速度合格:
- 电脑 GPU 实时测试:FPS≥20;
- 板卡端测试(后续):FPS≥10;
- 泛化合格:
- 不同距离、角度、光照下,漏检次数≤1次/10次测试。
常见问题处理
- 识别不到网球:
- 降低置信度阈值:
conf=0.4; - 确保网球在画面中心,且占比不小于画面的 5%(太小时模型难识别);
- 降低置信度阈值:
- 假阳性太多(误判其他物体):
- 提高置信度阈值:
conf=0.6;
- 提高置信度阈值:
- 帧率太低(卡顿):
- 关闭
show=True(仅保存结果); - 降低输入尺寸:
imgsz=320(但会轻微影响精度)。
- 关闭
更多推荐


所有评论(0)