YOLOv8独家原创改进:提出一种新的Shape IoU,小目标检测实现暴力涨点 | 2023.12.29收录
💡💡💡本文改进:一种新的Shape IoU方法,该方法可以通过关注边界框本身的形状和尺度来计算损失,解决边界盒的形状和规模等固有属性对边界盒回归的影响。
💡💡💡对小目标检测涨点明显,在VisDrone2019、PASCAL VOC均有涨点
1.Shape-IoU介绍
论文:
摘要:边界盒回归损失作为检测器定位分支的重要组成部分,在目标检测任务中起着重要的作用。现有的边界盒回归方法通常考虑GT盒与预测盒之间的几何关系,利用边界盒的相对位置和形状来计算损失,而忽略了边界盒的形状和规模等固有属性对边界盒回归的影响。为了弥补已有研究的不足,本文提出了一种关注边界盒本身形状和尺度的边界盒回归方法。首先,我们分析了边界框的回归特征,发现边界框本身的形状和尺度因素都会对回归结果产生影响。基于以上结论,我们提出了Shape IoU方法,该方法可以通过关注边界框本身的形状和尺度来计算损失,从而使边界框回归更加准确。最后,我们通过大量的对比实验验证了我们的方法,结果表明,我们的方法可以有效地提高检测性能,并且优于现有的方法,在不同的检测任务中达到了最先进的性能。
本文贡献:
1.我们分析了边界盒回归的特点,得出边界盒回归过程中,边界盒回归样本本身的形状和尺度因素都会对回归结果产生影响。
2.在已有的边界盒回归损失函数的基础上,考虑到边界盒回归样本本身的形状和尺度对边界盒回归的影响,提出了shape- iou损失函数,针对微小目标检测任务提出了 the shape-dotdistance and shape-nwd loss
3.我们使用最先进的单级探测器对不同的检测任务进行了一系列的对比实验,实验结果证明本文方法的检测效果优于现有的方法来实现sota。
如图2所示,边界框回归样本A和B中的GT盒尺度相同,而C和D中的GT盒尺度相同。A和D中的GT盒形状相同,B和C中的GT盒形状相同。C和D中的边界框的尺度大于A和b中的边界框的尺度。图2a中所有边界框的回归样本具有相同的偏差,形状偏差为0。Fig.2a与Fig.2b的不同之处在于Fig.2b中所有边界框回归样本的形状偏差相同,偏差均为0。
图a中的A与B的deviation相同但IoU值存在差异。
图a中的C与D的deviation相同但IoU值存在差异,并且与a中的A与B相比,其IoU值差异并不显著。
图b中的A与B的shape-deviation相同但IoU值存在差异。
图b中的C与D的shape-deviation相同但IoU值存在差异,并且与b中的A与B相比,IoU值差异并不显著。
基于上述分析,得出的结论:
1)假设GT盒不是正方形,有长边和短边,回归样本中边界盒形状和尺度的不同,在偏差和形状偏差相同且不全为0时,其IoU值也会不同。
2)对于相同尺度的边界盒回归样本,当回归样本的偏差和形状偏差相同且不均为0时,边界盒的形状会对回归样本的IoU值产生影响。沿边界盒短边方向偏移和形状偏移所对应的IoU值变化更为显著。
3)对于相同形状边界框的回归样本,当回归样本偏差与形状偏差相同且不均为0时,相对于较大尺度的回归样本,较小尺度边界框回归样本的IoU值受GT盒形状的影响更为显著。
1.1 Shape-IoU介绍
其中scale为尺度因子,与数据集中目标的尺度有关,ww与hh分别为水平方向与竖直方向的权重系数,其取值与GT框的形状有关。其对应的边框回归损失如下:
1.2 Shape-IoU 在小目标的应用
Shape-Dot Distance:我们将ShapeIoU的思想融入到Dot Distance中,得到Shape-Dot Distance,定义如下:
1.3 Shape-NWD
Shape-NWD:同样,我们将ShapeIoU的思想融入到NWD中,得到Shape-NWD,其定义如下:
1.4 实验结果
PASCAL VOC 数据集在 YOLOv8 and YOLOv7的性能
VisDrone2019 on YOLOv8
AI-TOD on YOLOv5
2.如何将Shape-IoU添加在YOLOv8
def shape_iou(box1, box2, xywh=True, scale=0, eps= 1e-7):
(x1, y1, w1, h1), (x2, y2, w2, h2) = box1.chunk(4, -1), box2.chunk(4, -1)
w1_, h1_, w2_, h2_ = w1 / 2, h1 / 2, w2 / 2, h2 / 2
b1_x1, b1_x2, b1_y1, b1_y2 = x1 - w1_, x1 + w1_, y1 - h1_, y1 + h1_
b2_x1, b2_x2, b2_y1, b2_y2 = x2 - w2_, x2 + w2_, y2 - h2_, y2 + h2_
# Intersection area
inter = (torch.min(b1_x2, b2_x2) - torch.max(b1_x1, b2_x1)).clamp(0) * \
(torch.min(b1_y2, b2_y2) - torch.max(b1_y1, b2_y1)).clamp(0)
# Union Area
union = w1 * h1 + w2 * h2 - inter + eps
# IoU
iou = inter / union
# Shape-Distance #Shape-Distance #Shape-Distance #Shape-Distance #Shape-Distance #Shape-Distance #Shape-Distance
ww = 2 * torch.pow(w2, scale) / (torch.pow(w2, scale) + torch.pow(h2, scale))
hh = 2 * torch.pow(h2, scale) / (torch.pow(w2, scale) + torch.pow(h2, scale))
cw = torch.max(b1_x2, b2_x2) - torch.min(b1_x1, b2_x1) # convex width
ch = torch.max(b1_y2, b2_y2) - torch.min(b1_y1, b2_y1) # convex height
c2 = cw ** 2 + ch ** 2 + eps # convex diagonal squared
center_distance_x = ((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2) / 4
center_distance_y = ((b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4
center_distance = hh * center_distance_x + ww * center_distance_y
distance = center_distance / c2
# Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shape #Shape-Shape
omiga_w = hh * torch.abs(w1 - w2) / torch.max(w1, w2)
omiga_h = ww * torch.abs(h1 - h2) / torch.max(h1, h2)
shape_cost = torch.pow(1 - torch.exp(-1 * omiga_w), 4) + torch.pow(1 - torch.exp(-1 * omiga_h), 4)
# Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU #Shape-IoU
iou = iou - distance - 0.5 * (shape_cost)
return iou # IoU
by CSDN AI小怪兽
- 点赞
- 收藏
- 关注作者
评论(0)