【目标检测】IoU、GIoU、DIoU、CIoU、EIoU

本文详细介绍了IoU、GIoU、DIoU和CIoU在目标检测任务中的概念、计算方法及其作为损失函数时的问题。这些改进旨在解决IoU的局限性,如考虑重叠程度、中心点距离和长宽比,提高预测精度。

一、IoU

1. 概念

在目标检测任务中,IoU被广泛使用,它反映预测bbox与真实bbox的重叠程度。具体来说,是预测bbox与真实bbox的交集与并集的比,该比值越大预测效果越好。

2. 计算

import torch


def IoU(box1, box2, x1y1x2y2=False):
    # box1.shape = 4  box2.shape = 4
    # return iou.shape = 1

    if x1y1x2y2:
        b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1[2], box1[3]
        b2_x1, b2_y1, b2_x2, b2_y2 = box2[0], box2[1], box2[2], box2[3]
    else:
        b1_x1, b1_x2 = box1[0] - box1[2] / 2, box1[0] + box1[2] / 2
        b1_y1, b1_y2 = box1[1] - box1[3] / 2, box1[1] + box1[3] / 2
        b2_x1, b2_x2 = box2[0] - box2[2] / 2, box2[0] + box2[2] / 2
        b2_y1, b2_y2 = box2[1] - box2[3] / 2, box2[1] + box2[3] / 2

    cap_x1, cap_y1 = torch.max(b1_x1, b2_x1), torch.max(b1_y1, b2_y1)  # 交集左上坐标,取两框左上坐标的大值,请注意图像左上角坐标为(0,0)
    cap_x2, cap_y2 = torch.min(b1_x2, b2_x2), torch.min(b1_y2, b2_y2)  # 交集右下坐标

    in_area = torch.clamp(cap_x2 - cap_x1, min=0) * torch.clamp(cap_y2 - cap_y1, min=0)  # clamp 限制最小为0,此时不相交,面积为0
    un_area = (b1_x2 - b1_x1) * (b1_y2 - b1_y1) + (b2_x2 - b2_x1) * (b2_y2 - b2_y1)

    return in_area / torch.clamp(un_area - in_area, min=1e-10)  # 避免溢出


if __name__ == "__main__":
    boxs1 = torch.tensor([1, 1, 3, 3])
    boxs2 = torch.tensor([2, 2, 4, 4])
    print(IoU(boxs1, boxs2, x1y1x2y2=True))

3. 问题

当1-IoU作为损失时,出现以下问题:
(1) 所有两框没相交的情况IoU均为0,损失均为1。此时,我们希望IoU同为0的不同情况下产生的损失有差异,比如两框距离越远损失越大。
(2) 所有两框相交且面积相同的情况IoU和损失均分别相同。此时,我们希望重合效果更好的拥有更小的损失。

如下图,前者应好于后者:

二、GIoU

1. 概念

针对上述问题,在IoU基础上,增加最小凸集概念,即包含两框的最小框。最小凸集减去并集的面积占最小凸集的比值越小预测效果越好。

2. 计算

如图所示, G I o U = I o U − C − B C GIoU=IoU-\frac{C-B}{C} GIoU=IoUCCB其中 G I o U ∈ ( − 1 , 1 ] GIoU\in(-1,1] GIoU(1,1] C C C为最小凸集, B B B为并集。

import torch


def GIoU(box1, box2, x1y1x2y2=False):
    # box1.shape = 4  box2.shape = 4
    # return iou.shape = 1

    if x1y1x2y2:
        b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fulin_Gao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值