目标检测是计算机视觉领域的基础任务,旨在通过算法自动检测图像中包含的目标类别信息和位置信息。本文将详细介绍基于锚框(Anchor)的目标检测算法,并介绍其原理和实现方法。
1. 目标检测基础
不同于图像分类任务,目标检测任务需要识别图像中的多个目标对象,并给出每个目标的类别信息和 位置信息。
1.1. 基于锚框的目标检测
如图所示,假设我们需要识别一张图片中的人脸,我们可以人为标记出图片中人脸的范围和位置(使用绿色方框),问题转化为,如何使用 CNN 来自动识别并定位图片中的人脸。
一种思路是,在图片中人为设计许多锚框(Anchor Boxes),然后使用 CNN 来识别锚框中的内容,同时想办法把锚框的位置和长宽信息预测的尽可能接近预先的标记框。可以看出,上述思想实际上是将目标检测问题转化为一个「图像分类」问题和一个「坐标回归」问题。
根据上述两个问题是「分阶段解决」还是「一步同时解决」,我们可以将目标检测方法分类为:
- 单阶段(single-stage)目标检测
- 多阶段(multi-stage)目标检测
2. R-CNN 系列多阶段目标检测
2.1. R-CNN
其流程如下:
- 输入图像:输入一张带检测的图像;
- 候选区域生成:使用 选择性搜索算法(Selective Search),在输入图像上生成 ~2K 个候选区域(region proposal);
- 候选区域处理:对每个候选区域进行预处理,并缩放到 $227\times 227$ 的尺寸(数字是否很熟悉?);
- 特征提取:将缩放后候选区域输入 AlexNet,并最终提取得到 $4096$ 维度的特征;
- 类别判断:把提取的特征送入 $20$ 个二分类 SVM 模型,得到 $20$ 个类别的概率,判断其属于哪一类;
- 位置精修:使用回归器精细修正候选框的位置。
2.1.1. 候选区域提取
一张图像中可能存在多个物体需要分别定位和分类。显然,在训练分类器之前,需要使用一些方法将图像划分为小的区域,这些方法统称为 Region Proposal Algorithms。一张图像中包含的信息非常丰富,图像中的物体有不同的形状、尺寸、颜色、纹理,而且物体间还有层次(hierarchical)关系。下图给出了四个例子,来说明目标检测的难度。
图(a)中的场景表明图像中不同物体之间是有一定的层次关系。图(b)中给出了两只猫,通过纹理很难找出这两只猫,但是通过颜色来可以很容易区分它们。图(c)中变色龙和周边颜色接近,但可以通过纹理来区分。图(d)中的车辆,我们需要把车身和车轮看做一个整体,但它们两者之间在纹理和颜色方面差别都非常大。
- Exhaustive Search
刚开始人们想到的是穷举法(Exhaustive Search),首先设计多个尺度的窗口,在每个尺度下按照一定步长进行滑动遍历(滑动窗口目标检测方法)。对于每一个窗口都分别计算 HOG 特征,然后送入提前训练好的 SVM 分类器进行判断,如果输出结果高于阈值则认为该框中含有目标。这个方式的局限性是搜索的范围很大,需要的计算量也很大,最后产生的提议区域也很多,即使改进的穷举法依然可以产生 $100000$ 多个提议区域,这对后面的区域特征提取和分类器训练带来不小的压力,所以不合适使用复杂的特征提取算法和分类器。
1
2
3
4
5
6
7
8
9
10
11
12
# 假设图像尺寸:1000×1000像素
# 窗口大小:64×128(行人检测标准)
# 步长:8像素
# 尺度数:10个
# 单一尺度的窗口数
水平滑动次数 = (1000 - 64) / 8 ≈ 117
垂直滑动次数 = (1000 - 128) / 8 ≈ 109
单尺度窗口数 = 117 × 109 ≈ 12,753
# 多尺度(10个尺度)
总窗口数 = 12,753 × 10 ≈ 127,530
此外,这个方法的窗口形状是固定的,比如对于行人设定的 $60\times 128$ 对与非行人类目标就不适用。
- Selective Search
选择性搜索是用于目标检测的区域提议算法,它计算速度快,具有很高的召回率。Selective Search 算法的核心是基于颜色,纹理,大小和形状兼容计算相似区域的分层分组,主要包含两个内容:
- Hierarchical Grouping Algorithm
- Diversification Strategies
这个方法主要有三个优势:捕捉不同尺度(Capture All Scales)、多样化(Diversification)、快速计算(Fast to Compute)。
在 Hierarchical Grouping Algorithm 中,首先将图像划分为多个区域,然后基于区域之间的相似性进行分组,两个最相似的区域被组合在一起形成一个新的区域,并将其添加到候选区域提议(Region Proposal)的列表中,重复上述过程直到整个图像变为一个区域。
在 Diversification Strategies 中,主要计算了不同的相似性度量方式,包括颜色相似度、纹理相似度、尺度相似度、形状重合度等。最终将他们加权得到总的相似性度量。
虽然Selective Search 算法能够大幅降低(提取~2K候选区域),但计算量仍然过高(每一个候选区域都需要过一次 CNN,且相邻区域间存在大量重复计算)。
在送入 AlexNet 之前,候选框需要扩展 16 个像素的上下文区域(避免裁剪丢失目标边缘特征),再强制缩放为 $227\times 227$ 尺寸,适配 AlexNet 的输入要求。
2.1.2. 边界框回归
在 R-CNN 中,Selective Search 生成的候选区域(region proposals)通常不够精确,主要体现在:
- 边界框可能只覆盖目标的一部分
- 位置可能有偏移
- 大小可能不完全匹配
而作者表示,CNN 提取的深层特征(pool5 层)包含目标的精准位置线索,可通过线性模型学习这种 “候选框 - 真实框” 的映射关系,实现框的微调(Bounding Box Regression)。
AlexNet 结构(R-CNN使用)
1 2 3 4 5 6 conv1 → relu1 → pool1 → norm1 → conv2 → relu2 → pool2 → norm2 → conv3 → relu3 → conv4 → relu4 → conv5 → relu5 → pool5 → fc6 → fc7 → fc8pool5 特征特点:
- 空间维度:6×6×256=9216(对于 227×227 输入)
- 其兼顾局部细节和全局语义,比浅层卷积特征更适合定位,比全连接层特征更具位置敏感性。
线性模型的核心是学习候选框到真实框(Ground Truth)的 $4$ 个变换参数。线性模型的结构、目标函数和参数求解方式如下:
- 目标参数定义
不直接预测边界框的绝对坐标,而是预测相对变换参数,以提升模型的尺度鲁棒性。设候选框$P=(P_x,P_y,P_w,P_h)$($P_x,P_y$为中心坐标,$P_w,P_h$为宽高),真实框$G=(G_x,G_y,G_w,G_h)$,定义4个目标变换参数:
\[\begin{cases} t_x=\frac{G_x - P_x}{P_w}\\ t_y=\frac{G_y - P_y}{P_h}\\ t_w=\ln(\frac{G_w}{P_w})\\ t_h=\ln(\frac{G_h}{P_h}) \end{cases}\]其中$t_x,t_y$描述中心坐标的相对偏移,$t_w,t_h$描述宽高的相对缩放
思考:为何宽高与中心坐标的相对变换参数形式不一样?
有如下几个考虑: - 为何宽高使用比值,而不是差值: - **尺度不变性**。假设候选框宽度 $P_w=10$,真实框宽度 $G_w=20$,宽度差为 $10$。但如果 $P_w=100, G_w=110$,差值也是 $10$,但物理意义完全不同:第一个是宽度翻倍,第二个只是增加了 $10\%$。而使用比值可以反应不同尺度框的相对缩放关系。 - **损失函数的公平性**。在训练时,一张图像中可能同时存在大物体和小物体。如果对大物体的宽高预测误差为10像素,对小物体的误差也为10像素,数值上相同。但对小物体来说,10像素可能是巨大的相对误差(比如50%),而对大物体可能是微小误差(比如5%)。使用差值损失会导致模型偏向优化大物体的绝对误差,而忽视小物体的相对精度。使用比值(对数)后,所有尺寸的物体都在相对变化空间中进行优化,实现了尺度公平。 - **梯度计算的稳定性**。如果使用差值,对于不同尺度的物体,梯度数值范围差异很大。 - **恢复预测时的数值合理性**。如果网络预测宽度差值很不准确,比如为一个很大的负数 $t_w=-15$,在用这个差值对候选框进行纠正时会得到比如 $\hat{G_w}=10-15=-5$ 种非法数字。 - 为何宽高使用对数,而不是直接使用比值: - 放大一倍时比值为2, 而缩小0.5倍时比值为0.5,二者在数值上不对称;如果使用对数,$ln(2)\approx 0.693, ln(0.5)\approx -0.693$,对数比值更适合表示缩放关系; - 直接比值的范围是 $(0,+\infty)$,这带来两个问题:(1)分布严重右偏,大多数比值在 $1$ 附近,但偶尔有极大值(如 $10$ 倍放大);(2)梯度不稳定,大比值导致大梯度; - 取对数后,范围变为 $(-\infty, +\infty)$,大多数值集中在 $0$ 附近,分布更接近正态分布,适合神经网络优化。- 线性模型结构
模型为 $4$ 个独立的 Ridge 回归(带 L2 正则的线性回归)模型,分别对应 $t_x,t_y,t_w,t_h$ 的预测。每个模型的表达式为 $\hat{t}=W^T f + b$,其中 $f$ 是 pool5 层的 9216 维特征向量,$W$ 是 9216 维的权重向量,$b$ 是偏置项,$\hat{t}$ 是预测的变换参数。使用独立模型可避免参数间的相互干扰,提升预测精度。
- 损失函数与训练约束
| 训练的损失函数采用均方误差(MSE),即最小化$\sum_{i=1}^N (\hat{t}_i - t_i)^2+\lambda | W | ^2$,其中 $\lambda$ 是 L2 正则化系数,用于防止过拟合。补充材料特别强调,训练样本需满足候选框与真实框的 IoU(交并比)大于 $0.6$,因为只有候选框与目标足够接近时,候选框到真实框的映射才近似线性,这是线性回归模型有效的前提。 |
论文指出,无需多次迭代修正,一次线性回归的调整即可满足精度要求,多次调整反而会引入累积误差,降低检测性能。
2.1.3. 总结
R-CNN 最大的问题在于:候选区域提取、目标特征提取与分类、候选框位置和大小回归,三个步骤相互独立,要分别训练,测试效率也较低。
2.2. Fast R-CNN
为了改善 R-CNN 的问题,作者提出了 Fast R-CNN。
其主要流程如下:
- 输入图像:输入一张带检测的图像;
- 候选区域生成:使用 选择性搜索算法(Selective Search),在输入图像上生成 ~2K 个候选区域(region proposal);
- 特征提取:将整张图片传入 CNN 提取特征;
- 候选区域特征:利用 RoI Pooling 层将候选区域映射到固定大小,并提取特征(投影+池化);
- 分类和回归:把提取的特征仅分类和回归;
2.2.1. RoI 映射
感兴趣区域(Region of Interest, ROI)映射(Projection)指将原始图像坐标空间中的感兴趣区域映射到卷积特征图上的过程。
2.2.2. RoI 池化
RoI Pooling 利用特征采样,把不同空间大小的特征,变成空间大小一致的特征。这样做有两个好处:
- RoI pooling 后接的是 FC 层,要求输入固定的维度;
- 各个候选区域的特征大小一致,可以组成 batch 进行批处理。
2.2.3. 端到端分类回归
Fast R-CNN 的核心突破之一是实现分类与边界框回归的端到端联合训练,其损失函数设计兼顾了分类任务的类别判别和回归任务的框位置微调,整体为多任务损失(Multi-Task Loss),由分类损失和回归损失加权组合而成。
\[L(p,u,t^u,v) = L_{cls}(p,u) + \lambda [u\geq 1]L_{reg}(t^u,v)\]其中:
- $p$:预测的类别概率分布,维度为 $K+1$($K$ 个目标类别 + 1 个背景类别)
- $u$:类别索引,$u=0$ 表示背景类别,$u=1,2,\cdots,K$ 表示目标类别
- $t^u$:预测的对应类别 $u$ 的边界框回归参数,维度为 $4$,即 $t_x,t_y,t_w,t_h$
- $v$:真实的边界框回归目标参数,维度为 $4$,即 $v_x,v_y,v_w,v_h$
- $\lambda$:回归损失的权重系数,平衡分类与回归任务的损失量级,一般取值为 $1$
- $[u\geq 1]$:指示函数,当$u\geq 1$ (非背景类)时值为 $1$,否则为 $0$
分类损失采用交叉熵损失函数:
\[L_{cls}(p,u) = -\log p_u\]思考:如何从交叉熵损失函数的一般形式推导得到上述损失函数?
对于标签 $u$,独热编码的真实标签为 $$y = [0,0,\cdots, \underbrace{1}_{第u位},\cdots, 0,0]$$ 代入交叉熵公式 $$ \begin{aligned} H(p,y) &= - \sum_{i=0}^K y_i \log p_i = - \sum_{i=0}^K 1[i=u]\log p_i\\ &=-(0\cdot \log p_0 +\cdots + 1\cdot \log p_u + \cdots + 0\cdot \log p_K)\\ &= -\log p_u \end{aligned} $$回归损失采用平滑 $L_1$ 损失函数:
\[L_{reg}(t,v) = \sum_{i\in\{x,y,w,h\}} \text{smooth}_{L1}(t_i^u-v_i)\]其中平滑 $L_1$ 损失函数定义为:
\[L_{smoothL1}(x) = \begin{cases} 0.5x^2 & \text{if } |x| < 1\\ |x| - 0.5 & \text{otherwise} \end{cases}\]-
当 $ x <1$ 时,近似为 L2 损失,梯度随误差减小而降低,训练更稳定; -
当 $ x \ge1$ 时,近似为 L1 损失,避免 L2 损失因离群点导致的梯度爆炸,提升鲁棒性。
2.2.4. 总结
- 相比 R-CNN 速度提升 200 多倍,精度提高约 10 mAP;
- 生成候选区域的算法(Selective Search)非常慢(耗时约 2s)。
2.3. Faster R-CNN
相比 Fast R-CNN,Faster R-CNN 引入了区域提议网络(Region Proposal Network,RPN)来代替启发式搜索来获得更好的锚框。
2.3.1. RPN
在特征图上,通过滑动窗口提取对应区域的特征区域信息,然后将其送入一个小网络中(实际上小网络和前面的特征提取网络共同组成 RPN )。
网络无法凭空产生锚框,因此人们预先设计了 $k$ 个形状不同的候选框,然后让网络预测候选框的相对偏移量($k$ 个候选框会产生 $4k$ 个偏移量,即长宽和中心点的横纵坐标)。而每个候选框还需要额外预测两个分类概率值,用于判断该候选框是否属于背景或者目标(因此总共有 $2k$ 个分类得分)。
Faster R-CNN 按照特定的宽高比去设置 9 个候选框($128^2, 256^2, 512^2$ 三个尺度和 $1:1, 2:1, 1:2$ 三个长宽比组合)。注意候选框尺寸和待检测的目标特性有关系。比如,对于 COCO 数据集,候选框的尺寸就额外设置有 $64^2$ 尺寸。
将网络输出的所有推荐的锚框进行可视化,如下图所示:
2.3.2. 损失函数
首先考虑一个真实的锚框标签,应该分配给那些候选框予以正负标签:
- IoU 最高的候选框,赋予正标签
- IoU > 0.7 的候选框,赋予正标签
- 与所有真实锚框 IoU < 0.3 的候选框,赋予负标签
则损失函数如下:
\[L(\{p_i\}, \{t_i\}) = \frac{1}{N_{cls}}\sum_{i} L_{cls}(p_i, p_i^\star) + \lambda \frac{1}{N_{reg}}\sum_i p_i^\star L_{reg}(t_i, t_i^\star)\]其中:
- $i$:mini-batch 中 anchor 的索引
- $p_i$:anchor $i$ 被预测包含有物体的概率
- $p_i^\star$:anchor $i$ 的真实标签(1 表示正样本,0 表示负样本)
- $t_i$:anchor $i$ 的预测锚框的回归参数向量
- $t_i^\star$:anchor $i$ 的真实锚框的回归参数向量
- $L_{cls}$:分类损失(二分类交叉熵损失函数)
- $L_{reg}$:回归损失(平滑 L1 损失函数)
- $N_{cls}$:分类损失归一化项(mini-batch 大小)
- $N_{reg}$:回归损失归一化项(论文设置为 2400,实际代码设置为 mini-batch 中正样本数量)
- $\lambda$:平衡权重(论文设置为 10, 实际代码中设置为 1)













