【目标检测系列】Faster R-CNN

跟着大佬学目标检测系列,→ 传送门


Faster - RCNN 的前世今生

Faster-RCNN是从R-CNN发展而来的,从R-CNN到Fast-RCNN,最后到Faster-RCNN,作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,曾在2010年带领团队获得终身成就奖


一、RCNN

(RCNN 原论文传送门)

RCNN的流程可分为四步:

  • 在图片中生成1K~2K个候选区(使用Selective Search方法得到)
  • 对每个候选区域,使用深度网络提取特征

(这里的4096维视频没说清楚,其实是AlexNet池化层完了之后接的第一层FC的输出作为的特征维度,也就是两层2048,即4096,详见 这篇博客

  • 特征送入每一个类的SVM分类器,判断是否属于该类
  • 使用回归器精细修改候选框位置

尽管RCNN在当时取得了不错的效果,但现在来看,RCNN仍存在许多不足:

二、Fast-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的网络中,经过了最开始的三个步骤后,将经过ROI pooling后得到的特征图展平,经过两个全连接层(这两个FC是并联的,其中一个FC(上图的虚线部分)用于目标概率的预测,另一个FC(上图虚线部分旁边的那个)用于边界框回归参数的预测),得到 RoI feature vector
        候选边界框通过上图的公式得到(宽高、中心点坐标),dx,dy,dw,dh 就是全连接层预测的边界框回归参数(每一类都有4个中,即宽高和中心点坐标)

    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=PwGxPx
v x = G y − P y P h v_{x}=\frac{{G_{y}}-P_{y}}{P_{h}} vx=PhGyPy
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

(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值