以R-CNN思路及其基础整理和SPP-net为基础,我们便可以很好理解 Fast-RCNN。
一、整体结构
Fast-RCNN的整体结构主要由这几部分组成:1.对输入图片用区域推荐算法获得2000个区域,并记录下框的坐标和索引;2.用卷积神经网络对图片进行特征提取,并且将框同样映射到特征空间(也就是对应到特征图上应该在什么位置);3.将卷积神经网络的最后一层pool层替换为RoI_Pooling层,获得固定尺寸的特征向量;4.对这个固定尺寸的特征向量后面添加两组全连接层,一组尺寸为21,用于分类;另一组尺寸为84,用于对框进行回归。
二、RoI_Pooling_layer
RoI_Pooling的作用与SPP-Net有着相同的作用,只不过操作步骤有一点不同。SPP—Net是用不同尺度的金字塔将原特征分割为(1x1,2x2,4x4...)等,但是RoI_Pooling并不将特征这样分割。假设我们RoI_Pooling的输入尺寸是w*h,而输出尺寸想要是W*H,那么就需要把特征分割为份,其中每一份都用max_pooling来提取最大特征,因此输出就变成了固定尺寸
。(等看完代码再补充:如果
不是整数,应该向上舍入还是向下舍入?不平均分配应该怎么做?)
三、softmax分类与边框回归
1、一般来讲,特征经过卷积层(或者全连接层)之后,输出的数有正有负,而且大小也不固定(并不是0~1或者-1~1之间),这也就是为什么每一层卷积层后面都要加一个激活函数将输出归一化。在这里,最后一层的全连接层输出后,再经过一个形如下图的sigmoid函数,将所谓的得分归一化为(0,1)之间。
softmax分类器,其实就是将得分再转化为概率,也就是说某个框分类为每个类别的概率在(0,1)之间,并且所有概率之和为1,这也符合我们对概率的认知。转化公式为:,其中,
为第i个框分类为第j列的概率(
),K为所有的类别。
2、边框回归,与RCNN一样。
四、损失函数
整个网络的损失函数有两个:分类的损失函数和框回归的损失函数。
1、分类的损失函数:
如果对分类的损失或者交叉熵不太理解的,可以参见我的另外一篇博客:从熵、相对熵、交叉熵到机器学习的交叉熵损失与softmax损失函数。
2. 框回归的损失函数:
五、SVD分解改进全连接层
我们知道,因为全连接层的参数量很大,并且在整个网络中,由于前面的卷积层对整张图片只有一次前向传输计算,而全连接层要对2000个RoI中的每一个都要进行计算,因此其计算量占据了整个网络的大部分,因此作者在这里用SVD分解,将特征向量进行降维,来加速运算。具体降维原理可以参考:https://www.cnblogs.com/pinard/p/6251584.html。
相对RCNN的改进:
1、卷积不再是对2000个region proposal中的每一个进行,而是直接对整张图像,这样减少了很多重复计算。
2、用ROI pooling进行特征的尺寸变换,因为全连接层的输入要求尺寸大小一样,因此不能直接把region proposal作为输入。
3、将regressor放进网络一起训练,每个类别对应一个regressor,同时用softmax代替原来的SVM分类器。