R-CNN存在的一些问题:
一、训练分成多个阶段:1、先从一张图片上提取2000个候选区域,采用log损失对用于提取候选区域的CNN网络进行微调。2、训练N(类别数目)个SVM,对提取的特征进行分类。3、边界框回归进行目标定位。
二、训练大量消耗存储空间和时间成本,由于CNN提取的特征需要先存储到硬盘,在拿去给SVM进行分类,所以需要耗费大量存储空间。
三、目标检测速度慢。一张图片在VGG16上进行目标检测需要47s。
Fast R-CNN进行的改进:
一、没有使用seletive search操作,而是先将一整张图片进行卷积,这样可以共享卷积运算

二、使用RoI池化层(RoI pooling layer),下图展示VGG16网络的结构,进入全连接层的维度大小为7x7x512。我们知道卷积并没有对图片大小做限制,任意一张图片都可以进行卷积运算,但是全连接层对输入的维度有限制。那么如何将任意大小的图片经过卷积后都能得到7x7的大小。作者参考了SSPnets提出的空间金字塔池化(spatial pyramid pooling layer)。对于任意一张HxW大小的图片,可以将他分割成7x7大小小方格,每个小方格h=H/7,w=W/7。最后对小方格中进行最大池化(max pooling)这样就得到了7x7的大小,可以进行之后的全连接层。
那么还有一个问题,这个RoI池化层放下哪里?作者说是将最后一个池化层换做RoI池化层,那么也就是下图红色方框前面的POOL。总结下,如果用VGG16训练,任意一张图片经过先前卷积得到HxWx512的维度,再经过RoI池化层得到7x7x512的大小,然后送去之后的全连接层。


三、使用多任务损失:之前的R-CNN将任务分为3个阶段,造成了空间和时间的极大浪费。Fast R-CNN将分类和定位相加合成一个损失值。K个目标类别加上背景一共K+1个类别,经过SoftMax函数,分类使用log损失。定位利用的是边界框回归,与R-CNN中的定位类似。当类别为背景时,u为0,不必计算定位损失。



网友评论