1. YOLO初识:目标检测发展史、YOLO系列演进与核心思想
大家好,欢迎来到这门课的第一章。今天咱们聊聊YOLO——这个在目标检测领域掀起革命的名字。
先说说我自己的经历。2016年我刚入行做安防检测,那时候主流还是Faster R-CNN。跑一帧图像要几百毫秒,根本没法做实时监控。后来YOLOv1出来了,虽然精度差点,但速度直接飙到45 FPS。我当时就觉得:这路子对了。
1.1 目标检测发展史:从传统到深度学习
目标检测不是突然冒出来的。它经历了几个关键阶段:
| 阶段 | 代表方法 | 核心思路 | 我的评价 |
|---|---|---|---|
| 传统方法(2000s) | VJ检测器、HOG+SVM、DPM | 手工特征 + 滑动窗口 | 慢、泛化差,但思路值得学 |
| 两阶段检测(2014) | R-CNN、Fast R-CNN、Faster R-CNN | 候选区域 + 分类回归 | 精度高,但实时性不行 |
| 单阶段检测(2016) | YOLO、SSD、RetinaNet | 一步到位,直接回归 | 速度起飞,精度逐渐追上 |
| Transformer时代(2020) | DETR、YOLOS | 端到端,注意力机制 | 新方向,但YOLO依然能打 |
关键转折点:2012年AlexNet在ImageNet夺冠,深度学习开始碾压手工特征。2014年R-CNN把目标检测拉入深度学习时代,但真正让检测"跑起来"的,是2016年的YOLOv1。
1.2 YOLO系列演进:从v1到v8
YOLO这八年进化得真快。我整理了一张演进图,你看看就明白了:
1.3 YOLO核心思想:单阶段检测、网格划分、边界框回归
YOLO为什么快?说白了就一句话:把检测当成回归问题来做。
传统两阶段方法先提候选框再分类,YOLO直接一步到位。它把输入图像分成 S×S 个网格,每个网格负责检测中心点落在它里面的物体。
1.3.1 网格划分
YOLOv1用7×7网格,每个网格预测2个边界框。你想想看,一张448×448的图像,分成49个格子,每个格子管一片区域。这设计其实很暴力,但有效。
我的经验:网格大小直接影响小目标检测。我在做交通标志检测时,7×7网格根本看不清远处的限速牌。后来换成YOLOv3的多尺度检测(13×13、26×26、52×52),小目标召回率从40%直接跳到75%。
1.3.2 边界框回归
每个边界框预测5个值:(x, y, w, h, confidence)。
- x, y:框中心相对于网格的偏移(0~1)
- w, h:框的宽高相对于整张图的比例(0~1)
- confidence:这个框包含物体的置信度
再加上每个网格预测 C 个类别的概率。最终输出就是 S×S×(B×5 + C) 的张量。
# YOLOv1输出张量结构示意
# 输入: 448×448×3
# 输出: 7×7×30
# 每个网格: 2个框 × 5个值 + 20个类别 = 30维
output_shape = (7, 7, 30) # S=7, B=2, C=20
1.3.3 单阶段检测的优势
| 对比维度 | 两阶段(Faster R-CNN) | 单阶段(YOLO) |
|---|---|---|
| 检测流程 | 候选区域 → 分类 + 回归 | 一步到位 |
| 速度 | 7~10 FPS | 45+ FPS |
| 精度(mAP) | 更高(~75%) | 稍低(~63% v1) |
| 小目标 | 较好 | 较差(v1) |
| 部署难度 | 模型大、依赖多 | 轻量、易部署 |
⚠️ 注意:YOLOv1的精度确实不如两阶段方法。但你要知道,在实时检测场景下,30 FPS和7 FPS的差距是"能用"和"不能用"的区别。我曾经在边缘设备上部署过Faster R-CNN,一帧跑2秒,客户直接说"这不行"。
1.4 损失函数:YOLO怎么学?
YOLO的损失函数分三部分:
Loss = λ_coord * Loss_xywh + λ_obj * Loss_confidence + λ_noobj * Loss_noobj + Loss_class
- 坐标损失:只计算有物体的框,用均方误差
- 置信度损失:有物体和无物体分开算,权重不同
- 类别损失:每个网格只预测一个类别(早期版本)
这里有个坑:正负样本极度不平衡。一张图里大部分网格都是背景,如果让背景的损失权重和前景一样,模型会学成"啥也不检测"。YOLO用 λ_noobj=0.5 压低背景权重,这个技巧后来被几乎所有单阶段检测器继承。
核心要点总结:
- YOLO把检测当成回归问题,一步到位
- 网格划分 + 边界框回归 + 类别预测 = 核心三件套
- 速度是最大优势,精度通过后续版本不断追赶
- 损失函数设计要平衡正负样本