2025年6月18日

框出万物:2D目标检测的演进之路


2D目标检测,是计算机视觉领域最核心的任务之一。它的目标很简单:在一张图片中,同时回答两个问题——“是什么?“(分类)和”在哪里?“(定位)。

我从2016年开始接触目标检测,亲历了从Fast R-CNN到YOLO,再到DETR的完整变迁。这条路走下来,最大的感受是:每一次范式更替,本质上都是在”精度、速度、简洁性”这三者之间重新找平衡

目标检测演进时间线

1. 蛮荒时代:传统方法 (2014年以前)

在深度学习一统江湖之前,目标检测是一个繁琐、多阶段的过程。

核心思想

滑动窗口(Sliding Window) + 手工特征(Hand-crafted Features) + 分类器(Classifier)。

流程拆解

  1. 区域选择:用一个固定大小的窗口,在图像上从左到右、从上到下地滑动。为了检测不同大小的物体,还需要缩放窗口或图像,重复滑动。这个过程会产生海量的候选区域。

  2. 特征提取:对于每一个候选区域,使用经典的特征描述子,如 HOG (Histogram of Oriented Gradients) 或 SIFT (Scale-Invariant Feature Transform),将其转换成一个固定长度的特征向量。

  3. 分类:将提取出的特征向量,喂给一个预先训练好的分类器,如 SVM (Support Vector Machine),来判断这个区域里是”目标”还是”背景”。

痛点

  • 计算量巨大:滑动窗口策略毫无重点,会产生大量冗余的计算。我在早期实验中跑过一个HOG+SVM的Demo,检测一张800x600的图片要跑将近30秒,基本不可用。
  • 特征表达力弱:手工设计的特征,对光照、形变、遮挡等情况的鲁棒性很差。稍微暗一点的光线,准确率就断崖式下跌。

2. 两阶段王朝:精度为王 (2014 - 2016)

2012年AlexNet的出现,标志着深度学习时代的到来。目标检测领域也迎来了革命。

核心思想

先找”可能”是物体的区域,再对这些区域进行精细分类和定位。这种”先粗后精”的思路,被称为**两阶段(Two-Stage)**方法。

代表模型:R-CNN 家族

R-CNN (2014)

  1. 区域提名(Region Proposal):用选择性搜索(Selective Search)算法,替代了蛮力的滑动窗口,生成约2000个高质量的候选框。

  2. 特征提取:将这2000个候选框,逐一缩放到固定尺寸,然后分别送入一个CNN(如AlexNet)中提取特征。

  3. 分类与回归:用SVM进行分类,再用一个线性回归器对边框位置进行微调。

  4. 问题:每个候选框都要独立过一遍CNN,计算冗余极大,速度极慢。我记得当时用GTX 980跑一张图要47秒,离实用还差得远。

Fast R-CNN (2015)

  1. 核心改进:只对整张图像进行一次CNN特征提取,得到一个特征图(Feature Map)。

  2. 将选择性搜索生成的候选框,投影(Project)到这个特征图上。

  3. 引入 RoI Pooling (Region of Interest Pooling) 层,从特征图上为每个不同大小的候选框提取出固定尺寸的特征向量。

  4. 结果:共享了卷积计算,速度大幅提升。但瓶颈转移到了CPU上运行的选择性搜索。

Faster R-CNN (2015)

  1. 终极形态:引入了RPN (Region Proposal Network),彻底抛弃了选择性搜索。

  2. RPN是一个小型的全卷积网络,它直接在CNN的特征图上滑动,高效地生成高质量的候选框。

  3. 意义:首次将区域提名步骤也集成到了GPU中,实现了**端到端(End-to-End)**的训练。Faster R-CNN 成为了后续无数两阶段算法的基石。我在生产环境用Faster R-CNN跑过一阵,精度确实高,但Titan X上也就勉强10fps,实时性还是不够。

3. 单阶段崛起:速度至上 (2016 - 至今)

两阶段方法精度虽高,但速度仍难以满足实时应用的需求。于是,另一条技术路线应运而生。

核心思想

取消区域提名阶段,直接在整张图上回归出物体的类别和位置。这种一步到位的方式,被称为**单阶段(One-Stage)**方法。

代表模型

YOLO (You Only Look Once) (2016)

  • 思路:将图像划分为SxS的网格(Grid)。每个网格单元负责预测中心点落入其中的物体。

  • 特点:结构极其简洁,速度飞快,真正意义上实现了实时检测。但早期版本对小物体的检测效果不佳。我第一次跑YOLO v1的时候,45fps的帧率确实震撼到我了——终于能实时了。

SSD (Single Shot MultiBox Detector) (2016)

  • 思路:借鉴了Faster R-CNN中Anchor Box的思想,并在不同层级的特征图上进行预测。

  • 特点:低层级的特征图分辨率高,适合检测小物体;高层级的特征图感受野大,适合检测大物体。在速度和精度之间取得了很好的平衡。我当时对比过SSD512和YOLO v1,SSD在COCO上的mAP高了将近10个点,速度也能接受。

4. 现代格局:百花齐放 (2018 - 至今)

随着研究的深入,单阶段和两阶段的界限逐渐模糊,新的范式不断涌现。

Anchor-Free 时代

  • 背景:YOLO和SSD等方法都依赖于预设的锚框(Anchor Box),这些锚框的设计本身就是一组复杂的超参数,影响性能且不够优雅。

  • 思路:抛弃锚框,回归到更本质的检测方式。

  • 代表:

    • CenterNet:将物体检测视为关键点(中心点)预测问题,然后回归其宽高。
    • FCOS (Fully Convolutional One-Stage):直接在每个像素位置上预测其到目标边界的四条距离,非常直观。

Transformer 革命

  • 背景:Transformer在NLP领域取得巨大成功后,研究者开始尝试将其引入CV。

  • 代表:DETR (DEtection TRansformer) (2020)

    • 核心思想:将目标检测视为一个集合预测(Set Prediction)问题。
    • 流程:利用CNN提取图像特征,然后输入到一个Transformer的Encoder-Decoder结构中,直接输出一个无序的、固定数量的预测框集合。
    • 颠覆性:它彻底抛弃了锚框和NMS(非极大值抑制)这两个在过去目标检测领域几乎不可或缺的手工组件,提供了一个极其简洁的端到端方案。虽然早期版本训练慢、对小物体不友好,但它开辟了全新的道路。我后来复现过DETR,训练确实比YOLO慢不少,500个epoch才收敛,但推理代码写得是真清爽。

总结

目标检测范式对比

范式 (Paradigm)代表模型核心思想优/缺点
传统方法HOG + SVM滑动窗口 + 手工特征缺点: 慢,鲁棒性差
两阶段 (Two-Stage)Faster R-CNN先找候选框,再精细分类优点: 精度高 缺点: 速度相对较慢
单阶段 (One-Stage)YOLO, SSD直接在图上回归类别和位置优点: 速度快 缺点: 早期精度稍逊
Anchor-FreeCenterNet, FCOS抛弃锚框,用关键点或距离回归优点: 结构更简洁,超参少
TransformerDETR将检测视为集合预测问题优点: 抛弃NMS,端到端 缺点: 训练收敛慢

2D目标检测的演进之路,本质上是一个不断追求更高精度、更快速度、更少人工干预(End-to-End)的过程。从复杂的流程到简洁的端到端模型,这条路还在继续。我个人的看法是,现在YOLOv8和RT-DETR已经足够好用了,除非你有特别极致的精度或速度要求,否则没必要自己从头造轮子——调参的功夫,不如多搞点数据实在。