目标检测入门 Part 3:R-CNN 系列

在“目标检测入门”系列中,我们在第1部分从图像处理的基本概念开始,如梯度向量和 HOG。然后,我们在第2部分介绍了用于分类的经典卷积神经网络结构设计和用于目标识别的先进模型 Overfeat 和 DPM。在本系列的第三篇文章中,我们将介绍 R-CNN(“基于区域的 CNN”)家族中的一系列模型。

在第3部分中,我们将研究四种目标检测模型:R-CNN、Fast R-CNN、Faster R-CNN 和 Mask R-CNN。这些模型是高度相关的并且新版本与旧版本相比,在速度上有巨大的改善

转载声明: 本文参考 Lil’Log 的相关内容,并进行翻译和编辑

这是这篇文章中涵盖的论文列表:

Model Goal Resources
R-CNN Object recognition paper, code
Fast R-CNN Object recognition paper, code
Faster R-CNN Object recognition paper, code
Mask R-CNN Image segmentation paper, code

R-CNN

R-CNN (Girshick et al., 2014) 是“基于区域的卷积神经网络”的简称。主要思想包括两个步骤。首先,使用选择性搜索来确定数量可控的边界框对象区域候选(“感兴趣区域”或“ RoI”)。然后从每个区域中独立提取 CNN 特征进行分类。

20210219RCNN
Fig. 1. R-CNN 的结构. (Image source: Girshick et al., 2014)

模型工作流程

R-CNN 的工作原理可以总结如下:
对CNN网络进行图像分类任务的预训练;例如,对 VGG 或 ResNet 进行 ImageNet 数据集训练。分类任务涉及 N 个类别。

  1. 预训练 对 CNN 网络进行图像分类任务的预训练;例如,对 VGG 或 ResNet 在 ImageNet 数据集上训练. 分类任务涉及 N 个类别。

注意: 您可以在 Caffe Model Zoo 中找到预训练的 AlexNet。你无法在 Tensorflow 中 找到它,但是 Tensorflow-slim 模型库 提供了预训练的 ResNet,VGG 等。

  1. 通过选择性搜索(每张图像约2k个候选对象)提出与类别无关的感兴趣区域。这些区域可能包含目标对象,并且它们的大小不同。
  2. 根据CNN的要求,将区域候选区域变形为固定大小(可等比例缩小,也可不等比例缩小)。
  3. 继续针对变形的候选区域微调 CNN(K + 1类);另外一个类别是指背景(无兴趣的对象)。在微调阶段,我们应该使用小得多的学习率,并且由于大多数建议的区域只是背景,因此小批量对阳性案例进行过采样。
  4. 给定每个图像区域,通过CNN的前向传播生成一个特征向量。然后,针对每个类别单独训练的二分类SVM将会处理这些特征向量。
    正样本是 IoU(intersection over union)重叠阈值 >= 0.3的建议区域,而负样本与其他样本无关。
  5. 为了减少定位误差,利用CNN特征训练回归模型对预测检测窗口进行边界框校正偏移。

边界框回归

给定一个预测的边界框坐标 p=pxpypwph\mathbf{p}=(p_x,p_y,p_w,p_h)(中心坐标,宽度,高度)及其相应 ground truth 框的坐标 g=(gxgygwgh)\mathbf{g}=(g_x,g_y,g_w,g_h),该回归器用于学习两个中心之间的尺度不变变换和宽度与高度之间的对数尺度变换。所有转换函数都以 p\mathbf{p} 作为输入。

g^x=pwdx(p)+pxg^y=phdy(p)+pyg^w=pwexp(dw(p))g^h=phexp(dh(p))\begin{aligned} \hat{g}_x &= p_w d_x(\mathbf{p}) + p_x \\ \hat{g}_y &= p_h d_y(\mathbf{p}) + p_y \\ \hat{g}_w &= p_w \exp({d_w(\mathbf{p})}) \\ \hat{g}_h &= p_h \exp({d_h(\mathbf{p})}) \end{aligned}

RCNN-bbox-regression
Fig. 2. 预测值和 ground truth 边界框之间转换的图示。

应用这种转换的一个明显好处是,所有边界框校正函数 di(p)d_i(\mathbf{p}),其中 i{x,y,w,h}i \in \{ x, y, w, h \} 可以取任意值 [-∞, +∞]。他们学习的目标是:

tx=(gxpx)/pwty=(gypy)/phtw=log(gw/pw)th=log(gh/ph)\begin{aligned} t_x &= (g_x - p_x) / p_w \\ t_y &= (g_y - p_y) / p_h \\ t_w &= \log(g_w/p_w) \\ t_h &= \log(g_h/p_h) \end{aligned}

标准回归模型可以通过正则化最小化SSE损失来解决此问题:

Lreg=i{x,y,w,h}(tidi(p))2+λw2\mathcal{L}_\text{reg} = \sum_{i \in \{x, y, w, h\}} (t_i - d_i(\mathbf{p}))^2 + \lambda \|\mathbf{w}\|^2

正则化项在这里很关键,RCNN 通过交叉验证选择了最佳λ。同样值得注意的是,并非所有预测的边界框都有相应的 ground truth 框。例如,如果没有重叠,运行 bbox 回归就没有意义。这里,一个预测框在其附近只有一个 ground truth 框(至少有0.6 IoU),用于训练 bbox 回归模型。

常见技巧

在RCNN和其他检测模型中通常使用一些技巧。

非最大抑制(Non-Maximum Suppression)

模型很可能能够为同一对象找到多个边界框。非最大值抑制有助于避免重复检测同一实例。在我们为同一对象类别获得一组匹配的边界框之后:
按置信度对所有边界框排序。
丢弃置信度低的框。
当有任何剩余的边界框时,重复以下步骤:
贪婪地选择得分最高的一个。
跳过高 IoU(即IoU>0.5)的剩余框和先前选择的框。

non-max-suppression
Fig. 3. 多个边界框检测图像中的汽车。在非最大值抑制之后,只有最好的保留,其余的被忽略,因为它们与所选的有很大的重叠。 (Image source: DPM paper)

困难负样本开采(Hard Negative Mining)

我们考虑没有对象的框作为反例。并非所有的负例都同样难以识别。例如,如果它的背景是纯空白的,那么它很可能是一个容易负样本(easy negative);但是如果框里有奇怪的有噪音的纹理或者部分物体,它可能很难被识别,这些都是困难负样本(hard negative)。
困难负样本很容易被错误分类。我们可以在训练循环中明确地发现这些假阳性样本,并将它们包含在训练数据中,从而改进分类器。

具体在 RCNN 中怎么实现,可以看一下其他人对 Hard Negative Mining 的解释:
hard negative mining 的实现贯穿于网络的训练过程,简单来说有以下三个步骤
1.目标检测中如何根据有标签的数据划分正负训练集?用带标签的图像随机生成图像块,IoU 大于某一个阈值的图像块做为正样本,否则为负样本。但一般负样本远远多于正样本,为避免训练出来的模型会偏向预测为负例,需要保持样本均衡,所以初始负样本训练集需要选择负样本集的子集,一般正:负=1:3。
2.有了正负训练集集就可以训练神经网络了。经过一轮训练,就可以用这个训练出的模型预测其余的负样本了(就是没有加入训练集的那些负样本)。模型在预测一张图像块后会给出其属于正负的概率,在这里设置一个阈值,预测为正的概率大于这个阈值,就可以把这个图像块加入负样本训练集了。
3.正样本训练集不变,负样本训练集除了初始的那些,还有新加入的。拿着这个新的训练集,就可以开始新的一轮训练了。
解释的参考连接

速度瓶颈

通过查看 R-CNN 学习步骤,您很容易发现培训R-CNN模型既昂贵又缓慢,因为以下步骤涉及大量工作:
-运行选择性搜索,为每幅图像提出 2000 个候选区域;
-为每个图像区域(N个图像x2000)生成 CNN 特征向量。
-整个过程分为三个模型:卷积神经网络用于图像分类和特征提取;支持向量机分类器用于目标识别;以及区域边界框收紧的回归模型。

Fast R-CNN

为了让 R-CNN 更快,Girshick(2015)改进了训练过程,将三个独立的模型统一到一个联合训练框架中,增加了共享的计算结果,命名为 Fast R-CNN。该模型不需要为每个区域建议单独提取 CNN 特征向量,而是将其聚合为一个CNN正向传递,整个图像上的区域建议共享该特征矩阵。然后将相同的特征矩阵进行分支,用于学习目标分类器和边界框回归器。总之,计算共享加速了 R-CNN。

fast-RCNN
Fig. 4. Fast R-CNN的结构。 (Image source: Girshick, 2015)

RoI Pooling

它是一种最大池的类型,用于将任意大小的图像投影区域中的特征(h x w)转换为一个小的固定窗口(H x W)。输入区域被划分为 H x W 网格,大约每个大小为 h/H x w/W 的子窗口。然后在每个网格中应用最大池。

roi-pooling
Fig. 5. RoI pooling (Image source: Stanford CS231n slides.)

模型工作流程

Fast R-CNN 的工作原理总结如下,许多步骤与 R-CNN 中的步骤相同:

  1. 首先,在图像分类任务上预训练卷积神经网络。
  2. 通过选择性搜索提出区域(每幅图像约2k个候选区域)。
  3. 更改预训练的 CNN:
    • 用 RoI pooling 层替换预先训练的 CNN 的最后一个 max pooling 层。RoI 池层输出区域建议的定长特征向量。共享 CNN 计算非常有意义,因为相同图像的许多区域建议高度重叠。
    • 将最后一个全连接的层和最后一个 softmax 层(K类)替换为全连接的层和 K+1 类的 softmax。
  4. 最后,模型分为两个输出层:
    • K+1 类的 softmax 预测器(与 R-CNN 相同,+1是“背景”类),输出每个 RoI 的离散概率分布。
    • 一个边界盒回归模型,预测相对于K个类的原始 RoI 的偏移量。

Loss Function

该模型针对结合两项任务(分类+定位)的损失进行了优化:

符号 解释
$$u$$ 真实的类标签, u0,1,,Ku \in 0, 1, \dots, K;按照惯例,对所有背景有 u=0u = 0
$$p$$ K+1 类的离散概率分布(每个RoI):$$p = (p_0, \dots, p_K)$$,这是通过全连接层后面的 K+1 类的 softmax 计算得到的。
$$v$$ 真实的 bounding box $$ v = (v_x, v_y, v_w, v_h) $$。
$$t^u$$ 预测边界框校正, $$t^u = (t^u_x, t^u_y, t^u_w, t^u_h)$$。

损失函数汇包括两个部分,分类损失和边界框预测损失:L=Lcls+Lbox\mathcal{L} = \mathcal{L}_\text{cls} + \mathcal{L}_\text{box},对于“背景” RoI,Lbox\mathcal{L}_\text{box} 被指标函数 1[u1]\mathbb{1} [u \geq 1] 忽略,该指标的定义为:

1[u>=1]={1if u10otherwise\mathbb{1} [u >= 1] = \begin{cases} 1 & \text{if } u \geq 1\\ 0 & \text{otherwise} \end{cases}

总体损失函数为:

\begin{align*} \mathcal{L}(p, u, t^u, v) &= \mathcal{L}_\text{cls} (p, u) + \mathbb{1} [u \geq 1] \mathcal{L}_\text{box}(t^u, v) \\ \mathcal{L}_\text{cls}(p, u) &= -\log p_u \\ \mathcal{L}_\text{box}(t^u, v) &= \sum_{i \in \{x, y, w, h\}} L_1^\text{smooth} (t^u_i - v_i) \end{align*}

边界框损失 Lbox\mathcal{L}_{box} 应该使用**鲁棒(robust)**损失函数测量 tiut^u_iviv_i 之间的差异。这里采用了平滑L1损失 ,据称它对异常值不太敏感。

L1smooth(x)={0.5x2if x<1x0.5otherwiseL_1^\text{smooth}(x) = \begin{cases} 0.5 x^2 & \text{if } \vert x \vert < 1\\ \vert x \vert - 0.5 & \text{otherwise} \end{cases}

20210729l1-smooth
Fig. 6. 光滑L1损失图,y=L1smooth(x)y = L_1^\text{smooth}(x)Image source

速度瓶颈

Fast R-CNN 在训练和测试时间上都快得多。然而,这种改进并不显著,因为该地区的提案是由另一个模型单独生成的,而且成本非常昂贵。

Faster R-CNN

直观的加速解决方案是将区域建议算法集成到 CNN 模型中,Faster R-CNNRen等人,2016年)正是这么做的:建立一个单一的,统一的模型组成的 RPN(区域建议网络)和快速 Faster R-CNN 与共享卷积特征层。

20210729faster-RCNN
Fig. 7. Faster R-CNN model 的示例图. (Image source: Ren et al., 2016)

工作流程

  1. 在图像分类任务上预训练一个 CNN 网络。
  2. 为端到端的区域建议任务微调 RPN(区域建议网络),该任务由预训练图像分类器初始化。阳性样本的 IoU(并集上的交点)大于 0.7,而阴性样本的 IoU<0.3。
    • 在整个图像的 conv 特征图上滑动一个 nxn 大小的窗口。
    • 在每个滑动窗口的中心,我们同时预测多个不同尺度和比率的区域。锚定一个组合(滑动窗口中心、尺度、比率)。例如在每个滑动位置有 3个尺度 + 3个比率 => k=9 个锚(anchor)。
  3. 使用当前 PRN 生成的区域建议,训练 Fast R-CNN 目标检测模型。
  4. 然后使用 Fast R-CNN 网络初始化 RPN 训练。在保持共享卷积层的同时,仅微调 RPN 特定层。在此阶段,RPN 和检测网络共享卷积层!
  5. 最后微调 Fast R-CNN 的独特层
  6. 如果需要,可重复步骤4-5,交替训练 RPN 和 Fast R-CNN。

损失函数

与 Fast R-CNN类似,Fastrer R-CNN 针对多任务损失函数进行了优化。

符号 解释
pip_i 锚 i 成为目标的预测概率。
pip^*_i 锚 i 是否为目标的 ground truth 标签(二进制)
tit_i$ 预测四个参数的坐标
tit^*_i$ Ground truth 坐标
NclsN_\text{cls} 标准化项(Normalization term),论文中设置的小批量大小(~256)。
NboxN_\text{box} 标准化项,论文中设置的锚定位置数(~2400)。
λ\lambda 一个平衡参数,在文件中设置为~10(以便 Lcls\mathcal{L}_\text{cls}Lbox\mathcal{L}_\text{box} 项的权重大致相等)。

多任务损失函数结合了分类损失和边界框回归损失:

\begin{align*} \mathcal{L} &= \mathcal{L}_\text{cls} + \mathcal{L}_\text{box} \\ \mathcal{L}(\{p_i\}, \{t_i\}) &= \frac{1}{N_\text{cls}} \sum_i \mathcal{L}_\text{cls} (p_i, p^*_i) + \frac{\lambda}{N_\text{box}} \sum_i p^*_i \cdot L_1^\text{smooth}(t_i - t^*_i) \\ \end{align*}

其中 Lcls\mathcal{L}_\text{cls} 是两个类上的对数损失函数,因为我们可以通过预测样本是否为目标对象,轻松地将多类分类转换为二分类。L1smoothL_1^\text{smooth} 是平滑的L1损失。

Lcls(pi,pi)=pilogpi(1pi)log(1pi)\mathcal{L}_\text{cls} (p_i, p^*_i) = - p^*_i \log p_i - (1 - p^*_i) \log (1 - p_i)

Mask R-CNN

Mask R-CNN (He et al., 2017) 将 Faster R-CNN 拓展到像素级别图像分割。关键是将分类和像素级掩模预测任务解耦。基于[Faster R-CNN](#Faster-R-CNN)的框架,它添加了第三个用于预测目标掩码的分支,与用于分类和定位的现有分支并行。掩模分支是一个应用于每个 RoI 的全连接的小网络,以像素到像素的方式预测分割掩模。

mask-rcnn
Fig. 8. Mask R-CNN 是具有图像分割功能的 Faster R-CNN 模型。(Image source: He et al., 2017)

由于像素级分割需要比边界框更细粒度的对齐,mask R-CNN 改进了 RoI 池层(称为“ROIALLIGN层”),因此可以更好、更精确地将 RoI 映射到原始图像的区域。

mask-rcnn-examples
Fig. 9. 用 Mask R-CNN 在 COCO 测试集上进行预测。(Image source: He et al., 2017)

RoIAlign

ROIAllign 层用于修复 RoI 池中量化导致的位置错位。例如,通过使用 x/16 而不是 [x/16] 来移除散列量化(说白了直接除,不用取整,取整会导致错位),以便提取的特征可以与输入像素正确对齐。双线性插值(Bilinear interpolation)用于计算输入中的浮点位置值。

roi-align
Fig. 10. 感兴趣区域从原始图像精确映射到特征图上,无需四舍五入到整数。(Image source: link)

损失函数

Mask R-CNN的多任务损失函数结合了分类、定位和分割掩码的损失:L=Lcls+Lbox+Lmask\mathcal{L} = \mathcal{L}_\text{cls} + \mathcal{L}_\text{box} + \mathcal{L}_\text{mask},其中 Lcls\mathcal{L}_\text{cls}Lbox\mathcal{L}_\text{box} 与 Faster R-CNN中的相同。

掩码分支为每个 RoI 和每个类生成一个尺寸为 m×mm \times m 的掩码;总共有K类。因此,总输出的大小为 Km2K \cdot m^2。因为模型试图为每个类学习一个掩码,所以类之间不存在生成掩码的竞争。

Lmask\mathcal{L}_\text{mask}被定义为平均二分类交叉熵损失,如果区域与 ground truth 类k关联,则仅包括第k个掩码。

Lmask=1m21i,jm[yijlogy^ijk+(1yij)log(1y^ijk)]\mathcal{L}_\text{mask} = - \frac{1}{m^2} \sum_{1 \leq i, j \leq m} \big[ y_{ij} \log \hat{y}^k_{ij} + (1-y_{ij}) \log (1- \hat{y}^k_{ij}) \big]

其中 yijy_{ij} 是大小为 m×mm \times m 区域的真实掩码中单元 (i,j)的标签;y^ijk\hat{y}_{ij}^k是为 ground-truth 类 k 而学习的掩码中相同单元的预测值。

R-CNN 系列模型的总结

Here I illustrate model designs of R-CNN, Fast R-CNN, Faster R-CNN and Mask R-CNN. You can track how one model evolves to the next version by comparing the small differences.
这里我举例说明了 R-CNN,Fast R-CNN,Faster R-CNN and Mask R-CNN 的模型设计。您可以通过比较小的差异来跟踪一个模型如何发展到下一个版本。

rcnn-family-summary

Reference

[1] Ross Girshick, Jeff Donahue, Trevor Darrell, and Jitendra Malik. “Rich feature hierarchies for accurate object detection and semantic segmentation.” In Proc. IEEE Conf. on computer vision and pattern recognition (CVPR), pp. 580-587. 2014.

[2] Ross Girshick. “Fast R-CNN.” In Proc. IEEE Intl. Conf. on computer vision, pp. 1440-1448. 2015.

[3] Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun. “Faster R-CNN: Towards real-time object detection with region proposal networks.” In Advances in neural information processing systems (NIPS), pp. 91-99. 2015.

[4] Kaiming He, Georgia Gkioxari, Piotr Dollár, and Ross Girshick. “Mask R-CNN.” arXiv preprint arXiv:1703.06870, 2017.

[5] Joseph Redmon, Santosh Divvala, Ross Girshick, and Ali Farhadi. “You only look once: Unified, real-time object detection.” In Proc. IEEE Conf. on computer vision and pattern recognition (CVPR), pp. 779-788. 2016.

[6] “A Brief History of CNNs in Image Segmentation: From R-CNN to Mask R-CNN” by Athelas.

[7] Smooth L1 Loss: https://github.com/rbgirshick/py-faster-rcnn/files/764206/SmoothL1Loss.1.pdf

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2022 Eureka Tesla
  • Visitors: | Views:

请我喝杯咖啡吧~