0. 前言
本文为我学习B站Up主霹雳吧啦Wz的R-CNN系列视频的学习笔记。
1. R-CNN (Region with CNN feature)
2014年提出,是有别于只能实现30%左右准确度的传统目标检测方法的划时代目标检测算法,将目标检测的准确度提升了30%。
Rich feature hierarchies for accurate object detection and semantic segmentation
1.1.四个步骤
- 首先通过一种名为Selective Search的算法去获取候选框。
- 其次通过深度网络对候选框进行特征提取。
- 随后通过一个SVM对提取的特征向量进行分类。
- 最后使用一个回归器精修候选框位置。
1.1.1. Selective Search算法
- 使用Efficient Graph-Based Image Segmentation中的方法分割图像得到个区域组成的区域集合。
- 计算中各个区域之间的相似度(颜色、纹理、尺度、填充)并加权求和,得到一个的相似度矩阵。
- 如果不为空:
- 获取相似度矩阵中的最大值;
- 将其对应的两个区域有合并成新区域;
- 从中删除这两个区域。
- 合并所得新区域加入集合
- 重新执行步骤2.生成新的相似度矩阵
每次迭代过程中对集合中的子区域做外切矩形(Bounding Boxes),这些Bounding Boxes就是通常所说的候选框。
这一算法相较于暴力的滑动窗口采样要快很多,且更有目的性,效率更高。
1.1.2. 深度网络特征提取
将上一步骤中得到的2000个候选框resize()成的图像;
使用AlexNet(去掉最后的全连接层,直接输出flatten()的结果),将的图像提取出长的特征向量;
总体上:;
将这些特征向量保存于磁盘,准备训练SVM分类器。
1.1.3. SVM判断
对于含有20个类别的目标检测,我们使用20个SVM二分类器,判断当前的长为的特征向量是否是某一类。
即的特征向量矩阵的类别评分矩阵,这个矩阵表示当前2000个候选框归属于20个类别的可能概率。
2000行,20列的矩阵,对每一列(类)进行非极大值抑制,剔除重叠的候选框,得到该类最有可能的候选框。
非极大值抑制提出多余候选框:
- 在当前类的候选框集合中选择得分最高的候选框;
- 与剩余候选框进行IoU计算;
- 阈值的说明重叠了,很可能是一个目标,所以从中剔除所有与IoU超过阈值的候选框。将另存。
- 重复1~3直至中候选框全部被遍历完。
如此,便可保留每一类得分最高的一系列建议框。
1.1.4. 回归器精修候选框位置
对上一步处理后剩余的边界框对应的长为的特征向量进行进一步筛选。小于与Ground Truth之间IoU阈值的候选框被删除。剩余的候选框通过20个类别的回归器进行修正。
1.2. R-CNN缺陷
- 测试速度慢:Selective Search算法提取候选框满,候选框之间存在大量重叠,导致提取特征操作冗余。
- 训练速度慢:特征提取网络、SVM、回归器都是相互独立训练的。
- 存储资源需求大:特征向量都需要保存在磁盘。
graph TD
A[Region_Proposal] --> B[Feature_Extraction];
B --> Classifaction;
B --> Bounding-box_regression;
2. Fast R-CNN
2015年,使用VGG16作为backbone,训练比R-CNN快9倍,测试快213倍,准确率提升4%。
2.1. 三个步骤:
- 仍然使用Selective Search的算法去获取候选框。
- 将整张图像输入特征提取网络,得到特征图feature map。将候选框投影在特征图上,得到对应的特征矩阵。
- ROI(Region of Interest) pooling层将特征矩阵缩放为尺寸,接着
flatten()为一维向量,通过若干全连接层得到预测结果。- 预测类别;
- 预测边界框。
2.2. 特征提取阶段的轻量化策略
在步骤1.中,我们从每张图像的2000个候选框中随机采样了64个RoIs。其中25%的RoIs要求与Ground Truth之间,剩余的RoIs要求与Ground Truth之间,被认为是背景。
在步骤2.中得到的候选框在R-CNN中需要每输入一个候选框就进行一次前向传播Forward propagation,但实际上这些候选框有大量重叠区域,多次Forward propagation实际上涉及到大量的重复计算。为了避免这样的重复计算,Fast R-CNN将整张图送入进行特征提取,在从特征图中裁出对应的候选区域。
2.3. RoI Pooling Layer
先将feature map等分为等份。
对每一份区域做max pooling,最后得到的特征尺寸。
所以候选框无论是什么尺寸,通过特征提取并RoI pooling都会输出的池化结果,所以无需限制网络的输入图像尺寸。
Pooling操作对每一个通道都是一样的。
Pooling后的同等大小feature矩阵经过flatten()后连续经过一系列FC,得到RoI feature vector。
2.4. 预测
输出的RoI feature vector并联两个全连接层,一个FC与Softmax连接进行目标概率预测,一个FC与Regressor连接,用于回归参数的预测。
Softmax输出个类别的概率,即长度为的向量。第一个概率是当前候选框为背景的概率(类别标签),剩下的N为目标概率(类别标签)。与其连接的全连接层自然也需要个节点。
边界框回归器输出对应个类别的边界框回归参数,总长度的输出。
候选框为,回归参数,真实目标框为,最终预测的边界框为。 关系为:
2.5. 多任务损失函数
分类损失+边界框回归损失
| 符号 | 含义 |
|---|---|
| softmax分类器概率分布 | |
| 真实类别标签 | |
| 边界框回归器对类别的回归参数 | |
| 真实目标边界框的回归参数 | |
| 任务平衡参数 |
2.6. Fast R-CNN与R-CNN前后融合程度对比
R-CNN:
graph TD
A[Region_Proposal] --> B[Feature_Extraction];
B --> Classifaction;
B --> Bounding-box_regression;
Fast R-CNN
graph TD
A[Region_Proposal] --> B[Feature_Extraction+Classification+Bounding-box_Regression];
可见,Fast R-CNN已将R-CNN的后三步融合,Fast R-CNN中SS算法的特征框生成步骤需要的时间比第二步慢很多,成为了瓶颈,因此,Faster R-CNN将会通过RPN把第一步也融合进来,组成端到端模型。
3. Faster R-CNN
2015年,同样使用VGG16作为backbone,将候选区域生成囊括在内的检测过程中,每秒能检测五张图片。
其核心在于RPN(Region Proposal Network)。
而整个Faster R-CNN = RPN + Fast R-CNN
3.1. 三个步骤
- 通过Backbone特征提取器,提取图像的特征图feature map。
- 使用RPN生成候选框proposals,将这些候选框投影到feature map上获得相应的特征矩阵。
- 每个特征矩阵通过ROI Pooling层缩放到的特征图,
flatten()操作展平并通过一系列FC Layers得到分类和回归两个预测结果。
3.2. RPN(Region Proposal Network)
对于一个尺寸为输入图像image,经过VGG16能够得到一个的的feature map,如果使用ZF则能够得到一个的的feature map,如上图所示。
对feature map进行一个的卷积,从而实现对feature map每一个点的滑动窗口操作,得到相应的长或的特征向量feature vectors组成的新feature map。feature map的前后尺寸保持不变。
对于每一个feature vector的中心点位置就对应原图中的一个anchor中心点。通过反向映射,在原图image上得到其对应的个anchor boxes。
对于个anchor,生成:
- 长为的分类结果,由组数对组成,一个数对由该anchor为背景的概率和为前景概率组成,一组数对的和为1,即。
- 长为的边界框回归参数,一个anchor的回归参数为与Fast R-CNN含义一直一致。
论文中根据坐着Ross的经验所得,一个中心点对应的anchor有三种尺度:,三种比例,所以上文中提到的一个中心点对应的anchor数。如下图所示。
虽然ZF的感受野,VGG则是,这意味着部分甚至全部的Anchor的面积都比这个感受野大,论文中对此的解释为虽然感受野小于候选框面积,猜测目标的大致区域仍然是可能的。
感受野计算方式
例如:
- 对于的图像image,feature map的尺寸为,意味着有个anchor。
- 忽略超出image边界的anchor,剩余约6K各anchor。
- 将anchor按照回归参数结果调整为候选框。
- 基于分类结果,采用IoU阈值0.7的非极大值抑制,淘汰候选框,得到2000个候选框proposals。
3.2.1. RPN网络训练集
训练过程与上述例子有出入,我们并不对每张图都用2000个proposals,而是先为训练集采样。
一个image可能有上万个anchor,所以从每个image中随机采样256个anchor用于训练。其中正负样本比为。如果正样本不足,仅有个,则负样本采样个数为个。
正样本:
- 与Ground Truth的IoU超过0.7的anchor为正样本;
- 如果没有IoU超过0.7的则选用与Ground Truth之间IoU最高的anchor作为正样本。
负样本: 与Ground Truth的IoU低于0.3的anchor为正样本。
其余Anchor非正非负则不纳入训练集。
3.2.2. RPN Multi-task Loss
| 符号 | 含义 |
|---|---|
| 第个anchor预测为其对应真实标签的概率,如果负样本真是标签为0,正样本真实标签为1. | |
| 正样本为1,负样本为0 | |
| 第个anchor的边界框回归参数 | |
| 第个anchor的GT box | |
| 一张图有256个anchor作为样本,所以是256 | |
| 特征图上中心点的个数,也就是所有anchor的个数。 |
其实该公式中和可以是相等的,PyTorch中就是。
另外Softmax Cross Entropy也可以换成Binary Cross Entropy,但是cls的长度应该为k而非2k。
边界框回归损失与Fast R-CNN的边界框回归参数损失一致。
3.3. Faster R-CNN模型训练
直接采用Loss = RPN Loss + Fast R-CNN Loss 联合训练。原论文的分步训练方法太繁琐,实际实现并不使用。
3.4. 与Fast R-CNN融合程度对比
R-CNN:
graph TD
A[Region_Proposal] --> B[Feature_Extraction];
B --> Classifaction;
B --> Bounding-box_regression;
Fast R-CNN
graph TD
A[Region_Proposal] --> B[Feature_Extraction+Classification+Bounding-box_Regression];
Faster R-CNN
graph TD
Region_Proposal+Feature_Extraction+Classification+Bounding-box_Regression;
直接全部融合,突破了SS算法的时间瓶颈,得到端到端框架。