技术博客
CV 计算机视觉

为什么你的 YOLOv8 训出来不能用?机器人视觉新手最全上手教程

Mr.黄先生2026-07-08 19:00
为什么你的 YOLOv8 训出来不能用?机器人视觉新手最全上手教程

官方文档与工具

Ultralytics 官方文档:

https://docs.ultralytics.com/

代码地址:

https://github.com/ultralytics/ultralytics

数据工具:

https://roboflow.com/




什么是 YOLOv8?


YOLOv8 是由 Ultralytics 公司于 2023 年初发布的第八代 YOLO,它并不只是一个升级版的检测模型,而是一个完整的视觉 AI 框架,支持五类主要任务:

  1. 目标检测

识别图中有哪些物体并画出边界框。


  1. 实例分割

精确描绘每个物体的像素轮廓。


  1. 图像分类

判断整张图片属于哪个类别。


  1. 姿态估计

检测人体或物体的关键点位置。


  1. 目标追踪

在视频中跨帧持续追踪目标。


YOLO 的全称是 You Only Look Once(只看一次),它是一类图像目标检测算法。与早期的"两段式"方法(先找候选区域,再逐个分类)不同,YOLO 一次性扫描整张图像就能输出"物体在哪里、是什么",这正是它速度极快的根本原因。


机器人需要"实时感知周围环境"——比如无人机避障、机械臂抓取、巡检机器人识别缺陷。这对算法提出了苛刻要求:速度要快(至少 30 帧/秒),准确率要高,还要能在边缘设备(树莓派、Jetson 等)上运行。


YOLOv8 在这三点上都有出色的表现,加上 Ultralytics 提供的极简 Python API,成为机器人视觉领域最受欢迎的框架之一。


YOLOv8 提供从 n(nano)到 x(extra-large)五档规格,本质上是在速度与精度之间做权衡。对新手来说,先用 yolov8n 跑通流程,等环境稳定了再根据需求升档。



上手路径


下面是一条为新手设计的上手路径。每一步都是建立在上一步的基础上,不要跳跃。

  1. 准备环境

  2. 跑通预训练

  3. 准备数据集

  4. 训练微调


准备阶段:环境搭建

前往 python.org 下载对应系统的安装包,推荐 3.10 或 3.11。安装时务必勾选 "Add Python to PATH" 选项,否则命令行找不到 Python。安装完成后,在终端输入 python --version 确认版本号正确。


配置虚拟环境,用下面的命令创建一个专属于 YOLOv8 的环境:

# 创建名为 yolo_env 的虚拟环境
python -m venv yolo_env
# 激活环境(Windows)
yolo_env\Scripts\activate
# 激活环境(macOS / Linux)source yolo_env/bin/activate


安装 Ultralytics(YOLOv8 的官方库),一行命令搞定,它会自动安装 PyTorch 等所有依赖:

pip install ultralytics

如果你有 NVIDIA GPU,建议额外去 pytorch.org 上按照你的 CUDA 版本安装 GPU 版 PyTorch,速度能快 10 倍以上。


验证安装成功:

from ultralytics import YOLO
# 加载最小的预训练模型(会自动下载约 6MB)
model = YOLO('yolov8n.pt')
print(model.info())  # 能看到模型信息就说明安装成功


第一次推理:看见效果

在深入学习之前,先体验一次"它能做什么"是非常重要的——有了感性认识,后面的概念才更容易落地。

from ultralytics import YOLO
# 1. 加载预训练模型(在 COCO 数据集上训练,能识别 80 种物体)
model = YOLO('yolov8n.pt')
# 2. 对一张图片做推理(可以用本地图片路径或 URL)
results = model('https://ultralytics.com/images/bus.jpg')
# 3. 显示结果(会弹出带检测框的图片窗口)
results[0].show()
# 4. 保存结果图片到 runs/detect/ 目录
results[0].save(filename='result.jpg')
# 5. 查看检测到的目标详情for box in results[0].boxes:
    print(f"类别: {results[0].names[int(box.cls)]}, 置信度: {box.conf:.2f}")

Checkpoint:如果你成功看到了带有检测框的图片,说明你已经完成了从零到"能用"的第一步!接下来的任务是让它识别你自己感兴趣的物体。


准备自定义数据集

预训练模型只能识别 COCO 数据集里的 80 种通用物体(人、车、猫、狗等)。如果你的机器人需要识别特定的工业零件、特殊标志牌或特定目标,就需要用自己的数据集来微调(Fine-tune)模型。这个过程分四步:

  1. 收集图像

100多张以上,多角度多光照。


  1. 标注数据

Roboflow/Labellmg画出边界框+填类别。


  1. 划分数据集

训练70%/验证20%/测试10%


  1. 编写data.yaml

数据集目录结构和 YAML 配置文件的写法是新手最容易出错的地方,我们来仔细看一下:

# 目录结构

my_dataset/
├── images/
│   ├── train/     # 训练图片
│   ├── val/       # 验证图片
│   └── test/      # 测试图片
└── labels/
    ├── train/     # 对应的标注文件(.txt)
    ├── val/
    └── test/
# data.yaml

# 数据集根目录(绝对路径更稳妥)
path: /home/user/my_dataset
# 各分集相对路径
train: images/train
val:   images/val
test:  images/test
# 类别数量和名称
nc: 3
names: ['cat', 'dog', 'bird']  # 和标注时保持一致!


训练模型

数据集准备好后,训练只需要几行代码。但在运行之前,你需要理解几个关键参数,因为它们直接影响训练结果:

# train.py
from ultralytics import YOLO
# 从预训练权重开始(强烈推荐!比从头训练快很多)
model = YOLO('yolov8n.pt')
# 开始训练
results = model.train(
    data='data.yaml',   # 数据集配置文件路径
    epochs=100,         # 训练轮数(新手从 50 开始)
    imgsz=640,          # 图片尺寸(标准 640x640)
    batch=16,           # 每批处理图片数(根据显存调整)
    device='0',         # GPU 编号(无 GPU 用 'cpu')
    project='runs',     # 结果保存目录
    name='my_exp'       # 本次实验名称
)
# 训练结束后,最佳模型保存在 runs/my_exp/weights/best.pt


理想的训练曲线 Loss 持续下降,mAP 持续上升,最终趋于平稳


如果你看到训练 Loss 一直降,但验证 mAP 在某个 epoch 后开始下降甚至震荡,说明模型开始"死记硬背"训练数据了(过拟合)。此时应该停止训练,使用 best.pt(验证集上最佳的那个权重)而不是 last.pt。


仿真部署:接入摄像头 / ROS

对于机器人仿真项目,最常见的场景是将 YOLOv8 接入实时摄像头流,或者集成到 ROS(机器人操作系统)中。下面是两种常见的部署方式:

# realtime_camera.py — 接入摄像头实时检测

from ultralytics import YOLO
import cv2
# 加载你训练好的模型(或预训练模型)
model = YOLO('best.pt')
# 打开摄像头(0 = 默认摄像头)
cap = cv2.VideoCapture(0)
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break# 对当前帧做推理
    results = model(frame, verbose=False)
    # 在画面上绘制检测结果
    annotated = results[0].plot()
    # 显示画面
    cv2.imshow('YOLOv8 实时检测', annotated)
    # 按 q 退出if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()
# ROS 2(Humble / Foxy)

# yolov8_ros_node.py
# 这个文件是一个标准的 ROS 2 节点
# 它订阅摄像头发布的图像,用 YOLOv8 检测,再把结果发布出去
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image       # ROS 标准图像消息格式
from std_msgs.msg import String         # 用来发布检测结果的文字描述
from cv_bridge import CvBridge          # 负责在 ROS 图像格式和 OpenCV 格式之间转换
from ultralytics import YOLO
import json
class YoloDetectorNode(Node):
    def __init__(self):
        super().__init__('yolo_detector')   # 节点名称,在 ROS 网络中唯一标识这个节点
        # 加载模型(节点启动时只加载一次,避免每帧都重新加载)
        self.model = YOLO('best.pt')
        self.bridge = CvBridge()
        # 订阅摄像头节点发布的图像话题
        # 话题名 '/camera/image_raw' 要和你的摄像头驱动保持一致
        self.subscription = self.create_subscription(
            Image,
            '/camera/image_raw',
            self.image_callback,    # 每当收到新图像,就调用这个函数
            10                      # 队列长度:最多缓冲 10 帧
        )
        # 创建两个发布者:一个发布带检测框的可视化图像,一个发布结构化的检测数据
        self.image_pub = self.create_publisher(Image, '/yolo/annotated_image', 10)
        self.result_pub = self.create_publisher(String, '/yolo/detections', 10)
        self.get_logger().info('YOLOv8 检测节点已启动,等待图像...')
    def image_callback(self, msg):
        # 第一步:把 ROS 图像消息转换成 OpenCV 的 numpy 数组
        frame = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
        # 第二步:用 YOLOv8 做推理
        results = self.model(frame, verbose=False)
        # 第三步:整理检测结果,打包成 JSON 字符串发布出去
        # 这样其他节点(比如机械臂控制节点)可以直接解析这个 JSON
        detections = []
        for box in results[0].boxes:
            detections.append({
                'class': results[0].names[int(box.cls)],
                'confidence': round(float(box.conf), 3),
                'bbox': box.xyxy[0].tolist()  # [x1, y1, x2, y2] 格式的像素坐标
            })
        result_msg = String()
        result_msg.data = json.dumps(detections, ensure_ascii=False)
        self.result_pub.publish(result_msg)
        # 第四步:把带检测框的可视化图像也发布出去(方便在 RViz 中监控)
        annotated = results[0].plot()
        annotated_msg = self.bridge.cv2_to_imgmsg(annotated, encoding='bgr8')
        self.image_pub.publish(annotated_msg)
def main(args=None):
    rclpy.init(args=args)
    node = YoloDetectorNode()
    rclpy.spin(node)          # 让节点持续运行,不断处理回调
    node.destroy_node()
    rclpy.shutdown()
if __name__ == '__main__':
    main()



避坑指南


  1. 数据集目录结构错误

这是新手最高频的问题。YOLOv8 对目录结构非常严格:images/ 和 labels/ 必须在同级目录,并且子目录名必须完全一致(train/val/test)。图片和标注文件必须同名(只是后缀不同)。一旦路径不对,训练会报"no labels found"但错误信息不直观。


解决方案:严格按照前面的目录结构来。用 Roboflow 导出的数据集会自动生成正确结构,非常推荐新手使用。


  1. 数据太少就开始训练

很多人觉得有个几十张图就够了。实际上每个类别至少需要 100 张以上(推荐 300+),而且数据的多样性比数量更重要——只在同一场景、同一角度、同一光照下拍的图,模型在真实场景中会"认不出来"。


解决方案:多角度拍摄、改变背景、改变光照。如果图片真的不够,可以用 Roboflow 的数据增强功能自动生成翻转、旋转、模糊、加噪等变体。


  1. 显存不足(OOM 错误)

CUDA out of memory 是新手最常见的错误之一。这通常是因为 batch 设置太大,GPU 显存装不下那么多图片同时计算。6GB 显存的显卡用 batch=16 就很勉强了,特别是在 imgsz=640 的情况下。


解决方案:把 batch 从 16 降到 8 甚至 4,或者把 imgsz 从 640 降到 320(代价是精度略有下降)。


  1. 混淆"置信度"和"准确率"

很多人觉得置信度 0.9 就是"准确率 90%"。实际上置信度(confidence)是模型对这个检测框"包含目标"的自信程度,而准确率(mAP)是对整体数据集的统计指标。一个模型可能置信度很高但 mAP 很低(因为框画错了位置),也可能置信度偏低但检测结果实际上是对的。


解决方案:评估模型时要看 mAP50 和 mAP50-95 这两个指标,不要只看置信度。训练结束后 runs/exp/results.png 会有完整的训练曲线。


  1. 在 Jetson / 树莓派上速度慢得无法使用

在边缘设备上直接运行 .pt 格式的 PyTorch 模型是很慢的。很多同学发现在 Jetson Nano 上只有 3-5 FPS,离实时还差很远,就以为是模型问题,其实是导出格式没优化。


解决方案:将模型导出为 TensorRT 格式(Jetson)或 ONNX 格式,速度可以提升 3-10 倍。命令:model.export(format='engine')(TensorRT)或 model.export(format='onnx')。

点赞收藏
// 评论0
0 / 500
还没有评论,快来抢沙发