《Rich feature hierarchies for accurate object detection and semantic segmentation》阅读笔记
1.introduction
R-CNN(region with CNN features),即region proposals(候选区域) + CNN,解决两个问题:
1.网络定位物体难,解决方法:通过操作”recognition using regions”,解决了CNN的定位问题。测试时,对这每张图片,产生了接近2000个与类别无关的region proposal,对每个CNN抽取了一个固定长度的特征向量,然后借助专门针对特定类别数据的线性SVM对每个区域进行分类。
2.标签数据太少,解决方法:第二个核心贡献是在辅助数据集(ILSVRC)上进行有监督预训练,再在小数据集上针对特定问题进行调优
如上图所示,R-CNN这个物体检查系统可以大致分为四步进行:
1.获取输入图像
2.提取约2000个候选区域
3.将候选区域分别输入CNN网络(这里需要将候选图片进行缩放)
4.将CNN的输出输入SVM中进行类别的判定
2.三个模块
第一个,产生类别无关的region proposal。这些推荐定义了一个候选检测区域的集合;
第二个是一个大型卷积神经网络,用于从每个区域抽取特定大小的特征向量;
第三个是一个指定类别的线性SVM。
2.1候选区域的提取
这部分有很多传统的方法objectness(物体性),selective search(选择性搜索),category-independent object proposals(类别无关物体推荐),constrained parametric min-cuts(受限参最小剪切, CPMC),multi-scal combinatorial grouping(多尺度联合分组)可以选择,rcnn为了和之前的物体检测算法进行对比,选择了selective search方法
输入:一张图片
输出:候选的目标位置集合
算法:
利用切分方法得到候选的区域集合R = {r1,r2,…,rn}
初始化相似集合S = ϕ
foreach 遍历邻居区域对 (ri,rj) do
计算相似度s(ri,rj)
S = S ∪ s(ri,rj)
while S not=ϕ do
从s中得到最大的相似度s(ri,rj)=max(S)
合并对应的区域rt = ri ∪ rj
移除ri对应的所有相似度:S = S\s(ri,r*)
移除rj对应的所有相似度:S = S\s(r*,rj)
计算rt对应的相似度集合St
S = S ∪ St
R = R ∪ rt
L = R中所有区域对应的边框
首先通过基于图的图像分割方法初始化原始区域,就是将图像分割成很多很多的小块,使用贪心策略,计算每两个相邻区域的相似度,然后每次合并最相似的两块,直至最终只剩下一块完整的图片。这其中每次产生的图像块包括合并的图像块我们都保存下来,这样就得到图像的分成表示.
选择性搜索采用三种多样性策略:
多种颜色空间,考虑RGB、灰度、HSV及其变种
多种相似度度量标准,既考虑颜色相似度,又考虑纹理、大小、重叠情况等
通过改变阈值初始化原始区域,阈值越大,分割的区域越少
1、颜色空间转换
通过色彩空间转换,将原始色彩空间转换到多达八种色彩空间。也是为了考虑场景以及光照条件等,主要应用于图像分割算法中原始区域的生成(两个像素点的相似度计算时,计算不同颜色空间下的两点距离)。主要使用的颜色空间有:(1)RGB,(2)灰度I,(3)Lab,(4)rgI(归一化的rg通道加上灰度),(5)HSV,(6)rgb(归一化的RGB),(7)C,(8)H(HSV通道的H)
2、区域相似度计算
我们在计算多种相似度的时候,都是把单一相似度的值归一化到[0, 1]之间,1表示两个区域之间相似度最大
颜色相似度
纹理相似度
有限合并小的区域
区域的合适度距离
合并上面四种相似度
2.2 特征提取
2.2.1缩放处理
们通过上述的生成候选区域算法得到了2000个左右的候选框,然后我们想要通过CNN获取其中的特征,架构中的CNN只能接受固定大小:227*227,而我们获取的图片大小却不是固定的,这就需要我们对图片进行缩放处理。
1.各项异性缩放
2.各项同性缩放
因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案,这也分两种:
A. 先扩充后后裁剪:在原图上将bounding box扩充到所需要的尺寸,然后在输入到CNN中
B.先裁剪后扩充:先把bounding box图片裁剪处理,然后再使用bounding box中的颜色均值进行填充
2.2.2CNN提取特征
使用的是Alexnet提取,网络总共的层数为8层,5层卷积,3层全连接层。而通过 Selective Search 产生的候选区域大小不一,为了与 Alexnet 兼容,R-CNN 采用了在候选框周围加上16的padding,再进行各向异性缩放,统一变换到 227*227 的尺寸。通过五个卷积层和两个全连接层进行前向传播,最终得到一个4096维度的特征向量。其中最后一层是softmax层,为1000个类别的输出,现在自己训练数据,修改了原来的1000为类别输出,改为21维(20类+背景)输出,而且用svm去替换softmax,因此CNN提取出的图片具体特征含在了倒数第二层里,也就是全连接层fc1。
3.用svm来类别判断
20种分类,SVM是二分类器,则有20个SVM,只分是该类和不是该类,获得2000×20维矩阵表示每个建议框是某个物体类别的得分,分别对上述2000×20维矩阵中每一列即每一类,通过计算 IoU 指标,进行非极大值抑制剔除重叠建议框,剔除掉那些重叠位置的区域,得到该列即该类中得分最高的一些建议框。
具体操作:
1.对于2000*20的矩阵,对每一列按从大到小排序,每一列有2000个数,每个数代表对这个候选区域对这一类别的打分数。
2.从第一列最大的得分类别开始,与这它后面的得分的建议框(也就是第一行)进行IOU计算,如果IOU>0.5保留,并剔除第一个候选框中的得分小的建议框。
3.再从第二行开始,也就是第二个候选框,开始按照步骤2进行操作。
直到遍历完所有的候选框。
4.训练
R-CNN 采取迁移学习,提取在 ILSVRC 2012 的模型和权重,然后在 VOC 上进行 fine-tune。这里只训练和分类有关的参数,因为ILSVRC数据只有分类,没有位置标注,所以这里在 ImageNet 上训练的是模型识别物体类型的能力,而不是预测 bbox 位置的能力。ImageNet 的训练当中需要预测 1000 个类别,而 R-CNN 在 VOC 上进行迁移学习时,神经网络只需要识别 21 个类别。R-CNN 将候选区域与 GroundTrue(真实值) 中的 box 标签相比较,如果 IoU > 0.5,说明两个对象重叠的位置比较多,于是就可以认为这个候选区域是 正样本,否则就是负样本。对于重叠的区域(这个框里既有背景也有识别物),则使用IoU重叠阈值来解决这个问题,低于这个阈值的就是负例。这个阈值我们选择了0.3,同上。
一个样本就会产生2000左右个预测框,但是产生的正样本会很少,所以又会使用坤但负样本挖掘hard negative mining method(ssd上说过,就是在训练时,尽量多挖掘些难负例(hard negative)加入负样本集,这样会比easy negative组成的负样本集效果更好。也是用的交并比)。
采用 SGD 训练,初始学习率为 0.001,batch 大小为 128.
5.实验结果
那yolov1的图来看,因为那时候比较的都是传统目标识别算法,也不比较速度。(DPM=HOG+SVM),rcnn与传统算法来说map提高了50%以上,但由于在产生bbox和svm的时候特别占用资源,在fps上不占优势。
参考文献:
大话目标检测经典模型(RCNN、Fast RCNN、Faster RCNN)
R-CNN论文详解(论文翻译)
rcnn详解
[深度学习]RCNNs系列(2)RCNN介绍
Fast R-CNN阅读笔记
1.提出rcnn的弊端
1.rcnn是多步策略:rcnn先用卷积网络和逻辑损失做目标检测,然后用卷积特征去训练支持向量机,通过微调来用支持向量机来代替softmax做分类器,在第三个训练阶段来学习检测回归。
2.训练的时间和空间消耗很大,对于svm和检测框的回归会由于磁盘读写时空复杂度很高,尤其是vgg16
3.目标检测很慢,由于rcnn前向传播的时候没有共享计算。
4.spp的缺陷,他的特征提取方法和rcnn一样,但是没有办法进行fine-tuning,因此其限制了深层网络的精度。
因此作者提出了把rcnn和sppnet结合的网络fast rcnn有着如下的优点:
1.map高于R-CNN, SPPnet
2.训练是使用多任务损失的单阶段训练
3.训练的时候可以更换所有层
4.不需要磁盘来缓存特征信息
2.fast rcnn结构
先把所有的图片的整个的投入用卷积和全连接,以产生卷积特征图,之后对于每个roi中的,提取固定长度的特征向量,每个特征向量也会被投入到一系列的的全连接层,最终进入到两个统计输出层:一个通过softmax来输出k个物体类别和1个背景类别,另一个层会输出针对所有k个类各自输出四个分数,这四个数值的含义是每个类的检测框位置的修正。
2.1roi 池化模块
roi池化层使用最大池化去把所有特征转换成具有的固定感受野的小特征图,roi的属性是左上角坐标+长宽。
之后根据roi的位置和大小来框定feature map,再将它划分为2x2的网格,惊醒pooling
重构预训练网络
预训练的ImageNet网络,每个网络有五个最大池化层和五到十三个卷积层
1.首先最后的最大池化层,被rop池化层代替、
2.最后的全连接层和softmax层被之前那两个同级网络替换
3.网络需要两个类数据的输入:图像的列表和图像中roi的列表
2.3SPPnet无法更新低于空间金字塔池化层的权重原因
再spp方向传播的时候由于roi的区域过大(通常是把整个图片都反向传播进去了)导致了其十分低效。fast rcnn使用了在训练期间进行特征共享,用sgd小批次分层采样。先通过采样N个图像,然后通过从每个图像采样R/N个 RoIs,来自同一图像的RoI在向前和向后传播中共享计算和存储器。
N = 2和R = 128时,得到的训练方案比从128幅不同的图采样一个RoI快64倍。这样虽然带来了收敛过慢的影响,所以使用更少的sgd。用精细化来化解要整个图相反向传播的缺点
fastrcnn还在微调阶段使用级联分类器和bbox回归,而不是之前的softmax、svm+回归
2.4多任务损失
fastrcnn有两层级联输出网:输出k+1个类的类别概率,通常是靠softmax来算的;第二个网络输出bbox回归,四类xyhw。
每个用来训练的roi都有真实的bbox和类标签信息,fastrcnn使用多任务损失,去联合回归,分两个部分:一个是类的损失,另一个是位置的损失
p : Anchor[i]的预测分类概率;
Anchor[i]是正样本时,p=1 ;Anchor[i]是负样本时,p=0 ;
满足以下条件的Anchor是负样本:
与Gound Truth Box的IOU的重叠区域 <0.3;否则是正样本
Smooth L1完美地避开了 L1 和 L2 损失的缺陷,在 x 较小时,对 x 的梯度也会变小; 而在 x 很大时,对 x 的梯度的绝对值达到上限1,不会因预测值的梯度十分大导致训练不稳定。因为比较平滑,所以可以避免梯度爆炸。
λ: 权重平衡参数,在论文中作者设置λ=10,但实际实验显示,结果对的λ变化不敏感,如下表所示:
2.5小批次采样
在微调阶段一个批次有128个roi,这128所有的sgd的小批量采样都是均匀随机从两个图中来的,只从候选框中找25%为正样本,而且要求iou至少是0.5以上。[0.1, 0.5)的作为负样本,类别标签u=0;[0.5, 1]的作为正样本,u>=1,其余的不要。128个roi中,正样本是32个,负样本是96个。使用水平翻转的方法来进行数据增益
2.6通过roi池化来反向传播
普通的池化只针对该感受野内的像素进行前向和反向传播,fastrcnn中的用roi池化来代替,由于roi可能会有重叠区块,所以同一个位置会进行多次反向传播。
2.7sdg的超参数
用于分类和bbox回归的全连接层是满足均值为零且各标准差为0.01和0.001的,偏置初始化为0。前三万次训练的学习率是0.001,后一万次为0.0001.sds的动量设置为0.9,权重衰减设置为0.0005。
2.8什么叫微调
使用fine tuning原因:由于数据集不够大,用预训练的网络(例如在ImageNet上训练的分类1000类的网络)来重新fine-tuning,或者当做特征提取器。
两类常见的迁移训练场景:
1 卷积网络当做特征提取器。使用在ImageNet上预训练的网络,去掉最后的全连接层,剩余部分当做特征提取器(例如AlexNet在最后分类器前,是4096维的特征向量)。这样提取的特征叫做CNN codes。得到这样的特征后,可以使用线性分类器(Liner SVM、Softmax等)来分类图像。
2 Fine-tuning卷积网络。替换掉网络的输入层(数据),使用新的数据继续训练。Fine-tune时可以选择fine-tune全部层或部分层。通常,前面的层提取的是图像的通用特征(例如边缘检测,色彩检测),这些特征对许多任务都有用。后面的层提取的是与特定类别有关的特征,因此fine-tune时常常只需要Fine-tuning后面的层。
2.9奇异值分解来减少检测时间
什么叫奇异值分解:简单来说就是把一个矩阵转换成两个方阵和一个矩阵成绩的形式
左奇异矩阵可以用于行数的压缩。
作用:右奇异矩阵可以用于列数即特征维度的压缩,也就是我们的PCA降维。
奇异值分解有两种表达形式,一个是之前说的的矩阵乘积一个是,向量乘积的和,σ就是奇异值,奇异值的大的组他代表的信息就多,相反小的所含的信息就少,还可以用删除奇异值小的组的数据来降噪。
分别表示列向量
而在 目标检测任务中,要处理的RoI数量比较多,几乎有一半的前向计算时间被用于全连接层,RoI池化层后的全连接层需要进行约2k次。
物体分类和bbox回归都是通过全连接层实现的,假设全连接层输入数据为X,输出数据为Y,全连接层权值矩阵为W,尺寸为 u × v ,那么该层全连接计算为:Y = W × X
若将W进行SVD分解(奇异值分解),并用前t个特征值近似代替,即:
svd可以节约大量的时间,而仅仅牺牲0.3个map,而且不需要使用微调
3.实验结果
接着使用yolo中的比较图,可以发现fast rcnn采用selective search算法提取候选区域,而目标检测大多数时间都消耗在这里。Faster R-CNN框架就解决了这一问题,其可以使用CNN直接产生候选区域并对其分类。
参考文献:
Fast R-CNN
Fast R-CNN论文详解
奇异值分解(SVD)
奇异值的物理意义是什么?
RCNN学习笔记(2):Fast R-CNN
Fast R-CNN论文解读
0.前沿知识补充
1.end-to-end(端到端):一端输入我的原始图像,一端输出我想得到的结果。只关心输入和输出,中间的步骤全部都不管。yolo这种一步法的
2.非end-to-end:先在图像中提取可能含有目标的候选框(region proposal), 然后将这些候选框输入到CNN模型,让CNN判断候选框中是否真的有目标,以及目标的类别是什么。两步法的:一是目标所在位置及大小,二是目标的类别,类似rcnn
end-to-end 的本质是你要解决的问题是多阶段的或多步的(跟所谓的raw feature没啥关系)。如果分阶段学习的话,第一阶段的最优解不能保证第二阶段的问题达到最优。end-to-end把他们堆在一起来优化,确保最后阶段的解达到最优。
因为之前的rcnn都是比较慢的,何凯明他们就准备使用yolo那种策略来提高fps
1.之前工作的缺陷:
之前的非端到端的模型都是之在卷积提取特征值的时候使用了gpu训练,而在提取bbox。
2. FATER R-CNN
使用了rpn,over feat,OverFeat ,fcn(fully convolutional network)
2.1使用锚点
faster受用了anchor作为多尺度和纵横比的参考。而不应是pyramids。它避免了枚举多尺度或纵横比的图像或滤波器。该模型在使用单尺度图像进行训练和测试时表现良好,
因此有利于运行速度。
2.2尝试使用新的region proposal方法和检测模块
和yolov3一样faster也喜欢各种实验模块:对象提议方法包括基于分组超像素的方法选择性搜索,CPMC,MCG )和基于滑动窗口的方法(窗口中的对象,EdgeBoxes )。采用对象提议方法作为独立于检测器的外部模块(选择性搜索
对象检测器,R-CNN 和 Fast R-CNN )。
2.3RPN
rpn可以将任意大小的图片输入,并获得一系列的Region Proposal,每个预测区域也有相应的分数
2.4FCN
FCN将传统CNN中的全连接层转化成一个个的卷积层。所有的层都是卷积层,故称为全卷积网络。
通常cnn网络在卷积之后会接上若干个全连接层,将卷积层产生的特征图(feature map)映射成为一个固定长度的特征向量,最后得到输入图像的分类的概率。
FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷基层的特征图(feature map)进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后奇偶在上采样的特征图进行像素的分类。全卷积网络(FCN)是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。