fastRCNN
继2014年的RCNN之后,Ross Girshick 在 15 年推出 Fast RCNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度。
fast_RCNN.png
- 首先生成候选框,也就是(上图中)红色框
- 通过卷积网图片抽取图片的特征(Conv feature map)也就是图中的白色方块部分
- 接下来是将候选框中部分映射到抽取特征层上
- 随后是 RoI pooliing 层,紧跟一个全连接层
- 最后再经过两个全连接层(FC)分别连接到用于分类 softmax 和用于回归边界的 bbox regression
但是 fastRCNN 有一个问题,就是在第一步获取候选框很耗时。
fasterRCNN
经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RCNN,在结构上,Faster RCNN已经将特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classification都整合在了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显。
faster_RCNN.jpeg
其实我们可以将 faster-RCNN 拆分为两个部分,一部分是 RPN(Region Proposal Network)推荐网络,另一部分图片分类网络。
- 通过Conv layers层对图片提取特征层
- 接下来在Conv layer抽取的特征层上做 sliding,其实就是卷积进行滑动
- 作为 sliding 就相当于抽取特征层上每一个点的特征信息。通过锚框机制可以将特征层每一个点对应到原图片一个区域
- 假设我们特征层是原图缩小 5 倍的结果,就特征层上每一个点对应原图就是的视野范围。但是这样的 区域覆盖能力和多样还是不够,所以这些区域中心,生成不同尺寸和缩放锚框
- 在特征层每一个特征点就对应原图的那些锚框的特征信息,这些信息包含锚框是前景概率还是背景概率信息,另外就是回归信息也就是这个锚框要做什么样修正才能逼近真实的边界框。
-
接下来就是那那些得分高的锚框筛选出来发送给 RoiPooling ,随后就是 FastCNN 一样
Faster_RCNN_anchors.png
RPN 工作原理
我们通过卷积神经网抽取原图特征层(conv feature map),然后我们用卷积核在特征层上进行滑动,卷积层深度为 256 这样互动结果就得到 intermediate layer 中间层,随后就是用两个 卷积来实现的全连接。一个用于分类(cls)(前景还是背景)层,另外就是回归(reg),k 就是对应锚框的个数。2k 表示分类也就是前景和背景,而 4k 表示每一个锚框有 4 坐标。
RPN 是 FasterRCNN 的重点,而锚框又是 RPN 的核心,而且锚框不但和特征层有关系而且和原图有关系,我们需要知道锚框和他们之间关系。一下内容查考了刘镇硕老师免费课程,是如何实现锚框,讲的不错
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 特征层的大小 4 * 4
size_y = 4
size_x = 4
# 原始图片到特征层缩放比
rpn_stride = 8
# 锚框的尺度
scales = [2,4,8]
# 锚框的变形,调整锚框宽高比,但是需要保持锚框的面积不变
ratios = [0.5,1,2]
# 原始图片$ feature \, map \times rnp \,stride$
original_x = np.arange(size_x) * rpn_stride
original_y = np.arange(size_y) * rpn_stride
original_x
array([ 0, 8, 16, 24])
这介绍一个 numpy 好用方法,也就是 meshgrid,这个方法利用我们传入表示行向量和列向量,生成一个这两向量在行和列坐标到矩阵,也就是我们输入坐标向量,这个方法会返回坐标矩阵
F_x,F_Y = np.meshgrid(f_x,f_y)
F_x
array([[ 0, 8, 16, 24],
[ 0, 8, 16, 24],
[ 0, 8, 16, 24],
[ 0, 8, 16, 24]])
F_Y
array([[ 0, 0, 0, 0],
[ 8, 8, 8, 8],
[16, 16, 16, 16],
[24, 24, 24, 24]])
网友评论