RCNN、SSPnet、FastRCNN、FasterRCNN、YOLO。

序:几张图

一:关系https://www.zhihu.com/question/35887527/answer/140239982

二: 【图像分类,图像定位,目标检测和实例分割】

一、RCNN

&创新点

  1.     采用CNN网络提取图像特征,从经验驱动的人造特征范式HOG、SIFT到数据驱动的表示学习范式,提高特征对样本的表示能力;
  2.     采用大样本下有监督预训练+小样本微调的方式解决小样本难以训练甚至过拟合等问题。

&如何解决问题

1.训练过程


  1. 有监督预训练

    样本 来源
    正样本 ILSVRC2012
    负样本 ILSVRC2012

    ILSVRC样本集上仅有图像类别标签,没有图像物体位置标注;
    采用AlexNet CNN网络进行有监督预训练,学习率=0.01;
    该网络输入为227×227的ILSVRC训练集图像,输出最后一层为4096维特征->1000类的映射,训练的是网络参数。

  2. 特定样本下的微调

    样本 来源
    正样本 Ground Truth+与Ground Truth相交IoU>0.5的建议框【由于Ground Truth太少了
    负样本 与Ground Truth相交IoU≤0.5的建议框


    PASCAL VOC 2007样本集上既有图像中物体类别标签,也有图像中物体位置标签;
    采用训练好的AlexNet CNN网络进行PASCAL VOC 2007样本集下的微调,学习率=0.001【0.01/10为了在学习新东西时不至于忘记之前的记忆】;
    mini-batch为32个正样本和96个负样本【由于正样本太少】;
    该网络输入为建议框【由selective search而来变形后的227×227的图像,修改了原来的1000为类别输出,改为21维【20类+背景】输出,训练的是网络参数。

  3. SVM训练

样本 来源
正样本 Ground Truth
负样本 与Ground Truth相交IoU<0.3的建议框

 由于SVM是二分类器,需要为每个类别训练单独的SVM,20个;
SVM训练时输入正负样本在AlexNet CNN网络计算下的4096维特征,输出为该类的得分,训练的是SVM权重向量;
由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本,该方法具体见。

4.Bounding-box regression训练

正样本 与Ground Truth相交IoU最大的Region Proposal,并且IoU>0.6的Region Proposal

2.测试过程

  • 输入一张多目标图像,采用selective search算法提取约2000个建议框(就是候选框);
  • 先在每个候选框周围加上padding=16(像素值为建议框像素平均值的边框),再直接变形为227×227的大小;
  •  【预处理操作】先将所有建议框像素减去该建议框像素平均值后,再依次将每个227×227的建议框输入AlexNet CNN网络获取4096×1维的特征【比以前的人工经验特征低两个数量级】,2000个建议框的CNN特征组合成2000×4096维矩阵;
  • 将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘【20种分类,SVM是二分类器,则有20个SVM,其实加背景是21类】,也就四十(2000,4096)×(4096,20)→ 2000×20维矩阵,每行是(候选框,class1-score,...class20-score)表示该候选框是某个物体类别的得分;
  • 对上述2000×20维矩阵中每一列即每一类分别进行非极大值抑制(NMS)和最低得分阈值,剔除重叠候选框,得到该列即该类中得分最高的一些候选框;eg:对第一列为cat的2000个候选框中有500个得分都是最高的,难道这图中有500只猫吗?→ NMS+得分阈值→ 得50个候选框
  •  分别用20个回归器对上述20个类别各自剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box。

解释:(为了自己记录,记录不会的。NMS可参考:NMS参考第三部的第三步有推荐链接)

1).为什么要采用回归器?回归器是什么有什么用?如何进行操作?

首先要明确目标检测不仅是要对目标进行识别,还要完成定位任务,所以最终获得的bounding-box也决定了目标检测的精度。
这里先解释一下什么叫定位精度:定位精度可以用算法得出的物体检测框与实际标注的物体边界框的IoU值来近似表示。

如图所示,绿色框为实际标准的卡宴车辆框,即Ground Truth;黄色框为selective search算法得出的建议框,即Region Proposal。即使黄色框中物体被分类器识别为卡宴车辆,但是由于绿色框和黄色框IoU值并不大,所以最后的目标检测精度并不高。采用回归器是为了对建议框进行校正,使得校正后的Region Proposal与selective search更接近, 以提高最终的检测精度。论文中采用bounding-box回归使mAP提高了3~4%。 

如何设计?

如上图,黄色框口P表示建议框Region Proposal,绿色窗口G表示实际框Ground Truth,红色窗口G^表示Region Proposal进行回归后的预测窗口,现在的目标是找到P到G^的线性变换【当Region Proposal与Ground Truth的IoU>0.6时可以认为是线性变换】,使得G^与G越相近,这就相当于一个简单的可以用最小二乘法解决的线性回归问题,具体往下看。

关于回归:

最终在进行实验时,lambda = 1000,同时作者发现同一对中P和G相距过远时通过上面的变换是不能完成的,而相距过远实际上也基本不会是同一物体,因此作者在进行实验室,对于pair(P,G)的选择是选择离P较近的G进行配对,这里表示较近的方法是需要P和一个G的最大的IoU要大于0.6,否则则抛弃该P。

3.分析

CNN训练的时候,本来就是对bounding box的物体进行识别分类训练,是一个端到端的任务,在训练的时候最后一层softmax就是分类层.那么为什么作者闲着没事干要先用CNN做特征提取(提取fc7层数据),然后再把提取的特征用于训练svm分类器?

这个是因为svm训练和cnn训练过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用svm精度还低。

事情是这样的:

1).cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;

2).采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);

3).然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm。

这是一个二分类问题,我么假设我们要检测车辆。我们知道只有当bounding box把整量车都包含在内,那才叫正样本;如果bounding box 没有包含到车辆,那么我们就可以把它当做负样本。但问题是当我们的检测窗口只有部分包好物体,那该怎么定义正负样本呢?作者测试了IOU阈值各种方案数值0,0.1,0.2,0.3,0.4,0.5。最后我们通过训练发现,如果选择IOU阈值为0.3效果最好(选择为0精度下降了4个百分点,选择0.5精度下降了5个百分点),即当重叠度小于0.3的时候,我们就把它标注为负样本。

4.还存在什么问题

  1.  很明显,最大的缺点是对一张图片的处理速度慢,这是由于一张图片中由selective search算法得出的约2k个建议框都需要经过变形处理后由CNN前向网络计算一次特征,这其中涵盖了对一张图片中多个重复区域的重复计算,很累赘;
  2. 知乎上有人说R-CNN网络需要两次CNN前向计算,第一次得到建议框特征给SVM分类识别,第二次对非极大值抑制后的建议框再次进行CNN前向计算获得Pool5特征,以便对建议框进行回归得到更精确的bounding-box,这里文中并没有说是怎么做的,博主认为也可能在计算2k个建议框的CNN特征时,在硬盘上保留了2k个建议框的Pool5特征,虽然这样做只需要一次CNN前向网络运算,但是耗费大量磁盘空间;
  3. 训练时间长,虽然文中没有明确指出具体训练时间,但由于采用RoI-centric sampling【从所有图片的所有建议框中均匀取样】进行训练,那么每次都需要计算不同图片中不同建议框CNN特征,无法共享同一张图的CNN特征,训练速度很慢;
  4. 整个测试过程很复杂,要先提取建议框,之后提取每个建议框CNN特征,再用SVM分类,做非极大值抑制,最后做bounding-box回归才能得到图片中物体的种类以及位置信息;同样训练过程也很复杂,ILSVRC 2012上预训练CNN,PASCAL VOC 2007上微调CNN,做20类SVM分类器的训练和20类bounding-box回归器的训练;这些不连续过程必然涉及到特征存储、浪费磁盘空间等问题。

此部分参考修改自链接1链接2和链接3

推荐:https://blog.csdn.net/u011534057/article/details/51218250

2.2. SPP-Net : Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)

        何大神对RCNN进行了优化得到SPP-Net :1.金字塔池化代替warp。2.先对一整张图进行卷积得到特征图,然后再将ss算法提供的2000多个候选区域的位置记录下来,通过比例映射到整张图的feature map上提取出候选区域的特征图B,然后将B送入到金字塔池化层中,进行权重计算.

1.CNN模型的特点:由卷积部分和全连接两部分构成,而对于卷积部分而言,比如任意图片大小(w,h),任意的卷积核size(a,b),默认步长为1,我们都会得到卷积之后的特征图F(w-a+1,h-b+1),所以这部分对图片大小没有要求,有要求的地方在全连接层,全连接层的神经元设定之后是固定的,比如是M个(个数代表提取多少个特征),全连接层的参数和输入图像大小有关,因为它要把输入的所有像素点连接起来,需要指定输入层神经元个数和输出层神经元个数,如 X*W=Y(Y为全连接层) 矩阵的维度要对应,可参考:维度。rg大神在进入CNN前对图片进行warp处理,就是为了卷积之后的特征数,能够和了全连接层的神经元个数相等。何大神提出将特征数据(特征图)进一步处理,然后把特征数拼凑成和CNN中设定的全连接层特征数相同(M个),这样就可以不用warp图片大小也可以获得相同数量的特征。

完整图:

2.使用这种方法CNN(带有全连接层的)可以处理任意大小的图像。即在FC之前使用SPP可以把不同大小的特征图转换为固定长度的特征向量输入到全连接层中,从而达到获取多层次的信息并处理任意大小图像的目的。那么就支持不同尺寸输入图像,RCNN中对图像的resize操作及其带来的误差可省去,此SPP-net提取得到的图像特征具有更好的尺度不变性,降低了训练过程中的过拟合可能性。

3.SPP的流程则是对整幅图像进行特征提取,也就是说不管图像中有多少目标SPP都只用CNN提取一次特征。

测试:采用selective search可以提取到约2k个proposals,先将整图代入到SPP-Net中,得到的conv5的输出。根据proposal在图中的相对位置关系计算得到proposal在整图conv5输出中的映射输出结果。这样,对于2000个proposal,我们事实上从conv1--->conv5只做了一遍前向,然后进行2000次conv5 featuremap的集合映射,再通过SPP-Layer,就可以得到的2000组长度相同的SPP-Layer输出向量,进而通过全连接层生成最终2000个proposal的卷积神经网络特征。和R-CNN类似,训练SVMs,然后将所有proposal经过CNN处理得到的特征和SVM新标定结果输入到SVMs分类器进行训练得到分类器预测模型。

在卷积层对整幅图特征提取得到特征图像后,SPPnet根据proposal在图中的相对位置关系计算得到proposal在整图conv5输出中的映射输出结果

用SPP-layer(替代RCNN中的pool5)根据空间对应关系得到相应的proposal对应的区域,对该区域进行SPP特征提取,得到固定的特征向量输入到全连接层中,相比RCNN极大的提高了检测效率。R-CNN在训练和测试是需要对每一个图像中每一个proposal进行一遍CNN前向特征提取,约2K次前向CNN特征提取,而SPPnet从conv1--->conv5只做了一遍前向,然后进行2000次conv5 featuremap的集合映射

SPP的检测流程如下图所示。

 (第三张图注意C,注释)

核心思想:使用三层的金字塔池化层pooling,分别设置图片切分成多少块,论文中设置的分别是(1,4,16),然后按照层次对这个特征图feature A进行分别处理(用代码实现就是for(1,2,3层)).

  1. 第一层对这个特征图feature A整个特征图进行池化(池化又分为:最大池化,平均池化,随机池化),论文中使用的是最大池化,得到1个特征。
  2. 第二层先将这个特征图feature A切分为4个(20,30)的小的特征图,后使用对应的大小的池化核对其进行池化得到4个特征。
  3. 第三层先将这个特征图feature A切分为16个(10,15)的小的特征图,后使用对应大小的池化核对其进行池化得到16个特征。
  4. 将这1+4+16=21个特征输入到全连接层,进行权重计算. 当然了,这个层数是可以随意设定的,以及这个图片划分也是可以随意的,只要效果好同时最后能组合成我们需要的特征个数即可

值得一提的是,sppnet提出的这种金字塔池化来实现任意图片大小进行CNN处理的这种思路,得到了大家的广泛认可,以后的许多模型,或多或少在这方面都是参考了这种思路,就连rg大神,在后来提出的fast-rcnn上也是收益于这种思想的启发.

当然,如果觉得SVM训练很麻烦,可以直接在SPP-Net后再加一个softmax层,用好的标定结果去训练最后的softmax层参数。

参考:https://www.cnblogs.com/gongxijun/p/7172134.html https://blog.csdn.net/v1_vivian/article/details/73275259

Fast RCNN

小结:Fast R-CNN融合了R-CNN和SPP-NET的精髓,并且引入多任务损失函数,使整个网络的训练和测试变得十分方便。在Pascal VOC2007训练集上训练,在VOC2007测试的结果为66.9%(mAP),如果使用VOC2007+2012训练集训练,在VOC2007上测试结果为70%(数据集的扩充能大幅提高目标检测性能)。使用VGG16每张图像总共需要3s左右。

缺点:region proposal的提取使用selective search,目标检测时间大多消耗在这上面(提region proposal 2~3s,而提特征分类只需0.32s),无法满足实时应用,而且并没有实现真正意义上的端到端训练测试(region proposal使用selective search先提取处来)。那么有没有可能直接使用CNN直接产生region proposal并对其分类?Faster R-CNN框架就是符合这样需要的目标检测框架。

https://zhuanlan.zhihu.com/p/24916624?refer=xiaoleimlnote

猜你喜欢

转载自blog.csdn.net/m0_37644085/article/details/83503769