第一步:获取公开数据集

使用 Roboflow 上的公开数据集,直接导出为 YOLOv8 所需的格式。

  1. 访问 Roboflow 数据集页面

  2. 下载数据集

    • 在数据集页面,点击右上角的 “Download Dataset” 按钮。
    • 在弹出的下载窗口中,你需要选择导出格式。请在 “Format” 下拉菜单中,选择 “YOLO v8”
    • 选择好格式后,点击 “Download ZIP” 按钮。
    • 注意:可能需要注册一个 Roboflow 账号才能下载,注册是免费的。
  3. 解压数据集

    • 下载完成后,会得到一个名为 tennisball.v1i.yolov8 的压缩文件。(名字可能会不一样)
    • 将这个文件解压到你电脑上的一个固定位置。推荐路径是 ~/datasets/
    • 解压后,会得到一个名为 tennisball.v1i.yolov8 的文件夹(或类似名称)。进入该文件夹,会看到以下结构:
      tennis-ball-1/
      ├── train/
      │   ├── images/
      │   └── labels/
      ├── valid/
      │   ├── images/
      │   └── labels/
      ├── test/
      │   ├── images/
      │   └── labels/
      └── data.yaml
      
      • train/, valid/, test/:分别存放训练集、验证集和测试集。
      • images/:存放图片文件(.jpg)。
      • labels/:存放对应的标注文件(.txt),每个图片都有一个同名的标注文件。
      • data.yaml非常重要的配置文件,它定义了数据集的类别、训练集和验证集的路径。

第二步:数据集准备与增强

  1. 检查 data.yaml 文件

    • 用文本编辑器打开 data.yaml 文件,它的内容应该如下所示:
      train: ../train/images
      val: ../valid/images
      
      nc: 1
      names: ['tennis ball']
      
      • trainval:指定了训练集和验证集图片的相对路径。这个路径是相对于你运行训练命令时所在的目录而言的。
      • nc (number of classes):类别数量,这里是 1,因为我们只识别网球。
      • names:类别名称列表。
  2. **数据增强 **

    • 为什么需要数据增强? 我们的目标是让训练出的模型在真实世界中也能准确识别网球。但真实世界的情况是多变的:网球可能在强光下、阴影里、不同角度、不同距离,甚至可能被部分遮挡。我们下载的数据集虽然很好,但可能无法覆盖所有这些情况。
    • 什么是数据增强? 数据增强是在训练过程中,通过对原始图片进行一系列随机的、但又符合真实世界变化的修改,来“创造”出新的训练样本。这相当于扩充了你的数据集,让模型“见多识广”。
    • 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张,增加背景多样性)。

    这些参数的默认值已经能取得不错的效果。对于这个网球数据集,可以直接使用默认值,或者稍微调整一下来获得更好的泛化能力。


第三步:启动模型训练

  1. 打开终端并激活环境

    • 打开你的终端(Terminal)。
    • 激活之前创建的 yolov8 conda 环境:
      conda activate yolov8
      
  2. 进入数据集目录

    • 使用 cd 命令,进入你刚刚解压的数据集根目录。例如:
      cd ~/datasets/tennisball.v1i.yolov8/
      
    • 非常重要:确保终端当前路径就在 tennisball.v1i.yolov8 目录下。因为 data.yaml 文件中指定的路径是相对路径,训练脚本会根据当前的位置来查找图片。
  3. 执行训练命令

    • 在终端中,输入并执行以下命令:

      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 目录已存在,则覆盖它。
  4. 观察训练过程

    • 命令执行后,训练就会开始。终端会有一系列输出信息,包括每一轮的训练损失(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 查看显存使用率,合理安排训练命令参数。

  1. 训练结果
    • 当训练完成或达到 patience 次数后,程序会自动退出。
    • 由于box_loss、cls_loss、dfl_loss 均持续下降并趋于平稳(最后 10 轮波动极小,无反弹),所以没有继续增加训练轮数
    • 最佳的模型权重文件 best.pt 会保存在 ~/runs/train/tennis_best/weights/ 目录下。这个 best.pt 文件就是训练好的、可以用于后续部署的模型。

第四步:模型验证(可选)

训练完成后,可以用独立的测试集来评估一下模型的最终性能。

  1. tennis-ball-1/ 目录下,执行以下命令:

    yolo detect val \
      data=data.yaml \
      model=~/runs/train/tennis_best/weights/best.pt \
      imgsz=640
    
  2. 命令会加载 best.pt 模型,并在 test/ 文件夹中的图片上进行推理。

  3. 执行完毕后,终端会打印出最终的评估指标,其中最重要的是 mAP@0.5

    • mAP@0.5 是目标检测任务中衡量模型精度的核心指标。对于这个网球检测任务,期望这个值能达到 0.95 以上,这代表模型在真实场景下有非常高的识别准确率。

遇到的问题:训练命令的参数设置的不合理导致电脑变得很卡很卡很卡

下面是我当时的解决方法:

  1. Ctrl+Alt+F2 切到纯命令行界面(图形界面卡所以要绕开,秒进)
  2. 输账号密码登录(盲输也能识别,输完回车)
  3. 直接执行杀进程+清缓存命令(复制粘贴或盲输):
    sudo killall -9 python && sudo echo 3 > /proc/sys/vm/drop_caches
  4. 等10秒,按 Ctrl+Alt+F7 切回图形界面,已恢复流畅
  5. 若仍卡,执行 sudo reboot 强制重启或物理层面强制关机重启,重启后资源全释放,回到训练前状态
  6. 换参数,换成轻量级的
# 先进入数据集根目录
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 关键测试场景(验证泛化能力)

重点测试以下场景,确保模型在真实环境中能用:

  1. 网球在不同距离(0.5m、1m、2m);
  2. 不同角度(正面、侧面、倾斜);
  3. 不同光照(室内灯光、室外自然光、逆光);
  4. 复杂背景(放在桌面、地面、草地等)。
  • 若某些场景漏检,可降低 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 即可满足网球跟随(人眼无卡顿)。

测试结果判断标准(是否合格)

  1. 精度合格
    • 单张图片测试:网球在视野内时,识别率≥95%(几乎不漏检);
    • 无网球时,无假阳性(不把其他物体误判为网球);
  2. 速度合格
    • 电脑 GPU 实时测试:FPS≥20;
    • 板卡端测试(后续):FPS≥10;
  3. 泛化合格
    • 不同距离、角度、光照下,漏检次数≤1次/10次测试。

常见问题处理

  1. 识别不到网球
    • 降低置信度阈值:conf=0.4
    • 确保网球在画面中心,且占比不小于画面的 5%(太小时模型难识别);
  2. 假阳性太多(误判其他物体)
    • 提高置信度阈值:conf=0.6
  3. 帧率太低(卡顿)
    • 关闭 show=True(仅保存结果);
    • 降低输入尺寸:imgsz=320(但会轻微影响精度)。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐