Faster RCNN论文与原理解读

网友投稿 804 2022-05-29

论文结构

摘要核心

候选区域提取是已有检测方法实时性低的主要瓶颈

提出了候选区域网络,通过共享特征,提取候选区域,极大提升了计算效率,可以进行端到端训练

FastRCNN和VGG通过迭代优化可以实现特征共享

FasterRCNN是一个实用系统,在单GPU上达5fps

在Pascal VOC2012上达到4% mAP

网络细节

Faster RCNN主要有4个重要部分:

共享卷积层:用于提取feature maps被共享用于后续RPN层和全连接层。

Region Proposal Network(RPN):生成region proposals

RoI Pooling:收集feature maps和proposals,提取proposal feature maps后送入全连接层判定目标类别。

Classification:利用proposal feature maps计算proposal的类别,同时再次bbox回归获得精确位置。

抽象网络结构

具体网络结果

共享卷积层

Conv layers(VGG网络)共有13个conv层,13个relu层,4个pooling层。

在FasterRCNN的Conv layers中对所有的卷积都做了扩边处理(pad=1,即填充一圈0),导致原图变为(M+2)x(N+2)大小,再做3x3卷积后输出MxN。

pooling层kernel_size=2,stride=2。这样每个经过pooling层的MxN矩阵,都会变为(M/2)x(N/2)大小。

一个MxN大小的矩阵经过Convlayers固定变为(M/16)x(N/16)

Anchors

假设原图800x600 下采样16倍,feature map每个点设置9个Anchor

所以:ceil(800/16) x ceil(600/16) x 9 = 50 *38 * 9 = 17100 个框。

区分前景与背景Anchor,标记标签(1正例,0负例,-1忽略)

正例:对于每一gtbox,交并比最大的anchor以及与任一gtbox交并比超过一定阈值(0.7)

负例:与所有gtboxes交并比小于一定阈值(0.3)其他忽略

对每一前景anchor,根据对应的gtbox计算回归值。

Region Proposal Networks

目的:判定哪些anchors有可能包含物体

输入:

提取的特征

原图信息(缩放比例,以及resize后尺寸)

输出:

rpn_box 偏移量(hh*ww*9,4)

rpn_score(hh*ww*9,2)

Faster RCNN论文与原理解读

rois(2000,4)

RPN具体网络结构

上面一条用softmax分类anchors获得positive和negative

下面一条用于计算对于anchors的bounding box regression偏移量

最后的proposal进一步剔除太小和超出边界的proposal,并综合变换量和positive anchors,计算出精准的proposal。

目标:寻找一种关系使得输入原始的anchor A 经过映射得到一个跟真实窗口G更接近的回归窗口G’。

其中绿色为GroundTruth,红色为positive anchor。

Positive anchor 与ground truth之间的平移计算方法:

先平移:

再缩放:

通过观察上面4个公式可知,需要学习的是dx(A), dy(A), dw(A), dh(A)这四个变换。当anchorA 与GT相差较小时,可认为这是一种线性变换。

如何通过线性回归获得dx(A), dy(A), dw(A), dh(A)?

线性回归就是给定输入特征向量X,学习一组参数W,使得经过线性回归后的值跟真实值Y非常接近。即Y=WX。对于该问题,输入X是feature map定义为φ;同时还有训练传入A与GT之间的变换量即(tx,ty,tw,th),输出是dx(A), dy(A), dw(A), dh(A)这四个变换那么目标函数可以表示为:

在FasterRCNN中 foreground anchor与ground truth之间的平移量(tx, ty)与尺度缩放因子(tw,th)关系如下:

对于每张图片,利用它的feature map,计算(H/16)x(W/16)x9(大概20000)个anchor属于前景的概率,然后从中选取概率较大的12000张,利用位置回归参数,修正这大约12000个anchor的位置, 利用非极大值抑制,选出大约2000个ROIS以及对应的位置参数。

输入:anchors分类结果,对应的bbox变换量和缩放信息

处理流程:

依据变换量对所有的anchors做bbox regression回归。

根据fg anchor scores由大到小排序anchors,提取前pre_nms_topN(e.g.

12000)个anchors。

限定超出图像边界的positive anchors为图像边界,防止后续roipooling时proposal超出图像边界。

剔除尺寸非常小的positive anchors。

对剩余的positive anchors进行NMS。

之后输出proposal=[x1,y1,x2,y2],对应的是MxN的图像尺度。

即如下流程:

生成anchors->softmax分类器提取foreground anchors->bbox 回归positive anchors->Proposal Layer生成proposals

ROIPooling

输入:

原始的feature maps

RPN输出的proposal boxes

由于目前的proposals还没有具体的物体信息,因此需要从已有的bounding boxes中提取特征。

不同于CNN 网络中的池化层,这里通过分块池化的方法得到固定尺寸的输出。

假设ROI Pooling层的输出大小为w2*h2,输入候选区域的大小为 w*h,ROI Pooling的过程如下:

1) 把输入候选区域划分为 w2*h2,大小的子网格窗口,每个窗口的大小为(w/w2)*(h/h2)

2) 对每个子网格窗口取最大元素作为输出,从而得到大小为w2*h2的输出。

如上图所示,假设Feature Map大小为4x4,候选ROI区域大小为3x3,通过2x2的ROI Pooling Layer得到2x2的归一化输出。4个划分后子窗口分别为1、2、3、5(5最大),3、7(7最大),9、10(10最大),11(11最大),然后对每个子窗口做Max Pooling。

这其实来自于更早提出的SPP Net,RPN网络提取出的proposal大小是会变化的,而分类用的全连接层输入必须固定长度,所以必须有个从可变尺寸变换成固定尺寸输入的过程。在较早的R-CNN和Fast R-CNN结构中都通过对proposal进行拉升(warp)或裁减(crop)到固定尺寸来实现,拉升、裁减的副作用就是原始的输入发生变形或信息量丢失(图7),以致分类不准确。而ROI Pooling就完全规避掉了这个问题,proposal能完整的pooling成全连接的输入,而且没有变形,长度也固定。

执行流程:

由于proposal对应的尺寸为MxN,所以首先使用spatial_scale参数将其映射回(M/16)x(N/16)大小的feature map。

再将每个proposal对应的feature map分为 pooled_w x pooled_h的网络;

对网格的每一份都进行max pooling处理,以保证结果都是pooled_w x pooled_h固定大小。

分类Classification

通过全连接和softmax对proposals进行分类

再次对proposals进行bounding box regression,获取更高精度的bbox

Loss

论文总结

关键点:

候选区域提取——RPN

特征共享计算——RPN和FastRCNN共享骨干网络特征

创新点:

多尺度与纵横比Anchor解决目标多尺度问题

RPN提取候选区域,实现端到端检测

多任务损失函数

两阶段目标检测,提高检测精度

启发点:

Anchor定义是否在不同数据集及不同场景下是否应有所变化

是否有必要在整幅图中均匀分布Anchor

Anchor定义的多尺度是否能够满足实际物体尺度变化要求

Faster RCNN代码复现

代码地址:

https://github.com/chenyuntc/simple-faster-rcnn-pytorch

博客《逐字理解目标检测simple-faster-rcnn-pytorch-master代码》地址:

https://blog.csdn.net/qq_32678471/article/details/84776144

https://blog.csdn.net/qq_32678471/article/details/84792307

https://blog.csdn.net/qq_32678471/article/details/84882277?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-6&spm=1001.2101.3001.4242

https://blog.csdn.net/qq_32678471/article/details/85678921

注:该博客虽然有很多理解不对或不到位的地方,但注释比较详细,能帮助新手快速理解每个模块的具体含义。

机器学习 神经网络

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:王渊命:QingCloud微服务实践全解析
下一篇:【软通鲲鹏云最佳实践8】Maven-3.3.9 鲲鹏云服务器安装实践
相关文章