Fast R-CNN的提出是基于前面的R-CNN及SPP-NET的改进版本,那么首先再来说明一下R-CNN和SPP-NET各自的不足之处吧~~
R-CNN最明显的不足之处在于对于一幅图片的2000个region proposals需要分别输入CNN进行特征提取,这将变得很耗时。另外因为全连接层的存在,其需要每个输入的region proposal的尺度一样,而这使得其对尺度敏感,不利于实际处理时的应用。整个网络的训练过程不是端到端的,分为region proposal的Selective Search阶段,CNN精调阶段,SVM分类器训练阶段,同时在进行SVM分类之前,需要将提取到的每个region proposal存储在磁盘中(???),然后再进行SVM阶段的处理。整个过程是很耗时的。
SPP-NET针对R-CNN中的尺度问题进行了改进,引入了SPP(spatial pyramid pooling)以此来实现对输入图片的大小不作限制,同时不是对每个region proposal单独输入CNN,而是将整张图片输入后得到feature map然后将每个region proposal映射到feature map上的对应位置。以此提升了速度。但整个网络的训练过程和R-CNN一样,也是分为多个阶段的,且需将提取到的特征存放至磁盘再进行SVM的操作。并且,由于SPP的加入,使得其在反向传播时不能对SPP之前的卷积网络进行更新,这限制了最后结果准确率的提升。
综上,R-CNN和SPP-NET的时间和空间消耗都较大。
于是一种end-to-end的joint training的pipeline诞生了~~~
个人觉得,Fast-RCNN是一种联合训练简化版的SPP-NET,至于原因,就从下面的details吧~
训练阶段:
Step1:原始图像的数据处理
文中在训练时与之前的不同是采用了一些训练的小trick,作者在进行SGD时取的mini-batch是两张图中各取64个region proposals共128个作为一次训练的数据。这比从128张图片中各1取一个proposal的方式要快64倍。类似于SPP-NET,将整张图输入至网络。
Step2:利用模型对整幅图提取特征
采用VGG16模型,和SPP-NET中类似,只是将其SPP网络的三层结构换成了单一结构,即只有一层金字塔,此时称其为ROI Pooling。使不同尺度的region proposals形成相同尺寸的特征向量。其整体结构可视为(13个卷积层+4个pooling层+ROI层+2fc层+2个平及层【softmaxLoss层和SmoothL1loss层】)
Step3:多任务训练阶段
要说相比于SPP-NET有明显不同的地方,大概就是这一步多任务训练了。从上图的网络结构可以看出,在最后fc层处有两个并列的输出,一个是用于分类的Softmax,另一个是用于bounding box的回归,以此实现一个完全端到端的网络结构。此时,对于Step2中提取到的特征,可不必存于磁盘而是直接输入到softmax和regression中进行训练(??)注:此时的正样本需满足余groundtruth的IoU>0.5.(可理解为,在之前如SPP-NET,R-CNN中在对CNN网络进行精调时,需要IoU>0.5,在对SVM训练时IoU>0.3,故在此进行联合训练时取其较大值0.5)
多任务损失:分类采用softmax损失,回归采用SmoothL1Loss,两者的权比例为1:1.如下图:
(??对于回归部分的损失)
另外,为了加快速度,作者对于全连接层处的矩阵进行了SVD分解,这样使得RoI数目较大时可以使速度明显提升。
************
在进行训练时,多尺度图像训练Fast R-CNN与单尺度图像训练相比,只提升了微小的mAP,但是时间成本却增加了很多,故综合考虑,作者建议直接用一种尺度的图像训练Fast R-CNN。(如何训练的?)
************
Step4 预测阶段:
与SPP-NET类似,对图片利用Selective Search提取region proposals,然后将整张图片输入网络,经过卷积层提取特征后,可利用ROI pooling层对不同尺寸的region proposal形成相同长度的特征向量,然后输入之后的fc层和softmax即regression进行分类及boundingbox回归。并进行非极大值抑制对boundingbox进行筛选。
********
并不是proposal提取越多效果就会越好,提取得太多,效果反而会使mAP值下降。
********