目标检测之RCNN、Fast RCNN 、Faster RCNN技术演进与对比

 

三者的处理步骤

先上三者的处理步骤:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

RCNN:
	1、提取1000-2000个(超参数)的候选框(采用selective search算法);
	2、将每个候选框中的图像调整到相同的size;
	3、将调整size后的图像(数量与候选框个数相同)输入CNN提取feature;
	4、用SVM对每个候选框feature进行分类,判断是否属于某个特定的类(多个二分类器);
	5、对于属于某一分类的候选框,用回归器进一步调整其位置。	
fast RCNN:
	1、提取1000-2000个打候选框(采用selective saerch算法);
	2、将整张图像输入CNN提取feature;
	3、找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征(feature)
	4、将候选框卷积特征输入到SPP layer(ROI pooling层)和之后的层;
	 (SPP:空间金字塔池化,其输入是大小不一的各候选框特征图的尺寸,输出是相同的尺寸)
	5、用softmax对每个候选框feature进行分类,判断是否属于某个特定的类;
	6、对于属于某一分类的候选框,用回归器进一步调整其位置。
faster RCNN:
	1、将整张图输入CNN获取feature map;
	2、将feature map输入RPN(region proposal network),获得候选框,以及各候选框的特征信息
	(一步到位获得了候选框,以及候选框的特征信息);
	3、用softmat对每个候选框feature进行分类,判断是否属于某个特定的类;
	4、对于属于某一分类打候选框,用回归器进一步调整其位置。

涉及的几个关键技术和概念

SPP Net

SPP:Spatial Pyramid Pooling(空间金字塔池化)
它的特点有两个:
1.结合空间金字塔方法实现CNNs的对尺度输入。
  一般CNN后接全连接层或者分类器,他们都需要固定的输入尺寸,因此不得不对输入数据进行crop或者warp,这些预处理会造成数据的丢失或几何的失真。SPP Net的第一个贡献就是将金字塔思想加入到CNN,实现了数据的多尺度输入。一般CNN后接全连接层或者分类器,他们都需要固定的输入尺寸,因此不得不对输入数据进行crop或者warp,这些预处理会造成数据的丢失或几何的失真。SPP Net的第一个贡献就是将金字塔思想加入到CNN,实现了数据的多尺度输入。
如下图所示,在卷积层和全连接层之间加入了SPP layer。此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出尺度始终是固定的。

2.只对原图提取一次卷积特征
  在R-CNN中,每个候选框先resize到统一大小,然后分别作为CNN的输入,这样是很低效的。在R-CNN中,每个候选框先resize到统一大小,然后分别作为CNN的输入,这样是很低效的。
所以SPP Net根据这个缺点做了优化:只对原图进行一次卷积得到整张图的feature map,然后找到每个候选框zaifeature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层。节省了大量的计算时间,比R-CNN有一百倍左右的提速。

ROI Pooling层详解

大牛提出了一个可以看做单层sppnet的网络层,叫做ROI Pooling,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量.
目标检测typical architecture 通常可以分为两个阶段:
(1)region proposal:给定一张输入image找出objects可能存在的所有位置。这一阶段的输出应该是一系列object可能位置的bounding box。这些通常称之为region proposals或者 regions of interest(ROI)
(bounding box、region proposals、 ROI 这几个概念等同)
(2)final classification:确定上一阶段的每个region proposal是否属于目标一类或者背景。
这个architecture存在的一些问题是:

  • 产生大量的region proposals 会导致performance problems,很难达到实时目标检测。

  • 在处理速度方面

  • 是suboptimal。

  • 无法做到end-to-end training。

    这就是ROI pooling提出的根本原因。

ROI pooling层能实现training和testing的显著加速,并提高检测accuracy。该层有两个输入:

  1. 从具有多个卷积核池化的深度网络中获得的固定大小的feature maps;
  2. 个表示所有ROI的N*5的矩阵,其中N表示ROI的数目。第一列表示图像index,其余四列表示其余的左上角和右下角坐标;

ROI pooling具体操作如下:
(1)根据输入image,将ROI映射到feature map对应位置;
(2)将映射后的区域划分为相同大小的sections
(sections数量与输出的维度相同;当不能均分时,区域大小可以略有不同,见后文示例);
(3)对每个sections进行max pooling操作;
这样我们就可以从不同大小的方框得到固定大小的相应 的feature maps。值得一提的是,输出的feature maps的大小不取决于ROI和卷积feature maps大小。ROI pooling 最大的好处就在于极大地提高了处理速度。
ROI pooling example
考虑一个88大小的feature map,一个ROI,以及输出大小为22.
(1)输入的固定大小的feature map
在这里插入图片描述
2)region proposal 投影之后位置(左上角,右下角坐标):(0,3),(7,8)。
在这里插入图片描述
(3)将其划分为(22)个sections(因为输出大小为22),我们可以得到:
在这里插入图片描述
(4)对每个section做max pooling,可以得到:
在这里插入图片描述

ROI pooling总结: (1)用于目标检测任务; (2)允许我们对CNN中的feature map进行reuse; (3)可以显著加速training和testing速度; (4)允许end-to-end的形式训练目标检测系统。

RPN简介

• 在feature map上滑动窗口
  • 建一个神经网络用于物体分类(分类为两种:“候选目标”,“不是目标”)+框位置的回归
  • 滑动窗口的位置提供了物体的大体位置信息
  • 框的回归提供了框更精确的位置
在这里插入图片描述
一种网络,四个损失函数;
  • RPN calssification(anchor good.bad)
  • RPN regression(anchor->propoasal)
  • Fast R-CNN classification(over classes)
  • Fast R-CNN regression(proposal ->box)
  在这里插入图片描述

特征提取器与fine tuning

  在目标检测中,会使用VGG、Resnet、zf、Alexnet等基础网络作为特征提取器。然后调用预训练好的网络(输出pool5的feature map,详情参考这篇博客),根据特定任务进行fine-tuning。
  (有实验证明:如果不进行fine-tuning,也就是你直接把预训练模型当做万金油使用,类似于HOG、SIFT一样做特征提取,不针对特定的任务。然后把提取的特征用于分类,结果发现p5(pooling layer 5)的精度竟然跟f6(fullconnect layer 6)、f7差不多,而且f6提取到的特征还比f7的精度略高;如果你进行fine-tuning了,那么在rcnn中f7、f6的提取到的特征最后训练的svm分类器的精度就会飙涨)
  据此我们明白了一个道理,如果不针对特定任务进行fine-tuning,而是把CNN当做特征提取器,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT算法一样,可以用于提取各种图片的特征,而f6、f7所学习到的特征是用于针对特定任务的特征。打个比方:对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了。

为啥要用SVM分类器

  在RCNN中,有一个疑问:CNN训练的时候,本来就是对bounding box的物体进行识别分类训练,是一个端到端的任务,在训练的时候最后一层softmax就是分类层,那么为什么作者闲着没事干要先用CNN做特征提取(提取fc7层数据),然后再把提取的特征用于训练svm分类器?
  这个是因为svm训练和cnn训练过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用svm精度还低。
  事情是这样的,cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);

  然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格:IOU<0.7的都当成负样本(rcnn训练的是svm二分类这里会存在正负样本不均衡情况,要对负样本下采样或者对正样本上采样)。我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm。

##faster RCNN 详解
https://blog.csdn.net/WZZ18191171661/article/details/79439212

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值