敞开生长之旅!这是我参加「日新计划 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 网络概述
backbone
为 vgg16
的 faster 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
)。
Conv layers
论文中
Faster RCNN
虽然支撑恣意图片输入,可是进入Conv layers
网络之前会对图片进行规整化标准操作,如可设定图画短边不超过 600,图画长边不超过 1000,咱们能够假定 MN=1000600M\times N=1000\times 600(假如图片少于该标准,能够边际补 0,即图画会有黑色边际)。
-
13
个conv
层:kernel_size=3, pad=1, stride=1
,卷积公式:N = (W − F + 2P )/S+1
,所以可知conv
层不会改变图片巨细 -
13
个relu
层: 激活函数,增加非线性,不改变图片巨细 -
4
个pooling
层:kernel_size=2,stride=2
,pooling
层会让输出图片变成输入图片的 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 网络
RPN
在 Extractor
(特征提取 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 就引入了检测中常用到的多标准方法。
留意,
generate_anchors.py
生成的仅仅 base anchors,其间一个 框的左上角坐标为 (0,0) 坐标(特征图左上角)的 9 个 anchor,后续还需网格化(meshgrid)生成其他 anchor。同一个 scale,可是不同的 anchor ratios 生成的 anchors 面积理论上是要一样的。
然后运用这 9
种 anchor
在特征图左右上下移动(遍历),每一个特征图上的恣意一个点都有 9
个 anchor
,假定原图巨细为 MxN,通过 Conv layers 下采样 16 倍,则每个 feature map 生成 (M/16)*(N/16)*9
个 anchor
。例如,关于一个标准为 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:1
的 256
个 anchor
,然后再用 CNN
(111\times 1 卷积,卷积通道数 929\times 2) 去判断挑选出来的 256
个 anchor
哪些有方针的 positive anchor
,哪些是没方针的 negative anchor
。
在挑选 1:1
正负样本份额的 anchor
用作 RPN
练习集后,还需求核算练习集数据对应的标签。关于每个 anchor
, 对应的标签是 gt_label
和 gt_loc
。gt_label
要么为 1
(远景),要么为 0
(布景),而 gt_loc
则是由 4
个方位参数 (tx,ty,tw,th)(t_x,t_y,t_w,t_h) 组成,它们是 anchor box
与 ground truth bbox
之间的偏移量,由于回归偏移量比直接回归座标更好。在 Faster RCNN
原文,positive anchor
与 ground truth
之间的偏移量 (tx,ty)(t_{x}, t_{y}) 与标准因子 (tw,th)(t_{w}, t_{h}) 核算公式如下:
参数解说: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
公式解说: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
)如下:
- 关于每张图片,运用它的
feature map
, 核算(H/16) (W/16)9
(大概 20000)个anchor
归于远景的概率,以及对应的方位参数,并选取概率较大的12000
个 anchor; - 运用回归的方位参数,批改这
12000
个anchor
的方位,得到RoIs
; - 运用非极大值((Non-maximum suppression, NMS)按捺,选出概率最大的
2000
个RoIs
。
在 RPN 中,从上万个 anchor 中,选必定数目(2000 或 300),调整巨细和方位生成
RoIs
,用于 ROI Head/Fast RCNN 练习或测验,然后ProposalTargetCreator
再从RoIs
中会中挑选128
个RoIs
用以 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
或许3004
的tensor
)
ROIHead/Fast R-CNN
RPN
仅仅给出了 2000 个 候选框,RoI Head
在给出的 2000 候选框之上持续进行分类和方位参数的回归。ROIHead
网络包含 RoI pooling
+ Classification
(全衔接分类)两部分,网络结构如下:
由于 RoIs
给出的 2000
个 候选框,别离对应 feature map
不同巨细的区域。首要运用 ProposalTargetCreator
挑选出 128
个 sample_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
负责将 128
个 RoI
区域对应的 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 2 个 bins
),实心点代表的是采样点,每个 bin
中有 4
个采样点。咱们通过双线性插值的方法根据采样点周围的四个点核算每一个采样点的值,然后对着四个采样点执行最大池化操作得到当前 bin
的像素值。
RoI Align
具体做法:假定采样点数为 4
,即表示,关于每个 2.972.972.97\times 2.97 的 bin
,平分四份小矩形,每一份取其间心点方位,而中心点方位的像素,采用双线性插值法进行核算,这样就会得到四个小数坐标点的像素值。
更多细节内容能够参阅 RoIPooling、RoIAlign笔记。
ROI Head 练习
RPN 会产生大约 2000 个 RoIs ,ROI Head 在给出的 2000 个 RoIs 候选框基础上持续分类(方针分类)和方位参数回归。留意,这 2000 个 RoIs 不是都拿去练习,而是运用 ProposalTargetCreator(官方源码能够检查类界说) 挑选 128 个 RoIs 用以练习。挑选的规则如下:
- 在和
gt_bboxes
的IoU
大于0.5
的RoIs
内,挑选一些(比方32
个)作为正样本 - 在和
gt_bboxes
的IoU
小于等于0
(或许0.1
)RoIs
内,的挑选一些(比方 128−32=96128 – 32 = 96 个)作为负样本
挑选出的 128
个 RoIs
,其正负样本份额为 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
个左右) 核算概率,并运用方位参数调整猜测候选框的方位,然后再用一遍极大值按捺(之前在 RPN
的ProposalCreator
也用过)。这里留意:
- 在
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_loc
和gt_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
练习或许测验。
其间 AnchorTargetCreator
和 ProposalTargetCreator
类是为了生成练习的方针,只在练习阶段用到,ProposalCreator
是 RPN
为 Fast R-CNN
生成 RoIs
,在练习和测验阶段都会用到。三个 creator
的共同点在于他们都不需求考虑反向传达(因而不同结构间能够共享 numpy
完结)。
参阅材料
- 一文读懂Faster RCNN
- 从编程完结角度学习Faster RCNN
- 你真的学会了RoI Pooling了吗
- Faster RCNN 学习笔记