跟着大佬学目标检测系列,→ 传送门 ←
Faster - RCNN 的前世今生
Faster-RCNN是从R-CNN发展而来的,从R-CNN到Fast-RCNN,最后到Faster-RCNN,作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,曾在2010年带领团队获得终身成就奖
一、RCNN
RCNN的流程可分为四步:
- 在图片中生成1K~2K个候选区(使用Selective Search方法得到)
- 对每个候选区域,使用深度网络提取特征
(这里的4096维视频没说清楚,其实是AlexNet池化层完了之后接的第一层FC的输出作为的特征维度,也就是两层2048,即4096,详见 这篇博客)
- 特征送入每一个类的SVM分类器,判断是否属于该类
- 使用回归器精细修改候选框位置
尽管RCNN在当时取得了不错的效果,但现在来看,RCNN仍存在许多不足:
二、Fast-RCNN
Fast-RCNN是继RCNN后的又一力作,使用 VGG16 作为网络的 backbone,与RCNN相比,训练时间提快了9倍,测试推理时间快213倍 ,准确率从62%提升到了66%(Pascal VOC 数据集)
Fast-RCNN的流程可分为三步:
- 在图片中生成1K~2K个候选区(使用Selective Search方法得到)
- 将图像输入到网络,得到相应的特征图,将候选框投影到特征图上获取相应的特征矩阵
这一步就是提高速度的原因所在。不同于RCNN,需要将每一个SS算法生成的候选区图片放入网络得到特征,Fast-RCNN直接将整张原图放入网络,得到整个特征图,然后根据对应位置的映射关系,找到候选框在特征图中的位置,就可以得到相应的特征矩阵了。 - 将每个特征矩阵通过 ROI pooling 层缩放到 7x7 大小的特征图,然后将特征图展平,通过一系列全连接层的到预测结果
这里使用的是最大池化下采样的方式缩放。
Fast-RCNN 的损失函数计算过程
[ u ≥ 1 ] 是艾佛森括号,表示当 u ≥ 1 时,其值=1,否则=0。也就是u < 1 时,此时表示这一项是背景,所以不需要计算。当u ≥ 1代表了需要检测的目标时,需要计算。
真实目标的边界框回归参数的计算为:
v
x
=
G
x
−
P
x
P
w
v_{x}=\frac{{G_{x}}-P_{x}}{P_{w}}
vx=PwGx−Px
v
x
=
G
y
−
P
y
P
h
v_{x}=\frac{{G_{y}}-P_{y}}{P_{h}}
vx=PhGy−Py
v
x
=
log
G
w
P
w
v_{x}=\log\frac{{G_{w}}}{P_{w}}
vx=logPwGw
v
x
=
log
G
h
P
h
v_{x}=\log\frac{{G_{h}}}{P_{h}}
vx=logPhGh
(这里的G就是上上个图的绿框,即真实目标候选框)
三、Faster-RCNN
同Fast-RCNN一样,Faster-RCNN也使用VGG16作为backbone,推理速度在GPU达到了5fps(包括候选区的生成),准确率也有进一步的提升
Faster-RCNN的流程可分为三步:
- 将图像输入网络得到相应的特征图
- 使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获取相应的特征矩阵
Faster-RCNN与前两个算法最大的不同,就是这里就不用SS算法生成候选框,而是使用RPN直接在第一步得到的特征图上生成候选框,得到特征矩阵。 - 将每个特征矩阵通过 ROI pooling 层缩放到 7x7 大小的特征图,然后将特征图展平,通过一系列全连接层的到预测结果
其实Faster-RCNN就是RPN+Fast-RCNN
RPN
RPN结构
RPN 生成候选框,就是在特征图(conv feature map)上通过一个 3x3 的滑动窗口(sliding window)滑动,每滑动到一个地方,就生成一个一维的向量(256-d。图上是256,是因为使用的backbone是ZF,ZF网络最后输出的是256维的channel,如果是VGG16,这里就应该是512维),这个向量通过两个全连接层(cls layer ; reg layer)得到目标概率(2k score。因为有 k 个anchor,需要得到每个anchor是背景的概率和是前景的概率)和边界框回归参数(4k coordinates。每个anchor包含 4 个回归参数,即 w、h、x、y)。
anchor boxs 的生成过程:
找到特征图上的滑动窗口(黄色背景图)的中心点(上图的黑点),在原图对应的位置,然后根据特定的长宽比(见下图),就可以生成 k 个 anchor boxs(图示只生成了 3 个作为示例)。
(感受野在VGG那篇博客有写)
特征图与原图中心点的位置关系是:
原
图
中
心
点
的
X
坐
标
=
滑
动
窗
口
中
心
点
的
X
坐
标
×
原
图
的
宽
特
征
图
的
宽
原图中心点的X坐标=滑动窗口中心点的X坐标 \times \frac{原图的宽}{特征图的宽}
原图中心点的X坐标=滑动窗口中心点的X坐标×特征图的宽原图的宽
原
图
中
心
点
的
Y
坐
标
=
滑
动
窗
口
中
心
点
的
Y
坐
标
×
原
图
的
高
特
征
图
的
高
原图中心点的Y坐标=滑动窗口中心点的Y坐标 \times \frac{原图的高}{特征图的高}
原图中心点的Y坐标=滑动窗口中心点的Y坐标×特征图的高原图的高
RPN的损失函数计算过程
Faster-RCNN 的损失函数计算过程
(同Fast-RCNN的损失计算一样)
Faster-RCNN 的训练方法
代码传送门:https://github.com/WZMIAOMIAO/deep-learning-for-image-processing