1.Fast-RCNN核心
RCNN的提出使得神经网络重新回归目标检测之中,作为神经网络用来目标检测的开山之作,RCNN也存在着许多缺点:
1.训练时速度慢,RCNN通过selective search方法产生2000+个候选框,对每一个候选框都要进行前向反向运算,存在着大量的重复计算,效率低下。
2.测试时速度慢,原因同上。
3.需要大量的存储空间,因为特征提取与分类和框回归独立,所以RCNN需要把神经网络的输出特征保存下来,占用大量的存储空间。
Fast-rcnn是既rcnn,sppNet之后提出的新的目标检测算法,相较于RCNN,其主要有两点改进:
1. 引入了ROI pooling层,相较RCNN将所有的region proposal都resize到相同大小进行CNN训练,Fast-RCNN只需一次对整个图片进行卷积,然后对于ss产生的region proposal,通过ROI pooling层到相同大小后进行特征提取,即共享卷积,这些候选区域的前几层特征不需要再重复计算。(一次卷积vs2000+卷积,大大提升训练测试速度)。
2.将最终的分类和bounding box regression放在了同一个网络中进行训练,而非独立进行,这样做无需存储特征,减少存储空间。
2.Fast-RCNN的网络结构
输入 一整张图片 与 ROI
输出 每个ROI对应的类别信息和bounding box回归。
图像归一化为224×224直接送入网络。前五阶段是基础的conv+relu+pooling形式,在第五阶段结尾,输入P个候选区域(图像序号×1+几何位置×4,序号用于训练)
ROI polling
ROI polling 将每个ROI均匀的分为M*N块,对每一块进行max pooling,将每一个ROI对应的特征图的区域转换为相同大小的特征,送入全连接层。
ROI polling层的训练过程:
首先考虑普通max pooling层。设xi为输入层的节点,yj为输出层的节点。
其中判决函数δ(i,j)表示i节点是否被j节点选为最大值输出。不被选中有两种可能:xi不在yj范围内,或者xi不是最大值。
对于roi max pooling,一个输入节点可能和多个输出节点相连。设xi为输入层的节点,yrj为第r个候选区域的第j
个输出节点。
判决函数δ(i,r,j)表示i节点是否被候选区域r的第j个节点选为最大值输出。代价对于xi的梯度等于所有相关的后一层梯度之和。
网络训练过程
在调优训练中,每一个mini-batch中先加入N张图片,而后加入从N中图片中选取的R个ROI,放入网络进行训练,这R个候选框可以复用N张图片前5个阶段的网络特征。
实际选择N=2, R=128。
训练数据正样本:负样本为1:3,其中对于ROI标记为正样本即ROI与gt的IOU>0.5,否则标为负样本
分类与位置调整
对于每个mini-batch中的R个ROI,在经过ROI池化层后,送入两个并列的全连接层中,称为multi-task。
cls_score层用于分类,输出K+1维数组p,表示属于K类和背景的概率。
bbox_prdict层用于调整候选区域位置,输出4*K维数组t,表示分别属于K类时,应该平移缩放的参数。
代价函数L:
全连接层提速
分类和位置调整都是通过全连接层(fc)实现的,设前一级数据为x后一级为y,全连接层参数为W,尺寸u×v。一次前向传播(forward)即为:
将W进行SVD分解,并用前t个特征值近似:
原来的前向传播分解为两步:
计算复杂度变为u×t+v×t。
在实现时,相当于把一个全连接层拆分成两个,中间以一个低维数据相连。
3.实验与结论
实验过程不再详述,只记录结论
- 网络末端同步训练的分类和位置调整,提升准确度
- 使用多尺度的图像金字塔,性能几乎没有提高
- 倍增训练数据,能够有2%-3%的准确度提升
- 网络直接输出各类概率(softmax),比SVM分类器性能略好
- 更多候选窗不能提升性能
4.一个读论文过程中的问题
论文中提到SPPNet反向求导效率低,而ROI能够较好的完成反向传播,主要原因是SPPNet是将所有图片的region proposal保存起来,每次训练随机选择一些ROI,那么对于每个ROI最坏的情况来自不同的图片,这就导致每次需要将这所有的图片都进行一次前向运算(反向传播需要用),导致效率十分低下。而fast-RCNN在训练的时候,每个mini-batch输入2张图片产生的128个region proposal,这样的话一次只需将2张图片送入CNN中训练,反向传播效率比较高。