【论文笔记】R-CNN系列之论文理解
论文原文及代码链接在gitee
R-CNN
1. 用selective search在测试图片上提取2000个候选区域
2. 对候选区域缩放,经过标准卷积神经网络获得固定维度输出
3. 训练SVM分类器进行分类,边界回归
了解即可,后面都被改进了:
1. selective search基本思路如下所述:使用过分割方法将图像分成小区域。在此之后,观察现有的区域。之后以最高概率合并这两个区域。重复此步骤,直到所有图像合并为一个区域位置。注意,在此处的合并规则与RCNN是相同的,优先合并以下四种区域: 颜色(颜色直方图)相近的; 纹理(梯度直方图)相近的; 合并后总面积小的。最后,所有已经存在的区域都被输出,并生成候选区域。
2. 为使候选区域符合CNN的输入,无论候选区域是什么尺寸和宽高比,我们都把候选框变形成想要的尺寸。具体的,在候选框周围加上16的padding,再进行各向异性缩放。
3. fine-tunning阶段是由于CNN对小样本容易过拟合,需要大量训练数据,故对IoU限制宽松: IoU>0.5的建议框为正样本,否则为负样本; SVM这种机制是由于其适用于小样本训练,故对样本IoU限制严格:Ground Truth为正样本,与Ground Truth相交IoU<0.3的建议框为负样本。
Fast R-CNN
Fast-RCNN的改进
RCNN缺点1——训练分多步
region proposal也要单独用selective search的方式获得,要fine tuning一个预训练的网络,然后针对每个类别都训练一个SVM分类器,最后还要用regressors对bounding-box进行回归。
=>在Fast-RCNN中,把bbox回归放进了网络内部,与分类合并成为了一个多任务模型,两个任务能够共享卷积特征,并相互促进。
RCNN缺点2——训练费空间和时间
图片中提取出来的特征要写入磁盘,再去训练SVM和回归。
=>在Fast-RCNN中,把类别判断和位置精调统一用深度网络实现,不再需要额外存储。
RCNN缺点3——目标检测很慢
一张图像内候选框之间大量重叠,提取特征操作冗余,用VGG16检测要47s一张图(在GPU上)。
=>在Fast-RCNN中,将整张图片归一化送入神经网络,在最后一层再加入候选框信息(这些候选框还是经过SS提取,再经过一个ROI层统一映射到最后一层特征图上
1. 将一整张图片经过卷积和池化的处理得到feature map
2. 对于每一个区域提议,pooling layer从中提取出固定长度的vector
3. 将特征向量喂入全连接层,分为两个同级输出层:一个经过softmax层输出概率,一个输出bbox的位置。
Faster R-CNN
分为三个步骤:
1. 将图像输入网络得到相应的特征图
2. 使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵
3. 将每个特征矩阵通过ROI pooling层缩放到7*7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果
其中1、3两步就是Fast R-CNN,所以Faster R-CNN = RPN + Fast R-CNN
重点1. Region Proposal Networks区域生成网络(RPN)
在卷积后的feature map上滑动,每一个位置生成1*256的向量,再经过全连接层生成2k个目标概率和4k个边界框回归参数。其中,k对应的是k个anchor box,2k是指每个anchor box是前景和背景的概率,每个anchor box还会产生4个边界框回归参数,因此k个anchor box产生4k个参数。256是指特征图的深度(channel),如果使用的是VGG16,那深度为512。
anchor
(1)计算出3*3滑动窗口中心点对应原始图像上的中心点
假设输入的原图为w*h,特征图为W*H,那么x方向上的步距为sx=w/W,y方向上的步距为sy=h/H,特征图(2,2)位置的点对应原图(2*sx,2*sy)。
(2)计算出k个anchor box。
默认情况下,我们使用3个尺度和3个比例,在每个滑动点产生9个可能的候选窗口:三种面积{1282,2562,5122}×三种比例{1:1,1:2,2:1}。这些候选窗口称为anchors。
512*512的候选窗口比VGG的感受野228还要大,用小的感受野去预测大的目标的边界框是有可能的,比如看到物体的一部分也能猜到物体的位置。(感受野就是特征图上3*3的区域对应卷积池化之前原图上的区域)
(3)筛选anchor
对于一张1000*600*3的图像,经过特征提取网络后大概是60*40的大小,在每个位置上滑动,生成9个anchor,一共是60*40*9(20k)个anchor,忽略跨越边界的anchor后,剩下6k个anchor。RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IOU设为0.7,这样剩下2k个候选框。
采样256个anchor计算损失函数,正负样本比为1:1,如果正样本少于128个,用负样本填充。(和之前的分类不同,分类将整张图作为输入,而目标识别将anchor作为输入,所以对anchor的正负样本的比例有一定的要求)
我们分配正标签前景给两类anchor:
1)与某个ground truth有最高的IoU重叠的anchor(也许不到0.7)
2)与任意ground truth有大于0.7的IoU交叠的anchor。
注意到一个ground truth可能分配正标签给多个anchor。
我们分配负标签(背景)给与所有ground truth的IoU比率都低于0.3的anchor。非正非负的anchor对训练目标没有任何作用,由此输出维度为(2*9)18,一共18维。
Multi-task loss多任务损失函数
其中,
分类损失:
有两种不同的说法,
(1)根据原文的理解,全连接层输出2k个score,即k个anchor,每个anchor有两个概率,背景概率和前景概率,Lcls应该是Softmax Cross Entropy(softmax输出,所有输出概率和为1):
Lcls = -log pi
其中,pi表示第i个anchor预测为真实标签的概率。pi*当为正样本是为1,当为负样本时为0。
比如上图, Lcls = (-log0.9)+(-log0.2)+...+(-log0.1)+(-log0.2)
(2)另外一种,二值交叉熵损失Binary Cross Entropy(sigmoid输出,各输出节点之间互不相干),此时分类的全连接层输出k个score
Lcls = -[pi* logpi + (1-pi*) log(1-pi)]
此时上图, Lcls = (-log0.9)+(-log0.2)+...+(-log0.1)+(-log0.2)。
对于区域提取网络的损失函数,目的是从图中找到目标,是关于背景和目标的分类问题,所以说是二分类问题。(个人理解,如有错误欢迎指正)
(这和Fast R-CNN中是不同的,在Fast R-CNN中是输出k+1维数组p,表示属于k类和背景的概率 p=(p0,p1,..,pk),是用分类器softmax得到的概率分布。下图为Fast R-CNN的损失函数计算过程
边界框回归损失
其中,pi*当为正样本是为1,当为负样本时为0。ti表示第i个anchor的回归参数,ti*表示第i个anchor对应的GTBox的回归参数。
例:
上图中,黄框为候选框,Px,Py,Pw,Ph分别为候选框的中心x,y坐标,以及宽高。红框是预测的边界框,绿框是GTBox。(也是说预测的回归参数是以固定候选框为基准的偏移缩放量)。ti*是已知G(Gx,Gy,Gw,Gh)和P(Px,Py,Pw,Ph),反推得到的。
重点2. ROI pooling layer
将区域提议对应的feature map转换成小的固定大小(H*W)的feature map,不限制输入map的尺寸。
ROI pooling layer的输入有两项:
(1)提取特征的网络的最后一个feature map;
(2)一个表示图片中所有ROI的N*5的矩阵,其中N表示 ROI的数目,5表示图像index,和坐标参数(x,y,h,w) 。坐标的参考系不是针对feature map这张图的,而是针对原图的。
如何实现?
比如左边这个特征矩阵(此处忽略了深度),将它划分为7*7的49等份,对其中每一个区域最大池化得到7*7的特征矩阵。无论输入是多少,都可以缩放到7*7的尺寸。
参考文献:
1. Faster RCNN理论合集(视频)
2. R-CNN论文详解(论文翻译)
3. R-CNN中的SVM理解
4. 【深度学习】R-CNN 论文解读及个人理解
5. Python3《机器学习实战》学习笔记(八):支持向量机原理篇之手撕线性SVM
6. RCNN 论文阅读记录