- R-cnn
第一步:待检测区域提取by selective search。通过一些传统图像处理方法将图像分成若干块,然后通过一个SVM将属于同一目标的若干块拿出来。
第二步:特征提取by alexnet。
第三步:目标检测by svm。在训练这个支持向量机的时候,结合目标的标签(类别)与包围框的大小进行训练。
优势:
- 使用了卷积神经网络进行特征提取。
- 使用bounding box regression进行目标包围框的修正。
存在问题: - 耗时的selective search,对一帧图像,需要花费2s。
- 耗时的串行式CNN前向传播,对于每一个RoI,都需要经过一个AlexNet提特征,为所有的RoI提特征大约花费47s。
- 三个模块是分别训练的,并且在训练的时候,对于存储空间的消耗很大。
- Fast r-cnn
首先还是采用selective search提取2000个候选框,然后,使用一个神经网络对全图进行特征提取。接着,使用一个RoI Pooling Layer在全图特征上摘取每一个RoI对应的特征,再通过全连接层(FC Layer)进行分类与包围框的修正。
优势:
- 取代R-CNN的串行特征提取方式,直接采用一个神经网络对全图提取特征(这也是为什么需要RoI Pooling的原因)。
- 除了selective search,其他部分都可以合在一起训练。
存在问题:
耗时的selective search还是依旧存在。
- Faster r-cnn
取代selective search,直接通过一个Region Proposal Network (RPN,区域候选网络)生成待检测区域。
首先使用共享的卷积层为全图提取特征,然后将得到的feature maps送入RPN,RPN生成待检测框(指定RoI的位置)并对RoI的包围框进行第一次修正。之后就是Fast R-CNN的架构了,RoI Pooling Layer根据RPN的输出在feature map上面选取每个RoI对应的特征,并将维度置为定值。最后,使用全连接层(FC Layer)对框进行分类,并且进行目标包围框的第二次修正。
RPN:
首先依靠一个在共享特征图上滑动的窗口,为每个位置生成9种预先设置好长宽比与面积的目标框,这9种初始anchor包含三种面积(128×128,256×256,512×512),每种面积又包含三种长宽比(1:1,1:2,2:1)。
RPN的本质是一个树状结构,树干是一个3×3的卷积层,树枝是两个1×1的卷积层,第一个1×1的卷积层解决了前后景的输出,第二个1×1的卷积层解决了边框修正的输出。对于RPN输出的特征图中的每一个点,一个1×1的卷积层输出了18个值,因为是每一个点对应9个anchor,每个anchor有一个前景分数和一个背景分数,如果一个anchor与ground truth的IoU在0.7以上,那这个anchor就算前景(positive)。采用SmoothL1loss对边框修正值进行训练。
Roi pooling:
一是为每个RoI选取对应的特征,二是为了满足全连接层的输入需求,将每个RoI对应的特征的维度转化成某个定值。
存在问题:
RoI Pooling过后的得到的输出可能和原图像上的RoI对不上,这主要是因为两点原因:
- 从输入图上的RoI到特征图上的RoI feature,RoI Pooling是直接通过四舍五入取整得到的结果。
- 再将每个RoI对应的特征转化为固定大小的维度时,又采用了取整操作。
- Mask r-cnn
对RoI Pooling做了改进并提出了RoI Align。RoI Align的主要创新点是,针对faster r-cnn的问题1,不再进行取整操作。针对问题2,使用双线性插值来更精确地找到每个块对应的特征。总的来说,RoI Align的作用主要就是剔除了RoI Pooling的取整操作,并且使得为每个RoI取得的特征能够更好地对齐原图上的RoI区域。