0%

R-CNN系列目标检测算法

CVPR2014 R-CNN

Rich feature hierarchies for accurate object detection and semantic segmentation

Methodology

image-20221008155509842

首先模型输入为一张图片,然后在图片上提出了约2000个region proposal

在提取region proposal时,R-CNN采用了selective search。selective search的核心是一个SVM,首先将图像分割为若干块,然后利用SVM将属于同一对象的块合并在一起。

然后通过卷积神经网络逐个提取region proposal的特征,对于每一个region proposal都会得到一个4096维的特征向量

R-CNN直接使用了AlexNet,在ImageNet上进行分类训练

然后这些被提取的特征通过支持向量机(SVM)进行分类(每个类别一个SVM),得到物体的类别,并通过一个bounding box regression调整目标包围框的大小。

实际包含两个子步骤,一是对特征向量进行分类(需要根据特征训练分类器);二是通过边界回归(bounding-box regression) 得到精确的目标区域,受 DPM 的启发,作者训练了一个线性的回归模型,这个模型能够针对候选区域的 pool5 数据预测一个新的 box 位置。

Details

由于CNN需要固定尺寸输入,R-CNN中采用$227 \times227$作为输入尺寸,在对 Region 进行变换的时候,首先对这些区域进行膨胀处理,在其 box 周围附加了 p=16 个像素

推理时,采取非极大性抑制,以最高分的区域为基础,剔除掉那些重叠位置的区域

训练分类,回归时正负样本选择参考博客

Segmentation

区域分类技术是语义分割的标准做法,所以 R-CNN 也可以做语义分割,并且作者拿它跟 O2P 来比较。

作者评估了三种用于计算CPMC区域特征的策略,所有这些策略都从将区域周围的矩形窗口弯曲到227 × 227开始。第一种策略 (完全) 忽略区域的形状,并直接在扭曲的窗口上计算CNN特征,就像进行检测一样。但是,这些特征忽略了区域的非矩形形状。两个区域可能具有非常相似的边界框,而几乎没有重叠。因此,第二种策略 (fg) 仅在区域的前景掩码上计算CNN特征。我们用平均输入替换背景,以便在平均减法之后背景区域为零。第三种策略 (full fg) 简单地连接了full和fg功能

Contribution&Weakness

Contribution

  • 引入CNN,在 ImageNet 上先进行预训练,然后利用成熟的权重参数在 PASCAL VOC 数据集上进行 fine-tune,利用 CNN 抽取特征,然后用一系列的的 SVM 做类别预测。
  • 训练了一个线性回归模型对 bbox 进行修正。

Weakness

  • 使用Selective Seach获取region proposal耗时较长,2s per image
  • 需要对RoI逐个进行特征提取,2k个region proposal就要前向传播2k次,耗时
  • 3个模块是分开训练的,且训练时需要大量存储空间
  • CNN需要固定尺寸的输入图像,crop/warp产生物体截断或拉伸,会导致输入CNN的信息丢失

TPAMI2015 SPP-Net

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

参考博客

Motivation

固定输入尺寸问题,其实CNN的卷积层并不需要固定输入尺寸,固定尺寸这一约束来自于最后的全连接层。当遇到任意尺寸的图像时,都是先将图像适应成固定尺寸,方法包括裁剪(crop)和变形(wrap)。但裁剪可能不包含整个对象区域,扭曲变形则会导致几何失真,影响识别的精度。另外,一个预先定义好的尺寸,并不适合在图像中存在不同尺寸的实际情况。

image-20221008195752250

Methodology

为了使网络能够处理任意尺寸输入,将全连接层前的最后一个池化层替换为空间金字塔池化层spatial pyramid pooling layer。

全连接层的输入是固定长度的向量,这样的向量可以使用词袋模型Bag-of-Words (BoW)得到,空间金字塔池改进了BoW,在每个局部的空间块中进行池化,保留空间信息。这些空间块的大小与图像大小成正比,因此无论图像大小如何,块的数量都是固定的。在本文中,作者在每一个块中采用最大池化max pooling。

输出向量大小为$kM$,$k$代表filters(卷积核个数),$M$代表文中所提的”bin”的数量,也就是块数,然后将这一向量作为全连接层的输入,在下图中输出的向量大小为$21\times256$。

image-20221008195846301

假设输入为尺寸是a x a(也就是13×13)的conv5之后的特征图。对于n x n块的空间金字塔池化,窗口大小为win = 上取整[a/n],步幅str = 下取整[a/n].

image-20221008201713125

Details

作者在附录中提到了如何将原图上的proposal映射到特征图上。由于我们需要使用proposal来裁剪已被多次采样的卷积特征图 (例如,conv5),所以我们需要在特征图上对齐proposal窗口。

计算映射参考

Contribution&Weakness

Contribution

  • SPP能在输入尺寸任意的情况下产生固定大小的输出,这意味着推理时可以使用任意尺寸的图片输入,在训练时则可以使用多尺度训练更进一步提高模型精度(每个epoch,针对一个给定的输入尺寸进行网络训练,然后在下一个epoch,再切换到另一个尺寸)
  • SPP使用了多级池化,即多个尺寸的池化窗口,多级池化对于物体的变形十分鲁棒

Weakness

  • 和RCNN一样,几个模块仍然需要分开训练,提取候选框 | 计算CNN特征| SVM分类 | Bounding Box回归独立训练,大量的中间结果需要转存,无法整体训练模型

  • 提出Region Proposal仍然很耗时

  • SPP-Net在无法同时优化在SPP-Layer两边的卷积层和全连接层

    SPP中的微调只更新spp层后面的全连接层。在微调阶段SPP-net只能更新FC层,这是因为卷积特征是线下计算的,从而无法在微调阶段反向传播误差。

ICCV2015 Fast R-CNN

参考1 参考2 参考3

Motivation

R-CNN存在的问题:

  • 训练分多步。R-CNN的训练首先要fine tuning一个预训练的网络,然后针对每个类别都训练一个SVM分类器,最后还要用regressors对bounding-box进行回归,另外region proposal也要单独用selective search的方式获得,步骤比较繁琐。
  • 时间和内存消耗比较大。在训练RCNN中独立的分类器和回归器时,需要大量特征作为训练样本,特征是另外保存在磁盘上再在训练阶段读入的,会增加不必要的耗时(如从磁盘上读入数据)。
  • 测试速度慢,需要对region proposal进行逐个卷积,存在大量冗余操作。

SPP-Net算法解决了RCNN中重复卷积的问题,也就是只需要提取一次特征。SPP-Net依然存在的缺点:

  • 训练步骤过多,无法整体训练
  • 特征保存在磁盘上,因此无法同时优化在SPP-Layer两边的卷积层和全连接层。
  • 没有解决使用selective search提出region proposal的耗时问题

Fast R-CNN取代R-CNN的串行特征提取方式,直接对全图提取特征,减少了特征的重复计算,把分类和位置回归统一用深度网络实现,不再需要额外存储,除了selective search,其他部分都可以合在一起训练,减少了训练步骤。

Methodology

image-20221009124719652

算法输入是图像和selective search产生的region proposal,通过卷积对图像提取一次特征,然后通过RoI projection从特征图上取出RoI的特征,然后使用RoI pooling layer生成固定长度的特征向量送入FCs,然后分别进行分类和回归,在Fast R-CNN中作者使用softmax代替原来的SVM分类器。网络每个RoI有两个输出向量: softmax分类概率和每个类边界框回归偏移(对每个类别都训练一个回归器,且只有非背景的region proposal才需要进行回归)。

RoI Pooling Layer

RoI Pooling Layer可以看作SPP-Net的简化版本,并未使用空间金字塔结构,RoI Pooling Layer的作用是根据不同尺寸的region proposal,从最后卷积层输出的feature map提取大小固定的特征向量,即将一个region proposal分割成$H\times W$大小的网格,然后将这个region proposal映射到最后一个卷积层输出的feature map,最后计算每个网格里的最大值(max pooling)作为该网格的输出,所以不管ROI pooling之前的feature map大小是多少,ROI pooling后得到的feature map大小都是$H\times W$。

Multi-task loss

$L\left(p, u, t^{u}, v\right)=L_{\mathrm{cls}}(p, u)+\lambda[u \geq 1] L_{\mathrm{loc}}\left(t^{u}, v\right)$

其中$L_{\mathrm{cls}}(p, u)=-\log p_{u}$,使用了log loss,$p_u$代表真实类的分类概率。分类采用softmax代替SVM进行分类,共输出N(类别)+1(背景)类。softmax由于引入了类间竞争,所以分类效果优于SVM,SVM在R-CNN中用于二分类。

回归损失输出的是4*N(类别),4表示的是(x,y,w,h分别表示候选框的中心坐标和宽、高)。比较真实分类对应的预测参数$t^u$ 和真实平移缩放参数为$v$的差别。SmoothL1Loss取代Bouding box回归。

$L_{\mathrm{loc}}\left(t^{u}, v\right)=\sum_{i \in\{\mathrm{x}, \mathrm{y}, \mathrm{w}, \mathrm{h}\}} \operatorname{smooth}_{L_{1}}\left(t_{i}^{u}-v_{i}\right)$

$|x|>1$时,变换为线性以降低离群噪声:

$\operatorname{smooth}_{L_{1}}(x)=\left\{\begin{array}{ll}
0.5 x^{2} & \text { if }|x|<1 \\
|x|-0.5 & \text { otherwise }
\end{array}\right.$

定位损失只对非背景类计算

$L=\left\{\begin{array}{ll}
L_{\mathrm{cls}}+\lambda L_{\mathrm{loc}} & \text { 前景 } \\
L_{\mathrm{cls}} & \text { 背景 }
\end{array}\right.$

Details

每个RoI由四元组 (r,c,h,w) 定义,该四元组指定其左上角 (r,c) 及其高度和宽度 (h,w)。

在实际训练中,每个mini-batch包含2张图像和128个region proposal(或者叫ROI),也就是每张图像有64个ROI。然后从这些ROI中挑选约25%的ROI,这些ROI和ground truth的IOU值都大于0.5。另外只采用随机水平翻转的方式增加数据集。
测试的时候则每张图像大约2000个ROI。

Contribution&Weakness

Contribution

  • 将最后一个卷积层的SPP Layer改为RoI Pooling Layer,在网络微调的过程中,不仅微调全连接层,对部分卷积层也进行了微调,得到了更好的检测结果。
  • 提出了多任务损失函数(Multi-task Loss),将边框回归直接加入到CNN网络中训练,同时包含了候选区域分类损失和位置回归损失
  • 为了减少繁琐的目标检测步骤,Fast R-CNN直接使用Softmax替代SVM分类,同时利用多任务损失函数将边框回归也加入到了网络中,这样整个的训练过程只包含提取候选区域和CNN训练两个阶段。

Weakness

  • 仍然没有解决使用selective search提出region proposal的耗时问题,提region proposal 2~3s,而提特征分类只需0.32s

TPAMI2017 Faster R-CNN

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

参考 代码参考

Motivation

解决Selective search提出region proposal的耗时问题

相比Fast R-CNN,主要两处不同:

  • 使用RPN(Region Proposal Network)代替原来的Selective Search方法产生建议窗口
  • 产生region proposal的CNN和目标检测的CNN共享

Methodology

image-20221009141937246

Faster R-CNN的结构主要分为三大部分,第一部分是共享的卷积层-backbone,第二部分是候选区域生成网络-RPN,第三部分是对候选区域进行分类的网络-classifier。其中,RPN与classifier部分均对目标框进行了回归,也就是进行了两次回归,在RPN部分,softmax进行的是二分类,也就是区分前景和背景。classifier部分与Fast R-CNN一致。

RPN

image-20221012202346752

RPN依靠一个在共享特征图上滑动的窗口,为每个位置生成$k=9$种预先设置好长宽比与面积的目标框(先验框anchor)。这9种初始anchor包含三种面积(128×128,256×256,512×512),每种面积又包含三种长宽比(1:1,1:2,2:1)。若共享特征图的大小为$h\times w$则RPN生成的初始anchor的总数为$h\times w\times k$个。RPN对于每个anchor需要做两件事:

  1. 判断anchor到底是前景还是背景

    如果一个anchor与ground truth的IoU在0.7以上,那这个anchor就算前景(positive)。类似地,如果这个anchor与ground truth的IoU在0.3以下,那么这个anchor就算背景(negative)。IoU介于0.3和0.7的anchor没有使用。在训练anchor属于前景与背景的时候,是在一张图中,随机抽取了128个前景anchor与128个背景anchor。

  2. 为属于前景的anchor进行第一次坐标修正

    采用SmoothL1loss(与Fast R-CNN一致),在训练RPN的时候,只对128个随机抽取的positive anchors计算框回归损失。

RPN部分在$3\times 3$卷积之后分别进行了$1\times1$卷积,其中softmax也就是分类分支的$1\times 1$卷积输出的通道数是$2\times 9=18$,其代表的是9个先验框属于前景和属于背景的概率,bbox reg也就是框回归分支的$1\times 1$卷积输出的通道数为$4\times 9=36$,其代表每个anchor的4个修正坐标的值(xy平移和wh缩放倍数)。

Classifier

在RoI Pooling Layer之后,就是Fast R-CNN的分类器和RoI边框修正训练。RoI边框修正和RPN中的anchor边框修正一样也采用SmoothL1 Loss,也是对非背景的RoI进行修正,对于类别标签为背景的RoI,则不进行RoI边框修正的参数训练。

测试流程

1) 首先通过RPN生成约20000个anchor(40×60×9)。
2) 对20000个anchor进行第一次边框修正,得到修订边框后的proposal。
3) 对超过图像边界的proposal的边进行clip,使得该proposal不超过图像范围。
4) 忽略掉长或者宽太小的proposal。
5) 将所有proposal按照前景分数从高到低排序,选取前6000个proposal。
6) 使用阈值为0.7的NMS算法排除掉重叠的proposal。
7) 针对上一步剩下的proposal,选取前300个proposal进行分类和第二次边框修正。

Details

Contribution&Weakness

Contribution

  • 采用卷积网络自行产生建议框,并且和目标检测网络共享卷积网络,使得建议框数目从原有的约2000个减少为300个,且建议框的质量也有本质的提高.

Weakness

  • ROI pooling存在的问题,Mask R-CNN提出ROI Align解决了对齐问题