在目标检测领域,为了判断预测框和gt之间的重叠程度 ,一般情况下使用iou来表示,本篇主要分析IoU以及相关改进,主要涉及iou,giou,diou,ciou。
IoU
IoU是Intersection over Union的缩写,顾名思义,交并比。
优点
- IoU可以作为一种距离的度量,反应两个box的相交程度,衡量检测模型的效果,loss=1-IOU。
- IoU 对尺度变化具有不变性,不受两个物体尺度大小的影响。 在box回归任务中,判断predict box和gt的距离最直接的指标就是IoU。**(满足非负性;同一性;对称性;三角不等性)**
缺点
- 无法衡量两框是相邻还是甚远,针对不同的情况,模型的优化方向应该是不同的。并且当两个box不想交的时候iou=0,这个时候没有回传的梯度,网络无法优化学习
- IOU不能反映两个物体如何重叠相交的,对于相同的iou值的情况,存在着无数种相交情形,这些情况的优劣通过iou无法表述出来。
上述两个方面实际是上说的是一回事,通俗的讲,通过IoU我们只能知道两个box是否有交集,但是并不知道box相交的位置和box之间的距离,如下图所示.这样从模型优化的角度来说,不利于模型想更好地方向优化。
1.
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32def bboxes_iou(boxes1,boxes2):
'''
cal IOU of two boxes or batch boxes
such as: (1)
boxes1 = np.asarray([[0,0,5,5],[0,0,10,10],[0,0,10,10]])
boxes2 = np.asarray([[0,0,5,5]])
and res is [1. 0.25 0.25]
(2)
boxes1 = np.asarray([[0,0,5,5],[0,0,10,10],[0,0,10,10]])
boxes2 = np.asarray([[0,0,5,5],[0,0,10,10],[0,0,10,10]])
and res is [1. 1. 1.]
:param boxes1:[xmin,ymin,xmax,ymax] or
[[xmin,ymin,xmax,ymax],[xmin,ymin,xmax,ymax],...]
:param boxes2:[xmin,ymin,xmax,ymax]
:return:
'''
#cal the box's area of boxes1 and boxess
boxes1Area = (boxes1[...,2]-boxes1[...,0])*(boxes1[...,3]-boxes1[...,1])
boxes2Area = (boxes2[..., 2] - boxes2[..., 0]) * (boxes2[..., 3] - boxes2[..., 1])
#cal Intersection
left_up = np.maximum(boxes1[...,:2],boxes2[...,:2])
right_down = np.minimum(boxes1[...,2:],boxes2[...,2:])
inter_section = np.maximum(right_down-left_up,0.0)
inter_area = inter_section[...,0] * inter_section[...,1]
union_area = boxes1Area+boxes2Area-inter_area
ious = np.maximum(1.0*inter_area/union_area,np.finfo(np.float32).eps)
return iousGIOU
GIOU正是针对上面的