RCNN (论文:Rich feature hierarchies for accurate object detection and semantic segmentation) 是将CNN方法引入目标检测领域, 大大提高了目标检测效果,可以说改变了目标检测领域的主要研究思路
RCNN
https://github.com/rbgirshick/rcnn
Fast RCNN
https://github.com/rbgirshick/fast-rcnn
Faster RCNN
https://github.com/ShaoqingRen/faster_rcnn
1 论文的主要特点(相对传统方法的改进)
- 速度: 经典的目标检测算法使用滑动窗法依次判断所有可能的区域。本文则(采用Selective Search方法)预先提取一系列较可能是物体的候选区域,之后仅在这些候选区域上(采用CNN)提取特征,进行判断。
- 训练集: 经典的目标检测算法在区域中提取人工设定的特征。本文则采用深度网络进行特征提取。使用两个数据库: 一个较大的识别库(ImageNet ILSVC 2012):标定每张图片中物体的类别。一千万图像,1000类。 一个较小的检测库(PASCAL VOC 2007):标定每张图片中,物体的类别和位置,一万图像,20类。 本文使用识别库进行预训练得到CNN(有监督预训练),而后用检测库调优参数,最后在检测库上评测。
RCNN算法分为4个步骤
候选区域生成: 一张图像生成1K~2K个候选区域 (采用Selective Search 方法)
特征提取: 对每个候选区域,使用深度卷积网络提取特征 (CNN)
类别判断: 特征送入每一类的SVM 分类器,判别是否属于该类
位 置精修: 使用回归器精细修正候选框位置
从图中可以看出,R-CNN主要包括以下几个方面的内容:
Extract region proposal,使用selective search的方法提取2000个候选区域
Compute CNN features,使用CNN网络计算每个proposal region的feature map
Classify regions,将提取到的feature输入到SVM中进行分类
Non-maximum suppression,用于去除掉重复的box
Bounding box regression,位置精修,使用回归器精细修正候选框的位置
1.1 Selective Search
本文中使用了selective search这个方法来选择候选区域,输入一张图片,selective search根据以下的步骤生成region proposals:
- 使用一种过分割方法,将图片分割成比较小的区域
- 计算所有邻近区域之间的相似性,包括颜色、纹理、尺度等
- 将相似度比较高的区域合并到一起
- 计算合并区域和临近区域的相似度
- 重复3、4过程,直到整个图片变成一个区域
其中合并规则如下: 优先合并以下四种区域:
- 颜色(颜色直方图)相近的
- 纹理(梯度直方图)相近的
- 合并后总面积小的: 保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域 (例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。 不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh)
- 合并后,总面积在其BBOX中所占比例大的: 保证合并后形状规则。
上述四条规则只涉及区域的颜色直方图、梯度直方图、面积和位置。合并后的区域特征可以直接由子区域特征计算而来,速度较快。
在每次迭代中,形成更大的区域并将其添加到区域提议列表中。这种自下而上的方式可以创建从小到大的不同scale的region proposal,如下图所示:
1.2 有监督预训练与无监督预训练
(1)无监督预训练(Unsupervised pre-training)
预训练阶段的样本不需要人工标注数据,所以就叫做无监督预训练。
(2)有监督预训练(Supervised pre-training)
所谓的有监督预训练也可以把它称之为迁移学习。比如你已经有一大堆标注好的人脸年龄分类的图片数据,训练了一个CNN,用于人脸的年龄识别。然后当你遇到新的项目任务时:人脸性别识别,那么这个时候你可以利用已经训练好的年龄识别CNN模型,去掉最后一层,然后其它的网络层参数就直接复制过来,继续进行训练,让它输出性别。这就是所谓的迁移学习,说的简单一点就是把一个任务训练好的参数,拿到另外一个任务,作为神经网络的初始参数值,这样相比于你直接采用随机初始化的方法,精度可以有很大的提高。
对于目标检测问题: 图片分类标注好的训练数据非常多,但是物体检测的标注数据却很少,如何用少量的标注数据,训练高质量的模型,这就是文献最大的特点,这篇论文采用了迁移学习的思想: 先用了ILSVRC2012这个训练数据库(这是一个图片分类训练数据库),先进行网络图片分类训练。这个数据库有大量的标注数据,共包含了1000种类别物体,因此预训练阶段CNN模型的输出是1000个神经元(当然也直接可以采用Alexnet训练好的模型参数)。
1.3 重叠度(IOU)
物体检测需要定位出物体的bounding box,就像下面的图片一样,我们不仅要定位出车辆的bounding box 我们还要识别出bounding box 里面的物体就是车辆。
对于bounding box的定位精度,有一个很重要的概念: 因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU。 它定义了两个bounding box的重叠度,如下图所示
就是矩形框A、B的重叠面积占A、B并集的面积比例。
1.4 非极大值抑制(NMS)
RCNN会从一张图片中找出n个可能是物体的矩形框,然后为每个矩形框为做类别分类概率:
就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。
- (1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
- (2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
- (3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
非极大值抑制(NMS)顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。
1.5 VOC物体检测任务
相当于一个竞赛,里面包含了20个物体类别:PASCAL VOC2011 Example Images 还有一个背景,总共就相当于21个类别,因此一会设计fine-tuning CNN的时候,我们softmax分类输出层为21个神经元。
2 模型
总体思路再回顾:
首先对每一个输入的图片产生近2000个不分种类的候选区域(region proposals),然后使用CNNs从每个候选框中提取一个固定长度的特征向量(4096维度),接着对每个取出的特征向量使用特定种类的线性SVM进行分类,用于去除掉重复的box,使用回归器精细修正候选框的位置。也就是:
- a、找出候选框;
- b、利用CNN提取特征向量;
- c、利用SVM进行特征向量分类;
- d、用于去除掉重复的box;
- e、位置精修,使用回归器精细修正候选框的位置
2.1 生成候选区域Extract region proposals
当我们输入一张图片时,我们要搜索出所有可能是物体的区域,这里采用的就是前面提到的Selective Search方法,通过这个算法我们搜索出2000个候选框。具体详见1.2。然后从上面的总流程图中可以看到,搜出的候选框是矩形的,而且是大小各不相同。然而CNN对输入图片的大小是有固定的,如果把搜索到的矩形选框不做处理,就扔进CNN中,肯定不行。因此对于每个输入的候选框都需要缩放到固定的大小。下面我们讲解要怎么进行缩放处理,为了简单起见我们假设下一阶段CNN所需要的输入图片大小是个正方形图片227* 227。因为我们经过selective search 得到的是矩形框,paper试验了两种不同的处理方法:
-
各向异性缩放
这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227* 227,如下图(D)所示;
-
各向同性缩放
因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。有两种办法
A、先扩充后裁剪: 直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如上图(B)所示;
B、先裁剪后扩充:先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如上图(C ) 所示;
对于上面的异性、同性缩放,文献还有个padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高。
(备注:候选框的搜索策略作者也考虑过使用一个滑动窗口的方法,然而由于更深的网络,更大的输入图片和滑动步长,使得使用滑动窗口来定位的方法充满了挑战。)
2.2 CNN特征提取阶段
2.2.1 网络结构设计阶段
网络架构两个可选方案:第一选择经典的Alexnet;第二选择VGG16。经过测试Alexnet精度为58.5%,VGG16精度为66%。VGG这个模型的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是Alexnet的7倍。后面为了简单起见,我们就直接选用Alexnet,并进行讲解;Alexnet特征提取部分包含了5个卷积层、2个全连接层,在Alexnet中p5层神经元个数为9216、 f6、f7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。
2.2.2 网络有监督预训练阶段 (图片数据库:ImageNet ILSVC )
参数初始化部分:物体检测的一个难点在于,物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的。这种情况下,最好的是采用某些方法,把参数初始化了,然后在进行有监督的参数微调,这里文献采用的是有监督的预训练。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。网络优化求解时采用随机梯度下降法,学习率大小为0.001;
2.2.3 fine-tuning阶段 (图片数据库: PASCAL VOC)
我们接着采用 selective search 搜索出来的候选框 (PASCAL VOC 数据库中的图片) 继续对上面预训练的CNN模型进行fine-tuning训练。假设要检测的物体类别有N类,那么我们就需要把上面预训练阶段的CNN模型的最后一层给替换掉,替换成N+1个输出的神经元(加1,表示还有一个背景) (20 + 1bg = 21),然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变;接着就可以开始继续SGD训练了。开始的时候,SGD学习率选择0.001,在每次训练的时候,我们batch size大小选择128,其中32个是正样本、96个是负样本。
疑惑点
1、关于正负样本问题:
一张照片我们得到了2000个候选框。然而人工标注的数据一张图片中就只标注了正确的bounding box,我们搜索出来的2000个矩形框也不可能会出现一个与人工标注完全匹配的候选框。因此在CNN阶段我们需要用IOU为2000个bounding box打标签。如果用selective search挑选出来的候选框与物体的人工标注矩形框(PASCAL VOC的图片都有人工标注)的重叠区域IoU大于0.5,那么我们就把这个候选框标注成物体类别(正样本),否则我们就把它当做背景类别(负样本)。
(备注: 如果不针对特定任务进行fine-tuning,而是把CNN当做特征提取器,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT算法一样,可以用于提取各种图片的特征,而f6、f7所学习到的特征是用于针对特定任务的特征。打个比方:对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了)
2. 疑惑点: CNN训练的时候,本来就是对bounding box的物体进行识别分类训练,在训练的时候最后一层softmax就是分类层。那么为什么作者闲着没事干要先用CNN做特征提取(提取fc7层数据),然后再把提取的特征用于训练svm分类器?
这个是因为svm训练和cnn训练过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用svm精度还低。事情是这样的,cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm,具体请看下文。
2.2.4 特征提取
• 提取图像的所有候选框(选择性搜索Selective Search)
• 对于每一个区域:修正区域大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘
2.3. SVM训练
本文使用了SVM来进行分类,对于每一类都会训练一个SVM分类器,所以共有N(21)个分类器,该分类器的主要作用是判断我们同样来看一下是如何训练和使用SVM分类器的。
这是一个二分类问题,我么假设我们要检测车辆。我们知道只有当bounding box把整量车都包含在内,那才叫正样本;如果bounding box 没有包含到车辆,那么我们就可以把它当做负样本。但问题是当我们的检测窗口只有部分包含物体,那该怎么定义正负样本呢?作者测试了IOU阈值各种方案数值0,0.1,0.2,0.3,0.4,0.5。最后通过训练发现,如果选择IOU阈值为0.3效果最好(选择为0精度下降了4个百分点,选择0.5精度下降了5个百分点),即当重叠度小于0.3的时候,我们就把它标注为负样本。一旦CNN f7层特征被提取出来,那么我们将为每个物体类训练一个svm分类器。当我们用CNN提取2000个候选框,可以得到20004096这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵4096N点乘(N为分类类别数目,因为我们训练的N个svm,每个svm包含了4096个权值w),就可以得到结果了。
2.4. Bounding box regression位置精修
有很多同学可能会感到疑惑,上边那步不是已经给出一个比较好的结果了吗,为什么还需要bounding box regression呢,为了解释这个问题,我们看下边这个例子:
图中,绿色的框表示Ground Truth Box, 红色的框为我们预测得到的region proposal 。那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准(IoU<0.5), 那么这张图相当于没有正确的检测出飞机。所以我们需要对红色的框进行微调,使得经过微调后的窗口跟Ground Truth Box更接近,这样就可以更准确的定位了。Bounding-box regression 就是用来微调这个窗口.
位置精修步骤。 回归器:对每一类目标,使用一个线性脊回归器进行精修。正则项λ=10000。 输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。 训练样本:判定为本类的候选框中和真值重叠面积大于0.6的候选框。
2.4.1 边框回归是什么?
对于窗口一般使用四维向量(x,y,w,h) 来表示, 分别表示窗口的中心点坐标和宽高。 对于图 2, 红色的框 P 代表原始的Proposal, 绿色的框 G 代表目标的 Ground Truth, 我们的目标是寻找一种关系使得输入原始的窗口 P 经过映射得到一个跟真实窗口 G 更接近的回归窗口
G
^
\hat{G}
G^。
边框回归的目的既是:给定
(
P
x
,
P
y
,
P
w
,
P
h
)
(P_{x}, P_{y}, P_{w}, P_{h})
(Px,Py,Pw,Ph)寻找一种映射
f
f
f, 使得
f
(
P
x
,
P
y
,
P
w
,
P
h
)
=
(
G
^
x
,
G
^
y
,
G
^
w
,
G
^
h
)
并且
(
G
^
x
,
G
^
y
,
G
^
w
,
G
^
h
)
≈
(
G
x
,
G
y
,
G
w
,
G
h
)
\begin{array}{l} f\left(P_{x}, P_{y}, P_{w}, P_{h}\right)=\left(\hat{G}_{x}, \hat{G}_{y}, \hat{G}_{w}, \hat{G}_{h}\right) \text { 并且 } \\ \left(\hat{G}_{x}, \hat{G}_{y}, \hat{G}_{w}, \hat{G}_{h}\right) \approx\left(G_{x}, G_{y}, G_{w}, G_{h}\right) \end{array}
f(Px,Py,Pw,Ph)=(G^x,G^y,G^w,G^h) 并且 (G^x,G^y,G^w,G^h)≈(Gx,Gy,Gw,Gh)
2.4.2 边框回归怎么做的?
那么经过何种变换才能从图 2 中的窗口 P 变为窗口 G ^ \hat{G} G^呢? 比较简单的思路就是: 平移+尺度放缩
- 先做平移
(
Δ
x
,
Δ
y
)
,
Δ
x
=
P
w
d
x
(
P
)
,
Δ
y
=
P
h
d
y
(
P
)
(\Delta x, \Delta y), \Delta x=P_{w} d_{x}(P), \Delta y=P_{h} d_{y}(P)
(Δx,Δy),Δx=Pwdx(P),Δy=Phdy(P) 这是R-CNN论文的:
G ^ x = P w d x ( P ) + P x , ( 1 ) G ^ y = P h d y ( P ) + P y , ( 2 ) \begin{array}{l} \hat{G}_{x}=P_{w} d_{x}(P)+P_{x}, (1) \\ \hat{G}_{y}=P_{h} d_{y}(P)+P_{y}, (2) \end{array} G^x=Pwdx(P)+Px,(1)G^y=Phdy(P)+Py,(2) - 然后再做尺度缩放
(
S
w
,
S
h
)
,
S
w
=
exp
(
d
w
(
P
)
)
,
S
h
=
exp
(
d
h
(
P
)
)
\left(S_{w}, S_{h}\right), S_{w}=\exp \left(d_{w}(P)\right), S_{h}=\exp \left(d_{h}(P)\right)
(Sw,Sh),Sw=exp(dw(P)),Sh=exp(dh(P)), 对应论文中:
G ^ w = P w exp ( d w ( P ) ) , ( 3 ) G ^ h = P h exp ( d h ( P ) ) , ( 4 ) \begin{array}{l} \hat{G}_{w}=P_{w} \exp \left(d_{w}(P)\right),(3) \\ \hat{G}_{h}=P_{h} \exp \left(d_{h}(P)\right),(4) \end{array} G^w=Pwexp(dw(P)),(3)G^h=Phexp(dh(P)),(4)
观察(1)-(4)我们发现, \quad 边框回归学习就是 d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_{x}(P), d_{y}(P), d_{w}(P), d_{h}(P) dx(P),dy(P),dw(P),dh(P) 这四个变换。 下一步就是设计算法那得到这四个映射。
线性回归就是给定输入的特征向量 X, 学习一组参数 W, 使得经过线性回归后的值跟真实值 Y(Ground Truth)非常接近. 即 Y ≈ W X Y≈WX Y≈WX 。 那么 Bounding-box 中我们的输入以及输出分别是什么呢?
Input:
RegionProposal
→
P
=
(
P
x
,
P
y
,
P
w
,
P
h
)
,
\rightarrow P=\left(P_{x}, P_{y}, P_{w}, P_{h}\right),
→P=(Px,Py,Pw,Ph), 这个是什么? 输入就是这四个数值 吗? 其实真正的输入是这个窗口对应的 CNN 特征, 也就是 R-CNN 中的 Pool5 feature (特征向量) 。 (注:训练阶段输入还包括 Ground Truth, 也就是下边提到的
t
∗
=
(
t
x
,
t
y
,
t
w
,
t
h
)
)
\left.t_{*}=\left(t_{x}, t_{y}, t_{w}, t_{h}\right)\right)
t∗=(tx,ty,tw,th))
Output:
需要进行的平移变换和尺度缩放
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
,
d_{x}(P), d_{y}(P), d_{w}(P), d_{h}(P), \quad
dx(P),dy(P),dw(P),dh(P), 或者说是
Δ
x
,
Δ
y
,
S
w
,
S
h
\Delta x, \Delta y, S_{w}, S_{h}
Δx,Δy,Sw,Sh 。我们的最终输出不应该是 Ground Truth 吗? 是的, 但是有了这四 个变换我们就可以直接得到 Ground Truth, 这里还有个问题, 根据(1) -(4)我们可以知 道,
P
P
P 经过
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
d_{x}(P), d_{y}(P), d_{w}(P), d_{h}(P)
dx(P),dy(P),dw(P),dh(P) 得到的并不是真实值 G, 而是预测值
G
^
\hat{G}
G^。的确, 这四个值应该是经过 Ground Truth 和 Proposal 计算得到的真正需要的平移量
(
t
x
,
t
y
)
\left(t_{x}, t_{y}\right)
(tx,ty) 和尺度缩放
(
t
w
,
t
h
)
\left(t_{w}, t_{h}\right)
(tw,th)
这也就是 R-CNN 中的(6) -(9):
t
x
=
(
G
x
−
P
x
)
/
P
w
,
(
6
)
t
y
=
(
G
y
−
P
y
)
/
P
h
,
(
7
)
t
w
=
log
(
G
w
/
P
w
)
,
(
8
)
t
h
=
log
(
G
h
/
P
h
)
,
(
9
)
\begin{array}{l} t_{x}=\left(G_{x}-P_{x}\right) / P_{w},(6) \\ \\ t_{y}=\left(G_{y}-P_{y}\right) / P_{h},(7) \\ \\ t_{w}=\log \left(G_{w} / P_{w}\right),(8) \\ \\ t_{h}=\log \left(G_{h} / P_{h}\right),(9) \\ \end{array}
tx=(Gx−Px)/Pw,(6)ty=(Gy−Py)/Ph,(7)tw=log(Gw/Pw),(8)th=log(Gh/Ph),(9)
那么目标函数可以表示为
d
∗
(
P
)
=
w
∗
T
Φ
5
(
P
)
,
Φ
5
(
P
)
d_{*}(P)=w_{*}^{T} \Phi_{5}(P), \Phi_{5}(P)
d∗(P)=w∗TΦ5(P),Φ5(P) 是输入 Proposal 的特征向量
w
∗
w_{*}
w∗ 是要学习的参数
(
⋆
\left(^{\star}\right.
(⋆ 表示
x
,
y
,
w
,
h
,
\mathrm{x}, \mathrm{y}, \mathrm{w}, \mathrm{h}, \quad
x,y,w,h, 也就是每一个变换对应一个目标函数
)
,
d
∗
(
P
)
), d_{*}(P)
),d∗(P) 是 得到的预测值。 我们要让预测值跟真实值
t
∗
=
(
t
x
,
t
y
,
t
w
,
t
h
)
t_{*}=\left(t_{x}, t_{y}, t_{w}, t_{h}\right)
t∗=(tx,ty,tw,th) 差距最小,得到损失函数为:
Loss
=
∑
i
N
(
t
∗
i
−
w
^
∗
T
ϕ
5
(
P
i
)
)
2
\text {Loss}=\sum_{i}^{N}\left(t_{*}^{i}-\hat{w}_{*}^{T} \phi_{5}\left(P^{i}\right)\right)^{2}
Loss=i∑N(t∗i−w^∗Tϕ5(Pi))2
函数优化目标为:
W
∗
=
argmin
w
∗
∑
i
N
(
t
∗
i
−
w
^
∗
T
ϕ
5
(
P
i
)
)
2
+
λ
∥
w
^
∗
∥
2
W_{*}=\operatorname{argmin}_{w_{*}} \sum_{i}^{N}\left(t_{*}^{i}-\hat{w}_{*}^{T} \phi_{5}\left(P^{i}\right)\right)^{2}+\lambda\left\|\hat{w}_{*}\right\|^{2}
W∗=argminw∗i∑N(t∗i−w^∗Tϕ5(Pi))2+λ∥w^∗∥2
利用梯度下降法或者最小二乘法就可以得到
w
∗
w_{*}
w∗。
2.4.3 为什么宽高尺度会设计这种形式?
这边我重点解释一下为什么设计的 t x , t y t_x,t_y tx,ty为什么除以宽高,为什么 t w , t h t_w,t_h tw,th会有log形式!!!
首先CNN具有尺度不变性, 以下图为例:
x,y 坐标除以宽高
上图的两个人具有不同的尺度, 因为他都是人,我们得到的特征相同。假设我们得到的特 征为
ϕ
1
,
ϕ
2
,
\phi_{1}, \phi_{2},
ϕ1,ϕ2, 那么一个完好的特征应该具备
ϕ
1
=
ϕ
∘
\phi_{1}=\phi_{\circ}
ϕ1=ϕ∘ ok, 如果我们直接学习坐标差值, 以X坐标为例,
x
i
,
p
i
x_{i}, p_{i}
xi,pi 分别代表第i个框的x坐标, 学习到的映射为
f
,
f
(
ϕ
1
)
=
x
1
−
p
1
f, f\left(\phi_{1}\right)=x_{1}-p_{1}
f,f(ϕ1)=x1−p1 同理
f
(
ϕ
2
)
=
x
2
−
p
2
f\left(\phi_{2}\right)=x_{2}-p_{2}
f(ϕ2)=x2−p2 。 从上图显而易见,
x
1
−
p
1
≠
x
2
−
p
1
x_{1}-p_{1} \neq x_{2}-p_{1}
x1−p1=x2−p1 。 也就是说同一个x对 应多个y,这明显不满足函数的定义。边框回归学习的是回归函数,然而你的目标却不满足 函数定义,当然学习不到什么。
宽高坐标Log形式
我们想要得到一个放缩的尺度,也就是说这里限制尺度必须大于0。我们学习的
t
w
,
t
h
t_w,t_h
tw,th怎么保证满足大于0呢?直观的想法就是EXP函数,如公式(3), (4)所示,那么反过来推导就是Log函数的来源了。
为什么IoU较大,认为是线性变换?
当输入的 Proposal 与 Ground Truth 相差较小时(RCNN 设置的是 IoU>0.6), 可以认为这种变换是一种线性变换, 那么我们就可以用线性回归来建模对窗口进行微调, 否则会导致训练的回归模型不 work(当 Proposal跟 GT 离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)。这里我来解释:
Log函数明显不满足线性函数,但是为什么当Proposal 和Ground Truth相差较小的时候,就可以认为是一种线性变换呢?大家还记得这个公式不?
lim
x
=
0
log
(
1
+
x
)
=
x
\lim _{x=0} \log (1+x)=x
x=0limlog(1+x)=x
现在回过来看公式(8):
t
w
=
log
(
G
w
/
P
w
)
=
log
(
G
w
+
P
w
−
P
w
P
w
)
=
log
(
1
+
G
w
−
P
w
P
w
)
t_{w}=\log \left(G_{w} / P_{w}\right)=\log \left(\frac{G_{w}+P_{w}-P_{w}}{P_{w}}\right)=\log \left(1+\frac{G_{w}-P_{w}}{P_{w}}\right)
tw=log(Gw/Pw)=log(PwGw+Pw−Pw)=log(1+PwGw−Pw)
当且仅当
G
w
−
P
w
=
G_{w}-P_{w}=
Gw−Pw= O的时候,才会是线性函数, 也就是宽度和高度必须近似相等。
2.5 测试阶段:
使用selective search的方法在测试图片上提取2000个region propasals ,将每个region proposals归一化到227x227,然后再CNN中正向传播,将最后一层得到的特征提取出来。然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用贪心的非极大值抑制(NMS)去除相交的多余的框。再对这些框进行位置精修,就可以得到bounding-box(then B-BoxRegression)。
注意:经过SVM之后,我们会得到2000个region proposal的class probability,然后我们可以根据‘有无物体’这一类过滤掉一大批region proposal,然后如果某个候选框的最大class probability<阀值,那也可以过滤掉这些region proposal,那剩下的就是有多个box相互重叠,但是我们目标检测的目标是一个物体有一个box即可,那这个时候就需要用到非极大值抑制(NMS)。NMS:先计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为选定的框,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box。然后重复上面的过程,直至候选bounding box为空,然后再将score小于一定阈值的选定框删除得到这一类的结果(然后继续进行下一个分类)。
2.6 优缺点
至此,我们已经讲解完了整个R-CNN的训练和测试过程,作为R-CNN家族的鼻祖,这篇文章的许多思想和做法都在后续的paper中有用到,但是我们也能意识到这篇文章确实存在着不足之处:
训练时间长:主要原因是分阶段多次训练,而且对于每个region proposal都要单独计算一次feature map,导致整体的时间变长。
占用空间大:主要原因是每个region proposal的feature map都要写入硬盘中保存,以供后续的步骤使用。
multi-stage:文章中提出的模型包括多个模块,每个模块都是相互独立的,训练也是分开的。
测试时间长,由于不共享计算,所以对于test image,也要为每个proposal单独计算一次feature map,因此测试时间也很长。
整体总结一下:
优点
- 使用 selective search 方法大大提高候选区域的筛选速度(对比传统算法)。
- 用在 ImageNet 数据集上进行学习的参数对神经网络进行预处理,解决了在目标检测训练过程中标注数据不足的问题。
- 使用 CNN 对 region proposals(候选框) 计算 feature vectors。从经验驱动特征(SIFT、HOG)到数据驱动特征(CNN feature map),提高特征对样本的表示能力。
- 通过线性回归模型对边框进行校准,减少图像中的背景空白,得到更精确的定位
缺点
- R-CNN 存在冗余计算, 因为 R-CNN 的方法是先生成候选区域,再对区域进行卷积,其中候选区域会有一定程度的重叠,造成后续 CNN 提取特征时出现重复运算,同时,由于 R-CNN 是将提取的特征存储下来,然后用 SVM 进行分类,所以需要大的存储空间
- 由于使用的是 CNN 进行特征提取,所以需要对候选框进行缩放操作,但实际情况是 selective search 方法选取的框有各种尺寸,所以会造成目标变形
3 【目标检测】SPP-net
SPP-net主要是在R-CNN的基础上进行改进的,但是它仍旧继承了R-CNN的多阶段的处理过程(图1):
- 1.Extract region proposal,使用selective search的方法提取2000个候选区域
- 2.Compute CNN features,使用CNN网络提取feature map
- 3.Classify regions,将提取到的feature输入到SVM中进行分类
- 4.Non-maximum suppression,用于去除掉重复的box
- 5.Bounding box regression,位置精修,使用回归器精细修正候选框的位置
但它同时也指出了R-CNN存在的一些不足之处:
- R-CNN对于每个region proposal都重复的使用CNN提取特征,这是非常消耗时间的,使得特征提取成为测试时的一个时间瓶颈
- 对于不同size的region proposal的feature map,都需要resize到固定大小才能输入到FC layer或SVM分类器,resize会导致图片形变,影响最终的结果
因此,SPP-net对R-CNN做了改进来解决这些问题,如图1所示,将原来R-CNN中红色框的区域改成了蓝色框的区域,这样改动主要解决了两方面的问题:
- 直接一整张图输入CNN网络,提取整个图片的特征,然后再根据region proposal的位置来在整个feature map上截取出对应的feature就好啦,这样就避免了重复性用CNN对每个region proposal单独提取特征。
- 第二点就是在原来的CNN网络的conv5层后加入了SPP layer,这样就可以不需要warp region proposal了,因为SPP layer可以接受不同size的输入,并可以得到相同尺寸的输出。
接下来,我们就针对这两方面详细探究SPP-net是怎么操作的。
3.1. 特征提取(Extract Feature)
我们知道在SPP-net中,一整张图输入CNN网络中,然后经过5个卷积层得到整个图的feature map,然后我们需要从这整个feature map上截取出每个region proposal对应的feature,例如图2中,如何在feature map中得到原图中蓝色的region对应的feature呢?我们知道一般要定位一个矩形框,只要知道中心点的坐标和矩形框的宽高就可以啦。所以我们需要根据原图中的region proposal推导出对应的feature map的中心点和宽高就行了。这就需要我们找到卷积网络中两个卷积层之间的映射关系:包括边的映射和点的映射。
3.1.1 边的映射
3.1.2 点的映射
(1)有规律的网络:对于有规律的网络,像VGG16,统一使用(3, 3)的卷积核和(2, 2)的池化尺度,这样就使得特征图的尺寸成倍的减少,那么feature map之间的映射关系就是简单的倍数关系,例如在conv5层中中心点的坐标为(2, 2), 那么在conv4中对应点的坐标就是(4, 4)。
(2)无规律的网络:那对于无规律的网络来说,这种映射关系就不是简单的倍数关系了,但是也是有规律可循的,只是比较难理解,我看好多博客里都是直接给公式,没有推到过程,虽然我也没有推导出来,我只能尽力帮大家理解公式,哈哈哈!好了,先上公式:
因此,按照上边的公式找到边和点的映射关系就可以推出原图的region proposal在feature map中的位置。
3.2 SPP Layer空间金字塔池化 (Spatial Pyramid Pooling)
3.2.1 Why we need SPP?
众所周知,我们训练CNN时需要输入固定size的图像,这主要是受CNN中的全连接层所限制。因为卷积层计算的方式类似于滑窗,因此对于不同size的输入,卷积层都可以正确计算。但是对于连接数固定的全连接层,例如4096* 1000,那么这个全连接层的输入必须是4096维,否则就会出现错误。因此在训练CNN之前都需要先把图片resize到一个固定的尺寸,常见的resize方法有两种,如图6所示:
图6 crop和warp
- crop:这种方法就是从原图中裁剪出固定大小的图片,这样的方式会使得部分图像的信息丢失。
- warp:这种方法就是直接将图片resize到规定的大小,这样会导致图片发生形变。
可以看出,固定输入图片的size会导致诸多问题。那么怎样才能设计出一个不需要固定size的CNN网络呢?答案就是使用SPP,空间金字塔。
在目标检测中,这点尤其重要,因为我们会通过selective search来提取出不同size的region proposal,然后对不同的region proposal提取出不同尺寸的feature map, 那这些feature map也要经过warp之后才输入之后的FC layer或SVM分类器,那这样或多或少会影响最后的检测结果。因此加入SPP层会改善结果。
3.2.2 How does it work?
为了使得CNN可以接受多尺度输入,我们把SPP(Spatial Pyramid Pooling)层加到FC layer之前即可。如下图所示,第一行是原来的CNN网络,需要crop/warp输入图片;第二行是加了SPP层的CNN网络,可以接受任何size的输入。
图7 网络结构
所以,如果我们在R-CNN的conv5层之后加入SPP layer,那对于不同size的region proposal的feature map就不需要再进行warp了,直接可以进行分类了。如图所示,不同size的feature map经过SPP后都变成固定长度的。
图8 SPP Layer
具体来说就是把输入的feature map划分成不同尺度的,比如图中(4, 4) (2, 2) (1, 1)三种不同的尺度,然后会产生不同的bin,比如分成(4, 4)就16个bin,然后在每个bin中使用max pooling,然后就变成固定长度为16的向量。例如下图9和图10中不同尺寸的输入,经过SPP层之后都得到了相同的长度的向量,之后再输入FC layer就可以啦。
图9 一种尺寸输入
图10 另一种尺寸输入
由图9与图10可知,使用SPP Layer之后,不同size的输入就可以输出相同的size。 (注:在文中实际使用的是4层金字塔,就包括(11, 22, 33, 66),总共包括50个bin)。
3.2.3 总结
本文主要讲解了SPP net在目标检测应用上的两个创新点,改进之后的运行速度变快了,准确度也提高了,但仍然存在一些不足之处:
整个过程还是multi-stage pipeline,还是需要额外保存feature map以供输入SVM进行分类,因此空间的消耗也还是很大。
在fine-tune的时候SPP-net不像R-CNN一样,Spp-net不会更新spatial pyramid pooling layer之前的conv layer,所以这就限制了准确性。
参考1:https://www.sohu.com/a/229087739_609569
参考2:https://blog.csdn.net/zijin0802034/article/details/77685438