DeepLearning · 2019年11月21日 0

DL-004-Faster RCNN

faster,一听就是有比较才有的er,所以说到faster RCNN如果只字不提fast RCNN,恐怕就抓不到faster的本质和其最核心的点。所以建议与fastRCNN配合服用最佳。

一言不合先上图:

图源网络,侵删

1)卷积层(conv layers),用于提取图片的特征,输入为整张图片,输出为提取出的特征称为feature maps
2)RPN网络(Region Proposal Network),用于推荐候选区域,这个网络是用来代替之前的search selective的。输入为图片(因为这里RPN网络和Fast R-CNN共用同一个CNN,所以这里输入也可以认为是featrue maps),输出为多个候选区域,这里的细节会在后面详细介绍。
3)RoI pooling,和Fast R-CNN一样,将不同大小的输入转换为固定长度的输出,输入输出和Faste R-CNN中RoI pooling一样。(详情见前一篇博文)
4)分类和回归,这一层的输出是最终目的,输出候选区域所属的类,和候选区域在图像中的精确位置。

我们总结一下:与fast最大的区别就是提出了一个叫RPN(Region Proposal Networks)的网络,专门用来推荐候选区域的,RPN可以理解为一种全卷积网络,该网络可以进行end-to-end的训练,最终目的是为了推荐候选区域

(这图还真是哪里都有。。。

RPN网络本质=CNN+3*3的卷积层+两个1*1的卷积层(两个卷积层的关系为sibling,分别是用来给softmax层进行分类,和用于给候选区域精确定位)。

这个背后的原理呢?我们只知道效果还是不行的,想要提高还是要学习原理。

还有个问题,CNN输出的feature map怎么可以通过RPN的后续处理得到与原图对应的候选区域的,即RPN输出的候选区域和softmax的结构怎么与原图中的区域进行对应的?这个对应关系是怎么得到的?

先来看一下,锚????——anchor,我记得最开始我深度接触这个家伙应该是从系统学习YOLO的Pytorch框架开始的?

所以anchor的本质是什么呢?有一种理解:是SPP(spatial pyramid pooling)思想的逆向,感觉甚是有理。

SPP的笔记在前面也有所记录(突然看到了按照时间顺序看论文做笔记的好处,发现了不少之前没有注意过的,或许就理解了大佬们对算法框架修改的一些灵感)所以由于SPP是将不同尺寸的输入resize成相同尺寸的输出,其逆向就是,将相同尺寸的输出,倒推得到不同尺寸的输入。

关于anchor的尺寸样子:三个面积尺寸(128^2,256^2,512^2),然后在每个面积尺寸下,取三种不同的长宽比例(1:1,1:2,2:1),于是出现了9个长得不一样的anchor:

图源网络,侵删

如果说anchor的使用是理解的核心,那么anchor的滑动则是关键。

在anchor开始处理的时候,原始图片已经经过一系列卷积层和池化层以及relu,得到了这里的 feature:51x39x256

在这个特征参数的基础上,通过一个3×3的滑动窗口,在这个51×39的区域上进行滑动,stride=1,padding=2,这样一来,滑动得到的就是51×39个3×3的窗口(没毛病吧)

对于每个3×3的窗口,论文作者就计算这个滑动窗口的中心点所对应的原始图片的中心点(对这个中心点的理解也很关键,一度迷惑着我)。然后假定,这个3×3窗口,是从原始图片上通过SPP池化得到的,而这个池化的区域的面积以及比例,就是一个个的anchor。

换句话说,对于每个3×3窗口,我们假定它来自9种不同原始区域的池化,但是这些池化在原始图片中的中心点,都完全一样。这个中心点,就是刚才提到的,3×3窗口中心点所对应的原始图片中的中心点。

所以,在每个窗口位置,我们都可以根据9个不同长宽比例、不同面积的anchor,逆向推导出它所对应的原始图片中的一个区域,这个区域的尺寸以及坐标,都是已知的。(莫名的想到了加密密钥。。和它恰恰不同)

而这个区域,就是我们想要的 proposal。

所以我们通过滑动窗口和anchor,成功得到了 51x39x9 个原始图片的proposal。然后每个proposal输出6个参数:每个 proposal 和 ground truth 进行比较得到的前景概率和背景概率(2个参数)(对应 cls_score);由于每个 proposal 和 ground truth 位置及尺寸上的差异,从 proposal 通过平移放缩得到 ground truth 需要的4个平移放缩参数(对应bbox_pred)。

所以我们一共得到51*39*9=17900了个anchor box呢?

好多呀。。。

其实在说白了:我们需要确定每个滑窗中心对应感受野内存在目标与否,但是目标大小和长宽比例不一,需要多个尺度的窗,而Anchor给出一个基准窗大小,按照倍数和长宽比例得到不同大小的窗。一个变换的基准吧。

或者:把anchor理解为候选框,到最后再分类这个框是属于背景还是前景;同时使用回归,修正anchor box的坐标,得到检测到的物体真正位置。

然后我们回到RPN:

图源网络,侵删

还记得前面说的RPN的架构吧

用图来说:红线以上CNN,下面就是RPN多出来的特有结构,这里我们也可以看到两个1*1的输出。其中一路输出是目标和非目标的概率,另一路输出box相关的四个参数,包括box的中心坐标x和y,box宽w和长h。和前面说的对照一哈。

所以RPN大致明白了,它用来干嘛的来着?

RPN最终目的是得到候选区域,但在目标检测的最终目的是为了得到最终的物体的位置和相应的概率,这部分功能由Fast R-CNN做的。因为RPN和Fast R-CNN都会要求利用CNN网络提取特征,所以文章的做法是使RPN和Fast R-CNN共享同一个CNN部分。