4、目标检测发展史:从传统方法到深度学习,R-CNN系列、YOLO系列、SSD简介

聊目标检测的发展史,其实就是在聊计算机视觉怎么「看懂」世界的过程。

我刚开始做视觉那会儿,用的还是传统方法。那时候做个检测,得先想好特征怎么设计,再琢磨分类器怎么训练。说实话,效果嘛……凑合能用,但离「实用」差得远。

后来深度学习来了,整个行业都变了。今天我就带你捋一捋这条发展线。

4.1 传统目标检测:手工特征的时代

在深度学习普及之前,目标检测主要靠三步走:

  1. 区域选择:用滑动窗口在图像上扫一遍
  2. 特征提取:手工设计特征,比如 HOG、SIFT、Haar
  3. 分类器判断:用 SVM、Adaboost 等判断是不是目标

我记得最早接触的是 Viola-Jones 检测器,专门用来做人脸检测。它的核心是 Haar-like 特征 + 级联分类器。说白了,就是用一堆简单的矩形特征快速排除掉大部分非人脸区域。

后来 HOG(方向梯度直方图)火了,配合 SVM 做行人检测,效果比之前好不少。但问题也很明显——滑动窗口太慢了,而且手工特征对光照、遮挡、形变这些变化很敏感。

传统方法的痛点:

  • 计算量大:滑动窗口穷举,效率低
  • 特征表达能力有限:手工特征很难覆盖所有场景
  • 泛化能力差:换个数据集,效果可能断崖式下跌

嗯,说白了就是「费力不讨好」。我当时做项目,调 HOG 参数调得头秃,最后效果也就那样。

4.2 R-CNN系列:深度学习检测的开端

2014年,R-CNN 横空出世。它把目标检测带入了深度学习时代。

4.2.1 R-CNN:区域提议 + CNN

R-CNN 的思路其实很直接:

  1. 用 Selective Search 生成约2000个候选区域
  2. 把每个候选区域缩放到固定尺寸
  3. 用 CNN 提取特征
  4. 用 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 发展脉络总结

回顾目标检测的发展史,其实就两条主线:

  1. 两阶段检测器(R-CNN 系列):先提候选区域,再分类回归。精度高,速度慢。
  2. 单阶段检测器(YOLO、SSD):一步到位。速度快,精度稍低(后来差距越来越小)。

现在的主流趋势是:

  • Transformer 架构(如 DETR)开始挑战 CNN 的地位
  • 端侧部署越来越受重视(轻量化模型)
  • 多任务学习(检测 + 分割 + 姿态估计)

但不管怎么变,YOLO 系列在工业界的地位依然稳固。原因很简单——它够快、够稳、够好用。

给新手的建议: 别急着追新模型。先把 YOLOv5 跑通,理解检测的基本流程。然后试试 Faster R-CNN,感受两阶段和单阶段的区别。最后再去看 Transformer 检测器。一步一个脚印,比什么都强。

好了,这一章就聊到这儿。下一章我们开始动手搭建环境,准备跑第一个检测模型。