RCNN
1.RCNN目标
暑假在做一个智能驾驶比赛,记录一下RCNN家族的学习,RCNN简单的介绍一下,并没有介绍训练过程,仅仅是工作原理。
传统的单一目标检测实现起来很简单,如手写数字识别,用一个CNN就可以完成。而RCNN系的目标并不像单一目标识别这么简单,它包含两个目标
(1) bbx回归
(2) 在每个bbx中进行目标检测
2.实现思路
假设现在有一个任务,需要识别找出一张图里的所有猫狗,正常人是怎么处理的呢?
(1)先找出大概的目标,我不可能把背景空白都纳入考量范围,我肯定先得锁定几个区域,比如这幅图,我得先锁定四个区域。
(2) 对每一个区域内的对象进行识别
2.1 selective search
因此,为了解决(1)找到大概目标这个事情,RCNN用了slective search
这一方法,注意,该方法只能在CPU上进行,它可以通过颜色聚类的方式为我们找到2000个候选框,也就是找到2000个最有目标可能出现的区域。
2.2 调整图片大小,抽取特征并进行框内的目标检测
我们现在已经得到了2000个候选框,经过resize输入RCNN,再送去SVM分类器。这个时候就得判断候选框里什么,是我们要的目标呢?还仅仅只是一个背景。我们把图片resize之后输入CNN网络, 并对其svm二分类判断。这是猫吗?这是狗吗?还是背景呢?
2.3 (NMS)非极大值抑制
其实有一个问题一直需要解决,那就是selective search
会产生很多候选框,但实际上我们并不要这么多候选框,而且很多候选框实际上很大一部分是重合的。比如下图的汽车,这个对象被很多候选框围住,实际上一个就可以了。那我们要怎么去重呢?经过二分类判断之后,每一个框对于类型会有一个分数。那分数有高有低。于是,这里可以用分数与重复率IOU进行比较。
非极大值抑制过程:
- 假设有三个框,根据SVM打分,概率可以从大到小排为A,B,C。
- 判断B,C与A的重复率IOU是否大于阈值,如果大于,就不要了,小于则保留。
- 保留下来的框,根据打分排序重复上述过程。
第二步需要理解一下:
IOU其实就是两个框的面积重合率。现在A得分最高,B比A低几分。如果这个时候发现A和B面积重复率到了90%(假设阈值是50%),则扔掉。很好理解,A,B位置类似意味着他们基本框住的是同一个东西,此时A又比B二分类分数高,那就证明A比B更优秀,所以就给B扔了。
2.4 Bounding-box regression
现在得到了筛选之后的bbox,但是依然要对其进行一些微调,如小范围的移动或者尺寸缩放。这就是bbox regression干的事情了。如红框变绿框
3. RCNN存在的问题
1.测试速度很慢。用selective search算法提取候选框就得用2秒,每个候选框都要进行分类, 相当于分类两千次。测试一张图片要53s.
2.训练过程很麻烦且复杂
Fast-Rcnn
1. fast RCNN的改进
(1) 在RCNN中,先用select-search
找到2000个候选框,然后把这2000个依次输入卷积网络。但其实这一步很多地方是重复计算了的,因为很多方框实际上是冗余的。因此比较好的方式是先将图片进行卷积,得到特征图,然后再进行select-search
,fast RCNN在一步上做出了改进
(2) 不再采用简单的reshape控制输入图片的大小,使用了pooling层进行处理。
(3) 直接使用全连接网络进行分类,而非SVM支持向量机。
2. fast RCNN的训练过程
(1)用selective search 选出2000个候选框
(2) 将候选框与真实框ground truth进行IOU运算, IOU>0.5的为正样本,其余的为负样本。 正样本就是包含目标的数据,负样本就是背景。
(3)将图片输入CNN中获得特征图
(4)将训练框投影到特征图上,获得特征图上的训练框
(5)将图片与特征图上的训练框输入全连接层
(6)计算sotfmax loss分类损失和smooth L1 loss h回归损失
(7)反向传播更新CNN权重
faster RCNN
1.改进
(1)fast RCNN仍旧需要预训练模型,并非端到端。faster RCNN为端到端网络。
(2)因为selective search
算法用于CPU,所以速度提不起来。在GPU训练时代,必须想办法使用GPU对数据进行处理。faster RCNN用RPN代替了selective search
2.流程
TODO