Faster RCNN发展过程总结

感谢https://www.bilibili.com/video/av15949356?from=search&seid=10709304168993056773

将卷积神经网络应用到物体检测中的模型发展过程:1.R-CNN 2.Fast R-CNN 3.Faster R-CNN。

(1)CNN 卷积神经网络

(2)RPN region proposal network

(3)Fast R-CNN(物体检测器)

(4)Faster R-CNN=RPN+Fast R-CNN 其中RPN和Fast R-CNN共享前面的卷积特征图。

1.R-CNN

region proposal:指的是图像中有很大概率是前景包围框的bounding boxes,在R-CNN中的region proposal由selective search算法提出。在R-CNN中,由selective search在原始的输入图像上运行后将会生成大约2000个region proposal,再对这些region proposal分别进行CNN的前向传播,即对每个候选区域分别提取卷积特征,这一过程将会消耗极大的内存资源和计算资源,R-CNN在测试阶段对于一张图像大约需要50秒,

Faster RCNN发展过程总结_第1张图片

loss = SmoothL1Loss(loc_preds, loc_targets) + CrossEntropyLoss(cls_preds, cls_targets).
物体检测中的损失函数分为两个部分:位置偏移量回归损失(smooth L1 Loss) 和 包围框分类损失(cross entropy)

回归损失:通常使用smooth L1 loss,

当abs(x)<1    0.5x**2   也即当所预测的位置偏移量距离小于1时,则将梯度值变小
当abs(x)>=1   x-0.5

分类损失:使用focal loss和OHEM,现在使用Focal loss的比较多,这是因为使用OHEM时负样本相比于正样本的采样倍数不容易确定,可能需要在实验的过程中动态调整。

(1)focal loss:由于物体检测训练RPN阶段仅仅进行前景和背景的二分类问题,故而这里仅以二分类问题为例。原始的交叉熵函数(带有解决类别不平衡为题的权重α)

CE\left ( pred,label \right )=\sum -\alpha* label\left [ i \right ]*log(pred\left [ i \right ])-\left ( 1-\alpha \right )*\left ( 1-label\left [ i \right ] \right )*log\left ( 1-pred\left [ i \right ] \right )

则加上focal loss是为了:无论是对于正样本还是负样本,都让容易训练的样本权重变小(容易训练的样本说明它很容易就预测正确),而困难的样本权重增大。物体检测中将会出现大量的负样本,而大多数的负样本都是简单负样本(即很容易分类正确的负样本)

FL(pred,label)=-α*label[i]*(1-pred[i]的γ次方)*log(pred[i])-(1-α)*(1-label[i])*(pred[i])的gamma次方*log(1-pred[i])

这意味着:对于负样本,如果pred越接近于0,则样本的权重将会更小。

(2)OHEM。OHEM的全称是on line hard negative example mining,只对困难的负样本进行在线挖掘。

它的做法是:首先计算出所有region proposal的分类损失,然后对于所有ground truth label为正样本的包围框都要保留对应的loss项,并记录正样本的个数N,再对于所有负样本的分类loss从大到小进行排序,然后取出loss为前3*N的region proposal对应的分类loss,加入到最终的分类loss中,由于这部分被挖掘出来的负样本loss是较大的,故而它一定是分类很困难的负样本,故而称为在线困难负样本挖掘。这意味着,每次训练过程中,所挖掘出来的困难负样本都是不同的,是随着训练过程的进行,网络权值的变化而不同的,故而称为在线困难负样本挖掘。

2.SPPNet

SPPNet在R-CNN上的改进主要在于:R-CNN由于对于每个region proposal的分类器和regression之前,先要对region proposal进行CNN的卷积特征提取以及FC的特征向量提取,这就要求输入到CNN之前的输入图像块具有相同的分辨率,R-CNN的做法是直接对图像块进行warp,而这一操作将会使得原始region proposal的特征损失(如宽高比、面积等),为了避免这一损失,SPPNet提出空间金字塔池化结构,允许region proposal具有不同的分辨率,经过CNN提取到特征图之后,分别进行4*4,2*2,1*1的空间金字塔池化,即将region proposal提取到的特征图分别划分成4*4,2*2,1*1的网格,在每个网格内部使用global average pooling,最终对每个特征图得到21维的特征图。

3.Fast RCNN

fast RCNN实际上借鉴了SPPNet的思想,但是它只使用了单个尺度的金字塔池化,即将region proposal经过CNN提取到的特征图划分成7*7个网格,在每个网格内部使用global average pooling,最终对每个region proposal得到7*7*C的特征图块。

fast RCNN相比于R-CNN的重要改进之处在于并不是将每个region proposal对应的图像块分别依次前向传播送入CNN,而是直接将整张输入图像送入CNN,得到整张图像对应的特征图,再根据selective search算法的指引(SS算法给出的是在原始输入图像分辨率上的region proposal像素坐标点),根据特征图与原始输入图像映射的比例关系,在特征图上crop出相应的特征块,而这些特征块必然也是不同分辨率大小,不同宽高比的,故而使用单个尺度的SPP pooling(在Fast RCNN中称为ROI pooling),得到当前region proposal对应的固定分辨率的特征图。

Faster RCNN发展过程总结_第2张图片Faster RCNN发展过程总结_第3张图片

Faster RCNN发展过程总结_第4张图片

4.Faster RCNN

Fast RCNN相比于它之前的object detector的区别在于它不在需要selective search算法提取region proposal,而是使用RPN(region proposal network)生成region proposal。

Faster RCNN发展过程总结_第5张图片

Faster RCNN发展过程总结_第6张图片

Faster RCNN发展过程总结_第7张图片

RPN:引入anchor的概念对ground truth bounding boxes进行编码。由于神经网络所能预测的输出必须具有固定的shape。物体检测问题中的ground truth就是bounding boxes包围框,而对于每个输入图像而言,最终的包围框数量并不确定。故而引入anchor,对ground truth boxes进行编码。在输入图像经过若干次下采样之后得到的特征图中的每个像素点上生成9个anchor,anchor的生成与输入图像的内容没有任何关系,对于所有的输入图像(应具有相同的空间分辨率)anchor都是相同的,然后计算anchor与所有ground truth boxes之间的IOU(intersection over union),IOU大于0.7则为正样本,表示anchor是该包围框的正样本,IOU小于0.3则为负样本。如果anchor是正样本,则对anchor的类别和位置偏移量进行编码,编码后将会得到anchor的classification和regression ground truth,位置偏移量的编码公式与Fast RCNN编码公式相同。如果anchor 是负样本,则只需要关注类别ground truth是背景类别即可。

RPN prediction map 有两个部分:

(1) H1*W1*36,36=9*4,表示对于特征图中每个像素点的9个anchor的位置偏移量预测值,

(2)H1*W1*18,18=9*2,表示对于每个anchor前景背景类别预测。

RPN阶段的classification loss使用了OHEM。

当RPN生成了大约2000个region proposal后,再从RPN与Fast RCNNshared feature map上的对应位置crop出相应的特征块,进行ROI pooling得到2000*7*7*C的特征图,进行多个类别的前景预测和位置精修。

你可能感兴趣的:(leetcode,offer)