最近读了这几篇文章,做个总结,相关文章链接如下:
- R-CNN
- Fast R-CNN
- Faster R-CNN
- Mask R-CNN
R-CNN
文中主要有三个步骤:
找候选框:文中利用传统方法( selective search)找出2000个可能是物体的候选框,然后将这些框缩放到同一尺寸,便于输入CNN网络。
CNN提取特征:选用已有CNN架构(比如AlexNet)及其参数作为初始参数,然后再训练过程中微调参数。(若选取网络所有参数都随机初始化,由于训练样本少,会导致跑不到最理想的参数)
训练一个SVM分类器:计算所有区域的得分,使用非极大抑制选择最合适的候选框,然后使用回归器精修候选框的位置。
这篇文章的思路与后几篇相比比较简单,文章后半部分主要是做基于实验的分析,感兴趣的可以去看看。
Fast R-CNN
Fast R-CNN和R-CNN是同一个作者,是在R-CNN基础上做的改进,在Fast R-CNN中,作者指出了R-CNN的几个不足:
训练是一个多阶段的过程:文中训练需要经过调参,建立SVM,边界回归几个过程,使训练时间显得很长。
占用很大的时间和计算机空间:在训练SVM和边界回归过程中,从图片的候选框中得到的特征都要写入磁盘,非常占用内存和GPU。
对象检测速度很慢:在测试时,需要从每个测试图像候选框中提取特征。使用VGG16进行检测平均每幅图像需要47s。
针对这些不足,作者提出了一种新的Fast R-CNN架构:
从图中可以看出,首先将输入图像和多个感兴趣区域(RoI)输入到完全卷积网络中。 每个RoI经池化(RoI pooling layer)形成固定大小的特征图,然后通过完全连接的层(FC)映射到特征向量。 网络每个RoI具有两个输出向量:softmax概率和每类边界框回归偏移。
相比R-CNN,本文将整幅图像作为输入,消除了候选框之间的重叠和冗余,特征提取的更快。将RoI feature vector作为两个全链接层的输入,不需要磁盘存储特征,同时也更快。
Faster R-CNN
我们可以先看看Faster R-CNN的结构框架:
与Fast R-CNN的结构相比,Faster R-CNN把区域提案(选择候选框)放在了CNN网络之后,相当于和后面的图像检测网络共享了一个CNN网络,那么为什么要这样做?
原文作了如下解释:在Fast R-CNN中,选取候选框的工作在CPU中进行,然后再GPU中进行CNN提取特征,这会拖慢整体的运行速度,所以能够想到把区域提案工作也在GPU中完成,而把这一步骤放在CNN提特征之后,即能共享CNN提取的特征,也不会影响后续的检测工作,使得产生区域提案的开销达到最小。
到这,整个架构就很清楚了:RPN+Fast R-CNN
作者保留了Fast R-CNN的主体架构(提特征,检测,分类,回归),在CNN网络和检测网络间并入了RPN网络用来产生区域提案。
接下来,我们看看RPN网络是如何运作的:
该网络的核心思想是滑动窗口,在最后一层卷积层的输出feature map(共有256个feature map,所以输出256维向量) 上使用一个3×3的滑动窗口,在滑动窗口的中心位置,对应预测输入图像产生3种尺度,3种长宽比的区域提案(region proposal),这种映射的机制称为锚点(anchor),于是,在每个3×3的区域,可以产生K=9个区域提案。所以对于这个40×60的feature map,总共有约20000(40×60×9)个anchor,也就是预测20000个区域提案。
然后把这些ragion proposal 输入cls layer 和reg layer&#x