网络模型—RPN

仅作记录,自用

简单来说:输入一张图片,经过骨干网络的特征提取,得到一个m*n的特征图,映射到原图上,将原图划分为m*n个区域(每个区域很小),原图的每个区域的中心点由这个特征图上的一个像素坐标表示。anchor机制,在特征图上每个像素点对应原图的一小个区域内生成k个(论文里为9个)可能存在目标的候选框(anchor box),再输入到RPN中判断每个像素点对应的k个区域是否包含目标,如果包含则输出给后面的网络进一步判断,即从m*n*9个候选框中作筛选,提取proposals。

第一步:生成基础anchor(base_anchor),anchor数量=长宽比的数量*anchor的缩放比例数量,anchorsn​um=len(ratios)∗len(scales)。三种长宽比(1:1, 1:2,2:1)和3种缩放尺度(8, 16, 32),因此 anchor_num = 9。

 第二步:根据base_anchor,对特征图上的每一个像素,都会以它为中心生成9种不同尺寸的边界框,总生成m*n*9个anchor。

注:所有的anchor都是相对于原图的。

特征图上的每个点生成一个Anchors,Anchors 可以理解成9个不同的框(框的属性是长宽,再进一步是四个点的坐标)。这个框的数据(框的左上角坐标(x0,y0),右下角坐标(x1,y1))这四个值都是对应于原图的。下面这个就是原图,红色点就是特征图上的点对应于原图的位置。每一个位置使用 9 个锚点,每个位置会生成 2×9 个目标分数和 4×9 个坐标分数。显然,通过一个中心定义9个不同的框,就是为实现多尺度这个想法。当然这样做获得检测框很不准确,后面会做2次 bounding box regression 修正检测框位置。

第三步:anchor的筛选,首先将定位层输出的坐标偏移应用到所有生成的anchor,然后将所有的anchor 按照前景概率/得分 从高到底进行排序。只取前pre_nms_num个anchor(训练阶段),最后anchor通过nms筛选得到post_nms_num(训练阶段)个anchor,也称作roi。

卷积过程:

 a.conv fetaure map 到 intermediate layer 的卷积过程

RPN前面是一个特征提取网络,传给RPN的是一个特征图13*13*256

拿到模型的特征,RPN网络首先加了一个 3 ∗ 3 ∗ 256 ∗ 256 3*3*256*256 3∗3∗256∗256 步长为 1 的卷积层(可能是为了扩大感受野)

这样就会得到 11 ∗ 11 ∗ 256 11*11*256 11∗11∗256 的输出,前面 11 ∗ 11 11*11 11∗11 是图形矩阵,其中每一个点在原图中都是一个很大的区域,256表示这个区域的特征。

在这个区域内可能有目标,为了能更能逼近目标,我们需要3种尺度,和3种形状,就是图中的那9种物体框。假设原图中有一个物体,那我们通过在原图上平移框,就总能找到一个颜色框能正好把物体框在里面(真是厉害这想法),而且尺度啊形状最接近。

那么如何平移的呢?在原图上你一个像素一个像素平移没意义啊,难道要重复提取特征?所以平移必须在特征图上平移,因为特征图最后总能映射回原图。 11 ∗ 11 11*11 11∗11 的特征图区域,在原图中就表示 11 ∗ 11 11*11 11∗11 个大黑框,每个大黑框里面又有9个小颜色框,这样就会产生 11 ∗ 11 ∗ 9 11*11*9 11∗11∗9 个不同位置,不同尺度,不同形状的物体框,基本足够框出所有物体了。

b.intermediate layer 的256维向量后面对应两条分支

  • cls layer 分支是目标和背景的二分类(classification),因为k等于9,所以通过 1 × 1 × 256 × 18 1×1×256×18 1×1×256×18 的卷积核得到 2 × 9 = 18 2×9 = 18 2×9=18 个分数,分别是目标和背景的评分。
  • reg layer分支。如果候选框是目标区域,就去判断该目标区域的候选框位置在哪,这个时候另一条分支就过 1 × 1 × 256 × 36 1×1×256×36 1×1×256×36 的卷积得到 4 × 9 4×9 4×9 个值,每个框包含4个值(x,y,w,h),就是9个候选区域对应的框应该偏移的具体位置 Δ x c e n t e r , Δ y c e n t e r , Δ w i d t h , Δ h e i g h t Δxcenter,Δycenter,Δwidth,Δheight Δxcenter,Δycenter,Δwidth,Δheight。如果候选框不是目标区域,就直接将该候选框去除掉,不再进行后续位置信息的判断操作。这里预测的值都是通过模型不断训练得到的。

c. proposals layer 

proposals layer 3个输入:一个是分类器结果 foreground softmax scores,一个是 anchor 回归 regression: [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] [d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)] [dx​(A),dy​(A),dw​(A),dh​(A)] ,还有一个是 im-info,包含图像缩放的信息。proposal layer 步骤:

  1. 生成 anchors(anchors 的坐标是相对于原图的坐标),然后利用 [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] [d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)] [dx​(A),dy​(A),dw​(A),dh​(A)] 对所有的 anchors 做 bbox regression 回归(这里的 anchors 生成和训练时完全一致)
  2. 按照输入的 foreground softmax scores 由大到小排序 anchors,提取前pre_nms_topN(e.g. 6000) 个anchors,即提取修正位置后的 foreground anchors。
  3. 判断fg anchors是否大范围超过边界,剔除严重超出边界fg anchors,剔除非常小(width<threshold or height<threshold)的 foreground anchors
  4. 进行 nms,按照 nms 后的 foreground softmax scores 由大到小排序fg anchors,提取前 post_nms_topN(e.g. 300) 结果作为 proposal 输出。

总结起来就是:生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals。

anchors的标定规则

  1. 如果 Anchor 对应的 refrence box 与 ground truth 的 IoU 值最大,标记为正样本;
  2. 如果 Anchor 对应的 refrence box 与 ground truth 的 IoU>0.7,标定为正样本。事实上,采用第2个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的 Anchor 对应的 reference box 与 groud truth 的 IoU 不大于0.7,可以采用第一种规则生成.
  3. 负样本标定规则:如果 Anchor 对应的 reference box 与 ground truth 的 IoU<0.3,标记为负样本。
  4. 剩下的既不是正样本也不是负样本,不用于最终训练。
  5. 训练 RPN 的Loss是有 classification loss(即softmax loss)和 regression loss(即L1 loss)按一定比重组成的。
  6. 丢弃跨越边界的 anchorLoss

Loss 

计算 softmax loss 需要的是 anchors 对应的 ground truth 标定结果和预测结果,计算regression loss 需要三组信息:

  1. 预测框,即 RPN 网络预测出的 proposal 的中心位置坐标x,y和宽高w,h;
  2. 锚点 reference box:之前的9个锚点对应9个reference boxes,每一个reference boxes都有一个中心点位置坐标 x a , y a x_a,y_a xa​,ya​ 和宽高 w a , h a w_a,h_a wa​,ha​;
  3. ground truth:标定的框也对应一个中心点位置坐标x,y和宽高w,h.因此计算regression loss和总Loss方式如下:

note 

  • 只有在train时,cls+reg 才能得到强监督信息(来源于ground truth)。即ground truth会告诉 cls+reg 结构,哪些才是真的前景,从而引导cls+reg结构学得正确区分前后景的能力;在 reference 阶段,就要靠 cls+reg 自力更生了。
  • 在train阶段,会输出约2000个proposal,但只会抽取其中256个proposal来训练RPN的cls+reg结构;到了reference阶段,则直接输出最高score的300个proposal。此时由于没有了监督信息,所有RPN并不知道这些 proposal 是否为前景,整个过程只是惯性地推送一波无tag的proposal给后面的Fast R-CNN。
  • RPN的运用使得region proposal的额外开销就只有一个两层网络。
  • two stage型的检测算法在 RPN 之后还会进行再一次的分类任务和边框回归任务,以进一步提升检测精度。
  • 在 RPN 末端,通过对两个分支的结果进行汇总,来实现对 anchor 的初步筛除(先剔除越界的 anchor,再根据 cls 结果通过NMS算法去重)和 初步偏移(根据 bbox reg结果),此时输出的都改头换面叫 proposal 了。
  • RPN之后,proposal 成为 RoI (感兴趣区域) ,被输入 RoIPooling 或 RoIAlign 中进行 size上的归一化。当然,这些都是 RPN网络 之后的操作了,严格来说并不属于 RPN 的范围了。
  • 但是如果只在最后一层 feature map 上映射回原图像,且初始产生的 anchor 被限定了尺寸下限,那么低于最小 anchor 尺寸的小目标虽然被 anchor 圈入,在后面的过程中依然容易被漏检。
  • 但是FPN的出现,大大降低了小目标的漏检率,使得RPN如虎添翼。

从模型训练的角度来看,通过使用共享特征交替训练的方式,达到接近实时的性能,交替训练方式描述为: 1)根据现有网络初始化权值w,训练RPN; 2)用RPN提取训练集上的候选区域,用候选区域训练FastRCNN,更新权值w; 3)重复1、2,直到收敛。 

  •  faster RCNN模型
  1. 测试

 在已经训练好的模型里,输入一张图片,如何通过网络生成检测结果

 如图1所示,Faster RCNN检测部分主要可以分为四个模块:
(1)conv layers。即特征提取网络,用于提取特征。通过一组conv+relu+pooling层来提取图像的feature maps,用于后续的RPN层和取proposal。
(2)RPN(Region Proposal Network)。即区域候选网络,该网络替代了之前RCNN版本的Selective Search,用于生成候选框。这里任务有两部分,一个是分类:判断所有预设anchor是属于positive还是negative(即anchor内是否有目标,二分类);还有一个bounding box regression:修正anchors得到较为准确的proposals。因此,RPN网络相当于提前做了一部分检测,即判断是否有目标(具体什么类别这里不判),以及修正anchor使框的更准一些。
(3)RoI Pooling。即兴趣域池化(SPP net中的空间金字塔池化),用于收集RPN生成的proposals(每个框的坐标),并从(1)中的feature maps中提取出来(从对应位置扣出来),生成proposals feature maps送入后续全连接层继续做分类(具体是哪一类别)和回归。
(4)Classification and Regression。利用proposals feature maps计算出具体类别,同时再做一次bounding box regression获得检测框最终的精确位置

1.1 conv layers

共有13个conv层,13个relu层,4个pooling层
conv:kernel_size=3,padding=1,stride=1
pooling:kernel_size=2,padding=0,stride=2

根据卷积和池化公式可得,经过每个conv层后,feature map大小都不变;经过每个pooling层后,feature map的宽高变为之前的一半。(经过relu层也不变)
综上,一个MxN大小的图片经过Conv layers之后生成的feature map大小为(M/16)x(N/16)

 1.2 RPN

 

RPN结构,有两条线。

上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。

最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取修正后的proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。(只差分具体类别,还有更精准的再次框回归)


1.2.1 anchor

假设原始图片输入大小是MxN,则RPN的输入feature map大小为(M/16)x(N/16)。在feature map上,对于每一个像素点,设置9个预设anchor(作者设置的9个)。这9个anchor的大小按照三种长宽比ratio[1:1,1:2,2:1]设置,具体大小根据输入图像的原始目标大小灵活设置。

设置anchor是为了覆盖图像上各个位置各种大小的目标,那么原图上anchor的数量就是(M/16) x (N/16) x 9。这么多anchor,第一肯定不准确,第二肯定不能要这么多,所以后续还会淘汰一大批以及修正anchor位置。图8可视化后更清晰,这些anchor都会用于后续的分类和回归。

1.2.2 cls layer 分类

 

参照上面原文中的图来讲,首先,在拿到conv layers的feature map后,先经过一个3x3卷积(卷积核个数为256)红色框是一个anchor,所以通过这个卷积层后feature map的通道数也是256,k是anchor个数(文中默认是9)。

(M/16)x(N/16)x256的特征通过1x1卷积得到(M/16)x(N/16)x2k的输出,因为这里是二分类判断positive和negative,所以该feature map上每个点的每个anchor对应2个值,表示目标和背景的概率(为什么有2个,是因为这里是用的softmax,这两个值加起来等于1;也可以用sigmoid,就只需要1个值了)

 Reshape层是技术细节问题,对feature map进行维度变换,使得有一个单独的维度为2,方便在该维度上进行softmax操作,之后再Reshape恢复原状。

 1.2.3 reg layer——回归

(M/16)x(N/16)x256的特征通过1x1卷积得到(M/16)x(N/16)x4k的输出,因为这里是生成每个anchor的坐标偏移量(用于修正anchor),[tx,ty,tw,th]共4个所以是4k。注意,这里输出的是坐标偏移量,不是坐标本身,要得到修正后的anchor还要用原坐标和这个偏移量运算一下才行。

偏移值计算公式:

其中[xa,ya,wa,ha]是anchor的中心点坐标和宽高,[tx.ty,tw,th]是这个回归层预测的偏移量,通过这个公式计算出修正后的anchor坐标[x,y,w,h]。计算如下:

[px,py,pw,ph]表示原始anchor的坐标
[dx,dy,dw,dh]表示RPN网络预测的坐标偏移
[gx,gy,gw,gh]表示修正后的anchor坐标。

还不明白见下图:

 可能会有的疑问:
1、为什么不直接预测修正后的anchor坐标,而是预测偏移量?
(1)如果直接预测修正后的anchor坐标了,那要这个预设anchor有何用?正是因为预测了偏移量,才能和预设anchor联动起来生成修正后的anchor
(2)直接预测框坐标,数量级比较大,难以训练
(3)坐标偏移一方面大小较小,且偏移具有较好的数学公式,求导方便


1.2.4 生成Proposal

如上图Proposal层,这是RPN里最后一个步骤,输入有三个:

    cls层生成的(M/16)x(N/16)x2k向量
    reg层生成的(M/16)x(N/16)x4k向量
    im_info=[M, N,scale_factor]

(1)利用reg层的偏移量,对所有的原始anchor进行修正
(2)利用cls层的scores,按positive socres由大到小排列所有anchors,取前topN(比如6000个)个anchors
(3)边界处理,把超出图像边界的positive anchor超出的部分收拢到图像边界处,防止后续RoI pooling时proposals超出边界。
(4)剔除尺寸非常小的positive anchor
(5)对剩余的positive anchors进行NMS(非极大抑制)
(6)最后输出一堆proposals左上角和右下角坐标值([x1,y1,x2,y2]对应原图MxN尺度)

综上所述,RPN网络总结起来其实就上面四个小标题:
生成anchors–>softmax分类器提取positive anchors–>bbox regression回归positive anchors生成偏移量–>生成最终Proposals


1.3 ROI pooling

RoI Pooling层则负责收集proposal,并计算出proposal feature maps(从conv layers后的feature map中扣出对应位置),输入有两个:
(1)conv layers提出的原始特征feature map,大小(M/16)x(N/16)
(2)RPN网络生成的Proposals,大小各不相同。一堆坐标([x1,y1,x2,y2])


1.3.1 为什么需要RoI pooling

全连接层的每次输入特征size必须是相同的,而这里得到的proposal大小各不相同。传统的有两种解决办法:

    从图像中crop(裁剪)一部分送入网络
    将图像wrap(resize)成需要的大小送入网络

    很明显看到,crop会损失图像完整结构信息,wrap会破坏图像原始形状信息。因此,需要一种能够把所有图像大小整合到一起又不会简单粗暴造成破坏的方法,这里使用的是RoI pooling,由SSP(Spatial Pyramid Pooling)发展而来。

1.3.2 RoI pooling原理

RoI pooling会有一个预设的pooled_w和pooled_h,表明要把每个proposal特征都统一为这么大的feature map
(1)由于proposals坐标是基于MxN尺度的,先映射回(M/16)x(N/16)尺度
(2)再将每个proposal对应的feature map区域分为pooled_w x pooled_h的网格
(3)对网格的每一部分做max pooling
(4)这样处理后,即使大小不同的proposal输出结果都是pooled_w x pooled_h固定大小,实现了固定长度输出,如下图

pooled_w x pooled_h网格,是为了生成相同大小的特征出来,比如有两个proposal,一个大小是7x7,另一个大小是14x14,我现在需要的是7x7的输出,那第一个proposal每个网格就是1x1的,第二个proposal每个网格就是2x2的

 1.4 Classification

 注意这里的分类和RPN中的分类不同,RPN中只是二分类,区分目标还是背景;这里的分类是要对之前的所有positive anchors识别其具体属于哪一类。

从RoI pooling处获取到pooled_w x pooled_h大小的proposal feature map后,送入后续网络,做两件事:

(1)通过全连接层和softmax对所有proposals进行具体类别的分类(通常为多分类)
举例说明:
假设pooled_w和pooled_h都为7,那么这些proposals在经过RoI pooling后的特征向量维度为[7, 7, 256],假设一共输出了300个proposals,那么所有的proposals组合起来维度就是[300,7,7,256],经过最后一个全连接层之后(会有拉平操作),维度应该是[300, 类别数],则该向量就能反应出每个proposal属于每一类的概率有多大。最终就知道每个proposal是属于哪一类,根据proposal索引来找到具体是图上哪个proposal。

(2)再次对proposals进行bounding box regression,获取更高精度的最终的predicted box
举例说明:
同上,假设一共输出了300个proposals,回归这里的全连接层输出维度应该是[300, 300*4],4还是代表偏移量。最终用proposal原始坐标加上偏移量,修正得到最最最终的predicted box结果。
 

2 训练 Train

2.1 训练步骤

Faster RCNN由于是two-stage检测器,训练要分为两个部分进行,一个是训练RPN网络,一个是训练后面的分类网络。为了清晰描述整个训练过程,首先明确如下两个事实:

    RPN网络 = 特征提取conv层(下面简称共享conv层) + RPN特有层(3x3卷积、1x1卷积等)
    Faster RCNN网络 = 共享conv层 + Faster RCNN特有层(全连接层)

详细的训练过程如下:

第一步:先使用ImageNet的预训练权重初始化RPN网络的共享conv层RPN特有层可随机初始化),然后训练RPN网络。训练完后,共享conv层和RPN特有层的权重都更新了。

第二步:根据训练好的RPN网络拿到proposals(和测试过程一样)

第三步:再次使用ImageNet的预训练权重初始化Faster RCNN网络的共享conv层Faster RCNN特有层随机初始化),然后训练Faster RCNN网络。训练完后,共享conv层和Faster RCNN特有层的权重都更新了。

第四步:使用第三步训练好的共享conv层第一步训练好的RPN特有层来初始化RPN网络,第二次训练RPN网络但这次要把共享conv层的权重固定,训练过程中保持不变,只训练RPN特有层的权重。

第五步:根据训练好的RPN网络拿到proposals(和测试过程一样)

第六步:依然使用第三步训练好的共享conv层第三步训练好的Faster RCNN特有层来初始化Faster RCNN网络,第二次训练Faster RCNN网络。同样,固定conv层,只fine tune特有部分

图解如下:

2.2 训练RPN网络

RPN网络训练有两个Loss:

  •     Lcls:softmax loss,用于分类anchors属于前景还是背景(也有说用二分类交叉熵Loss的)
  •     Lreg:smooth L1 loss,用于修正anchor框,前面乘了一个pi*表示只回归有目标的框


    参数详细解释如下(为了方便输入公式,使用word截图)
   
    smooth L1 loss如下:
   

2.3 训练Faster RCNN网络

由于两块网络的loss用的是一样的,所以过程一样,只不过这里是多分类向量维度上有所变化,其他一毛一样。


另:Faster RCNN与SSD的anchor区别在于:
(1)前者在一个特征图上预设了anchor,先进行初步修正与筛选,之后再进行分类与回归
(2)后者在多个特征图上预设了anchor(多尺度),并直接在所有这些anchor上进行分类与回归(单阶段)

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值