深度学习笔记----Faster R-CNN(持续更新)

Faster R-CNN论文地址:https://arxiv.org/abs/1506.01497

介绍

Faster R-CNN整体网络结构如下:

  • Conv layers
    提取input image的特征图(feature maps),用于后续的RPN层和RoI Pooling层

  • RPN(Region Proposal Networks)
    生成region proposals(可能包含物体的框),判断框内的是属于物体或者背景(用的是二分类网络),bounding box regression修正anchor box(锚点+边框长宽)

  • RoI Pooling
    利用RPN生成的候选框和Conv layers最后一层得到的feature maps,得到固定大小的proposal feature maps,进入到后面可利用全连接操作来进行目标识别和定位

  • Classifier
    利用Softmax进行具体类别的分类,同时,利用L1 Loss完成bounding box regression回归操作获得物体的精确位置
    在这里插入图片描述

Conv layers

采用迁移学习的思想,可采用一些现成的网络架构进行构建,如最早用于 Faster R-CNN的在ImageNet上训练的 ZF 和 VGG,其后的ResNet和DenseNet以及Inception V3,Inception-ResNet等网络架构进行特征提取,最终输出卷积特征图,其分辨率比input image小了很多,但更深.,特征图的 width 和 height 由于卷积层间的池化层而降低,而 depth 会因为卷积层的卷积核filters数量而增加。

RPN(Region Proposal Networks)

在这里插入图片描述
RPN网络把一个任意尺度的图片作为输入,输出一系列的矩形object proposals,每个object proposals都带一个objectness score。
RPN是Faster R-CNN的最关键部分及难点,首先我们必须明确RPN层是如何工作的:

anchors机制

我们知道特征图是由Conv Layers经过多次的卷积池化(下采样)得到的,那么特征图上的每一个点相当于是原图一个区域的“映射”(感受野),这些点就是论文中所指的anchor,即锚点;以feature maps上的每一个锚点映射回映射回原图的感受野的中心点当成一个基准点,然后围绕这个基准点选取k个不同scale、aspect ratio的anchor,这样在一张特征图上就可以衍生出一些列的框,可称之为“锚框”。论文中3个scale(三种面积{ 1282, 2562, 5212 }),3个aspect ratio( {1:1,1:2,2:1} )
在这里插入图片描述
在这里插入图片描述
这些衍生出来的一系列的框和物体的框(ground truth bound)不是完全重合的甚至是完全不重叠的,要对这些衍生出来的框进行删减,进而对保留下来的框进行调整(平移和大小缩放)才会和物体框接近进而重合。
所以对于生成的每一个框都需要考虑两个问题:

  • 这个框是否包含物体?可以用**交并比(IoU,intersection-over-union)**来判断
    在这里插入图片描述
  • 这个框与真正的物体框的差距有多大?可以用回归梯度(可以由RPN网络中回归分支部分的预测值计算得到)来衡量,一个candidate bound的回归梯度可以用以下公式计算:
tx = (cx - cxa) / (x2_anc - x1_anc)
ty = (cy - cya) / (y2_anc - y1_anc)
tw = np.log((gta[bbox_num, 1] - gta[bbox_num, 0]) / (x2_anc - x1_anc))
th = np.log((gta[bbox_num, 3] - gta[bbox_num, 2])) / (y2_anc - y1_anc)

其中:
(1)(x2_anc - x1_anc):衍生宽的宽度;(y2_anc - y1_anc):衍生宽的高度
(2)tx,ty是用来对中心点进行修正(平移参数);tx:中心点x轴相差的距离与衍生框宽度的比例,ty:中心点y轴相差的距离与衍生框高度的比例
(3)tw,th是对边框的宽度和高度进行修正(伸缩参数);tw:物体所在边框宽度与衍生框之间的比率,th:物体所在边框高度与衍生框之间的比率

RPN内部结构和工作细节

在这里插入图片描述

内部结构

RPN 输入是卷积特征图,输出是生成的 proposals。在内部,RPN 利用所有的anchors得到的参考框,输出一系列objecs 的良好的 proposals,针对每个 anchor,都有两个不同的输出:

  • 对于分类层,每个 anchor 输出两个预测值:anchor 是背景(background,非object)的 score 和 anchor 是前景(foreground,object) 的 score,利用 object score,去滤出将要用于第二阶段的效果不佳的 boxes
  • 对于回归层,也可以叫边界框调整层,每个 anchor 输出 4 个预测值:Δxcenter,Δycenter,Δwidth,Δheight,即调整 anchors的边框来得到最终的 proposals

RPN 是全卷积(full conv) 网络,其采用基础网络Conv layers输出的卷积特征图作为输入。如下图,首先,采用 256 channel,3×3 kernel 的卷积层继续提取特征,然后是两个并行的2k channel 1×1 kernel和4k channel 1×1 kernel的卷积层,该卷积层的 channels 数量取决每个点的 anchors 的数量k。所以最后在分类层和回归层上为同样大小,深度为2k和4k的Tensor,相当于计算得到了所有锚框的分类信息及其所需的边框修正信息。

在这里插入图片描述
在每个滑动窗口位置,我们同时预测多个region proposals,其中每个位置的最大可能建议的数量表示为k,换句话说,对于每个3 * 3 窗口,作者假定它来自 9 种不同原始区域的池化,但是这些池化在原始图片中的中心点,都完全一样。这个中心点,就是刚才提到的,3 * 3 窗口中心点所对应的原始图片中的中心点。如此一来,在每个窗口位置,我们都可以根据 9 个不同长宽比例、不同面积的 anchor,逆向推导出它所对应的原始图片中的一个区域,这个区域的尺寸以及坐标,都是已知的。而这个区域,就是我们想要的 proposal regions。对于每一个proposal,输出六个参数:a)每个 proposal 和 ground truth 进行比较得到的前景概率和背景概率(2个);b)由于每个 proposal 和 ground truth 位置及尺寸上的差异,从 proposal 通过平移放缩得到 ground truth 需要的 4 个平移放缩参数
所以回归层有4 * k输出来编码k个box的坐标(可能是一个角的坐标(x,y)+width+height),二分类层输出2 * k的分数来估计每个proposal是object的概率或者背景的概率。这k个proposals是k个参考框的参数化,默认情况下,我们使用3个尺度和3个纵横比,在每个滑动位置上产生k=9个锚框。对于W *H大小的feature maps,总共有W * H * k个锚框
在这里插入图片描述

训练过程

由RPN的内部结构可知,RPN 有两种类型的预测值输出:二值分类(object or background)和边界框回归调整。

  • 1.训练时,对所有的 anchors 进行过滤和标记.:与 ground truth object 边界框的 Intersection over Union (IoU) 最大或大于 0.7 的 anchors 作为 foreground;小于 0.3的作为 background;其他的anchors对训练目标没有任何作用,不用于最终训练
  • 2.随机采样 anchors 来生成batchsize如256的 mini-batch,尽可能的保持 foreground 和 background anchors 的比例平衡;
  • 3.RPN 对 mini-batch 内的所有 anchors 采用 binary cross entropy 来计算分类 loss;
  • 4.对 mini-batch 内标记为 foreground 的 anchros 计算回归 loss(根据 foreground anchor 和其最接近的 ground truth object,计算将 anchor 变换到 object ground truth 的修正值 correct Δ,进而计算Smooth L1 loss)
    参照Fast R-CNN中的多任务损失最小化目标函数,一张图像的损失函数定义为:
    在这里插入图片描述
    这里的i在一个批量中一个锚点的索引,pi是锚点i是一个目标的概率。如果锚点是正的,标签pi* 是1,如果是负的则为0。ti是代表边框坐标4个参数的向量,ti * 是与正锚点相关的真值。pi* 用于只计算正锚点框损失,不计算负的,表示这些regressor的loss指针对正样本而言,因为负样本时pi*=0该项被消去。
非极大值抑制(Non-maximum suppression)

Anchors的衍生框之间一般是有重叠的overlap,因此,相同 object 的 proposals 也存在重叠,为解决重叠问题,采用NMS法丢弃与一个高score的proposal间IoU大于预设阈值(一般设置为0.6)的一些proposals。NMS 获取按照分数排序的proposal列表并对已排序的列表进行迭代,丢弃那些 IoU 值大于某个预定义阈值的proposals,并提出一个具有更高分数的建议。NMS 处理后,根据 score 对 topN个 proposals 排序
在这里插入图片描述
在这里插入图片描述

具体计算流程
计算锚点

(1)对输入图片进行rescale,控制图片短边为指定长度;
(2)根据rescale后的尺寸计算特征图尺寸,其尺寸取决于网络结构;
(3)读取图片信息里包含的bounding box(可能有多个),把bbox中的x1,x2,y1,y2分别通过rescale比例缩放,逐个存入gta数组中(gta = np.zeros((num_bboxes, 4));
(4)定义3种anchor_size,3种anchor_ratios,共9种大小不同形状不同的anchor box;
(5)以1 * 1的窗口扫描feature maps,每一个窗口就是一个锚点,也是anchor的中心;
(6)对锚点坐标放大映射到经过rescale的图片上的实际坐标;
(7)根据实际坐标计算该anchor的x1,x2,y1,y2(忽略掉超出图片范围的);

计算anchor和gt的匹配度

(1)遍历gta里的bounding box,与每一个anchor求IoU;
(2)如果某一个anchor的IoU大于best_iou_for_bbox[bbox_num]或者大于我们设定的阈值,就会去计算gta和该anchor的中心点坐标,再通过中心点坐标和bbox坐标,计算出anchor的x,y,w,h四个值的梯度值tx,ty,tw,th,作为regression的target;

  • 如果IoU介于最大和最小阈值之间:设定bbox_type为neutral;
  • 如果IoU大于当前gta的最大值:则更新当前gta的最匹配anchor,最大IoU,最优Region坐标,最优梯度;
  • 如果IoU仅大于当前IoU阈值:设定设定bbox_type为pos(默认为neg),当前bbox的匹配anchor数+=1;考虑是否要更新该anchor下的最佳交集和最佳梯度;
给anchor打标签

(1)根据bbox_type对本anchor进行打标,y_is_box_valid和y_rpn_overlap分别定义了这个anchor是否可用和是否包含对象,注意保证每个bounding box都至少有一个anchor与之对应;
(2)对pos和neg的样本进行均匀抽样,返回两个numpy数组y_rpn_cls,y_rpn_regr:分别用于确定anchor是否有效,是否包含物体,和及其对应的回归梯度,每次抽取一部分作为训练目标;
(3)RPN层:通过1 * 1的窗口在特征图上滑过,生成了num_anchors数量的channel,每个channel包含特征图(w*h)个sigmoid激活值,表明该anchor是否可用,与我们刚刚计算的y_rpn_cls对应;同样的方法,得到x_regr与刚刚计算的y_rpn_regr对应;更新参数,训练rpn模型,最后预测得到region proposals

def rpn(base_layers,num_anchors):
    x = Convolution2D(512, (3, 3), padding='same', activation='relu', kernel_initializer='normal', name='rpn_conv1')(base_layers)

    x_class = Convolution2D(num_anchors, (1, 1), activation='sigmoid', kernel_initializer='uniform', name='rpn_out_class')(x)
    x_regr = Convolution2D(num_anchors * 4, (1, 1), activation='linear', kernel_initializer='zero', name='rpn_out_regress')(x)

    return [x_class, x_regr, base_layers]

RoI Pooling

经RPN层后,输出一批proposals,结合Conv Layers输出的feature maps,可以利用RoI Pooling 对每个 大小不同形状不同的proposal 提取特征输出等长度的特征再进行分类及定位。RoI的原理继承了SPP-Net的思想,具体可看之前的blog:
https://blog.csdn.net/weixin_41065383/article/details/90408039

R-CNN – Region-based CNN

R-CNN 是 Faster R-CNN 框架中的最后一个步骤
R-CNN 有两个不同的输出:

  • 对每个 proposal 分类,其中类别包括一个 background 类(用于去除不良 proposals);
  • 根据预测的类别class,更好的调整 proposal 边界框.

在 Faster R-CNN 论文中,R-CNN 对每个 proposal 的特征图,拉平flatten,并采用 ReLU 和两个大小为 4096 维的全连接层进行处理.
然后,对每个不同 objects 采用两个不同的全连接层处理:

  • 一个全连接层有 N+1 个神经单元,其中 N 是类别 class 的总数,包括 background class;
  • 一个全连接层有 4N 个神经单元. 回归预测输出,得到 N 个可能的类别 classes 分别预测 Δcenterx, Δcentery, Δwidth, Δheight
训练过程
  • R-CNN 的目标基本上是与 RPN 目标的计算是一致的,但需要考虑不同的可能的 object 类别 classes,而非仅考虑是否为object;
  • 由于 R-CNN 全连接网络对每个类别class 仅输出一个预测值,当计算边框回归loss 时需谨慎. 当计算 loss 时,只需考虑正确的类别;
  • 类似于 RPNs 的 losses,随机采用一个平衡化的 mini-batch=64,其中,25% 的 foreground proposals(具有类别class) 和 75% 的background proposals,对于选定的 proposals,分类 loss 采用 multi-class entropy loss;对于 25% 的 foreground proposals 采用 Smooth L1 loss 计算其与 ground truth box 的差距
后处理

采用 class-based NMS.:主要是通过对 objects 根据类别class 分组,然后根据概率排序,并对每个独立的分组采用 NMS 处理,最后再放在一起。
最终得到的 objects 列表,仍可继续通过设定概率阈值的方式,来限制每个类的 objects 数量

评价

指定 IoU 阈值对应的 Mean Average Precision (mAP),如 mAP@0.5

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值