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 框架进一步简化了使用流程,只需几行代码即可完成目标检测的推理和训练。
本文将覆盖以下内容:
二、环境安装
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 数据获取方法
五、模型训练
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 是目标检测领域最实用的工具之一,掌握其使用方法后,你可以快速完成从数据准备到模型部署的完整流程。
参考资料
- Ultralytics YOLOv8 官方文档
- Ultralytics YOLOv8 GitHub
- YOLO 论文
- COCO 数据集





