SPP网络效果有个比较大的提升,其主要原因还是在下面几步改进中。

目标检测实时视频推送 目标检测flops_计算机视觉


其效果得到巨大提升,主要做了下面三种改进,最后一种改进focal loss根据作者是说效果不大,所以没做。

1、图像增强

Mosaic数据增强,就是将四张图片通过缩放等手段拼接在一起,增加单张图片内目标数。

目标检测实时视频推送 目标检测flops_取整_02


2、SPP

通过对不同感受野的最大池化,最终进行维度拼接,可以获取到不同尺度的特征融合信息,从而提升模型性能。

目标检测实时视频推送 目标检测flops_取整_03


根据模型对比图,我们发现v3和v3spp区别就在于第一个Set块中间加入了11 spp 11部分

目标检测实时视频推送 目标检测flops_MSE_04


那么你可能会有疑问,既然spp这么好,为什么后两个set不也加入呢?这里作者也做了验证实验,结果表明加的多,在增加计算量的同时,并没有对效果有多大的提升。

目标检测实时视频推送 目标检测flops_取整_05


3、关于损失函数计算,这里根据yolov1,三种参数两个是类别概率和置信分数都是交叉熵,而回归参数是均方误差 MSE

我们在v1中,计算损失,几乎都是平方和累加损失。也就是l2损失。在v2和v3中,在类别和置信度损失都是二值交叉熵,定位损失还是l2损失,均方损失 MSE ,但是在v3-spp中,我们就换了定位损失的计算方法,看下面这四种损失。

目标检测实时视频推送 目标检测flops_计算机视觉_06


1)、IOU损失

目标检测实时视频推送 目标检测flops_取整_07


作者发现,当出现三种完全不同的重叠效果时,平方误差却是相等的,这明显不合理,而此时IOU却可以很好的表现出真实情况。所以引入IOU损失,公式就是-ln(IOU)。或者是1-IOU也可以表示。但是这种情况下,如果真实框和预测框不重叠,就没有办法了。

目标检测实时视频推送 目标检测flops_目标检测实时视频推送_08


2)、GIoU损失

目标检测实时视频推送 目标检测flops_目标检测_09


其中AC表示把两个框都包含在内的大框,u表示两者的并集。

这就可以很好解决当两者不相交时,出现的loss为0问题。但是它也有弊端,我们看下图

目标检测实时视频推送 目标检测flops_计算机视觉_10


当我们两个框水平放置时,就退化为IOU了。

3)、Diou

目标检测实时视频推送 目标检测flops_目标检测实时视频推送_11


那么本文又提出了DIOU, 让损失直接与中心点之间距离相关,来加快收敛速度。使用IOU减去对角线平方分之中心点坐标平方。

目标检测实时视频推送 目标检测flops_目标检测实时视频推送_12


目标检测实时视频推送 目标检测flops_MSE_13


但是,一个好的偏移量损失指标,应该包括三部分:重叠部分,中心点距离,长宽比。4) CIoU

加入了要考虑的长宽比。。。

目标检测实时视频推送 目标检测flops_目标检测实时视频推送_14


在该函数中,增加了应该考虑的所有参数。

综上,即为本篇论文中实际使用的关于回归参数的loss函数表示方法,而在下面focal loss,是作者尝试的另一种关于分类概率和置信度分数的回归参数。5)Focal loss

该loss最核心的作用之一就是还可以解决一阶段算法中正负样本比例失调的问题。

在二阶段算法中,因为RPN需要经过一次筛选,导致传到ROIpooling的只有2000个,而真正有效的是512个。在最后计算loss时,负样本又仅仅选择了128个,所以二阶段一般来说不存在正负样本比例失调问题。而一阶段算法中,比例失调问题很严重。

因此,我们就需要一个办法来解决这个问题。

目标检测实时视频推送 目标检测flops_MSE_15


目标检测实时视频推送 目标检测flops_目标检测实时视频推送_16


目标检测实时视频推送 目标检测flops_计算机视觉_17


目标检测实时视频推送 目标检测flops_MSE_18


首先,我们做了一个尝试,我们可以选择在二值交叉熵前加一个权重系数,来增加正样本在loss中的占比量,减少负样本在loss计算中的占比量,从而达到一定程度上减轻正负样本不均衡,导致loss被负样本左右的现象。但是,当负样本极大时,仍然不能避免。然后,我们也可以选择Focal loss ,来根据样本训练的难以程度来调整系数,重点训练难以训练的样本。

目标检测实时视频推送 目标检测flops_MSE_19


目标检测实时视频推送 目标检测flops_MSE_20


目标检测实时视频推送 目标检测flops_MSE_21

那么为什么Focal loss加入到这里面,明明是有利于样本均衡的,可是效果却更低了?可能的一个原因是里面有标签错误的样本,就是人工打标签时,把标签标错误了。这个错误样本是很难训练的,导致该loss重点关注这个错误标签,导致正确的样本到被忽视了。造成效果不佳。

关于SPP在代码实现时,还需要注意的点是:
1、在faster rcnn以及ssd一阶段算法中,我们都是生成anchor,然后在生成的所有anchor中通过正负样本选取两条原则,一一筛选出最终128条正样本和128条负样本,或者说正负样本1:3的样本数。而在SPP中,对于每一个预测特征层(一共三个预测特征层),都提供了三个模板。我们需要先将三个模板和所有的目标target求iou,来判断每一个真实目标都由哪个模板框来进行预测。然后再确定这个模板框是属于哪一个像素单元的模板框。那如何确定属于哪个像素单元呢??就看我们真实目标框中心点坐标向下取整后在特征层哪个单元格内,那么就由这个单元格的该模板框进行预测。这也就是正样本。
2、在计算三类损失时,坐标损失就可以使用giou loss或者Diou loss实现。
类别损失和置信度损失都是由BSELOSS实现。坐标损失必须全部是正样本才会有。而类别损失和置信度损失都需要正负样本,将刚刚挑选出的标定为正样本,剩下的为负样本