Faster-RCNN原理详解---该算法是其他算法的基础

总体:

首先缩放至固定大小MxN,然后将MxN图像送入网络;
而Conv layers中包含了13个conv层+13个relu层+4个pooling层;
RPN网络首先经过3x3卷积,再分别生成positive anchors和对应bounding box regression偏移量,然后计算出proposals;
而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。
在这里插入图片描述

1 Conv layers

Conv layers包含了conv,pooling,relu三种层,
relu属于激活函数层
所有的conv层都是:kernel_size=3,pad=1,stride=1
所有的pooling层都是:kernel_size=2,pad=0,stride=2
因为conv层中pad=1,所以做3*3卷积后不改变输入输出矩阵大小
Conv layers中的pooling层kernel_size=2,stride=2。这样每个经过pooling层的MxN矩阵,都会变为(M/2)x(N/2)大小,经过四层以后,输出矩阵变为M/16 * N/16

2 Region Proposal Networks(RPN)

在这里插入图片描述

2.2 anchors

所谓anchors,实际上就是一组由rpn/generate_anchors.py生成的矩形,矩形大小由自己定义
在这里插入图片描述
在这里插入图片描述
在原文中使用的是ZF model中,其Conv Layers中最后的conv5层num_output=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions 256-d是不是说就是256维的呢
在conv5之后,做了rpn_conv/3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息(猜测这样做也许更鲁棒?反正我没测试),同时256-d不变(如图4和图7中的红框),256-d不变是因为加了padding
假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分positive和negative,所以每个点由256d feature转化为cls=2•k scores;而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4•k coordinates
补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练(什么是合适的anchors下文5.1有解释)
注意,在本文讲解中使用的VGG conv5 num_output=512,所以是512d,其他类似。

正式版

主要分为4步:
1、Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
2、Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
3、Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
4、Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

整体网络结构

在这里插入图片描述
1、在conv layers层中:
所有的所有的conv层都是:kernel_size=3,pad=1,stride=1,所有的pooling层都是:kernel_size=2,pad=0,stride=2
由于conv中的pad=1,所以不会改变输出层的大小,pooling层将输出变为输入的M/2 * N/2
所以经过conv层以后输出变成了M/16 * N/16大小

2、Region Proposal Networks(RPN):
直接使用RPN生成检测框
在这里插入图片描述
RPN分为两条线,上面一条通过softmax分类anchors获得positive和negitive分类,下面一条用于计算anchors的bounding box regression偏移量,以获得精确的proposal,而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能

这里的33实际上就是用来设置检验框的,然后输出WH256的输出,再经过1118的卷积,输出WH18的输出,这个WH92的输出保存了每个框是属于posi还是negitive,后面接softmax分类获得positive anchors

那为啥前后要接一个reshape呢,因为要进行预处理,因为在代码中的储存形式是[通道数, 高 ,宽]

3、anchors
就是一组按比例的矩形,4个值(x1 x2 y1 y2 )矩形左上和右下角点坐标,共三种形状,长宽比为1:1 1:2 2:1
在这里插入图片描述
实际上就是引用了多尺度方法
这个算法会将输入的图像reshape成800600大小
然后anchors的大小基本上会覆盖800
600大小的图像

遍历conv layers计算获得的feature maps,为这,每个点都配备9个anchors作为初始的检测框
在这里插入图片描述
如图所示,feature maps上每个点有33的黄色框框,对应于原图上的着9个框,特征图上一个点是对应原图上的一个区域的的,就是感受野的意思,于是我们就在对应的原图的区域的中心点上画9个框。所以相当于还是在特征图上每个点画了9个框,只不过可以映射到原图,然后原图就是隔一片区域存在九个框
在这里插入图片描述
会输出前景和背景共2k个参数,每个anchor对应的偏移量4
k

补充一点,全部anchors拿去训练太多了,训练程序会在“合适的”anchors中随机选取128个postive anchors+128个negative anchors进行训练

RPN就是在原图尺度上,设置了密密麻麻的anchor,然后用cnn去判断哪些anchors是有目标的positive anchors 哪些是没目标的negitive anchors ,所以,仅仅是个二分类而已
在这里插入图片描述

bounding box regression原理

在这里插入图片描述
在这里插入图片描述
寻找一个转化关系,使得A变到G
在这里插入图片描述
先做平移,再做缩放
在这里插入图片描述
在这里插入图片描述
那么如何求得这四个参数呢,利用线性回归的方法,给的cnn feature map ,同时还有A变到G之间的变化量,通过损失函数和真实框的对比,可以得出四个变化量参数,训练的是四个变化量参数,然后训练出来以后在预测的时候就可以直接用了
设计L1损失函数:
在这里插入图片描述
函数优化目标为:
在这里插入图片描述
真实情况一般使用smooth-L1损失
即可达到修正anchors的位置了

对proposals进行bounding box regression

也就是第二条线
在这里插入图片描述
输出num_output = 36 相当于存储了每个回归框的变换量
所以RPN输出:
大小为50382k的positive/negative softmax分类特征矩阵 大小为50384k的regression坐标回归特征矩阵
恰好满足RPN完成positive/negative分类+bounding box regression坐标回归.

Proposal Layer

这一小层也是属于RPN层的
这个层负责综合所有的变化量和positive,计算出精准的proposal 送入后续的Rol Polling Layers层
这一层有三个输入,一个是分类器结果,一个是变化量,以及是im_info

im_info:因为传入的图像进行了尺寸固定到M*N,所以im_info=[M, N, scale_factor]保存了此次缩放的信息

在proposal layer层中做了如下事情:
对生成的anchor做回归,按照输入的positive softmas scores由大到小排列anchors,提取分手较高的anchors,即提取修正后的positive anchors当中
剔除超出边界的positive anchors
剔除尺寸非常小的positive anchors、
对剩余的positive anchors进行NMS
roposal Layer有3个输入:positive和negative anchors分类器结果rpn_cls_prob_reshape,对应的bbox reg的(e.g. 300)结果作为proposal输出

至此:检测的部分已经做完了,也就是RPN的部分就完了
总结就是:生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals

positive是在softmax层中提取的

RoI pooling

在这里插入图片描述
有两个输入,一个是Feature Map,另一个是proposal boxes,计算出proposal feature maps

为何需要RoI Pooling

传统的CNN,比如Alex和VGG,训练好以后输入的图像尺寸必须固定,同时输出的也是固定的,

RoI Pooling原理

分析之前先来看看RoI Pooling Layer的caffe prototxt的定义:

layer {
name: “roi_pool5”
type: “ROIPooling”
bottom: “conv5_3”
bottom: “rois”
top: “pool5”
roi_pooling_param {
pooled_w: 7
pooled_h: 7
spatial_scale: 0.0625 # 1/16
}
}

spatial_scale参数表示对应的输入尺寸为M*N,经过卷积层后输出M/16 *N/16,所以spatial_scale表示的就是这个缩放的参数

具体操作为: 作用为极大的提高了处理速度
1、根据输入image,将ROI映射到feature map对应位置,ROI相当于这里的proposal层的输出
2、将映射后的区域划分为相同大小的sections
3、对每个sections进行max polling操作
例如:
在这里插入图片描述
region proposal 投影之后位置(左上角,右下角坐标):(0,3),(7,8)。
在这里插入图片描述
将其划分为(22)个sections(因为输出大小为22),我们可以得到:
在这里插入图片描述
对每个section做max pooling,可以得到:
在这里插入图片描述
说明:在此案例中region proposals 是57大小的,在pooling之后需要得到22的,所以在57的特征图划分成22的时候不是等分的,行是5/2,第一行得到2,剩下的那一行是3,列是7/2,第一列得到3,剩下那一列是4。
Faster Rcnn这里的池化层是7*7的

这一个feature map的其他地方就可以丢弃了,因为那些地方存在物体的概率很小,所以使得输出相同大小的feature map,实现了固定长度输出
大大的减少了计算量

4 Classification

Classification部分利用已经获得的proposal feature maps ,通过full connect 层与softmax计算每个proposal具体属于哪个类别,输出cls_prob概率向量;同时再次利用proposal feature maps获得每个proposal偏移量bbox_pred,用于回归更加精确的目标检测框
在这里插入图片描述
在这里插入图片描述
这是全连接层的内部结构图
在这里插入图片描述
这是计算公式:其中W和bias B都是预先训练好的,即大小是固定的,当然输入X和输出Y也就是固定大小。所以,这也就印证了之前Roi Pooling的必要性

5 Faster RCNN训练

是在已经训练好的VGG,ZF的基础上继续进行训练,分为6个步骤:
在已经训练好的model上,训练RPN网络,对应stage1_rpn_train.pt
利用步骤1中训练好的RPN网络,收集proposals,对应rpn_test.pt
第一次训练Fast RCNN网络,对应stage1_fast_rcnn_train.pt
第二训练RPN网络,对应stage2_rpn_train.pt
再次利用步骤4中训练好的RPN网络,收集proposals,对应rpn_test.pt
第二次训练Fast RCNN网络,对应stage2_fast_rcnn_train.pt

论文中只迭代了两次
在这里插入图片描述
5.1 训练RPN网络
在这里插入图片描述
依旧是使用conv layers 提取feature maps ,整个网络的loss函数是:
在这里插入图片描述
上述公式中 i 表示anchors index, Pi表示positive softmax probability,Pi代表对应的GT predict概率(即当第i个anchor与GT间IoU>0.7,认为是该anchor是positive,Pi=1;反之IoU<0.3时,认为是该anchor是negative,Pi*=0;至于那些0.3<IoU<0.7的anchor则不参与训练);
t代表predict bounding box, t* 代表对应positive anchor对应的GT box。可以看到,整个Loss分为2部分:
1、cls loss,即rpn_cls_loss层计算的softmax loss,用于分类anchors为positive与negative的网络训练
2、reg loss,即rpn_loss_bbox层计算的soomthL1 loss,用于bounding box regressions网络训练,乘了Pi*,相当于只关♥positive
λ用来平衡Ncls和Nreg两个参数
soomthL1 loss公式为
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值