YOLO 目标检测完整教程

文章目录

1. 什么是 YOLO

1.1 专业名词解释

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

1.2 YOLO 简介

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

1.3 YOLO 各版本演进

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

1.4 模型版本选择建议

版本适用场景推荐指数
YOLOv8通用项目、初学者学习⭐⭐⭐⭐⭐
YOLO11追求更高精度⭐⭐⭐⭐
YOLO26CPU/边缘设备部署⭐⭐⭐⭐⭐
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.5IoU 阈值设为 0.5 时的 mAP
mAP@0.5:0.95IoU 阈值从 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 训练参数详解

参数默认值说明
epochs100训练轮数,越多越久
batch16批次大小,显存不足时减小
imgsz640输入图片尺寸
lr00.01初始学习率
optimizerauto优化器(AdamW/SGD)
device00=GPU, cpu=CPU
workers8数据加载线程数
patience50早停轮数,0=禁用
weight_decay0.0005权重衰减,防止过拟合
momentum0.937SGD 动量

5.5 模型规格对比

模型参数量速度精度(mAP)显存要求推荐场景
yolov8n.pt3.2M最快37.3%2GB移动端、边缘设备
yolov8s.pt11.2M44.9%3GB快速实验
yolov8m.pt25.9M中等50.2%4GB通用场景(推荐)
yolov8l.pt43.7M52.9%6GB高精度需求
yolov8x.pt68.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 指标解读

指标含义优秀良好需优化
mAP50IoU=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.engineNVIDIA GPU 极致加速最快中等
OpenVINO.xmlIntel CPU/GPU中等
TFLite.tfliteAndroid/移动端中等简单
CoreML.mlmodelApple 设备简单

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当前最佳水平
TensorRTNVIDIA 推理加速库

参考链接

Logo

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

更多推荐