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

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


一、前言

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

本文将覆盖以下内容:

  1. YOLO 基本推理
  2. 数据集准备与标注
  3. 模型训练
  4. 推理结果数据提取
  5. 目标跟踪
  6. 模型导出与部署

二、环境安装

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_centery_center:边界框中心点坐标(归一化到 0~1)
  • widthheight:边界框宽高(归一化到 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 数据获取方法

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

五、模型训练

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.pt3.2M最快较低移动端、实时检测
yolov8s.pt11.2M中等轻量级部署
yolov8m.pt25.9M中等较高通用场景
yolov8l.pt43.7M较慢高精度需求
yolov8x.pt68.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 指标说明

指标含义
mAP50IoU 阈值为 0.5 时的平均精度
mAP50-95IoU 阈值从 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

十一、总结

本文要点回顾:

  1. 推理:使用 YOLO 类加载模型,调用 predict() 或直接调用即可
  2. 数据集:YOLO 格式要求严格的目录结构和标签格式
  3. 训练model.train() 一行代码启动训练,支持丰富的参数配置
  4. 结果提取:通过 result.boxes 获取检测结果,支持转为 numpy、DataFrame、JSON 等格式
  5. 评估:使用 model.val() 在测试集上评估,关注 mAP50 和 mAP50-95 指标
  6. 部署:支持导出为 ONNX、TensorRT 等多种格式

YOLO 是目标检测领域最实用的工具之一,掌握其使用方法后,你可以快速完成从数据准备到模型部署的完整流程。


参考资料

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐