目标检测之Faster RCNN
文章目录
前言
Ross B. Girshick在2016年提出Faster RCNN,在结构上,Faster RCNN 使用backbone对图片的进行特征抽取(feature extraction),然后proposal提取,bounding box regression(rect refine),classification都整合在了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显。Faster RCNN是截止目前,RCNN系列算法的最杰出产物,two-stage中最为经典的物体检测算法。推理第一阶段先找出图片中待检测物体的anchor矩形框(对背景、待检测物体进行二分类),第二阶段对anchor框内待检测物体进行分类Faster RCNN原文
一、Faster RCNN的结构
结构如下图所示:
二、分析
1.主要组成部分
依作者看来,如图1,Faster RCNN其实可以分为4个主要内容:
1、Backbone。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层构成的backbone上图中的conv layers , 提取image的feature maps。这些feature maps被共享用于后续RPN层和全连接层。
2、RPN(Region Proposal Network)层。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获得检测框最终的精确位置。
所以本文根据上述4个结构作为切入点介绍Faster R-CNN网络。
2.Conv layers(backbone)
由上图所示:输入图片的尺寸为 P*Q, 缩放至固定大小MxN,然后将MxN图像送入网络;
首先经过Conv layers, Conv layers中包含了13个conv层+13个relu层+4个pooling层;经过backbone得到feature maps,Conv layers中的所有的卷积(conv层)在进行卷积操作之前都会做扩边处理( pad=1,即填充一圈0),这使得每个卷积前,原图变为 (M+2)x(N+2)大小,然后经过3x3卷积,原图就又变成了MxN,而且每个经过pooling层的MxN尺寸的矩阵,都会变为(M/2)x(N/2)大小。在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长宽都变为输入的1/2。那么一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)!
论文中:
1、所有的conv层都是:kernel_size=3,pad=1,stride=1
2、所有的pooling层都是:kernel_size=2,pad=0,stride=2
3.RPN
然后就是进入RPN网络,RPN网络实际分为2个进程,一条通过softmax分类anchors,对anchors分类获得positive和negative分类,一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。在介绍RPN网络之前,我们先看下原文中的RPN结构图,如图3。
在原文中,其Conv Layers最后的conv5层输出维度为num_output=256,对应生成256张特征图,所以相当于feature map中的每个点都是256-dimensions。(为什么要说每个点都是256-dimensions,这与下面我们将要介绍的anchor有关。)在conv5之后,做了3x3卷积(图2所示),且num_output=256,相当于每个点又融合了周围3x3的空间信息,同时维度256-d不变(如图3的红框),如果原图的尺寸为800x600,下采样16倍后,feature map每个点设置9个Anchor,所以输出的feature map size= 50x38 :(800/16)x(600/16) ,这里的计算结果向上取整。所以anchor的数量为50x38x9。
anchors
提到RPN网络,就不得不说anchors。所谓anchors,实际上就是一组需要生成的矩形。每个像素点都要生成9个长宽比不同的anchor,这9个矩形 anchor 共有3种形状,长宽比为大约为1:1,1:2,2:1。实际上通过anchors就引入了检测中常用到的多尺度方法,该模型在conv5之后做了3x3卷积的feature map设置anchor,设置的anchor大小基本可以覆盖原图。 下图展示anchors。
我们继续分析图3中的内容,conv feature map 是我们经过3x3卷积之后得到的feature map,它的维度是256的,然后经过两个分支,分别得到了cls layer和reg layer,这分别对应图2中的上下两个分支,上面的分支经过1x1卷积核得到的输出维度是2•k scores,下面的分支经过1x1卷积核得到的输出维度是4•k scores。这里k代表每个点anchor的数量,论文中为默认k=9。因为每个anhcor要分positive和negative,所以每个点由256d feature转化为cls=2•k scores;而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4•k coordinates,到这里两个分支应该已经介绍详细。
如果设 W=M/16,H=N/16,上面的分支经过1x1卷积,输出图像为WxHx18大小,刚好对应了feature maps每一个点都有9个anchors,同时每个anchors又有可能是positive和negative,这些信息都保存在WxHx(9*2)大小的矩阵。下面的分支经过1x1卷积,输出图像为WxHx36,相当于feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的偏移量。
分支1: 为了便于softmax分类,在softmax前后都接一个reshape layer而在softmax分类时需要进行positive/negative二分类,所以reshape layer会将其变为[1, 2, 9xH, W]大小,以便softmax分类,然后再reshape回复原状。
分支2: 分支2输出的feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的偏移量。这个WxHx36的矩阵的作用是用来做bounding box regression,计算每个Anchor的偏移量
bounding box regression 分支2输出WxHx36的矩阵 包含9个anchor的四个信息量,对于窗口一般使用四维向量(x,y,w,h)表示,该网络是通过引入真实框架(目标GT)来计算这个偏移量的, 故在推理阶段,该分支就可以输出这个偏移量,进而得到proposal。
4.Proposal层
Proposal层则负责综合分支1输出的positive anchors(前面softmax分类好的anchors)和分支2计算完成的对应bounding box regression偏移量来获取精准的proposals,同时剔除太小和超出边界的proposals(这个很重要)。im_info:PxQ图像,传入Faster RCNN前reshape到MxN,im_info=[M, N, scale_factor],保存了此次缩放的所有信息。
1、生成anchors,利用偏移量对所有的anchors做bbox regression回归(这里的anchors生成和训练时完全一致)
2、然后按照输入的positive softmax scores由大到小排序anchors,提取前6000个anchors,即提取修正位置后的positive anchors。
3、限定超出图像边界的positive anchors为图像边界,防止后续roi pooling时proposal超出图像边界。
4、剔除尺寸非常小的positive anchors,对剩余的positive anchors进行NMS(nonmaximum suppression)。
5、positive anchors对应的bbox reg的前300个结果作为proposal输出。
输出proposal=[x1, y1, x2, y2],这里输出的proposal是对应MxN输入图像尺度的,具体操作可以分析源码。
5.Roi Pooling
而Roi Pooling层则收集proposal,并计算出proposal feature maps送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。
而Roi Pooling层是针对什么问题呢?
因为前面对positive anchors进行bounding box regression,这样获得的proposals是大小形状各不相同的,所以提出了Roi Pooling,那么Roi Pooling是如何操作的?
Roi Pooling层输入:
1、原始的feature maps
2、RPN输出的proposal boxes(大小各不相同)
因为之后的classification分类网络的输入尺寸固定为7x7,所以对于任意大小的输入,都用7x7的网格覆盖原区域。在7x7中每个格子上,取当前格子覆盖区域内的最大值(max pooling)。任意大小的Proposal,就这样都pooling成了7x7的尺寸。
具体操作:Proposal层得到的proposal是MxN尺度的,所以用spatial_scale参数将其映射回(M/16)x(N/16)尺度;再将每个proposal对应的feature map的区域水平分为 pool_w*pool_h 的网格;对网格的每一份都进行max pooling处理,最终pooling成了7x7的尺寸,输入到分类网络。
6.classification
Classification层利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别,输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。
训练阶段参考文章