经典目标检测识别方法概述@陈子逸
经典目标检测识别方法概述
由于水硕期间自学了一些目标探测的方法,这里做一个概述,肯定有不完美的地方,还请指正一起进步.
综述
1.分别简单描述一下RCNN系列:
在我看来, RCNN 是一个benchmark,首先利用传统的图像检测方法基于纹理特征用selective search 如HOG,sift来产生一些候选框,然后将这些候选框加入到卷积神经网络中进行训练和分类.这很明显不是一个端到端的算法,我记得一幅图就需要47s以上的时间来识别.
在这个基础上何等人又提出了Fast rcnn. 这里就不用传统的SVM/reg(线性回归模型) 来分类而是同样采用神经网络(多任务网络)来分类, 他是结合SPPnet改进RCNN,在这里提出了ROI Pooling,利用这个ROI Pooling层得到FC层固定的输入. 但是在候选区域提取的过程仍然选择的是selective search的方法.
Linear+ softmax:分类
Bounding-box regressors:回归
但是Roi 还是需要一些传统的算法去原始图像上找,再把处理的结果汇入CNN
.这一步只能在CPU上面做!!!没办法用GPU,所以无法迭代到神经网络中来.
Faster就把候选区域提取这一部分的工作进行了优化,引入了RPN网络. RPN网络最直接的是anchor机制, 这个机制对特征图上的每个像素点进行三个尺度的反映射,利用感受野的比例在原图上产生一堆box. 然后对这些可能是目标的box进行筛选和精细化过滤,这里有一些小tricks. 比如把和图像边框重叠的去掉以及以IOU比例来去掉一部分,再加上非极大值抑制,最终一幅图大概还剩2000个框. 然后就是2层共四个分类回归器当中.第一层是判断前景背景,从传递函数可以看出来,如果不是前景,Pi*(anchor预测是物体的概率)是0,右边半部分是0,就不需要bbox regression的计算了同时左边很明显是二分类交叉熵损失.朗达值是用来分配分类回归权重的.
而mask-rCNN呢 比起之前有了2个最明显的提高. mask的backbone使用新的resnet+FPN.另外使用ROI align替换ROI Pooling.更具体一点就是ResNeXt+RPN+RoI Align+Fast R-CNN+FCN。 深度残差网络是一种神经网络中将输入输出跨层连接 的一种网络,函数是F(x)+x,x为之前层的输出.因为随着网络深度的增长,cnn的效果(performance)并不是越来越好,相反会下降,而深度残差网络因为将前几层的结果跨层输入到后面的层未经过激活函数的放缩可以极大的保存原始的特征.而RPN网络是左右2个模型,左边是bottom-up模型就是简单的卷积过程,这里作者是将深度残差网络中的几个过程分为几个stage.,feature map的大小在经过某些层后会改变(Pooling层),而在经过其他一些层的时候不会改变,作者将不改变feature map大小的层归为一个stage,因此每次抽取的特征都是每个stage的最后一个层输出,这样就能构成特征金字塔。将每个stage 的结果输出成为C1-C5的特征图,其分辨率从512到32,然后通过C5一个11卷积得到P5(达到通道数与高层相同),再P5高层与较低一层且通过11卷积后的C4相加得到P4,后面以此类推.生成P2–P5后,再通过一个33的卷积生成新的P2-P5(消除混叠效应),P5上采样生成P6只进行RPN网络使用.
每个层利用RPN三个比例就能生成15个anchor,那么如何决定该选择哪层特征图进行ROI Pooling呢? 有一个公式,其作用是大尺度的ROI就用高层特征.输出为三个: rpn-logits/rpn-class/rpn-bbox. Roialign呢就是针对之前roipooing的坐标转换的浮点型近似带来的特征图信息值缺失的改良,对该点周围四个像素点进行双线性插值,然后maxpooling得到的值比只进行近似要好很多.进行完roi pooling后, 用FCN对mask 分支机构对每个roi产生k个分辨率mm的二值掩膜,K为分类物体总类数.根据faster rcnn里面的预测判断使用哪一个掩膜,对于预测的二值掩膜的每一个像素点,我们都应用sigmod激活函数(127-0.77举个例子),整体使用二分类交叉熵损失函数.这样就允许每个类生成独立的掩膜,避免类间竞争(解耦).如果像只用FCN那样对每个像素点进行softmax,整体使用多任务交叉熵,会引起竞争,导致分割效果差.
FCN是全卷积,实现任何输入,而且因为pooling的分辨率降低,便使用上采样,同时有结合不同深度的跳级skip结构.
SSD?
SSD是利用多尺度特征图来进行检测的算法, 主干网络是vgg16,去掉了最后的FC层.因为vgg16后面的FC层是用来分类,在这些只利用前部分提取特征不用分类,一共有6个尺度的特征图,从3838到11. 这里也借鉴了faster rcnn中的rpn网络, 叫prior box其实差不多,scale也是自己定义.3838、1919、1010每个产生6个,其他三个每个产生4个box. 最终输出的向量纬度为(C类+4)kmn.同样是参照rpn,设定一个阈值,大于为正样本,小于一个阈值为负样本.中间的省略.这里要注意两个阈值不一样.同时负样本也会添加一些难例,正负样本比例基本是1:3.数据增强是通过随机采用多个path,分类用的softmax loss,回归用的smooth L1. 损失函数里面采用的jaccard函数算IOU其实就是RPN里面算IOU的方法.最终损失函数通过置信损失和分类损失按比例和的形式得到.
DSSD ?
将SSD中的vgg16模型前部分backbone替换成了ResNet. 然后在网络后面添加了反卷积网络层,原因是增加了大量上下文信息.后面还有些作者添加不同的预测结构这个有余力可以看看。
YOLO V1
将图像分为SS个格子, 每个框包含ground truth的拿去回归. 这里我们可以发现, 无论大小分辨率的图都是固定的SS个格子,这样对于小物体的检测没有特别突出的优化,容易检测失误. 但这是一个端到端的算法, 或者说one-stage. 它没有faster rcnn那种候选框提取的步骤,整个网络都在CNN网络中进行, 每个格子产生B个框,每个框有5个坐标,4个位置,1个置信度,置信度就是框和ground的IOU,所以总的输出向量为(5B+C)SS这一个tensor. C是预测的类别信息,置信度为box含物体的概率IOU两个乘积(测得有多准).从这里可以看出如果不是objct,第一项就是0,总的置信度0