经典R-CNN系列网络学习笔记

229 阅读4分钟

图片和部分文字内容来自互联网,对于未标注出处的内容,若有侵权请联系作者删除

1. R-CNN

2000个待检测区域(selective search,里面也是SVM)+串行过cnn+(svm分类& bbox reg位置),训练时的pipeline是分开的。

2. SPP-Net

在feature map上提取RoI特征,这样就只需要在整幅图像上做一次卷积。

2.1 问题一:原始图像的RoI如何映射到特征图

参考知乎:zhuanlan.zhihu.com/p/24780433

2.2 问题二:RoI的在特征图上的对应的特征区域的维度不满足全连接层的输入要求怎么办?

采用金字塔池化:1x1(金字塔底座),2x2(金字塔中间),4x4(金字塔顶座)三张子图,分别做max pooling后,出来的特征就是(16+4+1)x256 维度。如果原图的输入不是224x224,出来的特征依然是(16+4+1)x256维度。这样就实现了不管图像尺寸如何 池化n 的输出永远是(16+4+1)x256 维度。

3. Fast-RCNN

除了selective search,其他部分都可以合在一起训练,但也只相当于一个分类器而已,对RoI区域分类,毕竟画框的部分都不是可以训的
首先还是采用selective search提取2000个候选框,然后,使用一个神经网络对全图进行特征提取。接着,使用一个RoI Pooling Layer在全图特征上摘取每一个RoI对应的特征,再通过全连接层(FC Layer)进行分类与包围框的修正。 RoI Pooling的规格需要针对不同的输入RoI进行计算,假如输出为pooledheight*pooledwidth,输入的RoI位置为(x1,y1,x2,y2),每个RoI网格的size为((y2-y1)/pooledheight,(x2-x1)/pooledwidth)。

4.Faster-RCNN

改进proposal使整个检测能够end-to-end,并且网络中的各个卷积层特征(feature map)也可以用来预测类别相关的region proposal(不需要事先执行诸如selective search之类的算法):其实就是前面用RPN提proposal,但是后面还是fast-rcnn的分类网络,损失如果算在一起,RPN里面的参数也是自己更新,分类网络也是自己更新。

4.1 RPN的bbox

如何在特征图中设置proposal?通过对应关系把feature map的点映射回原图,在每一个对应的原图设计不同的固定尺度窗口(bbox),根据该窗口与ground truth的IOU给它正负标签,让它学习里面是否有object,这样就训练一个网络(Region Proposal Network)。
由于我们只需要找出大致的地方,无论是精确定位位置还是尺寸,后面的工作都可以完成,作者对bbox做了三个固定:固定尺度变化(三种尺度),固定scale ratio变化(三种ratio),固定采样方式(只在feature map的每个点在原图中的对应RoI上采样,反正后面的工作能进行调整) ,如此就可以降低任务复杂度。
(1)尺寸和ratio如图 (2)关于正负样本划分:首先对每个gt找一个最大的anchor标记为正样本,保证其至少有一个anchor;再对其余anchor找与他iou>0.7的gt标记为正样本,<0.3的为负样本;其余anchor不用,跨出图像边界的不用。 (3)关于采样:如果每幅图的所有anchor都去参与优化loss function,那么最终会因为负样本过多导致最终得到的模型对正样本预测准确率很低。因此 在每幅图像中随机采样256个anchors去参与计算一次mini-batch的损失。正负比例1:1(如果正样本少于128则补充采样负样本)。

4.2 RPN的loss

对于每个anchor,首先在后面接上一个二分类softmax,有2个score 输出用以表示其是一个物体的概率与不是一个物体的概率 (pi),然后再接上一个bounding box的regressor 输出代表这个anchor的4个坐标位置(ti)。


分类损失:i这个anchor为正时p*是1,反之是0;交叉熵。
位置损失:i为正时才有;smoothl1。

关于坐标的预测
问题一:为什么要平移和尺度缩放:CNN的尺度不变特性,以下两个人应该具有相同特征a1=a2。

问题二:为什么要log:缩放的尺度必须>0,所以需要exp函数。

4.3 训练方式

如果是分别训练两种不同任务的网络模型,即使它们的结构、参数完全一致,但各自的卷积层内的卷积核也会向着不同的方向改变,导致无法共享网络权重,论文作者提出了三种可能的方式:
方法一:交替训练 实际中应该还有步骤,具体看源码:将所有proposal按照前景分数从高到低排序,选取前6000个proposal。
=>使用阈值为0.7的NMS算法排除掉重叠的proposal。
=>针对上一步剩下的proposal,选取前300个proposal进行分类和第二次边框修正。
方法二:近似联合训练:好像是不对proposal的边框修正进行训练,只对anchord。
方法三:联合训练:都训