首先回顾以下Faster R-CNN
Faster R-CNN的过程:
首先对数据进行数据处理,包括水平翻转缩放等得到实际网络需要的输入,然后进入backbone(它可以是resnet50等),得到一个特征图,这个特征图会先进入RPN网络当中,去提取一些候选区域(也叫ROI),接着这些ROI再和这些特征图ROI pooling,或者叫RoI Align操作,提取处RoI对应的特征,最后再将这些提取出来的特征送到BBox Head(也就是第二阶段),进一步的分类和回归。
Faster R-CNN会在两个地方用到NMS:
第一个部分是在RPN生成候选区域(ROI)的时候,它会把RPN输出的分类分支和回归分支与anchor配合起来,先进行一个解码,得到一些候选框,然后再做一些NMS刷选,刷选之后就会得到一些对应的bboxs和score;
第二个部分就是在BBox Head阶段,也就是最后的预测阶段,它会把BBox Head输出的分类分支和回归分支与ROI配合起来,先进行一个解码,得到一些bboxs,然后将其输入到NMS当中。
RPN和BBox是一起训练的。RPN和BBox都会有分类分支和回归分支的loss,最终的loss是这个四个loss的加和,一起去做优化的。
物体框的表示啊,IOU的概念啊,NMS,卷积,池化,BN。
Faster R-CNN的各个模块,其实这些模块都是有一些优化空间的,比如说,数据预处理,也叫数据增强,我们可以加一些颜色增强,随机裁剪等。
RPN也会设计到正负样本的采样,它能不能真正采集到正负样本,这也是有优化空间的。
ROI Align其实就是一个优化策略了,原先是采用的ROI Pooling。
BBox Head是对检测框做进一步的调整,如何更好的调整,也是有提升的空间。
这就隐身到Faster R-CNN的晋升版了。比如下图
两阶段方法
FPN的解说
FPN实际上要解决的也就是多尺度问题,其实多尺度问题也是所有视觉任务中要解决的一个比较重要的问题。它期望模型能够具备检测不同大小尺度的能力,换言之,怎么在一张图上,检测出大象和老鼠。
可以看一下之前的方式:
首先是金字塔的方式(a图),将图片调整到不同大小的尺度,使用多个模型进行预测,这个方法就十分的耗时,也消耗存储的空间。
b图,它仅使用了最后一层的特征作为检测模型后续部分的输入。这种方式对小物体就不够优化了,因为我们知道,卷积神经网络存在着下采样的过程,比如说特征图的下采样是16,那么特征图的点就代表着原图中1616的小区域,但是如果这个时候,我需要检测小老鼠,它在原图中的大小是1010,这就意味着这张特征图在原图中无法检测这个10*10的小老鼠了。
c图,刚刚也说了,卷积神经存在下采样的过程,这就说明它天然地具备了特征金字塔的结构,什么意思呢,也就是说明了它在不同的深度对应了不同语义层次的特征。就比如说倒数第二个特征层,相比浅层的网络的话,它的分辨率就比较高,学习更多的是细节的特征,而深层的网络(最上面的那个),它的分辨率就比较低,学习更多的是语义特征,或者说是全局的特征。如果这个时候,我有一个小老鼠,我就可以通过浅层的网络去学习了。
d图,FPN,就是将不同层的特征进行一个融合,就希望能够让不同尺度的这个特征都具备一个比较全面的信息。
FPN网络结构
FPN的输入就是骨干网络每一层的输出,然后将每一个特征图进行一个上采样,与上一层特征图进行一个相加,最终得到FPN的输出,具体的关系,如上图左边。其实在yolov3系列网络中就是使用了这种方式。
FPN目标检测实现方法
原先的faster rcnn的骨干网络只输出一张特征图,在骨干网络之后加入FPN网络,此时输出多张特征图,这样的话,RPN和ROI Align就会受到影响,第二阶段BBox Head不变。
FPN结构下的RPN网络
1)Anchor: {3232, 6464, 128128, 256256, 512*512} – > {p2, p3, p4, p5, p6}
FPN的输出层,P2到P6,每一层只生成一种面积的anchor(长宽比不变1:1, 1:2, 2:1),P6就是P5直接下采样得到的。
说到anchor,就要说到anchor要和真实框去做正负样本的匹配,后面再做采样和监督信息的分配,这个过程和faster rcnn的过程是一样的。
2)RPN网络分为多个head预测不同尺度上的候选框。
RPN网络部分,原先faster RCNN当中,RPN的网络结构,就是输入一个特征图,经过33卷积,再经过一个11卷积,分别得到分类分支和回归分支,然后去计算loss和输出的候选框。 如下图。
而现在,有多个输入了,也就是不同尺度的特征图,我就要用多个head去预测不同尺度上的候选框,在这里,这个不同head的权重是共享的。如下图。
3)RPN网络的预测结果和anchor解码得到的RoI会进行合并。
每一个head都会输出一个候选框(ROI),在FPN下,会将这个多个尺度的ROI进行合并。合并的方法是:先根据他们对应的分数来进行排序(比如说取2000个),再进入到第二个阶段的网络计算当中。
FPN结构下的RoI Align
如何将ROI分配到不同层级呢?
将FPN的特征金字塔类比为图像金字塔,也就是不同尺度的特征,它就象征着不同大小的输入图像,因此我们就可以考虑这些RoI按面积来分配,分配的方法,就是上面的公式进行计算的。简单来说,我们把大的ROI分到深层的特征去学习,小的ROI分到浅层的特征去学习。
FPN模型效果:
IoU表示两个检测框之间的重叠程度。
cascade RCNN主要是围绕IOU这个概念来展开的。它能够来评价我们的预测框预测的质量好不好。
正负样本定义规则:
cascade RCNN主要基于RoI和真实框匹配值来展开分析的。
那么IoU选择0.5这个值会不会有点低呢?也就是说,它训练出来的检测器可能会带来一些噪声,就是会产生一些比较多的误检框,那么直观的想法就是把这个0.5提升到0.7,这样的话,进入到第二阶段的RoI质量不就变高了嘛,但是呢,如果只是简单粗暴将这个IoU阈值提高,检测性能是不会提升,反而是下降的,有这么几个原因,第一,IOU值提高了,用于训练的正样本数量是会成指数倍数量减少的,这就会导致我的第二阶段的训练出现过拟合;第二个原因就是,如果使用了一个比较高的IOU阈值,就很容易导致输入的候选框和设定的阈值不匹配的问题,这个不匹配下面将具体分析一下。
检测中的不平衡问题
Libra R-CNN的特征融合
Libra R-CNN的采样策略
比如说,我们需要20个负样本,假如说这些负样本的阈值都是大于0.1的,那么我们的负样本的范例就读再0.1到0.5之间,然后我期望采集6个负样本,就根据iou分为两个桶,一个是0.1到0.3一个桶,0.3到0.5一个桶,然后属于每个桶的随机采样。有可能存在一个情况,就是出现某个桶的数据不足,就需要在低于这个阈值(0.1)的样本中随机采样补齐。
Libra R-CNN的回归损失函数
主要是在回归损失的优化。
Libra R-CNN效果
服务器端模型优化基线方案
AutoAugment,这里就是通过强化学习来作为搜素的方法,去搜出,针对这个任务而言,常用的数据预处理的操作和选择顺序是最有效的。
backbone:可变性卷积的思想就是让卷积核多学习一个偏移量,然后卷积核落到更感兴趣的区域当中;半监督知识蒸馏的方式,是在我们图像分类中应用的,提高精度。
RPN:
Iou Loss,直接将预测结果,也就是预测框和真实框的IOU的值直接作为回归分支的损失函数。
CIou Loss,考虑到了物体间的中心点的距离和长宽比,这样就更有效了表达了预测结果的质量了。
服务器端模型优化效果
1.基线方案
移动端采用了余弦的学习率调整策略。
2. 移动端模型优化:微调FPN结构
采用下采样的策略。 FPN的通道数进行了调整。
3. 移动端模型优化效果
FPN:通过多尺寸融合的方式提高检测精度,FPN中根据RoI的面积来分配所属层级。
– 多尺度检测
– FPN结构下不同模块的调整
Cascade R-CNN:通过级联的方式不断对预测框的位置进行微调,Cascade R-CNN中使用了3个BBox Head完成目标检测。
– 两阶段模型中IoU的使用
– 通过3个级联检测头对预测框不断调优
Libra R-CNN:从多个角度解决两阶段检测中存在不平衡问题,Libra R-CNN从FPN特征,正负样本采样,Loss几个角度讨论增强了两个阶段检测模型。
– 两阶段模型中不平衡问题
– 提出新的FPN结构,采样策略和回归loss
服务器端模型优化策略
移动端模型优化策略
工业案例分享