Object-Detection中常用的概念解析
常用的Region Proposal
- Selective Search
- Edge Boxes
Softmax-loss
softmax-loss层和softmax层计算大致是相同的,softmax是一个分类器,计算的是类别的概率(Likelihood),是Logistic Regression的一种推广。Logistic Regression只能用于二分类,而Softmax可以用于多分类,softmax和softmax-loss的区别:
Softmax计算公式:
而Softmax-loss的计算公式:
用户最终目的就是得到各个类别的概率似然值,这个时候就只需要一个Softmax层,而不一定要进行softmax-loss操作;或者用户有通过其他什么凡是已经得到了某种概率似然值,然后要做最大似然估计,此时则只需要后面的softmax-loss而不需要前面的softmax操作,因此提供两个不同的layer结构比值提供一个合在一起的Softmax-loss layer要灵活许多,不管是softmax layer还是softmax-loss layer都是没有参数的,只是层类型不同而已
softmax-loss layer:输出loss值
layer{
name:“loss”
type:"SoftmaxWithLoss"
bottom:"ip1"
bottom:"label"
top:"loss"
}
softmax layer:输出似然估计
layers{
bottom:"cls3_fc"
top:"prob"
name:"prob"
type:"Softmax"
}
Selective Search
这个策略其实是借助了层次聚类的思想,将层次聚类的思想应用到区域合并上面:
- 假设现在图像上有n个预分割的区域(Efficient Graph-Based image Segmentation)表示R={R1,R2,......,Rn}
- 计算每个region与其它相邻region(注意是相邻的区域)的相似度,这样会得到一个n*n的相似度矩阵(同一个区域之间和一个区域与不相邻区域之间的相似度可以设为NaN)从矩阵中找出最大相似度值对应的两个区域,将这两个区域合二为一,这时候图像上还剩下n-1个区域
- 重复上面的过程(只需要计算新的区域与它相邻区域的新相似度,其他的不用重复计算)重复一次,区域的总数目就减少1,直到最后所有的区域都合并成为了同一个区域(即此过程进行了n-1次,区域总数目最后变成了1),算法的流程图如下图所示:
SPP-NET
SPP-Net:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
R-CNN框架,对图像提完Region Proposal(2000个左右)之后将每个Proposal当成一张图像进行后续处理(CNN提特征+SVM分类)实际上对一张图像进行了2000次提特征和分类的过程!这2000个Region Proposal都是图像的一部分,那么完全可以对图像提一次卷积层特征,然后只需要将Region Proposal在原图的位置映射到卷积层特征图上,这样对于一张图像我们只需要提一次卷积层特征,然后将每个Region Proposal的卷积层特征输入到全连接层做后续操作(对于CNN来说,大部分运算都耗在卷积操作上,这样做可以节省大量时间)
现在的问题是每个Region Proposal的尺度不一样,直接输入全连接层肯定是不行的,因为全连接层输入必须是固定长度SPP-Net刚好可以解决这个问题
由于传统的CNN限制了输入必须固定大小(比如AlexNet是224*224)所以在实际使用中往往需要对原图进行crop或者warp的操作:
-crop:截取图片的一个固定大小的patch
-warp:将原图片的ROI缩放到一个固定大小的patch
无论是crop还是warp,都无法保证在不失真的情况下将图片传入CNN当中:
-crop:物体可能会产生截断,尤其是长宽比大的图片
-warp:物体被拉伸,失去“原形”,尤其是长宽比大的图片
SPP-Net为的就是解决上述问题,做到的效果为:不管输入的图片是什么尺度,都能够正确的传入网络。
具体的思路为:CNN的卷积层是可以处理任意尺度的输入的,只是在全连接层处有限制尺度-换句话说,如果找到一个方法,在全连接层之前将其输入限制到等长,那么就解决这个问题了。
具体方案如下:
如果原图输入是224*224,对于Conv5出来后的输出,是13*13*256的,可以理解成有256个这样的filter,每个filter对应一张13*13的activation map。如果像上图那样将activation map pooling成4*4 2*2 1*1三张子图,做max pooling后,出来的特征就是固定长度的(16+4+1)*256那么多维度了,如果原图的输入不是224*224,出来的特征依然是(16+4+1)*256;直觉地说,可以理解成将原来固定大小为(3*3)窗口的pool5改成了自适应窗口大小,窗口的大小和activation map成比例,经过了pooling后出来的feature的长度是一致的。
Bounding Box Regression
R-CNN中的bounding box回归
先介绍R-CNN和Fast R-CNN中所用到的边框回归方法
(1).什么是IOU?
IOU的定义:物体检测需要定位出物体的bounding box,就像下面的图片一样,我们不仅要定位出车辆的bounding box,我们还要识别出bounding box里面的物体就是车辆,对于bounding box的定位精度,有一个很重要的概念,因为我们的算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU
IOU定义了两个bounding box的重叠度,如下图所示:
矩形框A和矩形框B的一个重合度IOU计算公式为IOU=(A∩B)/(A∪B)
就是矩形框A,B的重叠面积占A,B并集的面积比例:IOU=Si/(SA+SB-Si)
(2).为什么要做Bounding-box regression?
如上图所示,绿色的框为飞机的Ground Truth,红色的框是提取的Region Proposal,那么即便是红色框被分类器识别为飞机,但是由于红色的框定位不准(IOU<0.5),那么这张图相当于没哟正确的检测出飞机,我们能对红色的框进行微调,使得经过微调后的窗口跟Ground Truth更接近,这样岂不是定位会更准确,确实Bounding-box regression就是用来微调这个窗口的。
(3).回归/微调的对象是什么?
对于窗口一般使用四维向量(x,y,w,h)来表示,分别表示窗口的中心点坐标和宽高,对于下图,红色的框P代表原始的Proposal,绿色的框G代表目标的Ground Truth,我们的目标是寻找一种关系使得输入原始的窗口P经过映射得到一个跟真事窗口G更接近的回归窗口G^(G hat).
即:给定(Px,Py,Pw,Ph),寻找一种映射f,使得
(4).Bounding-box regression(边框回归)
那么经过何种变换才能从图11中的窗口P变换为窗口G^(G hat)呢?比较简单的思路是:
[1].先做平移(△x,△y),△x = Pwdx(P),△y = Phdy(P)
- 这就是R-CNN论文中的:
[2].后做尺度缩放(Sw,Sh),Sw = Pwdw(P),Sh = Phdh(P)
所以由上面的4个公式可以看出,我们需要学习dx(P),dy(P),dw(P),dh(P)这四个变换,下一步就是设计算法得到这四个映射。当输入Proposal与Ground Truth相差较小时(R-CNN设置的是IoU>0.6),可以认为这种变换是一种线性变换,那么就可以用线性回归来建模对窗口进行微调。
Note:只有当Proposal和Ground Truth比较接近时(线性问题)才能将其作为训练样本训练线性回归模型,否则会导致训练的回归模型不work(当Proposal跟Ground Truth离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理),这个也是G-CNN:an Interative Grid Based Object Dector多次迭代实现目标准确定位的关键。
线性回归就是给定输入的特征向量X,学习一组参数W,使得经过线性回归后的值跟真实值Y(Ground Truth)非常相近。
输入:Region Proposal → P = (Px,Py,Pw,Ph),这个是什么?输入就是这四个数值?其实真正的输入是这个窗口对应的CNN特征,也就是R-CNN中Pool5 feature(特征向量)。(注:训练阶段输入还包括Ground Truth,也就是t*=(tx,ty,tw,th))。
输出:需要进行评议变换和尺度缩放dx(P),dy(P),dw(P),dh(P),或者说△x,△y,Sw,Sh,最终的输出不应该是Ground Truth吗?有了这四个变换就可以直接得到Ground Truth,这里还有一个问题,就是根据上面的4个公式可以知道P经过dx(P),dy(P),dw(P),dh(P)变换后,得到的并不是真实值G,而是预测值G^(G hat),的确,这四个值应该是经过Ground Truth和Proposal计算得到的真正需要的平移量和尺度缩放。也就是R-CNN中的:
那么目标函数可以表示为是输入Proposal的特征向量,W*是要学习的参数(*表示x,y,w,h,也就是每一个变换对应一个目标函数),d*(P)是得到的预测值,要让预测值跟真实值t* = (tx,ty,tw,th)差距最小,得到损失函数为:
函数的优化目标为:
利用梯度下降法或者最小二乘法就可以得到
Region Proposal Network
RPN的实现方式:在conv5_3的卷积feature map上用一个n*n的滑窗(论文作者选用了n=3,即3*3的滑窗)生成一个长度为256(ZF网络)或512(VGG网络)维长度的全连接特征,然后这个256维或者512维特征后产生两个分支的全连接层:
[1]:reg-layer :用于预测proposal的中心锚点对应的proposal的坐标x,y和宽高w,h
[2]:cls-layer,用于判定该proposal是前景还是背景,sliding window的处理方式保证reg-layer和cls-layer关联了conv5_3的全部特征空间,事实上,作者用全连接层实现方式介绍RPN层实现帮助我们理解这一过程,而在实现时作者选用了卷积层实现全连接层的功能。
[3]:全连接层本来就是特殊的卷积层,如果产生256或者512维的fc特征,事实上可以用Num_out=256或512,kernel_size=3*3,stride=1的卷积层来说海鲜conv5_3到第一个全连接特征的映射,然后再用两个Num_out分别为2*9=18,4*9=36,kernel_size = 1的卷积层来实现上一层特征到两个分支cls层和reg层的特征映射。
[4]:注意,这里的2*9中的2指cls层的分类结果包括前后背景两类,4*9的4表示一个Proposal的中心点坐标x,y和宽高w,h四个参数。采用卷积的方式实现全连接处理并不会减少参数的数量,但是使得输入图像的尺寸可以更加灵活,在RPN网络中,需要重点理解其中的anchros概念,Loss functions计算方式和RPN层训练数据生成的具体细节:
Anchros:字面上可以理解为锚点,位于之前提到的n*n的sliding window的中心处,对于一个sliding window,我们可以同时预测多个proposal,假设有k个,k个proposal即k个reference boxes,每一个reference box又可以用一个scale,一个aspect_ratio和sliding window中的锚点唯一确定,所以我们说一个anchor,就可以理解成一个anchro box或一个reference box。作者在论文中定义k = 9,即3种scales和3种aspect_ratio确定出当前sliding window位置处对应9个reference boxes,4*k个reg-layer的输出和2*k个cls-layer的score输出,对于一幅W*H feature map,对应W*H*H个锚点,所有的锚点都具有尺度不变性。
Loss Function:
在计算Loss值之前,作者设置了anchors的标定方法,正样本标定规则:
1):如果Anchor对应的reference box与ground truth的IoU值最大标记为正样本;
2):如果Anchor对应的reference box与ground truth的IoU>0.7,标记为正样本,事实上,采用第二个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的Anchor对应的reference box与ground truth的IoU不大于0.7,可以采用第一种规则生成
3):负样本标定规则:如果Anchor对应的reference box与ground truth的IoU<0.3,标记为负样本
4):剩下的既不是正样本也不是负样本,不用于最终训练
5):训练RPN的Loss是有classification loss(即softmax loss)和regression loss(即L1 loss)按一定比重组成的,计算softmax loss需要的是anchors对应的ground truth标定结果和预测结果,计算regression loss需要三组信息:
- 预测框,即RPN网络预测出的proposal的中心为主坐标x,y和宽高w,h
- 锚点reference box,之前的9个锚点对应9个不同的scale和aspect_ratio的reference boxes,每一个reference boxes都有一个中心点位置坐标x_a,y_a,w_a,h_a
- ground truth:标定的框也对应一个中心点位置坐标x*,y*和宽高w*,h* ,因此计算regression loss和总loss的方式如下:
RPN训练设置:
[1]:在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个proposal组成的,其中正负样本的比例为1:1
[2]:如果正样本不足128,则多用一些负样本以满足有256个Proposal可以用于训练,反之亦然
[3]:训练RPN时,与VGG共有的层参数可以直接拷贝经ImageNet训练得到的模型中的参数;剩下没有的层参数用标准差=0.01的高斯分布初始化
RoI Pooling
RoI Pooling layer实际上是SPP-Net的一个精简版,SPP-Net对每个Proposal使用了不同大小的金字塔映射,而RoI Pooling layer只需要下采样到一个7*7的特征图,对于VGG16网络conv5_3有512个特征图,这样所有region proposal对应了一个7*7*512维度的特征向量作为全连接层的输入。RoI Pooling就是实现从原图区域映射到con5区域最后pooling到固定大小的功能。