Pytorch机器学习(五)——目标检测中的损失函数(l2,IOU,GIOU,DIOU, CIOU)




Pytorch机器学习(五)——目标检测中的损失函数(l2,IOU,GIOU,DIOU, CIOU)





前言

目标检测领域,从发展到现在这个阶段,出现过很多次有关预测框损失函数的讨论与更新,从l2范数损失,到IOU损失,GIOU损失,DIOU损失等等,今天记录一下有关l2范数损失,IOU损失,GIOU和CIOU损失





一、l2范数损失

在早期,目标检测领域常用的是l2范数损失,个人理解l2损失是一种以距离为衡量指标的损失函数

像在数据预测时,比如以以前的数据去预测某一地区今年的房价时,用l2损失去回归曲线,就是一种比较好的损失函数。以预估的曲线上的点和真实点,用距离的概念去逼近,去回归,是十分符合直观理解的。

但用做目标检测领域时、如果仅仅以四个距离值来衡量预测框的好坏时,会有如下问题——xt:像素点距离框的上边距离,xb:像素点距离框的下边距离,xl:像素点距离框的左边距离,xr:像素点距离框的右边的距离)

一:这四个距离值并不是相互独立的。这导致会出现,当比如预测框的左下角和和真实框的左下角距离固定时,预测框的右上角只要落在以真实框右上角为圆形,半径为r的圆上,l2损失的值是相同的。

二:l2损失不是归一化的,即一个大的预测框对于此损失函数的影响大概率是要比小的预测框大的




二、IOU损失

由此可见l2损失用来作为预测框的损失函数其实是十分不适合的,于是就引入了IOU这个概念来作为预测框的损失函数。

IOU又名交并比,即是预测框与真实框的交集比上并集的值,即下图,黄色面积与蓝色面积的比值。而IOU loss一般有两种定义

一是上图中的 IOU loss = -ln IOU

二是比较常用的 IOU loss = 1 - IOU

 IOU损失解决了l2损失中出现的问题,但IOU也有其问题,其中最主要的问题就是IOU没法去定义两个完全不相交的框直接的损失。IOU对此,直接把其IOU定位0,这样就会导致其梯度为0,无法进行反向传播。




二、GIOU损失

为了弥补IOU损失中两个方框没有相交,无法进行反向传播的问题,后来提出了GIOU的概念来解决。

GIOU引入了两个方框中最小外接矩形的概念,来解决两个方框不相交的问题。

下图中,黄色框的面积即为公式中的Ac,u为A框和B框相交的面积

 

 通过公式可以知道

当两个框不相交,且距离很远时IOU=0,GIOU = -1

当两个框重合时,IOU=1,GIOU = 1

而GIOU损失函数即为 GIOU loss = 1 - GIOU

但GIOU也有其问题。

我们通过GIOU的损失函数可以知道,当使用GIOU时,网络会尽力去缩小Ac-u,这样会导致,网络会将预测框变大,去缩小Ac-u,而当预测框和真实框十分相近时,Ac-u会变的很小,那么GIOU就会被退化成IOU,最终结果导致网络的收敛变得十分困难。

 三、 DIOU,CIOU损失

从上面几种损失,我们可以知道,一个好的损失函数,应该需要考虑以下几个部分。

1.两个框的重叠部分,2.两个框直接的距离,3.两个框的长宽比

而IOU很好的考虑了两个框的重叠部分,DIOU在IOU的基础上,添加了对于两个框的距离的考虑,而CIOU则在DIOU的基础上添加了两个框长宽比的考虑

 

 其中公式中,

c表示两个框最小外接矩形的对角线的长度

d表示两个框的中心点直接的距离。

a在IOU<0.5时为0,即说明,当两个框较远离时,去考虑两个框的长宽比是没有意义的。

而CIOU通过引入距离这个量,可以帮助网络快速的收敛预测框到真实框的距离,在收敛到IOU>0.5时,通过引入长宽比,来限制框的形状,再次加快了网络的收敛





总结

下次会更新,有关这些损失函数的数学推导和其在代码中的应用。

猜你喜欢

转载自blog.csdn.net/lzzzzzzm/article/details/119997391
今日推荐