R-CNN系列(3)—— Fast R-CNN

 

1.R-CNN的弊端  

  (1)CNN的输入size需要固定,这就会扭曲了候选框里面的内容,导致失真。
  (2)在测试时(包括训练时也是),每个候选框都要单独送到CNN中以提取特征,但其实好多候选框都是有重复部分的,所以特征提取的整个过程其实也做了很多重复的工作,这导致速度慢。
  (3)训练是一个多阶段过程。分为三个阶段,第一阶段微调CNN(用于特征检测),第二阶段训练SVM(用于分类判别),第三阶段则是训练边框回归(用于精修候选框)。这三个步骤需要单独训练并且当前阶段训练完了才能进入下一个阶段的训练。那显然,单一训练阶段的模式是更好的,因为降低了训练的复杂性。
  (4)训练是非常耗时间和空间的。每个候选框经过特征提取后得到的特征,需要写入到磁盘上,以在之后训练SVM和边框回归(为什么要写到磁盘上而不直接放在内存上?估计是所占内存太大了吧)。而磁盘的I/O是非常耗费时间和空间的。个人猜测:这个弊端是源于第(3)个弊端,正因为训练不是单一模式的,所以不能把提取到的特征马上送到下一个模块进行训练。
 
 

2.SPP-NET改进R-CNN

   SPP-NET解决了R-CNN的第(1)、(2)个弊端
   针对第(1)个弊端:R-CNN在特征提取之前需要resize区域提议。SPP-NET通过空间金字塔池化进行优化,使得不同size的特征图(feature map)能够转换成维度固定的向量,然后再输入全连接层,最后再输入SVM中用于判别区域提议的类型。
   针对第(2)个弊端:每个候选框都单独送进CNN进行特征提取。SPP-NET只对原始输入图进行一次特征提取,得到整幅图的feature map。然后区域提议映从原始图像的位置映射到在feature map的位置中,从而找到该特征提议的自己的feature map(原始图与feature map的大小虽不同,但是卷积操作与池化操作的特点,长宽比例是相同的。所以可以进行映射,原图像是精细的,而特征图是粗糙的)
  但SPP-NET仍然保留了R-CNN的第(3)、(4)这两个弊端,即分别是:训练是一个多阶段过程、需要写磁盘耗费时间和空间。
    
 

3.Fast R-CNN改进SPP-NET

  Fast R-CNN吸收了SPP-NET对R-CNN所作出的改进,并继续对R-CNN的第(3)、(4)个弊端作出改进,同时针对第(1)个弊端的SPP-NET解决方案,Fast R-CNN作出了简化。
  针对第(1)个弊端:R-CNN在特征提取之前需要resize区域提议。SPP-NET的解决方案是使用空间金字塔池化,使得不同size的输入,经过该池化之后都输出固定维度的向量。空间金字塔池化是分层次的,例如,4*4、2*2、1*1地对feature map进行划分然后池化。而Fast R-CNN只取第一个层此的划分,即只取4*4。这种方法称为ROI池化。
  针对第(3)、(4)个弊端:训练是一个多阶段过程、需要将提取后的特征进行写磁盘。Fast R-CNN取消了使用SVM作为分类器,并且把目标分类和边框回归这两个任务融入到了整个模型当中,即构成了:CNN特征提取+ROI池化+全连接层+(目标分类,边框回归)的整体模型,使得训练变成了一个单一过程,也因此无需把特征写进磁盘到后续又读出来,因为整个模型都是直通的,无缝连接。同时实现目标分类和边框回归两个任务,需要对模型的损失函数做一下规定,总体的思想就是损失函数需要同时考虑这两个任务的损失值,并且两个损失值需要按照一定的比例进行组合,作为为模型最终的损失函数,称为多任务损失函数。
 
 

4.Fast R-CNN的缺点

  (1)原始输入图像的size可以不固定。
  (2)只需对原始输入图像进行一次特征提取得到feature map,后续的区域提议获取自己的feature map时只需在原始图像的feature map中找到所对应的区域即可。(因此可以加快速度)
  (3)通过多任务学习,使得训练为单单一阶段过程。
  (4)不需要对特征进行磁盘I/O。(因此可以加快速度)
 
 
 
 
 
 

你可能感兴趣的:(R-CNN系列(3)—— Fast R-CNN)