基本流程:
-
候选区域生成: 一张图像生成1K~2K个候选区域 (采用Selective Search 方法)
-
特征提取: 对每个候选区域,使用深度卷积网络提取特征 (CNN)
-
类别判断: 特征送入每一类的SVM 分类器,判别是否属于该类
-
位置精修: 使用回归器精细修正候选框位置
基础知识
什么是Selective Search 方法:
该算法的主要思路是输入一张图片,首先通过图像分割的方法(代码里使用的是felzenszwalb算法,详见https://www.cnblogs.com/qw12/p/9461158.html)获得很多小的区域,然后对这些小的区域不断进行合并,一直到无法合并为止。
下图是原文中对该算法进行的伪代码描述
算法分为如下几个大步:
1. 生成原始的区域集R(利用felzenszwalb算法)
2. 计算区域集R里每个相邻区域的相似度S={s1,s2,…}
3. 找出相似度最高的两个区域,将其合并为新集,添加进R
4. 从S中移除所有与第3步中有关的子集
5. 计算新集与所有子集的相似度
6. 跳至第三步,不断循环,合并,直至S为空(到不能再合并时为止)
说明:在RCNN中, 最终生成的候选区域为2000个,而且每个候选区域是矩形(不知道为啥是矩形,按理说应该是不规则的形状。)
Selective Search 主要思想:
- 使用一种过分割手段,将图像分割成小区域 (1k~2k 个)
- 查看现有小区域,按照合并规则合并可能性最高的相邻两个区域。重复直到整张图像合并成一个区域位置
- 输出所有曾经存在过的区域,所谓候选区域
其中合并规则如下: 优先合并以下四种区域:
- 颜色(颜色直方图)相近的
- 纹理(梯度直方图)相近的
- 合并后总面积小的: 保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域 (例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。 不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh)
- 合并后,总面积在其BBOX中所占比例大的: 保证合并后形状规则。
上述四条规则只涉及区域的颜色直方图、梯度直方图、面积和位置。合并后的区域特征可以直接由子区域特征计算而来,速度较快。
迁移学习:
神经网络具有迁移性,什么是迁移性:比如你已经有一大堆标注好的人脸年龄分类的图片数据,训练了一个CNN,用于人脸的年龄识别。然后当你遇到新的项目任务时:人脸性别识别,那么这个时候你可以利用已经训练好的年龄识别CNN模型,去掉最后一层,然后其它的网络层参数就直接复制过来,继续进行训练,让它输出性别。
为什么具有迁移性?因为卷积神经网络是一点一点提取特征,每一个节点的输出是特征(小矩阵),只是提取出特征,浅层神经网络能提取的特征很小,深层神经网络才是把之前提取的特征整合起来。所以只需要更改深层的神经网络部分,前面的浅层神经网络的提取方式(是可以不变的)。
重叠度(IOU):
物体检测需要定位出物体的bounding box,就像下面的图片一样,我们不仅要定位出车辆的bounding box 我们还要识别出bounding box 里面的物体就是车辆。
对于bounding box的定位精度,有一个很重要的概念: 因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU。 它定义了两个bounding box的重叠度,如下图所示
就是矩形框A、B的重叠面积占A、B并集的面积比例。
非极大值抑制(NMS):
说的那么高端,其实就是:如果你不是最大的结果(非极大值),那么你就会被删除(抑制)
RCNN会从一张图片中找出n个可能是物体的矩形框,然后为每个矩形框为做类别分类概率:
就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
非极大值抑制(NMS)顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。