iou与giou

衡量目标检测定位性能的主要指标是交并比iou,我们在设计损失函数的时候通常是使用mse等损失函数来优化模型对目标的定位结果,但是这类损失函数并不能够良好的反应定位精度。

对iou的认识:可以反应预测检测框与真实框的检测效果,有一个很好的特性是尺度不变性也就是对尺度不敏感,在回归任务重判断predict box和gt的距离最直接的指标就是iou(满足非负性,同一性,对称性,三角不等性)。作为损失函数会出现的问题是:如果两个框没有相交根据定义iou=0,不能反应两者之间的距离大小,同时loss=0,没有梯度回传,无法进行学习训练。无法精确的反应predict box与gt的重合度大小。论文中图片。

对giou的认识:iou是比值的概念,对目标物体尺寸不敏感,但是检测任务中的box回归损失优化和iou优化不是完全等价的,而且范数对物体的尺寸比较敏感,iou无法直接优化没有重叠的部分。giou的论文直接提出把iou设为回归的loss,首先计算两个框的最小闭包区域面积(就是包含predict box和gt的最小框的面积),再计算iou(交并比),再计算最小闭包区域面积中不属于两个框的区域占闭包区域的比重,最后用iou减去这个比重得giou。giou越是一种距离度量,作为损失函数的话,loss=1-giou,满足损失函数的基本要求,giou是iou的下界,在两个框无限重合的情况下,iou=giou=1,iou取值空间为0-1,giou有对称区间取值空间为-1到1,在两者重合的时候取1,无交集的时候取最小值-1,因此giou是一个非常好的距离度量指标。不仅关注重叠区域还关注其他非重合区域。

iou与giou_第1张图片取图链接为:https://blog.csdn.net/u014061630/article/details/82818112

def iou(x1_gt, y1_gt, x2_gt, y2_gt, x1_pred, y1_pred, x2_pred, y2_pred):
	w = x2_gt- x1_gt#gt的宽
	h = y2_gt - y1_gt#gt的高
	w_pred = x2_pred - x1_pred#pred的宽
	h_pred = y2_pred - y1_pred#pred的高 
	w_i = max(min(x2_gt, x2_pred) - max(x1_gt, x1_pred), 0) 
	h_i = max(min(y2_gt, y2_pred) - max(y1_gt, y1_pred), 0) 
	A_i = w_i * h_i
	A_u = w * h + w_hat * h_hat
	return A_i / A_u

八个坐标值的话,获取第一个和第三个就可以进行计算,先是gt的高和宽,然后再是pred的高和宽,

交集框的话是:

(如果是如图所示的情况的话)在序号1的两个点中选择x值大的那个,y值大的那个,在序号2的两个点中选择x值小的,y值小的那个,但是会有很多种相交的情况,就是在序号为1(一般为左上角)的结点里选x的最大值max(x1_gt,x1_pred),y的最大值max(y1_gt,y1_pred),在序号为2(右下角)的结点里选x值最小的min(x1_gt,x1_pred),y值最小的那个值min(y1_gt,y1_pred)。

然后就是交集框的面积:交集面积取尽可能的大max(min后边值-max前边值,0)Xmax(min下面值-max上面值,0)

整体面积的话是:w*h+w_pred*h_pred

最后求比值。iou结束。

GIOU:论文《Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression》下面是论文中说的giou的算法。

iou与giou_第2张图片iou与giou_第3张图片

def giou(gt,pred):
   #应用上面iou的结果
   iou=iou(gt,pred)
   #计算u
   u=gt面积+pred面积-iou
   #计算c面积
   x1_c=min((x1_gt,x1_pred),0)
   y1_c=min((y1_gt,y1_pred),0)
   x2_c=max((x2_gt,x2_pred),0)
   y2_c=max((y2_gt,y2_pred),0)
   
   A_c=(x2_c-x1_c)x(y2_c-y1_c)   
   giou=iou-((A_c-u)/A_c)

按这个算法流程的话,求出iou的时候已经算是完成一大半的流程了,公式中还剩c外接矩形的面积和u并集的面积,并集的面积就是(gt面积+pred面积-交集面积)

并集的面积的话是cv2中有一个自带的函数如果给四个点的话就是直接调用cv2.minAreaRect()可以得到最小外接矩形的中心,宽,高,旋转角度。

现在的问题是如何得到确定最小外接矩形的四个点呢?和求交集的面积四个点的获取不同,这个是找左上角点的x值的最小值,y值的最小值,找右下角点的x值的最大值,y值的最大值(参考图片和算法中步骤5理解),面积的话就是宽的值(最大的max-最小的min)X高的值(最大的max-最小的min)。然后公式中的要素都求出来就可以计算出giou了,giou结束。

 

 

 

 

你可能感兴趣的:(深度学习,计算机视觉)