Region-based Convolutional Neural Network(R-CNN)
基础知识
1.
有监督预训练与无监督预训练
(1)无监督预训练(Unsupervised pre-training)
无监督预训练这个名词我们比较熟悉,栈式自编码、DBM等采用的都是采用无监督预训练。因为预训练阶段的样本不需要人工标注数据,所以就叫做无监督预训练。
(2)有监督预训练(Supervised pre-training)
有监督预训练,可称之为为迁移学习。比如你已有一大堆标注好的人脸年龄分类的图片数据,训练了一个CNN,用于人脸的年龄识别。
2.IoU的定义
全称为交并比(Intersection over Union),IoU 计算的是 “预测的边框” 和 “真实的边框” 的交集和并集的比值。
物体检测需要定位出物体的bounding box,就像下面的车子图片一样,我们不仅要定位出车辆的bounding box 我们还要识别出bounding box 里面的物体就是车辆。对于bounding box的定位精度,有一个很重要的概念,因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IoU。
IoU定义了两个bounding box的重叠度,如下图所示:
矩形框A、B的一个重合度IOU计算公式为:
IOU=(A∩B)/(A∪B)
就是矩形框A、B的重叠面积占A、B并集的面积比例:
IOU=SI/(SA+SB-SI)
3.非极大值抑制
因为一会儿讲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来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。
4.Canny Detection(canny NMS)对梯度幅值进行非极大值抑制
图像梯度幅值矩阵中的元素值越大,说明图像中该点的梯度值越大,但这不不能说明该点就是边缘(这仅仅是属于图像增强的过程)。在Canny算法中,非极大值抑制是进行边缘检测的重要步骤,通俗意义上是指寻找像素点局部最大值,将非极大值点所对应的灰度值置为0,这样可以剔除掉一大部分非边缘的点。
要进行非极大值抑制,就首先要确定像素点C的灰度值在其8值邻域内是否为最大。图1中蓝色的线条方向为C点的梯度方向,这样就可以确定其局部的最大值肯定分布在这条线上,也即出了C点外,梯度方向的交点dTmp1和dTmp2这两个点的值也可能会是局部最大值。因此,判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点。如果经过判断,C点灰度值小于这两个点中的任一个,那就说明C点不是局部极大值,那么则可以排除C点为边缘。这就是非极大值抑制的工作原理。
作者认为,在理解的过程中需要注意以下两点:
1)非最大抑制是回答这样一个问题:“当前的梯度值在梯度方向上是一个局部最大值吗?” 所以,要把当前位置的梯度值与梯度方向上两侧的梯度值进行比较;
2)梯度方向垂直于边缘方向。
但实际上,我们只能得到C点邻域的8个点的值,而dTmp1和dTmp2并不在其中,要得到这两个值就需要对该两个点两端的已知灰度进行线性插值,也即根据图1中的g1和g2对dTmp1进行插值,根据g3和g4对dTmp2进行插值,这要用到其梯度方向,这是上文Canny算法中要求解梯度方向矩阵Thita的原因。
完成非极大值抑制后,会得到一个二值图像,非边缘的点灰度值均为0,可能为边缘的局部灰度极大值点可设置其灰度为128。根据下文的具体测试图像可以看出,这样一个检测结果还是包含了很多由噪声及其他原因造成的假边缘。因此还需要进一步的处理。
5.mAP
mAP(Mean Average Precision)均值平均精度对于评估模型定位性能、目标监测模型性能和分割模型性能都是有用的。
选择mAP的原因
目标检测问题中的模型的分类和定位都需要进行评估,每个图像都可能具有不同类别的不同目标,因此,在图像分类问题中所使用的标准度量不能直接应用于目标检测问题。
文章主要贡献有二:
1.首先将大容量卷积神经网络应用于自底向上的区域方案,实现目标的定位和分割。
2.打标了的数据不足时,训练大型CNN网络的范例。
其他:“有监督的预训练/特定领域的微调”范例将对多种数据稀缺的视觉问题非常有效。
网络核心原理:
用区域识别的方式来解决CNN的定位问题。即,首先输入图像处理后,生成约2000张分类独立的区域提议,再使用CNN从每个proposal提取固定长度的特征向量,最后使用类别特定的线性SVM对每个区域进行分类。
即:selective search+CNN+L-SVM
- 用selective search代替传统的滑动窗口,提取出2k个候选region proposal
- 对于每个region,用摘掉了最后一层softmax层的AlexNet来提取特征
- 训练出来K个L-SVM作为分类器(每个目标类一个SVM分类器,K目标类个数),使用AlexNet提取出来的特征作为输出,得到每个region属于某一类的得分
- 最后对每个类别用NMS(non-maximum-suppression)来舍弃掉一部分region,得到detection的结果(对得到的结果做针对boundingbox回归,用来修正预测的boundingbox的位置)
流程
1.先将Region通过Selective Search算法检测出来(2k左右个),然后将根据CNN提取的region特征丢入SVM进行分类(compute score),得到的就是一个region-bbox以及对应的类别
2.再利用(IoU->NMS)得到具体的框,目的防止泛滥,为了精确bbox.
3.再根据pool5 feature做了个bbox regression来decrease location error.
4.其中training的trick则为hnm+finetuning)
SS(Selective Search)遵循如下的原则:
图片中目标的尺寸不一,边缘清晰程度也不一样,选择性搜索应该能够将所有的情况都考虑进去,如下图,最好的办法就是使用分层算法来实现。
区域合并的算法应该多元化。初始的小的图像区域(Graph-Based Image Segmentation得到)可能是根据颜色、纹理、部分封闭等原因得到的,一个单一的策略很难能适应所有的情况将小区域合并在一起,因此需要有一个多元化的策略集,能够在不同场合都有效。能够快速计算。
SS算法
对于候选框的位置确定问题,简单粗暴的方法就是穷举或者说滑动窗口法,但是这必然是不科学的,因为时间和计算成本太高,直观的优化就是假设同一种物体其在图像邻域内有比较近似的特征(例如颜色、纹理等等)。
由此提出使用比较广泛的Selective search算法:
Selective search算法(paper: Selective Search for Object Recognition)(以下简称ss算法):首先通过以及简单的聚类生成区域集合;然后根据定义的相似度不断合并相邻区域构成新的候选框。本质上是一种基于在原始聚类后的区域集合上,依照邻域的相似度,从小到大的进行滑动窗口。
首先通过简单的区域划分算法,将图片划分成很多小区域,再通过相似度和区域大小(小的区域先聚合,这样是防止大的区域不断的聚合小区域,导致层次关系不完全)不断的聚合相邻小区域,类似于聚类的思路。
step0:生成区域集R,具体参见论文《Efficient Graph-Based Image Segmentation》
step1:计算区域集R里每个相邻区域的相似度S={s1,s2,…}
step2:找出相似度最高的两个区域,将其合并为新集,添加进R
step3:从S中移除所有与step2中有关的子集
step4:计算新集与所有子集的相似度
step5:跳至step2,直至S为空
区域相似度表现在:颜色、纹理、尺寸、交叠。四个方面。
合并规则:
优先合并以下四种区域:
- 颜色(颜色直方图)相近的
- 纹理(梯度直方图)相近的
- 合并后总面积小的
保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域 。 - 合并后,总面积在其BBOX中所占比例大的
保证合并后形状规则。
SS算法:选择性搜索,然后生成2000个候选区域。
算法详解:
https://blog.csdn.net/qq_38273984/article/details/90638768
https://blog.csdn.net/Tomxiaodai/article/details/81412354#Python%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90
其他收获
0.物体检测和图片分类的区别:图片分类不需要定位,而物体检测需要定位出物体的位置,也就是相当于把物体的bbox检测出来,还有一点物体检测是要把所有图片中的物体都识别定位出来。
1.使用仿射图像扭曲(affine image warping)来计算每个区域的固定大小的CNN输入,而不考虑区域的形状。
2.给定图像中所有被评分的区域,应用贪婪的非极大值抑制(NMS)(独立地针对每个类),如果该区域的交点重叠(IoU)重叠且评分较高的选定区域大于学习的阈值,则拒绝该区域。IoU即二图的交/并集。
将所有重叠大于或等于0.5IoU的区域提案都视为一个真实的盒子,将其作为该盒子类别的肯定,其余作为否定。
(图1,使用IoU阈值,阈值以下的被认为是负样本)
3.Bounding box regression(BB) 边界框回归算法,对给定的选择性搜索区域提议的pool5池化层中的特征,训练了线性回归模型来预测新的检测窗口。
4.
CNN的大部分代表性来自于它的卷积层,而不是更大、更密集的连接层。
5.
与pool5相比,fc6和fc7的微调带来的提升要大得多,这表明从ImageNet学习到的pool5特性是一般化的,而大部分改进是通过在它们之上学习领域特定的非线性分类器而获得的。打个比方:对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了。
6.训练