前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R-CNN目标检测第三弹(Faster R-CNN)

R-CNN目标检测第三弹(Faster R-CNN)

作者头像
用户1332428
发布2018-03-09 19:02:42
8380
发布2018-03-09 19:02:42
举报
文章被收录于专栏:人工智能LeadAI人工智能LeadAI

今天,重看了 R-CNN 的终极改进版本 Faster R-CNN(NIPS 版)-本文提到的paper,若为特别指明,说的就是此版本。

先说一个学术趣事吧,R-CNN 的 一作是RGB大神,大神的导师也是DPM检测方法的作者;受到微软亚研院 Kaiming HeRGB博士SPP-Net工作的启发,RGB大神博士毕业后在微软 redmond 研究院做出了 Fast R-CNN;而本篇paper,则是Kaiming 和 RGB的合作产生;今年CVPR17 的mask R-CNN也是两位大神的大作。大神们的合作,我等只能膜拜...

闲话以后再扯,我们就来看这一次改进是怎么让 R-CNN faster的。

01 缘起

1.1、Fast R-CNN的不足

尽管 Fast R-CNN通过 ROI Pooling Layer实现了对proposal深度特征的快速提取,又通过multi-loss的联合训练进一步提升了mAP。但是它依旧不完全是一个end-2-end的工作,下面详细列出:

和R-CNN一样,Fast R-CNN的region proposal生成依旧严重依赖于 Selective Search算法(简写为SS算法)。不仅在于SS算法比较耗时,还在于SS算法得到的proposal不一定适合于detection network。

1.2、Fast R-CNN的主要解决手段

针对 Fast R-CNN 存在的上述问题,Faster R-CNN主要采用以下方式来解决:

1、设计专门用于region proposal generating的网络:region proposal networks。该网络和fast r-cnn中的检测网络共享 conv layer的参数,通过anchor box来生成多个 region proposal,并给出每个proposal的object-ness score

2、设计multi-loss来对该 region proposal network进行优化。此外,依次对参数共享的region proposal network和detection network进行交替训练。

本文在Fast R-CNN 的基础上,采用其原有的detection network来对每张图片中的region proposal进行分类和重定位。另一方面,设计了Region Proposal Network 来生成proposal。

下面,我们主要探讨 region proposal network的构造与优化

02 Region proposal network

paper作者希望设计基于CNN model的region生成机制。

A Region Proposal Network(RPN)(也是CNN model)的以任意size的图像作为输入,输出一系列矩形目标proposals,每个proposal都自带一个object-ness score

为了节省计算量,作者将RPN前半部分的卷积层设计为和detection network的卷积层为共享(shared),在最后一层共享的conv layer后,作者设计了如下的类似sliding window的机制来生成proposal,并得到每个proposal的object-ness score。详细如下:

2.1、后续的proposal如何生成?

1、基本的生成流程

为了生成 region proposals,在最后一个共享 conv layer输出的conv feature map上,上下左右滑动一个小型的network。这个network全连接到conv feature map上的 (n,n)大小的子窗口上,对应每个子窗口,network的输出就是一个低维向量(256-d for ZF,512-d for VGG16)。而这个低维向量后面跟了两个分开的全连接层,其中一个是分类层:负责判定子窗口得到的proposal为object的概率,即计算object-ness score;而另一个则是回归层:负责对子窗口的位置信息进行更新(类似于detection network中的),即计算更精确的proposal的位置。

这里的n取3,事实上,这个滑动的network就是(3,3,input_dim,output_dim)的conv 层。

2、Anchors的引入

事实上,上述生成流程中,对每一个(n,n)子窗口,就可以得到关于这个子窗口的 object-ness score和位置信息的更新。但是proposal的size和aspect ratio 可能存在多种情况,例如目标人的height一般就是width的两倍以上,车辆则反过来。如果考虑多种长宽比的子窗口,那么就会出现组合爆炸,变成了真正的dense sample proposal,计算量太高。因此,对每个(n,n)子窗口,paper在提出采用旋转不变的 Anchors:

在每一个 sliding-window location,同时预测 k 个 region proposals,这样一来,分类层会输出k个object-ness score,回归层会输出k个对应的新的位置信息。

这k个proposal是相对 k个 anchor来说的。这里的k个anchor是一些以sliding-window的中心为中心,不同scale和aspect ratio的proposal。这里取3种scale和3种aspect-ratio,那么k=9。

假设conv feature map的大小为 (W,H),那么anchors的个数为 WHK,这是因为在有边界padding的情况下,每个点都是sliding-window location。

一个重要的性质是:每个点的k个anchors,除了中心不同外,高度和宽度均一致。且对每种anchor,从子窗口到256-d的conv连接是共享的,是不随中心变化而变化的。

所以,现在再看k个anchors,实际上就是在conv feature map运行k个不同kernel size的conv 层。每个conv层后面接的就是分类全连接层和回归全连接层。

2.2、如何学习RPN?

RPN的loss其实和 Fast R-CNN中 detection的multi-loss十分类似。区别在于,detection network中的分类错误是对多类别的分类错误,回归错误只针对不是背景的proposal来做;而RPN 中的分类错误是针对 是否为物体的分类错误,回归错误则只针对是物体的anchor来做。这个loss的公式表达为:

$L({p_i},{t_i})=\frac{1}{N_{cls}}\sum_iL_{cls}(p_i, p_i^)+\lambda \frac{1}{N_{reg}}\sum_i p^i L{reg}(t_i, t^*_i)$

上式中的 $p_i$ 和 $p_i^$ 分别代表proposal经过分类层得到的object-ness预测概率和 proposal对应的gt bbox的label(1 or 0),而 $t_i$ 和 $t_i^$ 则是proposal经过回归层预测出的位置信息以及 proposal对应的gt bbox的位置信息。当然这里的位置信息和R-CNN中的bbox regression一样,经过了参数化的。详见paper的第4页。

值得注意的是,这里的regression是针对k种anchors来进行训练的,即覆盖了多种scale和aspect-ratio下的bbox regression,这样做出的预测是更有针对性的。

RPN 训练时的正负样本定义:正样本包含两类:和每个gt bbox的IOU最大的anchor,以及和任意 gt bbox的IOU大于0.7的anchor。负样本为:和所有的 gt bbox的IOU均小于0.3的anchor。对于正样本某anchor,其回归层的回归目标就是那个和它IOU最大的gt bbox的位置信息。

接下来,就是通过类似 hierarchical sampling的方式采集正负样本,进行SGD训练来学习RPN。

2.2.1、一些训练的细节

1、anchor boxes在训练和测试中的使用

由于anchor box是对子窗口进行不同scale和不同aspect-ratio变化得到的,因此存在大量的anchor boxes超出了图像的边界。在训练中,将超出了图像边界的anchor boxes全部忽略。在测试时,也不保留这些超出边界的anchor boxes(这里存疑,文中并未叙述清晰,需要看具体的代码),待得到最终的 proposal后,对于超出图像边界的proposal,截取其在图像内的部分作为proposal。

2、Non-maximum Suppression用于减少proposal

在RPN得到proposal之后,根据每个proposal的object-ness score来执行NMS(使用的IOU阈值为0.7),并留下前2000个proposal,作为detection network的输入

2.3、如何对RPN和detection network 进行联合训练

由于节省计算量的关系,作者将RPN和detection network的前半部分设计为共享的。顺理成章,最好是进行联合训练。正如paper中第4页末尾所言,

需要开发一种技术来学习共享层的参数,而不是学习两个隔离开来的网络。但这并非简单地将RPN和detection network组合在一起进行联合训练,主要是因为:detection network的训练需要固定的object proposal作为输入。很难说,在对RPN进行优化(即逐步改变proposal的生成机制)时同时去优化detection network,因为不一定会收敛。

不过未来可以尝试开发联合学习,paper中给出的是:采用交替优化的四步训练算法:

1、从 imagenet pretrained的网络出发fine-tuning RPN

2、采用第一步得到的RPN来负责proposal generation,从 imagenet pretrained 的网络出发fine-tuning detection network

3、采用第二步得到的detection network的权重来初始化RPN的共享部分,并保持共享部分的权重不变,在第一步得到的RPN的ROI Pooling Layer及其后的层的权重的基础上fine-tuning RPN

4、采用第三步得到的RPN来负责proposal generation,保持共享部分的权重不变,在第二步detection network的FC层权重的基础上fine-tuning detection network。

03 实验分析

3.1、RPN对训练的提升

paper第5页的Table 1清晰展示了实验结果,以下结果说明了训练RPN时multi-loss的重要性

1、训练好RPN后,采用SS算法生成的proposal来训练detection network,然后在测试时采用RPN来生成proposal,mAP相对上面的方法略有下降

2、训练好不带分类输出的RPN后,采用SS算法生成的proposal来训练detection network,然后在测试时采用不刚刚训练的不带分类输出的RPN来生成proposal,mAP有大幅下降,下降的绝对值接近10%以上

3、训练好不带回归输出的RPN后,采用SS算法生成的proposal来训练detection network,然后在测试时采用不刚刚训练的不带回归输出的RPN来生成proposal,mAP有小幅下降,下降的绝对值接近5%以上

3.2、其他

1、采用的detection network的capacity越强,mAP也更高(from ZF-Net to VGG)

2、在整个的检测流程中,因为实现了RPN和detection network的共享,实际上proposal的生成几乎不耗费时间

我个人感觉,今后肯定能出现一个将RPN和detection network结合起来的工作...

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人工智能LeadAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档