欢迎光临
我们一直在努力

YOLO 目标检测从入门到实战:Ultralytics YOLOv8 完整使用指南

YOLO 目标检测从入门到实战:Ultralytics YOLOv8 完整使用指南

摘要: 本文系统讲解 YOLO 目标检测的使用方法,涵盖推理、训练、数据集准备、结果数据提取、模型部署等全流程,基于 Ultralytics YOLOv8 框架,配有完整代码示例。 适用读者:目标检测入门者、YOLO 使用者 | 难度:入门~中级 | 预计阅读时间:40 分钟

文章目录

  • YOLO 目标检测从入门到实战:Ultralytics YOLOv8 完整使用指南
    • 一、前言
    • 二、环境安装
    • 三、基本推理
      • 3.1 图片推理
      • 3.2 摄像头实时推理
    • 四、数据集准备
      • 4.1 YOLO 数据集目录结构
      • 4.2 标签文件格式
      • 4.3 data.yaml 配置文件
      • 4.4 数据获取方法
    • 五、模型训练
      • 5.1 基本训练脚本
      • 5.2 详细训练参数
      • 5.3 恢复中断的训练
      • 5.4 模型选择
    • 六、推理结果数据提取
      • 6.1 Results 对象结构
      • 6.2 提取边界框
      • 6.3 过滤检测结果
      • 6.4 坐标格式转换
      • 6.5 转为结构化数据
    • 七、模型评估与测试
      • 7.1 在测试集上评估
      • 7.2 指标说明
    • 八、目标跟踪
    • 九、模型导出
    • 十、常见问题
      • 10.1 没有检测到目标
      • 10.2 数据类型问题
      • 10.3 不同模型类型的结果属性
    • 十一、总结
    • 参考资料

一、前言

YOLO(You Only Look Once)是最流行的目标检测算法之一,以其速度快、精度高的特点被广泛应用于工业界。Ultralytics 公司推出的 YOLOv8 框架进一步简化了使用流程,只需几行代码即可完成目标检测的推理和训练。

本文将覆盖以下内容:

  • YOLO 基本推理
  • 数据集准备与标注
  • 模型训练
  • 推理结果数据提取
  • 目标跟踪
  • 模型导出与部署

  • 二、环境安装

    pip install ultralytics

    安装完成后验证:

    from ultralytics import YOLO
    print("Ultralytics YOLO 安装成功!")


    三、基本推理

    3.1 图片推理

    from ultralytics import YOLO

    # 加载模型(首次运行会自动下载预训练权重)
    yolo = YOLO(model='yolov8n.pt', task='detect')

    # 对图片进行推理
    results = yolo('image.jpg')

    # 查看结果
    for result in results:
    print(result.boxes) # 检测到的边界框

    3.2 摄像头实时推理

    from ultralytics import YOLO

    yolo = YOLO(model='yolov8n.pt', task='detect')

    # source=0 表示使用摄像头
    results = yolo(source=0, save=True, conf=0.77)

    参数说明:

    • source:输入源,0 为摄像头,也可以是图片路径、视频路径、RTSP 流等
    • conf:置信度阈值,只保留置信度高于此值的检测结果
    • save:是否保存结果图片/视频

    详细参数说明请参考 Ultralytics 官方文档。


    四、数据集准备

    4.1 YOLO 数据集目录结构

    YOLO 格式的数据集有严格的目录结构要求:

    datasets/mydata/
    ├── images/
    │ ├── train/ # 训练集图片
    │ │ ├── img1.jpg
    │ │ ├── img2.jpg
    │ │ └── …
    │ ├── val/ # 验证集图片
    │ │ ├── img1.jpg
    │ │ └── …
    │ └── test/ # 测试集图片(可选)
    │ ├── img1.jpg
    │ └── …
    ├── labels/
    │ ├── train/ # 训练集标签(每张图片对应一个 .txt 文件)
    │ │ ├── img1.txt
    │ │ ├── img2.txt
    │ │ └── …
    │ ├── val/ # 验证集标签
    │ │ ├── img1.txt
    │ │ └── …
    │ └── test/ # 测试集标签(可选)
    │ ├── img1.txt
    │ └── …
    └── data.yaml # 数据集配置文件

    4.2 标签文件格式

    每个 .txt 文件中每行表示一个目标,格式为:

    <class_id> <x_center> <y_center> <width> <height>

    • class_id:类别编号(从 0 开始)
    • x_center、y_center:边界框中心点坐标(归一化到 0~1)
    • width、height:边界框宽高(归一化到 0~1)

    示例:

    0 0.5 0.5 0.3 0.4
    1 0.2 0.3 0.1 0.2

    4.3 data.yaml 配置文件

    path: ../datasets/mydata # 数据集根目录
    train: images/train # 训练图片相对路径
    val: images/val # 验证图片相对路径
    test: images/test # 测试图片相对路径(可选)

    nc: 2 # 类别数量
    names: ['cat', 'dog'] # 类别名称列表

    重要提示: names 列表中的类别顺序必须与标签文件中的 class_id 对应。

    4.4 数据获取方法

  • 公开数据集:Kaggle、Roboflow、COCO
  • 自行采集:使用摄像头拍摄、网络爬取等
  • 视频抽帧:从视频中提取关键帧作为训练图片

  • 五、模型训练

    5.1 基本训练脚本

    from ultralytics import YOLO

    # 加载预训练模型
    model = YOLO('yolov8n.pt')

    # 开始训练
    results = model.train(
    data='datasets/mydata/data.yaml',
    epochs=100,
    imgsz=640,
    batch=16,
    workers=8
    )

    5.2 详细训练参数

    results = model.train(
    # —– 基础配置 —–
    data='datasets/mydata/data.yaml', # 数据集配置
    epochs=100, # 训练轮数
    batch=16, # 批大小
    imgsz=640, # 输入图像尺寸
    device=0, # GPU 设备号
    workers=8, # 数据加载线程数
    seed=42, # 随机种子

    # —– 优化器与学习率 —–
    optimizer='auto', # 优化器:SGD/Adam/AdamW/auto
    lr0=0.01, # 初始学习率
    lrf=0.01, # 最终学习率因子
    momentum=0.937, # SGD 动量
    weight_decay=0.0005, # 权重衰减
    warmup_epochs=3, # 预热轮数

    # —– 损失函数权重 —–
    box=7.5, # 边界框损失权重
    cls=0.5, # 分类损失权重
    dfl=1.5, # DFL 损失权重

    # —– 数据增强 —–
    degrees=0.0, # 随机旋转角度
    translate=0.1, # 随机平移
    scale=0.5, # 随机缩放
    shear=0.0, # 随机剪切
    fliplr=0.5, # 左右翻转概率
    mosaic=1.0, # 马赛克增强概率
    mixup=0.0, # MixUp 增强概率

    # —– 保存与验证 —–
    save=True, # 保存检查点
    patience=50, # 早停轮数
    val=True, # 每轮验证
    project='runs/train', # 输出目录
    name='exp', # 实验名称
    )

    5.3 恢复中断的训练

    如果训练中断,可以从上次的检查点继续:

    model = YOLO('runs/train/exp/weights/last.pt')
    results = model.train(resume=True)

    5.4 模型选择

    模型参数量速度精度适用场景
    yolov8n.pt 3.2M 最快 较低 移动端、实时检测
    yolov8s.pt 11.2M 中等 轻量级部署
    yolov8m.pt 25.9M 中等 较高 通用场景
    yolov8l.pt 43.7M 较慢 高精度需求
    yolov8x.pt 68.2M 最慢 最高 追求极致精度

    六、推理结果数据提取

    6.1 Results 对象结构

    from ultralytics import YOLO

    model = YOLO("yolov8n.pt")
    results = model.predict("image.jpg")
    result = results[0] # 取第一张图的结果

    result 对象包含以下属性:

    属性说明
    result.boxes 边界框信息
    result.masks 分割掩码(分割模型)
    result.keypoints 关键点(姿态模型)
    result.probs 分类概率(分类模型)
    result.names 类别 id → 名称 字典
    result.orig_img 原始图像
    result.orig_shape 原始图像尺寸
    result.speed 各阶段耗时(毫秒)

    6.2 提取边界框

    if result.boxes is not None:
    # 方法 1:直接取 tensor (N x 6: x1, y1, x2, y2, conf, cls)
    boxes_data = result.boxes.data

    # 方法 2:分别取各个属性
    xyxy = result.boxes.xyxy # N x 4, 绝对坐标
    conf = result.boxes.conf # N x 1, 置信度
    cls = result.boxes.cls # N x 1, 类别索引

    # 转为 numpy
    boxes_np = result.boxes.data.cpu().numpy()

    # 遍历每个检测框
    for box in result.boxes:
    x1, y1, x2, y2 = box.xyxy[0].tolist()
    confidence = box.conf[0].item()
    class_id = int(box.cls[0].item())
    class_name = result.names[class_id]
    print(f"{class_name}: {confidence:.2f}, "
    f"bbox=[{x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f}]")

    6.3 过滤检测结果

    if result.boxes is not None:
    # 过滤置信度 > 0.5 的检测结果
    high_conf = result.boxes[result.boxes.conf > 0.5]

    # 过滤特定类别(假设 person 的 id 为 0)
    persons = result.boxes[result.boxes.cls == 0]

    # 组合条件
    keep = (result.boxes.conf > 0.5) & (result.boxes.cls == 0)
    filtered = result.boxes[keep]

    6.4 坐标格式转换

    import numpy as np

    # xyxy → xywh(中心点 + 宽高)
    xyxy = result.boxes.xyxy.cpu().numpy() # (N, 4)
    xywh = np.zeros_like(xywh)
    xywh[:, 0] = (xyxy[:, 0] + xyxy[:, 2]) / 2 # cx
    xywh[:, 1] = (xyxy[:, 1] + xyxy[:, 3]) / 2 # cy
    xywh[:, 2] = xyxy[:, 2] xyxy[:, 0] # w
    xywh[:, 3] = xyxy[:, 3] xyxy[:, 1] # h

    6.5 转为结构化数据

    import pandas as pd
    import json

    # 转为 DataFrame
    def results_to_df(result):
    if result.boxes is None:
    return pd.DataFrame()
    data = result.boxes.data.cpu().numpy()
    df = pd.DataFrame(data, columns=["x1", "y1", "x2", "y2",
    "confidence", "class_id"])
    df["class_name"] = df["class_id"].map(result.names)
    return df

    df = results_to_df(result)
    print(df.head())

    # 转为 JSON
    def results_to_json(result):
    detections = []
    if result.boxes is not None:
    for box in result.boxes:
    detections.append({
    "bbox": box.xyxy[0].tolist(),
    "confidence": box.conf[0].item(),
    "class_id": int(box.cls[0].item()),
    "class_name": result.names[int(box.cls[0].item())]
    })
    return detections

    json_str = json.dumps(results_to_json(result), indent=2)
    print(json_str)


    七、模型评估与测试

    7.1 在测试集上评估

    best_model = YOLO('runs/train/exp/weights/best.pt')

    test_results = best_model.val(
    data='datasets/mydata/data.yaml',
    split='test',
    batch=16,
    imgsz=640,
    device=0,
    )

    print(f"mAP50-95: {test_results.box.map:.4f}")
    print(f"mAP50: {test_results.box.map50:.4f}")
    print(f"mAP75: {test_results.box.map75:.4f}")

    7.2 指标说明

    指标含义
    mAP50 IoU 阈值为 0.5 时的平均精度
    mAP50-95 IoU 阈值从 0.5 到 0.95 的平均精度(更严格)
    Precision 精确率:正确检测数 / 总检测数
    Recall 召回率:正确检测数 / 总真实目标数

    八、目标跟踪

    YOLO 支持目标跟踪功能,可以用于视频中目标的持续追踪:

    from ultralytics import YOLO

    model = YOLO('yolov8n.pt')

    # 对视频进行跟踪
    results = model.track(source='video.mp4', save=True, conf=0.5)

    跟踪结果中每个目标会有唯一的 track_id,可以在不同帧之间关联同一个目标。


    九、模型导出

    训练好的模型可以导出为多种格式用于部署:

    model = YOLO('runs/train/exp/weights/best.pt')

    # 导出为 ONNX 格式
    model.export(format='onnx')

    # 导出为 TensorRT 格式(需要 NVIDIA GPU)
    model.export(format='engine')

    # 导出为 TorchScript 格式
    model.export(format='torchscript')


    十、常见问题

    10.1 没有检测到目标

    if result.boxes is None or len(result.boxes) == 0:
    print("No objects detected")

    10.2 数据类型问题

    • result.boxes.data 默认在 GPU 上,使用 .cpu() 移到 CPU
    • 转为 Python 基本类型用 .item() 或 .tolist()

    10.3 不同模型类型的结果属性

    • 检测模型:result.boxes
    • 分割模型:result.masks
    • 姿态模型:result.keypoints
    • 分类模型:result.probs

    十一、总结

    本文要点回顾:

  • 推理:使用 YOLO 类加载模型,调用 predict() 或直接调用即可
  • 数据集:YOLO 格式要求严格的目录结构和标签格式
  • 训练:model.train() 一行代码启动训练,支持丰富的参数配置
  • 结果提取:通过 result.boxes 获取检测结果,支持转为 numpy、DataFrame、JSON 等格式
  • 评估:使用 model.val() 在测试集上评估,关注 mAP50 和 mAP50-95 指标
  • 部署:支持导出为 ONNX、TensorRT 等多种格式
  • YOLO 是目标检测领域最实用的工具之一,掌握其使用方法后,你可以快速完成从数据准备到模型部署的完整流程。


    参考资料

    • Ultralytics YOLOv8 官方文档
    • Ultralytics YOLOv8 GitHub
    • YOLO 论文
    • COCO 数据集
    赞(0)
    未经允许不得转载:171主机测评 » YOLO 目标检测从入门到实战:Ultralytics YOLOv8 完整使用指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址