Loss-IOUs

在目标检测领域,为了判断预测框和gt之间的重叠程度 ,一般情况下使用iou来表示,本篇主要分析IoU以及相关改进,主要涉及iou,giou,diou,ciou。

IoU

IoU是Intersection over Union的缩写,顾名思义,交并比。

  1. 优点

    1. IoU可以作为一种距离的度量,反应两个box的相交程度,衡量检测模型的效果,loss=1-IOU。
    2. IoU 对尺度变化具有不变性,不受两个物体尺度大小的影响。 在box回归任务中,判断predict box和gt的距离最直接的指标就是IoU。(满足非负性;同一性;对称性;三角不等性)
  2. 缺点

    1. 无法衡量两框是相邻还是甚远,针对不同的情况,模型的优化方向应该是不同的。并且当两个box不想交的时候iou=0,这个时候没有回传的梯度,网络无法优化学习
    2. IOU不能反映两个物体如何重叠相交的,对于相同的iou值的情况,存在着无数种相交情形,这些情况的优劣通过iou无法表述出来。

    上述两个方面实际是上说的是一回事,通俗的讲,通过IoU我们只能知道两个box是否有交集,但是并不知道box相交的位置和box之间的距离,如下图所示.这样从模型优化的角度来说,不利于模型想更好地方向优化。

  3. 代码

    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
    def 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 ious

    GIOU

    GIOU正是针对上面的

赏杯咖啡!