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)