一、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=IoU−CC−B其中 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

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

被折叠的 条评论
为什么被折叠?



