keras框架:目标检测Faster-RCNN思想及代码

Faster R-CNN是一种基于深度学习的目标检测方法,主要包含四个部分:卷积层、区域提议网络RPN、RoI池化和分类。首先,卷积层提取特征,然后RPN生成候选区域,通过softmax分类和bounding box回归确定提案。RoI池化层将不同大小的提案转换为固定尺寸特征,最后分类层进行目标识别和位置校准。这种方法显著提高了目标检测的速度和准确性。

Faster-RCNN(RPN + CNN + ROI)概念

Faster RCNN可以分为4个主要内容:

  1. Conv layers:作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取 image的feature maps。该feature maps被共享用于后续 RPN层和全连接层。
  2. Region Proposal Networks: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获 得检测框最终的精确位置。
    在这里插入图片描述

整体流程:

在这里插入图片描述

Faster-RCNN:conv layer

Conv layers包含了conv,pooling,relu三种层。共有13个conv层,13个relu层,4个pooling层。
在Conv layers中:

  1. 所有的conv层都是:kernel_size=3,pad=1,stride=1
  2. 所有的pooling层都是:kernel_size=2,pad=1,stride=2

在Faster RCNN Conv layers中对所有的卷积都做了pad处理( pad=1,即填充一圈0),导致原图 变为 (M+2)x(N+2)大小,再做3x3卷积后输出MxN 。正是这种设置,导致Conv layers中的conv层 不改变输入和输出矩阵大小。
在这里插入图片描述
类似的是,Conv layers中的pooling层kernel_size=2,stride=2。 这样每个经过pooling层的MxN矩阵,都会变为(M/2)x(N/2)大小。
综上所述,在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长 宽都变为输入的1/2。
那么,一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)。 这样Conv layers生成的feature map都可以和原图对应起来。

Faster-RCNN:Region Proposal Networks(RPN)

区域生成网络Region Proposal Networks(RPN)

经典的检测方法生成检测框都非常耗时。直接使用RPN生成检测框,是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
在这里插入图片描述
• 可以看到RPN网络实际分为2条线:

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

• 而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取 proposals,同时剔除太小和超出边界的proposals。
• 其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。

anchors

RPN网络在卷积后,对每个像素点,上采样映射到原始图像一个区域,找到这 个区域的中心位置,然后基于这个中心 位置按规则选取9种anchor box。
9个矩形共有3种面积:128,256,512; 3种形状:长宽比大约为1:1, 1:2, 2:1。 (不是固定比例,可调) 每行的4个值表示矩形左上和右下角点坐标。
在这里插入图片描述
遍历Conv layers获得的feature maps,为每一个点都 配备这9种anchors作为初始的检测框。
在这里插入图片描述
这些anchor box都是对应于原图的尺寸,可以直接使用标记的候选框和分类结果进行训练。其中:

  1. 把每个标定的ground-truth box与其重叠最大的anchor box记为正样本。(保证每个ground-truth box 至少对应一个正样本anchor)
  2. 剩余的anchor box与某个ground-truth box重叠大于0.7的记为正样本。(每个ground-truth box可能 会对应多个正样本anchor。但每个正样本anchor只可能对应一个grand-truth box)
  3. 与任意一个标记ground-truth box重叠小于0.3的anchor box记为负样本。
  4. 其余的舍弃。 这样做获得检测框很不准确,通过后面的2次bounding box regression可以修正检测框位置。

softmax判定positive与negative

其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面 有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已。
在这里插入图片描述
可以看到其num_output=18,也就是经过该卷积的输出图像为WxHx18大小。
这也就刚好对应了feature maps每一个点都有9个anchors,同时每个anchors又有可能是positive和 negative,所有这些信息都保存在WxHx(9*2)大小的矩阵。
注意这里的18,后面之所以reshape成为18也是因为对应这18个元素的原因
为何这样做?
后面接softmax分类获得positive anchors,也就相当于初步提取了检测目标候选区域box (一般认为目标在positive anchors中)。

那么为何要在softmax前后都接一个reshape layer?
其实只是为了便于softmax分类。 前面的positive/negative anchors的矩阵,其在caffe中的存储形式为[1, 18, H, W]。而在softmax 分类时需要进行positive/negative二分类,所以reshape layer会将其变为[1, 2, 9xH, W]大小,即 单独“腾空”出来一个维度以便softmax分类,之后再reshape回复原状。

对proposals进行bounding box regression

在这里插入图片描述
可以看到其 num_output=36,即经过该卷积输出图像为WxHx36。 这里相当于feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的变换量:
在这里插入图片描述

Proposal Layer

Proposal Layer负责综合所有变换量和positive anchors,计算出精准的proposal,送入后续RoI Pooling Layer。
Proposal Layer有4个输入:

  1. positive vs negative anchors分类器结果rpn_cls_prob_reshape,
  2. 对应的bbox reg的变换量rpn_bbox_pred,
  3. im_info
  4. 参数feat_stride=16

im_info:对于一副任意大小PxQ图像,传入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]则保存了此次缩放的所有信息。
输入图像经过Conv Layers,经过4次pooling变为WxH=(M/16)x(N/16)大小,其中feature_stride=16则保 存了该信息用于计算anchor偏移量。

Proposal Layer 按照以下顺序依次处理:

  1. 利用变换量对所有的anchors做bbox regression回归
  2. 按照输入的positive softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors, 即提取修正位置后的positive anchors。
  3. 限定超出图像边界的positive anchors为图像边界,防止后续roi pooling时proposal超出图像边界。
  4. 剔除尺寸非常小的positive anchors。
  5. 对剩余的positive anchors进行NMS(non-maximum suppression)。
  6. 之后输出proposal。

注意,由于在第三步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应MxN输 入图像尺度的,这点在后续网络中有用。
严格意义上的检测应该到此就结束了,后续部分应该属于识别了。

RPN网络结构就介绍到这里,总结起来就是:

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

Faster-RCNN:Roi pooling

RoI Pooling概念

RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。
Rol pooling层有2个输入:

  1. 原始的feature maps
  2. RPN输出的proposal boxes(大小各不相同)

为何需要RoI Pooling?
对于传统的CNN(如AlexNet和VGG),当网络训练好后输入的图像尺寸必须是固定值,同时网络输出也 是固定大小的vector or matrix。如果输入图像大小不定,这个问题就变得比较麻烦。
有2种解决办法:

  1. 从图像中crop一部分传入网络将图像(破坏了图像的完整结构)
  2. warp成需要的大小后传入网络(破坏了图像原始形状信息在这里插入图片描述

RoI Pooling原理

新参数pooled_w、pooled_h和spatial_scale(1/16)
RoI Pooling layer forward过程:

  1. 由于proposal是对应MN尺度的,所以首先使用spatial_scale参数将其映射回(M/16)(N/16)大小 的feature map尺度;
  2. 再将每个proposal对应的feature map区域水平分为poold_w * pooled_h的网格;
  3. 对网格的每一份都进行max pooling处理。

这样处理后,即使大小不同的proposal输出结果都是poold_w * pooled_h固定大小,实现了固定长度输出。
在这里插入图片描述

Faster-RCNN: Classification

Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;
同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。
在这里插入图片描述
从RoI Pooling获取到poold_w * pooled_h大小的proposal feature maps后,送入后续网络,做了如下2 件事:

  1. 通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了
  2. 再次对proposals进行bounding box regression,获取更高精度的预测框

全连接层InnerProduct layers:
在这里插入图片描述
输入X和输出Y是固定大小。所以,这也就印证了之前Roi Pooling的 必要性
在这里插入图片描述

代码实现:

因为代码非常多,所以放在资源里面。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值