Faster RCNN论文与原理解读

举报
lutianfei 发表于 2021/01/28 18:22:10 2021/01/28
【摘要】 论文结构摘要核心候选区域提取是已有检测方法实时性低的主要瓶颈提出了候选区域网络,通过共享特征,提取候选区域,极大提升了计算效率,可以进行端到端训练FastRCNN和VGG通过迭代优化可以实现特征共享FasterRCNN是一个实用系统,在单GPU上达5fps在Pascal VOC2012上达到4% mAP   网络细节Faster RCNN主要有4个重要部分:共享卷积层:用于提取feature...

论文结构

摘要核心

  1. 候选区域提取是已有检测方法实时性低的主要瓶颈
  2. 提出了候选区域网络,通过共享特征,提取候选区域,极大提升了计算效率,可以进行端到端训练
  3. FastRCNNVGG通过迭代优化可以实现特征共享
  4. FasterRCNN是一个实用系统,在单GPU上达5fps
  5. Pascal VOC2012上达到4% mAP

 

 

 

网络细节

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

  1. 共享卷积层:用于提取feature maps被共享用于后续RPN层和全连接层。
  2. Region Proposal NetworkRPN):生成region proposals
  3. RoI Pooling:收集feature mapsproposals,提取proposal feature maps后送入全连接层判定目标类别。
  4. Classification:利用proposal feature maps计算proposal的类别,同时再次bbox回归获得精确位置。

 

抽象网络结构

 

具体网络结果


 

共享卷积层

Conv layersVGG网络)共有13conv层,13relu层,4pooling层。

  • FasterRCNNConv layers中对所有的卷积都做了扩边处理(pad=1,即填充一圈0),导致原图变为(M+2)x(N+2)大小,再做3x3卷积后输出MxN
  • poolingkernel_size=2stride=2。这样每个经过pooling层的MxN矩阵,都会变为(M/2)x(N/2)大小。
  • 一个MxN大小的矩阵经过Convlayers固定变为(M/16)x(N/16)

 

Anchors

Anchors的产生

 

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

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


 

Anchor 正负例定义与分配

  • 区分前景与背景Anchor,标记标签(1正例,0负例,-1忽略)
    • 正例:对于每一gtbox,交并比最大的anchor以及与任一gtbox交并比超过一定阈值(0.7)
    • 负例:与所有gtboxes交并比小于一定阈值(0.3)其他忽略
  • 对每一前景anchor,根据对应的gtbox计算回归值。

 

 

Region Proposal Networks

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

输入:

  1. 提取的特征
  2. 原图信息(缩放比例,以及resize后尺寸)

输出:

  1. rpn_box 偏移量(hh*ww*94
  2. rpn_scorehh*ww*92
  3. rois2000,4


 

RPN具体网络结构


  • 上面一条用softmax分类anchors获得positivenegative
  • 下面一条用于计算对于anchorsbounding box regression偏移量
  • 最后的proposal进一步剔除太小和超出边界的proposal,并综合变换量和positive anchors,计算出精准的proposal

 

Bounding Box Regression

目标:寻找一种关系使得输入原始的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。对于该问题,输入Xfeature map定义为φ;同时还有训练传入AGT之间的变换量即(tx,ty,tw,th),输出是dx(A), dy(A), dw(A), dh(A)这四个变换那么目标函数可以表示为:


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


 

 

Proposal Layer

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

 

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

处理流程:

  • 依据变换量对所有的anchorsbbox regression回归。
  • 根据fg anchor scores由大到小排序anchors,提取前pre_nms_topN(e.g.

12000)anchors

  •  限定超出图像边界的positive anchors为图像边界,防止后续roipoolingproposal超出图像边界。
  • 剔除尺寸非常小的positive anchors
  • 对剩余的positive anchors进行NMS
  • 之后输出proposal=[x1,y1,x2,y2],对应的是MxN的图像尺度。

 

即如下流程:

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

 

ROIPooling

输入:

  1. 原始的feature maps
  2. RPN输出的proposal boxes

 

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


 

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

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

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

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


 

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

为什么需要ROI pooling


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

 

执行流程:

  1. 由于proposal对应的尺寸为MxN,所以首先使用spatial_scale参数将其映射回(M/16)x(N/16)大小的feature map
  2. 再将每个proposal对应的feature map分为 pooled_w x pooled_h的网络;
  3. 对网格的每一份都进行max pooling处理,以保证结果都是pooled_w x pooled_h固定大小。

 

 

分类Classification

  1. 通过全连接和softmaxproposals进行分类
  2. 再次对proposals进行bounding box regression,获取更高精度的bbox


Loss


 

论文总结

关键点:

  • 候选区域提取——RPN
  • 特征共享计算——RPNFastRCNN共享骨干网络特征

 

创新点:

  • 多尺度与纵横比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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。