参考:RCNN介绍
参考:RCNN,Fast RCNN, Faster RCNN整理总结
一、 RCNN
20180527152957814.png
【借助CNN良好的特征提取和分类性能,通过RegionProposal方法实现目标检测问题的转化】
RCNN三个步骤:
1)候选区域选择
- Region Proposal:一类传统的区域提取方法,可以看作不同宽高的滑动窗口,通过窗口滑动获得潜在的目标图像。
- SelectiveSearch:
滑动窗口法:就是按照子块的大小在整幅图像上穷举所有子图像块(费时费力)。
选择性搜索:和滑动窗口法相对的是另外一类基于区域(region proposal)的方法。参考SelectiveSearch - Candidate:一般2k个,可理解为将图片划分成2k个网格,之后再对网格进行特征提取或卷积操作,这根据RCNN类算法下的分支来决定。然后基于就建议提取的目标图像将其标准化为CNN的标准输入。
2)CNN特征提取
标准CNN过程,根据输入进行卷积或池化等操作,得到固定维度的输出。在特征提取之后,特征映射被卷积和汇集以获得输出(向量)。
3)分类与边界回归
两个步骤:
1.分类:对前一步的输出向量进行分类,分类器需要根据特征进行训练。(分类器的选择中有支持向量机SVM、Softmax等等)
2.边界回归:通过边界回归框(bounding-box regression)进行回归,获得精确的目标区域。其目的是准确定位和合并完成分类的预期目标,并避免多重检测。(边界回归有bbox回归、多任务损失函数边框回归等)
RCNN缺点
- 在RCNN刚刚被发明出来的2014年,RCNN在目标检测与行人检测上取得了巨大的成就,然而效率低下,花费时间长等一系列的问题的产生,还是导致了RCNN的运用并没有取得大范围的应用。
- 其最大的问题有三:
- 需要事先提取多个候选区域对应的图像。这一行为会占用大量的磁盘空间。
- 针对传统的CNN来说,输入的map需要时固定尺寸的,而归一化(crop/warp)过程中对图片产生的形变(截断或拉伸)会导致图片大小改变,导致输入CNN的信息丢失,这对CNN的特征提取有致命的坏处。
- 每个RegionProposal都需要进入CNN网络计算,上千个Region存在大量范围重叠,导致重复的相同的特征提取,这导致巨大的计算资源。
二、SPP-Net
SPP-Net.png
克服CNN特征提取过程卷积计算资源的耗费,提取整体特征(而不是对每个候选区域独立计算),分类之前仅仅做一次Region截取。
改进:
1)取消了crop/warp图像归一化过程,解决图像变形导致的信息丢失以及存储问题;
2)采用空间金字塔池化(SpatialPyramid Pooling)替换了全连接层之间的最优一个迟化层。
空间金字塔池化
使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的意义(多尺度特征提取出固定大小的特征向量),送入全连接层。整体框架大致为:输入图像,卷积层提取特征,空间金字塔池化提取固定大小特征,全连接层。
SppNet缺点:
- 和RCNN一样,训练过程仍然是隔离的,提取候选框 | 计算CNN特征| SVM分类 | Bounding Box回归独立训练,大量的中间结果需要转存,无法整体训练参数;
- SPP-Net在无法同时Tuning在SPP-Layer两边的卷积层和全连接层,很大程度上限制了深度CNN的效果;
- 在整个过程中,Proposal Region仍然很耗时。
三、Fast RCNN
改进点:对RCNN进行加速。(更快、更准、更鲁棒——是我们一直追求的目标)
- (重点一)借鉴SPP思路,提出简化版ROI池化层(不是金字塔),同时加入候选框映射功能,使得网络能够反向传播,解决了SPP的整体网络训练问题;
- (重点二)多任务Loss层
a) SoftmaxLoss代替SVM,证明softmax比SVM更好的效果;
b) SmoothL1Loss代替Bounding box回归(边界回归)。
将分类和边框回归进行合并,通过多任务Loss层进一步整合深度网络,统一了训练过程,从而提高了算法准确度。
- (重点二)多任务Loss层
- 全连接层通过SVD加速(有一定的提升但不是革命性的)
- 结合上面的改进,模型训练时可对所有层进行更新,除了速度提升外(训练速度是SPP的3倍,测试速度10倍),得到了更好的检测效果(VOC07数据集mAP为70,注:mAP,mean Average Precision)。
四、Faster RCNN
Faster-RCNN.png
* 对于提取候选框最常用的SelectiveSearch方法,提取一副图像大概需要2s的时间,改进的EdgeBoxes算法将效率提高到了0.2s,但是这还不够。
* 选框提取不一定要在原图上做,特征图上同样可以,低分辨率特征图意味着更少的计算量,基于这个假设,MSRA的任少卿等人提出RPN(RegionProposal Network),完美解决了这个问题,我们先来看一下网络拓扑。
候
RPN分支
- 通过添加额外的RPN分枝网络,将候选框提取合并到深度网络中,这正是Faster-RCNN里程碑式的贡献。
- RPN网络的特点在于通过滑动窗口的方式实现候选框的选取,每个滑动窗口位置生成9个候选框(不同尺寸、不同高度),提取对应9个候选框的特征,用于目标分类和边框回归,与FastRCNN类似。
-
目标分类只需要区分候选框内特征为前景或者背景。
边框回归确定更精确的目标位置。
Faster-RCNN-RPN.png
-
训练过程中,候选框选取依据:
- 丢弃跨越边界的anchor;
- 与样本重叠区域大于0.7的anchor标记为前景,重叠区域小于0.3的标定为背景;
- 对于每一个位置,通过两个全连接层(目标分类+边框回归)对每个候选框(anchor)进行判断,并且结合概率值进行舍弃(仅保留约300个anchor),没有显式地提取任何候选窗口,完全使用网络自身完成判断和修正。
-
从模型训练的角度来看,通过使用共享特征交替训练的方式,达到接近实时的性能,交替训练方式描述为:
- 根据现有网络初始化权值w,训练RPN;
- 用RPN提取训练集上的候选区域,用候选区域训练FastRCNN,更新权值w;
- 重复1、2,直到收敛。
-
因为Faster-RCNN,这种基于CNN的real-time 的目标检测方法看到了希望,在这个方向上有了进一步的研究思路。
RCNN网络的演进:
RCNN网络的演进.png
Faster实现了端到端的检测,并且几乎达到了效果上的最优,速度方向的改进仍有余地,于是YOLO诞生了。
五、YOLO
YOLO.png
YOLO来自于“YouOnly Look Once”,你只需要看一次,不需要类似RPN的候选框提取,直接进行整图回归就可以了。
算法描述
- 将图像划分为固定的网格(比如7*7),如果某个样本Object中心落在对应网格,该网格负责这个Object位置的回归;
- 每个网格预测包含Object位置与置信度信息,这些信息编码为一个向量;
- 网络输出层即为每个Grid的对应结果,由此实现端到端的训练。
存在的问题
-
7*7的网格回归特征丢失比较严重,缺乏多尺度回归依据;
-
Loss计算方式无法有效平衡(不管是加权或者均差),Loss收敛变差,导致模型不稳定。
Object(目标分类+回归)<=等价于=>背景(目标分类)
- 导致Loss对目标分类+回归的影响,与背景影响一致,部分残差无法有效回传;
- 整体上YOLO方法定位不够精确,贡献在于提出给目标检测一个新的思路,让我们看到了目标检测在实际应用中真正的可能性。
- 这里备注一下,直接回归可以认为最后一层即是对应7*7个网格的特征结果,每一个网格的对应向量代表了要回归的参数(比如pred、cls、xmin、ymin、xmax、ymax),参数的含义在于Loss函数的设计。
SSD
SSD.png
由于YOLO本身采用的SingleShot基于最后一个卷积层实现,对目标定位有一定偏差,也容易造成小目标的漏检。
借鉴Faster-RCNN的Anchor机制,SSD(Single Shot MultiBox Detector)在一定程度上解决了这个问题,我们先来看下SSD的结构对比图。
- 基于多尺度特征的Proposal,SSD达到了效率与效果的平衡,从运算速度上来看,能达到接近实时的表现,从效果上看,要比YOLO更好。
- 对于目标检测网络的探索仍在一个快速的过程中,有些基于Faster-RCNN的变种准确度已经刷到了87%以上,而在速度的改进上,YOLO2也似乎会给我们带来一定的惊喜,“未来已来”,我们拭目以待!
【上面都是理论,接下来去代码实践一下】
网友评论