Faster R-CNN算法是作者Ross Girshick对Fast R-CNN算法的一种改进。Fast R-CNN在速度和精度上都有了不错的结果,但仍有一些不足之处。Faster R-CNN算法同样使用VGG-16网络结构,检测速度在GPU上达到5fps(包括候选区域的生成),准确率也有进一步的提升。在ILSVRC和COCO 2015竞赛中获得多个项目的第一名。在Faster R-CNN中提出了区域生成网络(Region Proposal Network,RPN),将候选区域的提取和Fast R-CNN中的目标检测网络融合到一起,这样可以在同一个网络中实现目标检测。Faster R-CNN主要是解决Fast R-CNN存在的问题:
Faster R-CNN算法步骤:
上图中各层的主要功能:
Faster R-CNN算法可以看作是由R-CNN和Fast R-CNN演化而来。
Faster R-CNN存在的问题:
Faster R-CNN算法详解:
1×1卷积核和3×3卷积核: 如果卷积的输出输入都只是一个平面,那么1×1卷积核并没有什么意义,它是完全不考虑像素与周边其他像素关系。 但卷积的输出输入是长方体,所以1×1卷积实际上是对每个像素点,在不同的channels上进行线性组合(信息整合),且保留了图片的原有平面结构,调控depth,从而完成升维或降维的功能。
候选区域(anchor): 特征可以看做一个尺度51 × \times × 39的256通道图像,对于该图像的每一个位置,考虑9个可能的候选窗口:三种面积{128 2 ^{2} 2,256 2 ^{2} 2,512 2 ^{2} 2} × × ×三种比例{1:1,1:2,2:1},这些候选窗口称为anchors。anchor的本质是SPP(spatial pyramid pooling)思想的逆向,而SPP本身就是将不同尺寸的输入resize成为相同尺寸的输出。所以SPP的逆向就是,将相同尺寸的输出,倒推得到不同尺寸的输入。下图示出51 × \times × 39个anchor中心,以及9种anchor示例。
softmax判定foreground与background: 一个MxN大小的矩阵送入Faster R-CNN网络后,到RPN网络时变为(M/16)x(N/16),不妨设W=M/16,H=N/16。在进入reshape与softmax之前,先做了1×1卷积,如下图所示。经过卷积的输出图像的大小为W × × × H × × × 18,这刚好对应了feature maps每一个点都有9个anchors,同时每个anchors又可能是foreground和background,所以这些信息都保存在W × × × H × × × (9 × × × 2)大小的矩阵。至于在softmax前后都接一个reshape layer的原因,其实只是为了便于softmax分类。
bounding box regression原理: 下图所示的绿色框为飞机的Ground Truth(GT),红色为提取的foreground anchors,那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得foreground anchors和GT更加接近。
对于窗口一般使用四维向量(x, y, w, h)表示,分别表示窗口的中心点坐标和宽高。对于下图,红色的框A代表原始的Foreground Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G’,即:给定A=(A x _x x, A y _y y, A w _w w, A h _h h),寻找一种映射f,使得f(A x _x x, A y _y y, A w _w w, A h _h h)=(G’ x _x x, G’ y _y y, G’ w _w w, G’ h _h h),其中(G’ x _x x, G’ y _y y, G’ w _w w, G’ h _h h)≈(G x _x x, G y _y y, G w _w w, G h _h h)。
那么经过何种变换才能从上图中的A变为G’呢? 比较简单的思路就是: 1. 先做平移
2. 再做缩放
观察上面4个公式发现,需要学习的是d x _x x(A),d y _y y(A),d w _w w(A),d h _h h(A)这四个变换。当输入的anchor与GT相差较小时,可以认为这种变换是一种线性变换, 那么就可以用线性回归来建模对窗口进行微调(注意,只有当anchors和GT比较接近时,才能使用线性回归模型,否则就是复杂的非线性问题了)。对应于Faster R-CNN原文,平移量(t x _x x, t y _y y)与尺度因子(t w _w w, t h _h h)如下:
接下来的问题就是如何通过线性回归获得d x _x x(A),d y _y y(A),d w _w w(A),d h _h h(A)了。线性回归就是给定输入的特征向量X,学习一组参数W,使得经过线性回归后的值跟真实值Y(即GT)非常接近,即Y=WX。对于该问题,输入X是一张经过num_output=1的1 × \times × 1卷积获得的feature map,定义为 Φ Φ Φ;同时还有训练传入A与GT之间的变换量,即(t x _x x, t y _y y, t w _w w, t h _h h),输出是d x _x x(A),d y _y y(A),d w _w w(A),d h _h h(A)四个变换。那么目标函数可以表示为:
其中 Φ ( A ) Φ(A) Φ(A)是对应anchor的feature map组成的特征向量,w是需要学习的参数,d(A)是得到的预测值(*表示 x, y, w, h,也就是每一个变换对应一个上述目标函数)。为了让预测值d ∗ _* ∗(A)与真实值t ∗ _* ∗差距最小,得到损失函数:
函数优化目标为:
对proposals进行bounding box regressiond: 看了RPN网络的第一条线路后,再来看第二条线路,如下图所示。经过卷积输出图像为W × × × H × × × 36,这里相当于feature maps每个点都有9个anchors,每个anchors又有4个用于回归的[dx(A),dy(A),dw(A),dh(A)]变换量。
proposal layer: proposal layer负责综合所有的[dx(A),dy(A),dw(A),dh(A)]变换量和foreground anchors,计算出精准的proposal,送入后续的RoI Pooling layer。 proposal layer有3个输入:fg/bg anchors分类器结果rpn_prob_reshape,对应的bbox reg的[dx(A),dy(A),dw(A),dh(A)]变换量rpn_bbox_ped,以及im_info,另外还有参数feat_stride=16,这和上图对应。 im_info:对于一幅任意大小的P × × × Q图像,传入Faster R-CNN前首先reshape到M × × × N大小,im_info=[M, N, scale_factor]则保存了此次缩放的所有信息。然后经过conv layers,经过4次pooling变为W × × × H=(M/16) × × × (N/16)大小,其中feature_stride=16则保存了该信息,用于计算anchor偏移量。
RPN网络结构总结: 生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> proposal layer生成proposals。
而RPN网络生成的proposals的方法:对foreground anchors进行bound box regression,那么这样获得的proposal也是大小形状各不相同,即也存在上述问题。所以Faster R-CNN提出了ROI Pooling来解决这个问题。 ROI Pooling layerl forward过程:proposal=[x1,y1,x2,y2]是对应M × × × N尺度的,所以首先使用spatial_scale参数将其映射回(M/16) × × × (N/16)大小的feature map尺度,之后将每个proposal水平方向和竖直方向都分成7份,对每一份都进行max pooling处理,这样处理后,即使大小不同的proposal,输出的结果都是7 × × × 7大小的,实现了fixed-length output(固定长度输出),如下图所示。
从ROI Pooling获取到7 × × × 7=49大小的proposal feature maps后,送入后续的网络,可以看到做了如下2件事: 1. 通过全连接层和softmax对proposal进行分类,这实际上已经是识别的范畴了; 2. 再次对proposals进行bounding box regression,获取更高精度的rect box。 接下来我们来看看全连接层,简单的示意图如下所示。
其计算公式如下:
其中W和bias B都是预先训练好的,即大小是固定,当然输入X和输出Y也是固定大小。所以,这也就印证了之前RIO Pooling的必要性。
参考文章:https://blog.csdn.net/Lin_xiaoyi/article/details/78214874。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/196026.html原文链接:https://javaforall.cn