YOLO 目标检测完整教程

文章目录

1. 什么是 YOLO

1.1 专业名词解释

名词 英文 解释
目标检测 Object Detection 在图像中找出并定位特定物体,同时识别其类别
边界框 Bounding Box 用矩形框标记物体位置的坐标信息 (x1, y1, x2, y2)
IOU Intersection over Union 预测框与真实框的重叠率,衡量定位精度,取值范围 0-1
NMS Non-Maximum Suppression 非极大值抑制,去除重叠的重复检测框,保留最佳结果
mAP mean Average Precision 平均精度均值,目标检测模型的核心评价指标
FPS Frames Per Second 每秒处理帧数,衡量模型推理速度
Anchor Box 锚框 预定义的先验框,帮助模型更好地预测物体位置
Backbone 骨干网络 用于提取图像特征的卷积神经网络(如 CSPDarknet)
Neck 颈部网络 连接 Backbone 和 Head 的特征融合层(如 FPN、PANet)
Head 检测头 负责预测边界框、类别和置信度的网络层
FPN Feature Pyramid Network 特征金字塔,融合多尺度特征,提升小目标检测能力
PANet Path Aggregation Network 路径聚合网络,增强特征传递,进一步提升精度
CSPNet Cross Stage Partial Network 跨阶段部分网络,减少计算量同时保持精度
SOTA State Of The Art 当前最佳水平,指在某个任务上表现最好的模型

1.2 YOLO 简介

YOLO(You Only Look Once)是一种单阶段目标检测算法,核心思想是将目标检测任务视为回归问题,直接在图像上预测边界框和类别概率。与传统的两阶段检测器(如 R-CNN)不同,YOLO 只需一次前向传播即可完成检测,因此速度极快,适合实时应用。

1.3 YOLO 各版本演进

版本 年份 核心创新 特点
YOLOv1 2016 开创性的单阶段检测范式 将图像划分为网格进行预测,速度极快但定位精度低
YOLOv2 2017 Anchor Boxes、多尺度训练 引入先验框,大幅提升召回率和定位精度
YOLOv3 2018 Darknet-53、FPN 多尺度预测,增强小物体检测能力
YOLOv4 2020 CSPDarknet53、Mish、Mosaic 集成了大量先进技巧,精度速度平衡优异
YOLOv5 2020 PyTorch 框架、工程化完善 生态最完善,提供多种规格模型,部署友好
YOLOv6 2022 EfficientRep、Rep-PAN 专为工业应用设计,量化友好
YOLOv7 2022 E-ELAN、Bag-of-Freebies 在效率和精度上做到了当时的最佳平衡
YOLOv8 2023 无锚点检测、解耦头 功能全面,支持检测/分割/姿态估计,应用最广泛
YOLOv9 2024 PGI、GELAN 解决信息丢失问题,参数利用率极高
YOLOv10 2024 双重分配策略、无NMS 端到端设计,推理延迟大幅降低
YOLOv11 2024 更高效的网络设计 参数量更少,速度和精度均优于 v8
YOLOv12 2025 区域注意力机制 回归注意力机制,精度达到 SOTA
YOLO26 2026 端到端、NMS-Free 专为边缘设备和 CPU 优化,推理速度极快

1.4 模型版本选择建议

版本 适用场景 推荐指数
YOLOv8 通用项目、初学者学习 ⭐⭐⭐⭐⭐
YOLO11 追求更高精度 ⭐⭐⭐⭐
YOLO26 CPU/边缘设备部署 ⭐⭐⭐⭐⭐
YOLOv5 稳定生产环境 ⭐⭐⭐⭐

💡 建议:初学者从 YOLOv8 入手,生态最完善,资料最全,学会后可轻松迁移到其他版本。

1.5 核心概念详解

1.5.1 单阶段 vs 两阶段检测
类型 代表算法 流程 特点
单阶段 YOLO、SSD 一步完成定位+分类 速度快,适合实时
两阶段 Faster R-CNN 先提取候选区域,再分类 精度高,速度慢
1.5.2 锚框(Anchor Box)
概念 说明
定义 预定义的、不同尺寸和宽高比的先验框
作用 让模型预测相对于锚框的偏移量,降低学习难度
聚类 在训练前,使用 K-means 聚类分析数据集,找到最优锚框尺寸
1.5.3 NMS(非极大值抑制)
输入:一组重叠的预测框
流程:
  1. 按置信度排序
  2. 保留最高置信度的框
  3. 移除与该框 IoU 大于阈值的其他框
  4. 重复 2-3 直到处理完所有框
输出:不重叠的最佳检测框
1.5.4 mAP(平均精度均值)
概念 解释
AP 单个类别的平均精度,即 PR 曲线下的面积
mAP 所有类别 AP 的平均值
mAP@0.5 IoU 阈值设为 0.5 时的 mAP
mAP@0.5:0.95 IoU 阈值从 0.5 到 0.95,步长 0.05 的 mAP 平均值(更严格)

2. 环境安装

2.1 安装 Miniconda

Miniconda 是基于 Python 的独立环境管理工具,可以为不同项目创建独立的虚拟环境。

下载地址:https://docs.conda.io/en/latest/miniconda.html

⚠️ 注意:安装时需要勾选 “Add Miniconda3 to my PATH environment variable”

2.2 配置 Miniconda 镜像源(加速下载)

# 设置清华源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2/

# 设置 conda 默认不激活 base 环境
conda config --set auto_activate_base false

2.3 创建 YOLO 虚拟环境

# 创建环境(-p 指定安装目录)
conda create -p F:\conda_envs\yolo-env python=3.11 -y

# 激活环境
conda activate F:\conda_envs\yolo-env

# 退出环境
conda deactivate

# 删除环境(直接删文件夹也行)
conda env remove -p F:\conda_envs\yolo-env

2.4 安装 PyTorch

根据你的硬件配置选择版本:

查看 GPU 是否可用
python -c "import torch; print(f'CUDA可用: {torch.cuda.is_available()}')"
GPU 版本(NVIDIA 显卡,推荐)
# 卸载 CPU 版本(如果有)
pip uninstall torch torchvision torchaudio -y

# 安装 CUDA 11.8 版本
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
CPU 版本(无独显)
pip install torch torchvision torchaudio

3. YOLO 安装与测试

3.1 安装 Ultralytics

pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2 验证安装

python -c "from ultralytics import YOLO; print('✅ 安装成功')"

3.3 测试推理

python -c "from ultralytics import YOLO; model = YOLO('yolov8n.pt'); results = model('https://ultralytics.com/images/bus.jpg'); results[0].show()"

3.4 摄像头实时测试

yolo predict model=yolov8n.pt source=0

q 键退出预览窗口


4. 数据准备与标注

4.1 安装标注工具

pip install labelimg

4.2 启动标注工具

labelimg

4.3 标注设置

设置项 操作
打开图片目录 点击 Open Dir,选择图片文件夹
设置保存目录 点击 Change Save Dir,选择标注保存文件夹
切换格式 左侧底部,从 PascalVOC 改为 YOLO

4.4 标注快捷键

快捷键 功能
W 画标注框
D 下一张(自动保存)
A 上一张
Ctrl + S 手动保存
Ctrl + Z 撤销

4.5 标注规范

正样本
  • 目标完整框入,边缘紧贴物体
  • 不要留太多空白背景
  • 不要切掉目标本身
负样本
  • 不画任何框,直接按 D 跳过
  • 帮助模型学会"什么不是"
  • 建议数量:正样本的 30%-50%
类别命名规范
规范 示例
使用英文小写 person, car
多个单词用下划线分隔 person_with_fan, traffic_light
避免使用数字开头 car_01car_01 可以

4.6 数据集目录结构

dataset/
├── images/
│   ├── train/          # 训练图片(建议 70-80%)
│   └── val/            # 验证图片(建议 20-30%)
├── labels/
│   ├── train/          # 训练标注(与图片同名 .txt)
│   └── val/            # 验证标注
└── data.yaml           # 数据集配置文件

4.7 YOLO 标注格式详解

每个 .txt 文件内容格式:

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

示例:

0 0.512 0.745 0.258 0.412
字段 含义 取值范围
class_id 类别索引 0 到 nc-1
x_center 框中心点 x 坐标(归一化) 0-1
y_center 框中心点 y 坐标(归一化) 0-1
width 框宽度(归一化) 0-1
height 框高度(归一化) 0-1

归一化公式:值 = 像素坐标 / 图像尺寸

4.8 创建 data.yaml

path: F:/your_project/dataset    # 数据集根目录的绝对路径
train: images/train               # 训练图片相对路径
val: images/val                   # 验证图片相对路径

nc: 1                             # 类别数量
names:
  0: person_with_fan              # 类别名称,索引从 0 开始

5. 模型训练

5.1 训练脚本

创建 train.py

from ultralytics import YOLO

def main():
    # 加载预训练模型
    # n/s/m/l/x 可选,参数量和精度递增
    model = YOLO('yolov8n.pt')
    
    model.train(
        data='dataset/data.yaml',  # 数据集配置文件
        epochs=100,                 # 训练轮数
        imgsz=640,                  # 输入图片尺寸
        batch=8,                    # 批次大小(根据显存调整)
        device=0,                   # GPU:0, CPU:cpu
        workers=2,                  # 数据加载线程
        patience=20,                # 早停轮数
        project='runs/train',       # 结果保存目录
        name='my_model',            # 实验名称
        exist_ok=True,              # 允许覆盖
        verbose=True,               # 打印详细信息
    )
    print("✅ 训练完成!")

if __name__ == '__main__':
    main()

5.2 运行训练

python train.py

5.3 训练过程解读

训练输出示例:

Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    1/100     2.1G      1.123      1.456      1.231         12        640
指标 含义 趋势
GPU_mem 显存占用(GB) 应保持稳定
box_loss 边框预测损失 逐渐下降
cls_loss 分类损失 逐渐下降
dfl_loss 分布焦点损失 逐渐下降
Instances 本批次目标数量 波动正常

5.4 训练参数详解

参数 默认值 说明
epochs 100 训练轮数,越多越久
batch 16 批次大小,显存不足时减小
imgsz 640 输入图片尺寸
lr0 0.01 初始学习率
optimizer auto 优化器(AdamW/SGD)
device 0 0=GPU, cpu=CPU
workers 8 数据加载线程数
patience 50 早停轮数,0=禁用
weight_decay 0.0005 权重衰减,防止过拟合
momentum 0.937 SGD 动量

5.5 模型规格对比

模型 参数量 速度 精度(mAP) 显存要求 推荐场景
yolov8n.pt 3.2M 最快 37.3% 2GB 移动端、边缘设备
yolov8s.pt 11.2M 44.9% 3GB 快速实验
yolov8m.pt 25.9M 中等 50.2% 4GB 通用场景(推荐)
yolov8l.pt 43.7M 52.9% 6GB 高精度需求
yolov8x.pt 68.2M 很慢 53.9% 8GB 极致精度

6. 模型评估

6.1 评估脚本

from ultralytics import YOLO

model = YOLO('runs/train/my_model/weights/best.pt')
metrics = model.val(data='dataset/data.yaml')

print(f"mAP50: {metrics.box.map50:.3f}")
print(f"mAP50-95: {metrics.box.map:.3f}")
print(f"Precision: {metrics.box.p:.3f}")
print(f"Recall: {metrics.box.r:.3f}")

6.2 指标解读

指标 含义 优秀 良好 需优化
mAP50 IoU=0.5 时的平均精度 >0.9 >0.7 <0.7
mAP50-95 多 IoU 阈值平均精度 >0.7 >0.5 <0.5
Precision 精确率 = TP / (TP + FP) >0.9 >0.8 <0.8
Recall 召回率 = TP / (TP + FN) >0.9 >0.7 <0.7

6.3 混淆矩阵解读

预测\真实 正样本 负样本
正样本 TP(真正例)✅ FP(假正例)❌
负样本 FN(假负例)❌ TN(真负例)✅
  • TP:正确检测到的目标
  • FP:错误检测(把背景当目标)
  • FN:漏检(没检测到目标)
  • TN:正确排除的背景

7. 模型导出

7.1 导出脚本

from ultralytics import YOLO

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

# ONNX(最通用,推荐)
model.export(format='onnx', imgsz=640)

# TensorRT(NVIDIA GPU 加速)
model.export(format='engine', device=0)

# OpenVINO(Intel CPU 加速)
model.export(format='openvino')

# TFLite(移动端)
model.export(format='tflite', imgsz=640, int8=True)

# CoreML(Apple 设备)
model.export(format='coreml')

7.2 导出格式对比

格式 后缀 适用场景 速度 部署难度
ONNX .onnx 通用,所有框架支持 中等 简单
TensorRT .engine NVIDIA GPU 极致加速 最快 中等
OpenVINO .xml Intel CPU/GPU 中等
TFLite .tflite Android/移动端 中等 简单
CoreML .mlmodel Apple 设备 简单

8. 模型推理

8.1 单张图片推理

from ultralytics import YOLO

model = YOLO('runs/train/my_model/weights/best.pt')
results = model('test.jpg', conf=0.5)
results[0].show()        # 显示结果
results[0].save('result.jpg')  # 保存结果

8.2 摄像头实时推理

from ultralytics import YOLO
import cv2

model = YOLO('best.pt')
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    results = model(frame, conf=0.5)
    annotated = results[0].plot()
    
    cv2.imshow('YOLO Detection', annotated)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

8.3 视频文件推理

yolo detect predict model=best.pt source=input.mp4 save=True

8.4 指定类别检测

# 只检测类别 0(person_with_fan)
results = model(frame, conf=0.5, classes=[0])

8.5 调整置信度阈值

# 降低阈值(检出更多,可能有误报)
results = model(frame, conf=0.3)

# 提高阈值(更精准,可能漏检)
results = model(frame, conf=0.7)

8.6 结果对象解析

results = model('image.jpg')

for r in results:
    boxes = r.boxes               # 检测框对象
    if boxes is not None:
        xyxy = boxes.xyxy         # 坐标 [x1,y1,x2,y2]
        conf = boxes.conf         # 置信度
        cls = boxes.cls           # 类别 ID
        ids = boxes.id            # 跟踪 ID(开启跟踪时)
    
    names = r.names               # 类别名称字典
    speed = r.speed               # 推理耗时
    orig_img = r.orig_img         # 原始图像

9. 常用配置参数

9.1 训练参数快速参考

model.train(
    data='dataset/data.yaml',  # 数据集配置文件
    epochs=100,                 # 训练轮数
    imgsz=640,                  # 输入尺寸
    batch=16,                   # 批次大小
    lr0=0.01,                   # 初始学习率
    lrf=0.01,                   # 最终学习率因子
    optimizer='AdamW',          # 优化器
    weight_decay=0.0005,        # 权重衰减
    warmup_epochs=3,            # 预热轮数
    patience=50,                # 早停轮数
    device=0,                   # 设备
    workers=8,                  # 工作线程
    project='runs/train',       # 保存目录
    name='exp',                 # 实验名称
    exist_ok=False,             # 是否覆盖
    pretrained=True,            # 预训练权重
    resume=False,               # 断点续训
    single_cls=False,           # 单类别模式
)

9.2 推理参数快速参考

model.predict(
    source='image.jpg',         # 输入源
    imgsz=640,                  # 输入尺寸
    conf=0.25,                  # 置信度阈值
    iou=0.45,                   # NMS 的 IOU 阈值
    device=0,                   # 设备
    save=True,                  # 保存结果
    save_txt=False,             # 保存标注文件
    save_conf=False,            # 保存置信度
    show=False,                 # 实时显示
    line_width=3,               # 边框宽度
    classes=None,               # 指定类别
    max_det=300,                # 最大检测数
)

10. 常见问题

10.1 CUDA 不可用

# 检查显卡驱动
nvidia-smi

# 重新安装 GPU 版 PyTorch
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

10.2 显存不足 (CUDA out of memory)

# 减小批次大小
batch=4  # 或 2

# 使用更小的模型
model = YOLO('yolov8n.pt')  # 而不是 yolov8m.pt

# 减小输入尺寸
imgsz=320  # 默认 640

10.3 标注格式错误

检查 .txt 文件内容应为:

0 0.512 0.745 0.258 0.412
检查项 正确值
第一个数字 0 到 nc-1
后面四个数字 归一化坐标,0-1 之间
每行数字个数 5 个
文件编码 UTF-8

10.4 训练不收敛

可能原因 解决方案
数据量不足 增加图片数量或数据增强
标注质量差 检查并重新标注
学习率不当 调整 lr0(降低到 0.005 或提高到 0.02)
轮数太少 增加 epochs 到 200-300
正负样本不平衡 添加更多负样本

10.5 模型误检

可能原因 解决方案
负样本不足 添加不画框的图片
置信度阈值低 提高 conf 值(0.5 → 0.7)
数据多样性差 增加不同背景、光照的图片
类别混淆 检查标注是否正确

10.6 Windows 多进程报错

错误信息

RuntimeError: An attempt has been made to start a new process...

解决方案

if __name__ == '__main__':
    main()  # 必须放在 __main__ 中

设置 workers=0workers=2

10.7 ONVIF 连接失败

错误 解决方案
Unauthorized 检查用户名密码,添加 ONVIF 用户
Connection refused 检查 IP 和端口,启用 ONVIF 功能
No module named 'onvif' pip install onvif_zeep

11. 项目目录结构建议

your_project/
├── dataset/
│   ├── images/
│   │   ├── train/      # 训练图片
│   │   └── val/        # 验证图片
│   ├── labels/
│   │   ├── train/      # 训练标注
│   │   └── val/        # 验证标注
│   └── data.yaml       # 数据集配置
├── runs/
│   └── train/
│       └── my_model/
│           └── weights/
│               ├── best.pt    # 最佳模型
│               └── last.pt    # 最后模型
├── scripts/
│   ├── train.py        # 训练脚本
│   ├── predict.py      # 推理脚本
│   ├── export.py       # 导出脚本
│   └── prepare_dataset.py  # 数据集整理脚本
├── models/             # 模型备份
├── outputs/            # 输出结果
└── requirements.txt    # 依赖列表

12. 快速开始(完整流程)

# 1. 创建并激活环境
conda create -p F:\conda_envs\yolo-env python=3.11 -y
conda activate F:\conda_envs\yolo-env

# 2. 安装依赖
pip install ultralytics torch labelimg

# 3. 标注数据
labelimg

# 4. 整理数据集(创建 prepare_dataset.py)
python prepare_dataset.py

# 5. 训练模型
python train.py

# 6. 评估模型
python evaluate.py

# 7. 测试模型
yolo detect predict model=runs/train/my_model/weights/best.pt source=0

# 8. 导出模型
python export.py

13. 术语速查表

术语 解释
Anchor Box 锚框,预定义的先验框
Backbone 骨干网络,特征提取器
Batch 批次,一次训练的样本数
COCO 通用目标检测数据集
Epoch 轮次,完整遍历一次训练集
FPN 特征金字塔,多尺度特征融合
IoU 交并比,预测框与真实框的重叠率
mAP 平均精度均值,核心评价指标
NMS 非极大值抑制,去重算法
ONNX 开放神经网络交换格式
Overfitting 过拟合,模型只记住训练数据
Precision 精确率,查准率
Recall 召回率,查全率
SOTA 当前最佳水平
TensorRT NVIDIA 推理加速库

参考链接

Logo

免费领 150 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐