4、目标检测发展史:从传统方法到深度学习,R-CNN系列、YOLO系列、SSD简介
聊目标检测的发展史,其实就是在聊计算机视觉怎么「看懂」世界的过程。
我刚开始做视觉那会儿,用的还是传统方法。那时候做个检测,得先想好特征怎么设计,再琢磨分类器怎么训练。说实话,效果嘛……凑合能用,但离「实用」差得远。
后来深度学习来了,整个行业都变了。今天我就带你捋一捋这条发展线。
4.1 传统目标检测:手工特征的时代
在深度学习普及之前,目标检测主要靠三步走:
- 区域选择:用滑动窗口在图像上扫一遍
- 特征提取:手工设计特征,比如 HOG、SIFT、Haar
- 分类器判断:用 SVM、Adaboost 等判断是不是目标
我记得最早接触的是 Viola-Jones 检测器,专门用来做人脸检测。它的核心是 Haar-like 特征 + 级联分类器。说白了,就是用一堆简单的矩形特征快速排除掉大部分非人脸区域。
后来 HOG(方向梯度直方图)火了,配合 SVM 做行人检测,效果比之前好不少。但问题也很明显——滑动窗口太慢了,而且手工特征对光照、遮挡、形变这些变化很敏感。
传统方法的痛点:
- 计算量大:滑动窗口穷举,效率低
- 特征表达能力有限:手工特征很难覆盖所有场景
- 泛化能力差:换个数据集,效果可能断崖式下跌
嗯,说白了就是「费力不讨好」。我当时做项目,调 HOG 参数调得头秃,最后效果也就那样。
4.2 R-CNN系列:深度学习检测的开端
2014年,R-CNN 横空出世。它把目标检测带入了深度学习时代。
4.2.1 R-CNN:区域提议 + CNN
R-CNN 的思路其实很直接:
- 用 Selective Search 生成约2000个候选区域
- 把每个候选区域缩放到固定尺寸
- 用 CNN 提取特征
- 用 SVM 分类,用回归器微调边框
效果确实比传统方法好一大截,在 PASCAL VOC 数据集上 mAP 从 30% 多直接干到了 58.5%。
但问题也很明显——太慢了。每张图要处理2000个候选区域,而且每个区域都要单独跑一遍 CNN。我试过,一张图要跑几十秒,根本没法用在实时场景。
避坑指南: 我曾经在项目里直接用 R-CNN 做视频检测,结果一秒钟处理不到一帧。后来才意识到,R-CNN 只适合离线处理,不适合实时系统。
4.2.2 Fast R-CNN:共享卷积计算
Fast R-CNN 解决了 R-CNN 的一个核心问题——重复计算。
它的做法是:整张图只跑一次 CNN,得到特征图。然后对每个候选区域,在特征图上做 RoI Pooling,提取固定大小的特征向量。
这样一来,速度提升了不少。训练也从多阶段变成了端到端。
但瓶颈还在——候选区域的生成(Selective Search)依然是 CPU 上的,拖慢了整体速度。
4.2.3 Faster R-CNN:区域提议网络
Faster R-CNN 是 R-CNN 系列的集大成者。它引入了一个叫 RPN(区域提议网络)的东西,把候选区域生成也放到了 GPU 上。
RPN 的工作原理:在特征图上滑动一个小窗口,每个位置预测 k 个锚框(anchor box),然后判断这些锚框里有没有目标,并微调边框。
这样一来,整个检测流程都跑在 GPU 上,速度大幅提升。一张图大概 0.2 秒,基本接近实时了。
R-CNN 系列总结:
| 模型 | 核心改进 | 速度 | 精度 |
|---|---|---|---|
| R-CNN | CNN 特征 + 候选区域 | 慢(~50s/图) | 高 |
| Fast R-CNN | 共享卷积 + RoI Pooling | 中等(~2s/图) | 更高 |
| Faster R-CNN | RPN 端到端训练 | 快(~0.2s/图) | 最高 |
4.3 YOLO系列:实时检测的标杆
YOLO 的出现,彻底改变了「实时检测」这个词的含义。
它的核心思想很简单——把检测当成回归问题来做。一张图进去,直接输出边界框和类别概率,一步到位。
4.3.1 YOLOv1:开创性的单阶段检测
YOLOv1 把图像分成 S×S 的网格,每个网格负责检测中心点落在它里面的目标。每个网格预测 B 个边界框和 C 个类别概率。
速度是真的快——在 Titan X 上能达到 45 FPS,轻量版甚至能到 155 FPS。
但精度嘛……比 Faster R-CNN 差一些。特别是对小目标和密集目标的检测,效果不太行。
注意: YOLOv1 每个网格只能预测一个类别,如果两个目标中心点落在同一个网格里,就会漏检。我在做交通场景检测时就踩过这个坑,密集的车流里经常漏检。
4.3.2 YOLOv2/YOLO9000:更好、更强、更多类别
YOLOv2 做了很多改进:
- 用 Batch Normalization 替代 Dropout
- 用锚框(anchor box)来预测边界框
- 用 Darknet-19 作为骨干网络
- 多尺度训练,适应不同分辨率
YOLO9000 更厉害,它联合训练了检测数据集和分类数据集,能检测 9000 多种类别。虽然精度不是特别高,但这个思路很有启发性。
4.3.3 YOLOv3:多尺度检测
YOLOv3 引入了 FPN(特征金字塔网络)的思想,在三个不同尺度的特征图上做检测。这样一来,小目标检测能力大幅提升。
骨干网络换成了 Darknet-53,用了残差连接,网络更深但训练更容易。
说实话,YOLOv3 是我用得最多的版本。它在速度和精度之间取得了很好的平衡,部署起来也方便。
4.3.4 YOLOv4 及之后:工程优化的巅峰
YOLOv4 不是原作者做的,但它在工程优化上做到了极致。它把各种 tricks 都整合进来了:
- Mish 激活函数
- CIoU 损失函数
- Mosaic 数据增强
- 自对抗训练
之后的 YOLOv5、YOLOX、YOLOv8 等版本,更多是在工程实现和部署上做优化。比如 YOLOv5 用 PyTorch 实现,导出 ONNX 和 TensorRT 都很方便。
我的建议: 如果你刚开始做目标检测,从 YOLOv5 或 YOLOv8 入手最合适。文档齐全,社区活跃,部署工具也成熟。别一上来就追最新版本,稳定好用才是王道。
4.4 SSD:兼顾速度和精度
SSD(Single Shot MultiBox Detector)是另一个经典的单阶段检测器。它和 YOLO 差不多同时期出现,但思路不太一样。
SSD 的核心特点:
- 在多个不同尺度的特征图上做检测
- 每个位置用不同大小和长宽比的锚框
- 直接预测类别和边框偏移
SSD 的速度和 YOLO 差不多,但精度更高,特别是对小目标的检测。原因就在于它用了多尺度特征图——浅层特征图感受野小,适合检测小目标;深层特征图感受野大,适合检测大目标。
我记得在某个项目中,用 SSD 检测工业零件上的微小缺陷,效果比 YOLOv3 好不少。但 SSD 的训练调参比较麻烦,锚框的尺寸和长宽比需要根据数据集仔细设计。
YOLO vs SSD 对比:
| 特性 | YOLO | SSD |
|---|---|---|
| 检测方式 | 网格 + 锚框 | 多尺度特征图 + 锚框 |
| 小目标检测 | 一般(YOLOv3后改善) | 较好 |
| 速度 | 极快 | 快 |
| 训练难度 | 中等 | 较高(锚框设计复杂) |
| 部署生态 | 非常成熟 | 较成熟 |
4.5 发展脉络总结
回顾目标检测的发展史,其实就两条主线:
- 两阶段检测器(R-CNN 系列):先提候选区域,再分类回归。精度高,速度慢。
- 单阶段检测器(YOLO、SSD):一步到位。速度快,精度稍低(后来差距越来越小)。
现在的主流趋势是:
- Transformer 架构(如 DETR)开始挑战 CNN 的地位
- 端侧部署越来越受重视(轻量化模型)
- 多任务学习(检测 + 分割 + 姿态估计)
但不管怎么变,YOLO 系列在工业界的地位依然稳固。原因很简单——它够快、够稳、够好用。
给新手的建议: 别急着追新模型。先把 YOLOv5 跑通,理解检测的基本流程。然后试试 Faster R-CNN,感受两阶段和单阶段的区别。最后再去看 Transformer 检测器。一步一个脚印,比什么都强。
好了,这一章就聊到这儿。下一章我们开始动手搭建环境,准备跑第一个检测模型。