Faster R-CNN总结

45 篇文章 0 订阅
35 篇文章 0 订阅

Faster R-CNN

论文的demo用了ZF和VGG16 的网络结构,本文默认用VGG16
它的结构图:

Alt
它的前13层是用了VGG提取特征 ,主要算法实现是后面几层:
Alt

Faster R-CNN的整体结构,如下图所示 :
Alt
Alt
算法步骤
1. Conv layers .作为一种cnn网络目标检测的方法,faster_rcnn首先使用一组基础conv+relu+pooling层提取image的 feture map 。该feature map被 共享用于后续的RPN层和全连接层
2.Region Proposal Networks.RPN层 是faster-rcnn 最大的亮点 ,RPN网络用于生成region proposcals .该层通过 softmax 判断anchors属于foreground或者background,再利用 box regression 修正anchors获得精确的propocals(后面会讲)
3.Roi Pooling .该层收集输入的feature map 和 proposcal,综合这些信息提取proposal feature map ,送入后续的全连接层判定目标类别。(从RIO Pooling获取到7*7=49大小的proposal feature maps后,送入后续的网络)
4.Classification 。利用proposal feature map计算 proposcal类别 ,同时再次bounding box regression获得检验框的最终精确地位置

1.Conv layer

在input-data层时,作者把原图都reshape成M×N大小的图片
conv layer中包含了conv relu pooling三种层,就VGG16而言,就有 13个conv层,13个relu层,4个pooling层 。在conv layer中:
1.所有的 conv层 都是kernel_size=3,pad=1
2.所有的pooling层 都是kernel_size=2,stride=2

Conv layer中的pooling层kernel_size=2,stride=2,这样使得经过pooling层中M×N矩阵,都会变为(M/2)*(N/2)大小。综上所述,在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长宽都变为输入的1/2。
那么,一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)!这样Conv layers生成的featuure map中都可以和原图对应起来。

2.Region Propocal Networks(RPN)

经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如RCNN使用SS(Selective Search)方法生成检测框。而Faster RCNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster RCNN的巨大优势,能极大提升检测框的生成速度。
Alt
上图中展示了RPN网络的具体结构,可以看到,feature map 经过一个3×3卷积 核卷积后分成了两条线, 上面 一条通过 softmax对anchors分类 获得foreground和background (检测目标是foregrounnd),因为是2分类,所以它的维度是2k scores。 下面 那条线是用于计算anchors的bounding box regression的偏移量 ,以获得精确的proposal。它的维度是4k coordinates。而最后 proposcal层 则负责 综合foreground anchors和bounding box regression偏移量获取proposal ,同时剔除太小和超出边界的propocals,其实网络到这个Proposal Layer这里,就完成了目标定位的功能

1x1卷积核,3x3卷积核

如果卷积的输出输入都只是一个平面,那么1x1卷积核并没有什么意义,它是完全不考虑像素与周边其他像素关系。 但卷积的输出输入是长方体,所以1x1卷积实际上是对每个像素点 ,在不同的channels 上进行 线性组合 (信息整合),且保留了图片的原有平面结构,调控depth,从而完成升维或降维 的功能。

多通道图像+多卷积核 做卷积,计算方式如下:
Alt
输入图像layer m-1有4个通道,同时有2个卷积核w1和w2。对于卷积核w1,先在输入图像4个通道分别作卷积,再将 4个通道结果加起来 得到w1的卷积输出;卷积核w2类似。所以对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量!

对于 多通道图像做1×1卷积 ,其实就是将输入的图像的每个通道乘以卷积系数加在一起,即相当于把原图像中本来各个独立通道"联通" 在一起。

anchors

提到PRN网络,就不能不说anchors。所谓的anchors,实际上就是一组由rpn/generate_anchors.py生成的矩形。直接运行作者demo中的generate_anchors.py可以得到以下输出:

[[ -84. -40. 99. 55.]
[-176. -88. 191. 103.]
[-360. -184. 375. 199.]
[ -56. -56. 71. 71.]
[-120. -120. 135. 135.]
[-248. -248. 263. 263.]
[ -36. -80. 51. 95.]
[ -80. -168. 95. 183.]
[-168. -344. 183. 359.]]

其中每行的4个值(x1,y1,x2,y2)代表矩形左上角和右下角点的坐标 9个矩形共有3种形状 ,3 scale with box areas分别是{128128 256256 512*512}和 3 aspect ratios分别是近似{(1:1 1:2 2:1)},所以共9种矩形。实际上通过anchors就引入了检测中常用的多尺度方法
Alt
注:关于上面的anchors size,其实是根据检测图像设置的。在python demo中,会把任意大小的 输入图像reshape成800x600 (即图2中的M=800,N=600)。再回头来看anchors的大小,anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状。

anchor的本质 是什么,本质是SPP(spatial pyramid pooling)思想的逆向 。而 SPP本身 是做什么的呢,就是将不同尺寸的输入 resize 成为相同尺寸的输出 。所以SPP的逆向 就是,将相同尺寸的输出 倒推得到不同尺寸的输入

对于 每个3×3的窗口 ,作者就以这个滑动窗口的中心点对应原始图片的中心点。然后作者假定,这个3×3的窗口,是从原始图片通过SPP池化得到,而这个池化的面积及比例,就是一个个anchors。换句话说,对于每个3x3窗口,作者 假定它来自9种不同原始区域的池化 ,但是这些池化在原始图片中的中心点,都完全一样 。这个中心点,就是刚刚提到的,3x3窗口中心点所对应的原始图片中的中心点。如此一来,在每个窗口位置,我们都可以根据不同的长宽比例,不同的面积的anchors, 逆向推导出它所对应的原始图片的一个区域 ,这个区域的尺寸以及坐标,都是已知。而这个区域,就是我们想要的proposal。接下来, 每个proposal我们只输出6个参数 ,每个proposal和ground truth进行比较得到的 前景概率和背景概率(2个参数) 对应图片上的cls_score,由于每个proposal和groundtruth的位置及尺寸上的差异从proposal通过平移缩放得到ground truth需要的 4个平移缩放参数 (对应图片上bbox_pred)
Alt
这样做获得检测框很不准确,不用担心,后面还有2次bounding box regression可以修正检测框位置。

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

softmax判定foreground与background

一副 MxN 大小的矩阵送入Faster RCNN网络后,到 RPN 网络变为(M/16)x(N/16) ,不妨设W=M/16,H=N/16。在进入reshape与softmax之前,先做了 1x1卷积
Alt
num_output=18 ,也就是经过卷积的输出的图像为W×H×18大小。这刚好对应了 feature maps每一个点 都有9个anchors ,同时每个anchors又可能是foreground和background ,所以这些信息都保存在W×Hx(9x2)大小的矩阵。为啥要这样做,因为后面的softmax分类获得foreground anchors,也就是相当于初步提取了检测目标候选区域box(一般认为目标在foreground anchors中)

那么为何要在softmax前后都接一个reshape layer?
其实只是为了便于softmax分类

对proposals进行bounding box regression
num_output=36,即经过卷积输出图像为W×H×36,在caffe blob存储为[1,36,H,W],这里相当于feature maps每个点都有9个anchors,每个anchors又有4个用于回归的[dx(A),dy(A),dw(A),dh(A)]变换量。

交替优化训练

faster rcnn的训练,其实是在已经训练好的model(如VGG_CNN_M,_1024,VGG,ZF)的基础上继续训练,实际中训练的过程分为6个步骤:

1、在预训练的model上,训练RPN网络
2、利用训练好的RPN
3、第一次训练Fast-RCNN网络
4、第二次训练RPN网络
5、再次利用步骤4训练好的RPN网络搜集proposals
6、第二次训练Fast-RCNN网络

可以看到训练过程类似于一种“迭代”的过程,不过只循环了2次。至于只循环了2次的原因是应为作者提到:“A similar alternating training can be run for more iterations, but we have observed negligible improvements”,即循环更多次没有提升了。

整个网络使用的loss如下

Alt
上述公式中,i表示anchors index,pi表示foreground softmax predict概率,pi* 代表对应的GT predict概率
(即当第i个anchors与GT间IoU>0.7,认为该anchor是foreground,pi* =1,反之IOU<0.3时,认为该anchors是background,pi* =0;
至于那些0.3小于IOU<0.7的anchors则不参与训练,一般一张图片取256个anchors,一般bg和fg=1;1);t代表predict bounding box,t* 代表对应的foreground anchors对应的GT box。可以看到,整个LOSS分为2个部分:
1.cls loss,即rpn_cls_loss层计算的softmax loss,用于分类的anchors为fg与bg的网络训练
2.reg loss,即rpn_loss_bbox层计算的soomth L1 loss,用于bounding box regression网络训练注意在该loss中乘了pi*,相当于只关心foreground anchors的回归(其实在回归中也完全没必要去关心background)。

smooth函数:

Alt

原文:https://blog.csdn.net/Lin_xiaoyi/article/details/78214874
https://blog.csdn.net/liuxiaoheng1992/article/details/81843363

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值