2D 目标检测基础:卷积神经网络与经典检测框架回顾

各位同学,欢迎来到第二章。

做机器人感知这些年,我有个很深的体会:2D 检测是位姿估计的“眼睛”。你连物体在图像里在哪、是什么都不知道,后面的 6D 位姿根本无从谈起。所以这一章,咱们把地基夯实。

我不会从零讲 CNN 的数学推导,那太枯燥。咱们直接从工程视角出发,聊聊卷积神经网络的核心原理,再回顾三个经典检测框架——Faster R-CNN、YOLO、SSD。这些都是我项目里反复用过的“老伙计”,坑也踩过不少,今天一并分享给你。

2.1 卷积神经网络(CNN)核心原理

说白了,CNN 就是一套自动提取特征的流水线。它不像传统方法那样手工设计特征(比如 HOG、SIFT),而是让数据自己“教”网络学什么有用。

2.1.1 卷积层:滑动窗口的“特征扫描仪”

卷积操作,你可以想象成一个手电筒在图像上滑动扫描。每次照到一个局部区域,就计算一次“匹配度”。这个手电筒就是卷积核(Kernel)。

  • 局部连接:每个神经元只看一小块区域,不关心全局。这大大减少了参数量。
  • 权值共享:同一个卷积核在整个图像上滑动,参数是一样的。为什么?因为图像的纹理特征(比如边缘、角点)在哪个位置都可能出现,没必要为每个位置学一套参数。
  • 感受野:随着层数加深,神经元看到的原始图像范围越来越大。底层看边缘,中层看纹理,高层看物体部件。
我的经验: 我在做工业零件检测时,发现 3x3 的小卷积核堆叠比直接用 7x7 大核效果更好。参数量少,非线性更强,还能保持感受野。现在主流网络基本都用小核堆叠,这是实践验证过的。

2.1.2 池化层:降维与不变性

池化层就干两件事:缩小特征图尺寸和保留主要特征。常见的有最大池化(Max Pooling)和平均池化(Average Pooling)。

  • 最大池化:取窗口内的最大值。我习惯用它来保留最强烈的纹理响应,比如边缘、角点。
  • 平均池化:取窗口内的平均值。适合保留背景信息或整体特征。

池化还带来了平移不变性——物体稍微移动几个像素,池化后的输出变化不大。这对检测来说很重要,因为物体在图像里的位置本来就不固定。

2.1.3 全连接层与分类

经过卷积和池化,特征图被“压平”成一维向量,送入全连接层。全连接层的作用就是做决策——根据提取到的特征,判断“这是什么类别”。

最后接一个 Softmax 层,输出每个类别的概率。嗯,这里要注意:全连接层的参数量通常占整个网络的 80% 以上,所以后来很多检测网络(比如 YOLO)干脆不用全连接层,改用卷积层替代,速度更快。

2.2 经典检测框架回顾

目标检测框架,我习惯把它们分成两派:两阶段(Two-stage)和单阶段(One-stage)。两阶段先提候选框再分类回归,精度高但慢;单阶段一步到位,速度快但精度稍逊。咱们一个个看。

2.2.1 Faster R-CNN:两阶段检测的标杆

Faster R-CNN 是两阶段检测的代表作。它的核心创新是区域建议网络(RPN),把候选框生成也融入网络,实现了端到端训练。

流程很简单:

  1. 特征提取:用 CNN(比如 VGG16、ResNet)提取整张图的特征图。
  2. RPN 生成候选框:在特征图上滑动一个小网络,为每个位置生成 k 个锚点框(Anchor Boxes),并判断是前景还是背景。
  3. ROI Pooling:把不同大小的候选框映射到固定尺寸的特征图上。
  4. 分类与回归:对每个候选框做精细分类和边框微调。
关键点: RPN 的锚点框设计很讲究。我做过一个项目,检测细长型的螺丝钉,默认的锚点框长宽比(1:1, 1:2, 2:1)完全不够用。后来我加了 1:4 和 4:1 的比例,召回率直接提升了 12%。锚点框一定要根据你的目标物体形状来设计,别偷懒用默认值。

2.2.2 YOLO:单阶段检测的速度之王

YOLO(You Only Look Once)的理念很暴力:把检测当成回归问题,一次前向传播直接输出边界框和类别概率。

它的做法是:

  • 把图像分成 S×S 的网格。
  • 每个网格负责预测 B 个边界框和 C 个类别概率。
  • 每个边界框包含 5 个值:x, y, w, h, confidence(置信度)。

YOLO 的速度优势很明显,但早期版本(v1、v2)对小物体检测效果不好。为什么?因为每个网格只能预测两个框,如果多个小物体挤在一个网格里,就漏检了。

避坑指南: 我曾经在 YOLOv3 上做行人检测,发现密集人群场景下漏检严重。后来我调低了 NMS(非极大值抑制)的 IoU 阈值,从 0.5 降到 0.3,召回率上去了,但误检也多了。这是个 trade-off,一定要根据你的场景调参,没有万能参数。

2.2.3 SSD:单阶段检测的平衡大师

SSD(Single Shot MultiBox Detector)结合了 YOLO 的速度和 Faster R-CNN 的锚点框思想。它的核心是多尺度特征图检测。

具体来说:

  • 从 CNN 的不同层(浅层到深层)引出特征图。
  • 浅层特征图(分辨率高)负责检测小物体。
  • 深层特征图(分辨率低,语义强)负责检测大物体。
  • 每个特征图位置都预设不同尺度和长宽比的锚点框。

SSD 在速度和精度之间取得了很好的平衡。我个人觉得,如果你做实时检测,又不想像 YOLO 那样调参调到头秃,SSD 是个不错的起点。

2.3 三大框架对比

为了方便你选型,我整理了一个对比表:

框架 类型 速度 精度 小物体检测 工程复杂度
Faster R-CNN 两阶段 慢(~7 FPS) 高 好(RPN 精细) 高(需要训练 RPN)
YOLOv3/v4 单阶段 快(~30-60 FPS) 中等 一般(网格限制) 中等
SSD 单阶段 较快(~20-40 FPS) 中等偏高 较好(多尺度特征) 低(结构简单)
我的建议: 如果你做高精度位姿估计,需要精确的物体边界,选 Faster R-CNN。如果你做实时机器人抓取,对速度要求高,选 YOLOv4 或 YOLOv5。如果你刚入门,想快速跑通一个检测模型,SSD 是最友好的。

2.4 本章知识体系

下面这张图,帮你理清本章的核心逻辑:

2D目标检测基础知识体系 2D目标检测基础:知识体系 CNN核心原理 卷积层 池化层 全连接层 经典检测框架 Faster R-CNN YOLO SSD 对比总结:速度 vs 精度 vs 复杂度 💡 核心思路 CNN提取特征 → 检测框架定位+分类 → 为后续位姿估计提供2D输入 选型原则:精度优先选Faster R-CNN,速度优先选YOLO,平衡选SSD

好了,这一章的内容就到这里。CNN 原理和三大检测框架,是后续所有位姿估计方法的基础。你想想看,不管是做 2D 到 3D 的 PnP 求解,还是端到端的 6D 位姿回归,第一步都是先拿到可靠的 2D 检测结果。所以,别觉得这些基础内容简单,真正用好的时候,细节决定成败。