您现在的位置是:首页 > 正文

思考R-CNN的一些问题,如何提取特征,分类,训练,测试

2024-01-30 22:52:31阅读 0

1.R-CNN是什么

论文链接
作为深度网络检测的开山之作,一定得了解其具体流程,首先R-CNN是什么:把(区域候选)region proposal和(卷积神经网络)CNN结合起来,所以该方法被称为R-CNN:Regions with CNN features,整个检测系统有三个模块构成。
在这里插入图片描述第一个,产生类别无关的region proposal:这些推荐定义了一个候选检测区域的集合;第二个是一个大型卷积神经网络,用于从每个区域抽取特定大小的特征向量;第三个是一个指定类别的线性SVM分类器。

2.如何提取候选框

使用了Selective Search方法从一张图像生成约2000-3000个候选区域。
在目标检测时,为了定位到目标的具体位置,通常会把图像分成许多子块,然后把子块作为输入,送到目标识别的模型中。分子块的最直接方法叫滑动窗口法。滑动窗口的方法就是按照子块的大小在整幅图像上穷举所有子图像块。但是穷举过于耗费资源,实现较为繁琐。和滑动窗口法相对的是另外一类基于区域(region proposal)的方法。selective search就是其中之一。其思想流程如下:
在这里插入图片描述基本思路如下:用一种分割手段,将图像分割成小区域,查看现有小区域,合并可能性最高的两个区域。重复直到整张图像合并成一个区域位置,输出所有曾经存在过的区域,所谓候选区域,候选区域生成和后续步骤相对独立,实际可以使用任意算法进行。优先合并以下四种区域:颜色(颜色直方图)相近的;纹理(梯度直方图)相近的;合并后总面积小的;合并后,总面积在其BBOX中所占比例大的;第三条,保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域。

3.如何提取特征

通过步骤2得到选择性搜索算法我们搜索出2000个候选框。尽管经过搜索合并后得到候选框是矩形的,但是大小各不相同。然而CNN对输入图片的大小是有固定的,因为R-CNN用的网络结构是Alexnet 。因此对于每个输入的候选框都需要缩放到固定的大小。具体的,变形之前,在候选框周围加上16的padding,再进行各向异性缩放。
利用CNN对每个推荐区域抽取一个4096维度的特征向量把一个输入为277*277大小的候选框含有的图片数据,通过五个卷积层和两个全连接层进行前向传播,最终得到一个4096维度的特征向量。其中最后一层是softmax层,为1000个类别的输出,现在自己训练数据,修改了原来的1000为类别输出,改为21维【20类+背景】输出,因此CNN提取出的图片具体特征含在了倒数第二层里,也就是全连接层fc1。

4.如何分类

用于训练多个SVM的数据集是用pretrain的ImageNet数据
将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘【20种分类,SVM是二分类器,则有20个SVM】,获得2000×20维矩阵表示每个建议框是某个物体类别的得分;
分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框
对每个候选区域的特征,采用训练好的20个svm(每类都训练一个svm)对进行二分类,只分是该类和不是该类(而不是用softmax直接多分类,文中发现直接用softmax时的mAP比较低),SVM得到是该类的score;取每个候选区域score最大的作为该类或者采用一定阈值进行过滤,对每个候选区域的框进行nms。
为什么单独训练了一个SVM而不是直接用softmax,作者提到,刚开始时只是用了ImageNet预训练了CNN,并用提取的特征训练了SVMs,此时用正负样本标记方法就是前面所述的0.3,后来刚开始使用fine-tuning时,也使用了这个方法,但是发现结果很差,于是通过调试选择了0.5这个方法,作者认为这样可以加大样本的数量,从而避免过拟合。然而,IoU大于0.5就作为正样本会导致网络定位准确度的下降,故使用了SVM来做检测,全部使用ground-truth样本作为正样本,且使用非正样本的,且IoU大于0.3的“hard negatives”,提高了定位的准确度】。
具体操作:
1.对于2000*20的矩阵,对每一列按从大到小排序,每一列有2000个数,每个数代表对这个候选区域对这一类别的打分数。
2.从第一列最大的得分类别开始,与这它后面的得分的建议框(也就是第一行)进行IOU计算,如果IOU>0.5保留,并剔除第一个候选框中的得分小的建议框。
3.再从第二行开始,也就是第二个候选框,开始按照步骤2进行操作。
直到遍历完所有的候选框。

5.如何训练,损失函数是什么

首先进行有监督预训练:训练网络参数,使用分类数据集样本:ILSVRC
这里只训练和分类有关的参数,因为ILSVRC数据只有分类,没有位置标注
图片尺寸为227x227。

训练大型cnn时,cnn进行前向传播阶段,依次调用每个Layer的Forward函数,得到逐层的输出,最后一层与目标函数比较得到损失函数,计算误差更新值,通过反向传播逐层到达第一层,所有权值在反向传播结束时一起更新。
loss layer 是CNN的终点,接受两个Blob作为输入,其中一个是CNN的预测值,另一个是真实标签。损失层则将这两个输入进行一系列运算,得到当前网络的损失函数(Loss Function),一般记做L(θ)其中θ是当前网络权值构成的向量空间。机器学习的目的是在权值空间中找到让损失函数L(θ) 最小的权值θ(opt),可以采用一系列最优化方法(如SGD方法)逼近权值θ(opt)。
损失函数是在前向传播计算中得到的,同时也是反向传播的起点
利用softmax的结果计算交叉熵分类损失函数,作为指导训练CNN的训练。
在这里插入图片描述

迁移到自己数据时只需要微调CNN结构,训练SVM分类器,训练边框回归用来准确定位。
在每次迭代中,考察一个候选框和当前图像上所有标定框重叠面积最大的一个。如果重叠比例大于0.5,则认为此候选框为此标定的类别即正样本;否则认为此候选框为背景。统一地对32个正窗口(所有类)和96个背景窗口进行采样,以构建一个128大小的batchsize。将取样偏向正窗,因为它们与背景相比非常罕见。
将卷积神经网络ImageNet训练+自己数据微调好后,

采用机器学习的形式训练分类器和回归器。
分类器:
用于训练多个SVM的数据集是用pretrain的ImageNet数据,将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘【20种分类,SVM是二分类器,则有20个SVM】,获得2000×20维矩阵表示每个建议框是某个物体类别的得分,分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框。即标题4的内容。
回归器:
所有图像经过select search 后选出2000个候选区域(当然这些图像会被IOU的阈值过滤掉许多)的位置(包括中心Px, 中心Py, 宽度Pw, 高度Ph, 这些位置都是已知的)。G为物体真实的位置(框用Gx, Gy, Gw, Gh表示)。P的位置肯定与真实的G有偏差,所以现在指定了一种学习方法,让P的值通过某种变换更接近真实G。这种变换用dx§, dy§, dw§, dh§表示,理解时把dx§, dy§, dw§, dh§分别当作一个整体,看作一种函数的变换。

softmax分类器用来指导CNN提取更有用的特征,训练好之后再用SVM分类。这就引出一个问题:在微调之后,为什么还要费心培训SVM?
原文中给了答案:简单地将微调网络的最后一层作为对象检测器,这是一个21路softmax回归分类器。我们尝试了一下,发现voc2007的性能从54.2%下降到41.3%(12.9个百分点)!这种性能下降很可能是因为在微调中使用的正样本的定义,而这些示例并不强调精确的本地化。我们推测,如果有足够的检测训练数据,我们可以像支持向量机训练一样简单地定义正反两个例子,然后应用微调(或简单地从头开始训练),然后将最后一层作为目标检测器。如果是真的,这将很好地简化R-CNN的培训。
但是加入了SVM就导致了失去了端到端的训练。因此后续fasterrcnn直接用softmax分类。
根据上文所述这就引出第2个问题
为什么在微调CNN和训练目标检测svm时,正反两个例子的定义不同?
微调CNN(IOU>0.5就认为是正样本)
微调阶段是由于CNN对小样本容易过拟合,需要大量训练数据,故对IoU限制宽松:预测框和真实框相交IoU>0.5的建议框为正样本,否则为负样本;
SVM这种机制是由于其适用于小样本训练,故对样本IoU限制严格:把真实框拿来做为正样本,与真实框相交的IoU<0.3的建议框就作为负样本

因此可以看出整个训练过程很复杂,ILSVRC 2012上预训练CNN,PASCAL VOC 2007上微调CNN,做20类SVM分类器的训练和20类bounding-box回归器的训练;这些不连续过程必然涉及到特征存储、浪费磁盘空间等问题。

6.测试

在测试时,对测试图像进行选择性搜索以提取大约2000个区域建议,将每个区域变形到227*227后并通过CNN向前传播,以计算每个区域的特征。然后,对于每一类,我们使用已经训练好的该类支持向量机对每个提取的特征向量进行评分。给定图像中的所有评分区域,我们应用非最大值抑制(独立于每个类),如果一个区域具有交集并且超过(IoU)重叠,则取一个置信度最大的保留下来。

网站文章

  • React自定义Hooks——useLocalStorage

    封装任何的函数,都是将一些重复的逻辑单独封装到一个函数。而不是为了封装而封装。 定义useLocalStorage,是因为localStorage,在不同的组件中获取,更新。每次更新或者获取都是loc...

    2024-01-30 22:52:25
  • 数据通信与计算机网络 TASK0

    数据通信与计算机网络 TASK0

    数据通信与计算机网络 TASK0

    2024-01-30 22:51:55
  • goland的激活码 热门推荐

    goland的激活码 http://idea.youbbs.org

    2024-01-30 22:51:49
  • Numpy基础一:ndarray

    Numpy基础一:ndarray

    1. ndarray对象numpy中的内置多维数组类型ndarray由一系列同类型数据所构成,并以0作为下标开始索引。ndarray中的每个元素在内存中都有相同的存储大小区域。ndarray由以下四部...

    2024-01-30 22:51:43
  • token 应该存在 Cookie、SessionStorage 还是 LocalStorage 中?

    3. LocalStorage:将token存储在localStorage中的优点是,即使在浏览器关闭后,localStorage中的数据仍然存在,因此用户可以保持登录状态。2. SessionSto...

    2024-01-30 22:51:13
  • eth0与enp0s0,为什么采用不同的网卡命名方式?

    eth0与enp0s0,为什么采用不同的网卡命名方式?

    旧的网卡命名方式,其网卡名字重启容易变动,无法预测。而新的做成了无状态的,基于fireware/bios/物理硬件插槽位置来确定网卡名字,具有预测性与确定性。可定制自己需要的网卡命名方式。

    2024-01-30 22:51:08
  • 【实验】Linux系统编译安装mysql数据库

    【实验】Linux系统编译安装mysql数据库

    编译安装mysql数据库首先上传mysql的程序包,我们这里使用的是mysql的5.6.36版本,链接:https://pan.baidu.com/s/1dEwaJqk3BMRYB-ejat_kYQ提...

    2024-01-30 22:51:00
  • C++学习15_类和对象(特殊数据成员初始化 特殊成员函数)

    文章目录特殊的数据成员——初始化常量数据成员 ( const ) 和引用数据成员( & )类对象数据成员静态数据成员 ( static )特殊成员函数静态成员函数const成员函数特殊的数据成员—...

    2024-01-30 22:50:31
  • SSL协议详解

    SSL协议详解

    SSL协议分为两层,下层为==SSL记录协议==,上层为==SSL握手协议、SSL密码变化协议和SSL警告协议。== 1.下层为SSL记录协议,主要作用是为高层协议提供基本的安全服务 > 建立在...

    2024-01-30 22:50:24
  • Cannot invoke “org.apache.ibatis.session.SqlSession.close()“ because “sqlSession“ is null

    Cannot invoke “org.apache.ibatis.session.SqlSession.close()“ because “sqlSession“ is null

    MyBatis遇到的神坑 刚才去优化MyBatis的属性配置的时候,使用resultMap,执行测试方法,提示我错误信息 可以看到错误信息 Cannot invoke "org.apache...

    2024-01-30 22:50:17