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 config --set auto_activate_base false
2.3 创建 YOLO 虚拟环境
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 显卡,推荐)
pip uninstall torch torchvision torchaudio -y
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_01 → car_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
5. 模型训练
5.1 训练脚本
创建 train.py:
from ultralytics import YOLO
def main():
model = YOLO('yolov8n.pt')
model.train(
data='dataset/data.yaml',
epochs=100,
imgsz=640,
batch=8,
device=0,
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')
model.export(format='onnx', imgsz=640)
model.export(format='engine', device=0)
model.export(format='openvino')
model.export(format='tflite', imgsz=640, int8=True)
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 指定类别检测
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
conf = boxes.conf
cls = boxes.cls
ids = boxes.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,
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
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
10.2 显存不足 (CUDA out of memory)
batch=4
model = YOLO('yolov8n.pt')
imgsz=320
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()
设置 workers=0 或 workers=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. 快速开始(完整流程)
conda create -p F:\conda_envs\yolo-env python=3.11 -y
conda activate F:\conda_envs\yolo-env
pip install ultralytics torch labelimg
labelimg
python prepare_dataset.py
python train.py
python evaluate.py
yolo detect predict model=runs/train/my_model/weights/best.pt source=0
python export.py
13. 术语速查表
| 术语 | 解释 |
|---|
| Anchor Box | 锚框,预定义的先验框 |
| Backbone | 骨干网络,特征提取器 |
| Batch | 批次,一次训练的样本数 |
| COCO | 通用目标检测数据集 |
| Epoch | 轮次,完整遍历一次训练集 |
| FPN | 特征金字塔,多尺度特征融合 |
| IoU | 交并比,预测框与真实框的重叠率 |
| mAP | 平均精度均值,核心评价指标 |
| NMS | 非极大值抑制,去重算法 |
| ONNX | 开放神经网络交换格式 |
| Overfitting | 过拟合,模型只记住训练数据 |
| Precision | 精确率,查准率 |
| Recall | 召回率,查全率 |
| SOTA | 当前最佳水平 |
| TensorRT | NVIDIA 推理加速库 |
参考链接
所有评论(0)