敞开生长之旅!这是我参加「日新计划 12 月更文应战」的第3天,点击检查活动概况。

  • Faster RCNN 网络概述
  • Conv layers
  • RPN 网络
    • Anchors
    • 生成 RPN 网络练习集
    • positive/negative 二分类
    • RPN 生成 RoIs(Proposal Layer)
    • RPN 网络总结
  • ROIHead/Fast R-CNN
    • Roi pooling
    • ROI Head 练习
    • ROI Head 测验
  • 概念了解
    • 四类丢失
    • 三个 creator
  • 参阅材料

本文为学习笔记,部分内容参阅网上材料和论文而写的,内容触及 Faster RCNN 网络结构了解和代码完结原理。

Faster RCNN 网络概述

二阶段目标检测网络-Faster RCNN 详解

backbonevgg16faster rcnn 网络结构如下图所示,能够清晰的看到该网络关于一副恣意巨细 PxQ 的图画,首要缩放至固定巨细 MxN,然后将 MxN 图画送入网络;而 Conv layers 中包含了 13 个 conv 层 + 13 个 relu 层 + 4 个 pooling 层;RPN 网络首要通过 3×3 卷积,再别离生成 positive anchors 和对应 bounding box regression 偏移量,然后核算出 proposals;而 Roi Pooling 层则运用 proposals 从 feature maps 中提取 proposal feature 送入后续全衔接和 softmax 网络作 classification(即分类: proposal 是哪种 object)。

二阶段目标检测网络-Faster RCNN 详解

Conv layers

论文中 Faster RCNN 虽然支撑恣意图片输入,可是进入 Conv layers 网络之前会对图片进行规整化标准操作,如可设定图画短边不超过 600,图画长边不超过 1000,咱们能够假定 MN=1000600M\times N=1000\times 600(假如图片少于该标准,能够边际补 0,即图画会有黑色边际)。

  1. 13conv 层:kernel_size=3, pad=1, stride=1,卷积公式:N = (W − F + 2P )/S+1,所以可知 conv 层不会改变图片巨细
  2. 13relu 层: 激活函数,增加非线性,不改变图片巨细
  3. 4pooling 层:kernel_size=2,stride=2pooling 层会让输出图片变成输入图片的 1/2。

所以通过 Conv layers,图片巨细变成 (M/16)∗(N/16)(M/16) \ast (N/16),即:60∗40(1000/16≈60,600/16≈40)60\ast 40(1000/16≈60,600/16≈40);则 Feature Map 标准为 60∗40∗51260\ast 40\ast 512-d (注:VGG16 是512-d, ZF 是 256-d,d 是指特征图通道数,也叫特征图数量),表示特征图的巨细为 60∗4060\ast 40,数量为 512

RPN 网络

二阶段目标检测网络-Faster RCNN 详解

RPNExtractor(特征提取 backbone )输出的 feature maps 的基础之上,先增加了一个 3*3 卷积(用来语义空间转化?),然后运用两个 1x1 的卷积别离进行二分类(是否为正样本)和方位回归。RPN 网络在分类和回归的时分,别离将每一层的每一个 anchor 分为布景和远景两类,以及回归四个位移量,进行分类的卷积核通道数为92(9 个 anchor,每个 anchor 二分类,运用穿插熵丢失),进行回归的卷积核通道数为 94(9个anchor,每个 anchor 有 4 个方位参数)。RPN是一个全卷积网络(fully convolutional network),这样对输入图片的标准就没有要求了。 RPN 完结 positive/negative 分类 + bounding box regression 坐标回归两个使命。

Anchors

RPN中,作者提出了anchors,在代码中,anchors 是一组由 generate_anchors.py 生成的矩形框列表。运转官方代码的 generate_anchors.py 能够得到以下示例输出.这里生成的坐标是在原图标准上的坐标,在特征图上的一个像素点,能够对应到原图上一个 161616\times 16巨细的区域。

[[ -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)(x_{1}, y_{1}, x_{2}, y_{2}) 表矩形左上和右下角点坐标。9 个矩形共有 3 种形状,长宽比为大约为 width:height{1:1,1:2,2:1}width:height \epsilon \{1:1, 1:2, 2:1\} 三种,如下图。实际上通过 anchors 就引入了检测中常用到的多标准方法

二阶段目标检测网络-Faster RCNN 详解

留意,generate_anchors.py 生成的仅仅 base anchors,其间一个 框的左上角坐标为 (0,0) 坐标(特征图左上角)的 9 个 anchor,后续还需网格化(meshgrid)生成其他 anchor。同一个 scale,可是不同的 anchor ratios 生成的 anchors 面积理论上是要一样的。

然后运用这 9anchor 在特征图左右上下移动(遍历),每一个特征图上的恣意一个点都有 9anchor,假定原图巨细为 MxN,通过 Conv layers 下采样 16 倍,则每个 feature map 生成 (M/16)*(N/16)*9anchor。例如,关于一个标准为 6237 的 feature map,有 62379 ≈ 20000 个 anchor,并输出特征图上面每个点对应的原图 anchor 坐标。这种做法很像是暴力穷举,20000 多个 anchor,哪怕是蒙也能够把绝大多数的 ground truth bounding boxes 蒙中。

因而可知,anchor 的数量和 feature map 巨细相关,不同的 feature map 对应的 anchor 数量也不一样。

生成 RPN 网络练习集

在这个使命中,RPN 做的工作就是运用(AnchorTargetCreator)将 20000 多个候选的 anchor 选出 256 个 anchor 进行分类和回归方位。挑选进程如下:

  • 关于每一个 ground truth bounding box (gt_bbox),挑选和它堆叠度(IoU)最高的一个 anchor 作为正样本;
  • 关于剩余的 anchor,从中挑选和恣意一个 gt_bbox 堆叠度超过 0.7 的 anchor ,相同作为正样本;特殊情况下,假如正样本缺乏 128(256 的 1/2),则用负样本凑。
  • 随机挑选和 gt_bbox 堆叠度小于 0.3 的 anchor 作为负样本。 本和正样本的总数为256 ,正负样本份额 1:1

positive/negative 二分类

111\times 1 卷积完结,卷积通道数为 929\times 2(每个点有 9 个 anchor,每个 anchor 二分类,运用穿插熵丢失),后面接 softmax 分类取得 positive anchors,也就相当于开始提取了检测方针候选区域 box(一般以为方针在 positive anchors 中)。所以可知,RPN 的一个使命就是在原图标准上,设置了大量的候选 anchor,并通过 AnchorTargetCreator 类去挑选正负样本比为 1:1256anchor,然后再用 CNN (111\times 1 卷积,卷积通道数 929\times 2) 去判断挑选出来的 256anchor 哪些有方针的 positive anchor,哪些是没方针的 negative anchor

在挑选 1:1 正负样本份额的 anchor 用作 RPN 练习集后,还需求核算练习集数据对应的标签。关于每个 anchor, 对应的标签是 gt_labelgt_locgt_label 要么为 1(远景),要么为 0(布景),而 gt_loc 则是由 4 个方位参数 (tx,ty,tw,th)(t_x,t_y,t_w,t_h) 组成,它们是 anchor boxground truth bbox 之间的偏移量,由于回归偏移量比直接回归座标更好。在 Faster RCNN原文,positive anchorground truth 之间的偏移量 (tx,ty)(t_{x}, t_{y}) 与标准因子 (tw,th)(t_{w}, t_{h}) 核算公式如下:

tx=(x−xa)/wa,ty=(y−ya)/hatw=log(w/wa),th=log(h/ha)tx∗=(x∗−xa)/wa,ty∗=(y∗−ya)/hatw∗=log(w∗/wa),th∗=log(h∗/ha)t_{x} = (x-x_{a})/w_{a}, t_{y}=(y-y_{a})/h_{a} \\\\ t_{w} = log(w/w_{a}), t_{h}=log(h/h_{a}) \\\\ t_{x}^{\ast } = (x^{\ast }-x_{a})/w_{a}, t_{y}^{\ast}=(y^{\ast}-y_{a})/h_{a} \\\\ t_{w}^{\ast } = log(w^{\ast }/w_{a}), t_{h}^{\ast }=log(h^{\ast }/h_{a})

参数解说:where x,y,w,x, y, w, and hh denote the box’s center coordinates and its width and height. Variables x,xax, x_{a},and x∗x^{*} are for the predicted box, anchor box, and groundtruth box respectively (likewise for y,w,hy, w, h).

核算分类丢失用的是穿插熵丢失,核算回归丢失用的是 Smooth_L1_loss。在核算回归丢失的时分,只核算正样本(远景)的丢失,不核算负样本的方位丢失。RPN 网络的 Loss 核算公式如下:

丢失函数:L1 loss, L2 loss, smooth L1 loss

二阶段目标检测网络-Faster RCNN 详解

公式解说:Here, ii is the index of an anchor in a mini-batch and pip_{i} is the predicted probability of anchor i being an object. The ground-truth label pi∗p_i^{\ast} is 1 if the anchor is positive, and is 0 if the anchor is negative. tit_{i} is a vector representing the 4 parameterized coordinates of the predicted bounding box, and ti∗t_i^* is that of theground-truth box associated with a positive anchor.

RPN 生成 RoIs(Proposal Layer)

RPN 网络在自身练习的一起,还会由 Proposal Layer 层产生 RoIs(region of interests)给 Fast RCNN(RoIHead)作为练习样本。RPN 生成 RoIs 的进程( ProposalCreator )如下:

  1. 关于每张图片,运用它的 feature map, 核算 (H/16) (W/16)9(大概 20000)个 anchor 归于远景的概率,以及对应的方位参数,并选取概率较大的 12000 个 anchor;
  2. 运用回归的方位参数,批改这 12000anchor 的方位,得到RoIs
  3. 运用非极大值((Non-maximum suppression, NMS)按捺,选出概率最大的 2000RoIs

在 RPN 中,从上万个 anchor 中,选必定数目(2000 或 300),调整巨细和方位生成 RoIs,用于 ROI Head/Fast RCNN 练习或测验,然后 ProposalTargetCreator 再从 RoIs 中会中挑选 128RoIs 用以 ROIHead 的练习)。

留意:RoIs 对应的标准是原图巨细,一起在 inference 的时分,为了提高处理速度,12000 和 2000 别离变为 6000 和 300。Proposal Layer 层,这部分的操作不需求进行反向传达,因而能够运用 numpy/tensor 完结

RPN 网络总结

  • RPN 网络结构:生成 anchors -> softmax 分类器提取 positvie anchors -> bbox reg 回归 positive anchors -> Proposal Layer 生成 proposals
  • RPN 的输出:RoIs(region of interests)(形如 20004 或许 3004tensor

ROIHead/Fast R-CNN

RPN 仅仅给出了 2000 个 候选框,RoI Head 在给出的 2000 候选框之上持续进行分类和方位参数的回归。ROIHead 网络包含 RoI pooling + Classification(全衔接分类)两部分,网络结构如下:

二阶段目标检测网络-Faster RCNN 详解

由于 RoIs 给出的 2000 个 候选框,别离对应 feature map 不同巨细的区域。首要运用 ProposalTargetCreator 挑选出 128sample_rois, 然后运用了 RoI Pooling 将这些不同标准的区域全部 pooling 到同一个标准 777\times 7 上,并输出 777\times 7 巨细的 feature map 送入后续的两个全衔接层。两个全衔接层别离完结类别分类和 bbox 回归的作用:

  • FC 21 用来分类,猜测 RoIs 归于哪个类别(20个类+布景)
  • FC 84 用来回归方位(21个类,每个类都有4个方位参数)

论文中之所以设定为 pooling 成 77 的标准,其实是为了网络输出是固定巨细的vector or matrix,然后能够共享 VGG 后面两个全衔接层的权重。当一切的 RoIs 都被pooling 成(51277)的 feature map 后,将它 reshape 成一个一维的向量,就能够运用 VGG16 预练习的权重来初始化前两层全衔接(FC 4096)。

Roi pooling

RoI pooling 负责将 128RoI 区域对应的 feature map 进行截取,然后运用 RoI pooling 层输出 777\times 7 巨细的 feature map,送入后续的全衔接网络。从论文给出的 Faster R-CNN 网络结构图中,能够看到 Rol pooling 层有 2 个输入:

  • 原始的 feature maps
  • RPN 输出的 RoIs (proposal boxes, 巨细各不相同)

RoI Pooling 的两次量化进程

(1) 由于 proposals是对应 MNM\times N 的原图标准,所以在原图上生成的 region proposal 需求映射到 feature map 上(坐标值缩小 16 倍),需求除以 16/3216/32(下采样倍数),这时分鸿沟会呈现小数,天然就需求量化。 (2) 将 proposals 对应的 feature map 区域水平划分成 kkk\times k (777\times 7) 的 bins,并对每个 bin 中均匀选取多少个采样点,然后进行 max pooling,也会呈现小数,天然就产生了第二次量化。

Mask RCNN 算法中的 RoI Align 怎么改进:

ROI Align 并不需求对两步量化中产生的浮点数坐标的像素值都进行核算,而是规划了一套优雅的流程。如下图,其间虚线代表的是一个 feature map,实线代表的是一个 roi (在这个例子中,一个 roi 是分成了 222\times 2bins),实心点代表的是采样点,每个 bin 中有 4 个采样点。咱们通过双线性插值的方法根据采样点周围的四个点核算每一个采样点的值,然后对着四个采样点执行最大池化操作得到当前 bin 的像素值。

二阶段目标检测网络-Faster RCNN 详解

RoI Align 具体做法:假定采样点数为 4,即表示,关于每个 2.972.972.97\times 2.97bin平分四份小矩形,每一份取其间心点方位,而中心点方位的像素,采用双线性插值法进行核算,这样就会得到四个小数坐标点的像素值。

更多细节内容能够参阅 RoIPooling、RoIAlign笔记。

ROI Head 练习

RPN 会产生大约 2000 个 RoIs ,ROI Head 在给出的 2000 个 RoIs 候选框基础上持续分类(方针分类)和方位参数回归。留意,这 2000 个 RoIs 不是都拿去练习,而是运用 ProposalTargetCreator(官方源码能够检查类界说) 挑选 128 个 RoIs 用以练习。挑选的规则如下:

  • 在和 gt_bboxesIoU 大于 0.5RoIs 内,挑选一些(比方 32 个)作为正样本
  • 在和 gt_bboxesIoU 小于等于 0(或许 0.1RoIs 内,的挑选一些(比方 128−32=96128 – 32 = 96 个)作为负样本

挑选出的 128RoIs,其正负样本份额为 3:1,在源码中为了便于练习,还对他们的 gt_roi_loc 进行标准化处理(减去均值除以标准差)。

  • 关于分类问题, 和 RPN 一样,直接运用穿插熵丢失
  • 关于方位的回归丢失,也采用 Smooth_L1 Loss, 只不过只对正样本核算丢失,而且是只对正样本中的对应类别的 44 个参数核算丢失。举例来说:
    • 一个 RoI 在通过 FC84 后会输出一个 84 维的 loc 向量。 假如这个 RoI 是负样本, 则这 84 维向量不参加核算 L1_Loss
    • 假如这个 RoI 是正样本,且归于 类别 kk, 那么向量的第 (k4,k4+1,k4+2,k4+3)(k4,k4+1 ,k4+2, k4+3)44 方位的值参加核算丢失,其他的不参加核算丢失。

ROI Head 测验

ROI Head 测验的时分对一切的 RoIs(大概 300 个左右) 核算概率,并运用方位参数调整猜测候选框的方位,然后用一遍极大值按捺(之前在 RPNProposalCreator 也用过)。这里留意:

  • RPN 的时分,现已对 anchor 做了一遍 NMS,在 Fast RCNN 测验的时分,还要再做一遍,所以在Faster RCNN结构中,NMS操作总共有 2 次
  • RPN 的时分,现已对 anchor 的方位做了回归调整,在 Fast RCNN 阶段还要对 RoI 再做一遍。
  • RPN 阶段分类是二分类,而 Fast RCNN/ROI Head 阶段是 21 分类。

概念了解

在阅览 Faster RCNN 论文和源码中,咱们经常会触及到一些概念的了解。

四类丢失

在练习 Faster RCNN 的时分有四个丢失:

  • RPN 分类丢失:anchor 是否为远景(二分类)
  • RPN 方位回归丢失:anchor 方位微调
  • RoI 分类丢失:RoI 所属类别(21 分类,多了一个类作为布景)
  • RoI 方位回归丢失:持续对 RoI 方位微调

四个丢失相加作为最后的丢失,反向传达,更新参数

三个 creator

Faster RCNN 官方源码中有三个 creator 类别离完结不同的功用,不能弄混,各自功用如下:

  • AnchorTargetCreator : 负责在练习 RPN 的时分,从上万个 anchors 中挑选一些(比方 256 )进行练习,并使得正负样本份额大概是 1:1。一起给出练习的方位参数方针,即回来 gt_rpn_locgt_rpn_label
  • ProposalTargetCreator: 负责在练习 RoIHead/Fast R-CNN 的时分,从 RoIs 挑选一部分(比方 128 个,正负样本份额 1:3)用以练习。一起给定练习方针, 回来(sample_RoI, gt_RoI_loc, gt_RoI_label)。
  • ProposalCreator: 在 RPN 中,从上万个 anchor 中,挑选必定数目( 2000 或许 300 ),调整巨细和方位,生成 RoIs ,用以 Fast R-CNN 练习或许测验。

其间 AnchorTargetCreatorProposalTargetCreator 类是为了生成练习的方针,只在练习阶段用到,ProposalCreatorRPNFast R-CNN 生成 RoIs ,在练习和测验阶段都会用到。三个 creator 的共同点在于他们都不需求考虑反向传达(因而不同结构间能够共享 numpy 完结)。

参阅材料

  • 一文读懂Faster RCNN
  • 从编程完结角度学习Faster RCNN
  • 你真的学会了RoI Pooling了吗
  • Faster RCNN 学习笔记