线上购物网站建设成本,爱站网关键词挖掘查询工具,域名是什么举个例子,网页游戏排行榜前十名知乎一、背景
目标检测和实例分割中的关键问题#xff1a; 现有的大多数边界框回归损失函数在不同的预测结果下可能具有相同的值#xff0c;这降低了边界框回归的收敛速度和准确性。 现有损失函数的不足#xff1a; 现有的基于 ℓ n \ell_n ℓn范数的损失函数简单但对各种尺度…一、背景
目标检测和实例分割中的关键问题 现有的大多数边界框回归损失函数在不同的预测结果下可能具有相同的值这降低了边界框回归的收敛速度和准确性。 现有损失函数的不足 现有的基于 ℓ n \ell_n ℓn范数的损失函数简单但对各种尺度敏感。当预测框与真实框具有相同的宽高比但不同的宽度和高度值时现有损失函数可能会存在问题限制了收敛速度和准确性。 文章目录 一、背景二、原理2.1 IoU计算原理2.2. 基于最小点距离的IoU度量2.3. 作为边界框回归损失函数2.4 MPDIoU的计算公式 三、添加步骤3.1 ultralytics/utils/metrics.py3.2 修改ultralytics/utils/loss.py3.3 修改ultralytics/utils/tal.py 四、成功运行截图 MPDIoUIntersection over Union with Minimum Points Distance是一种用于高效且准确的边界框回归的损失函数。
二、原理
2.1 IoU计算原理
IoUIntersection over Union即交并比用于衡量预测边界框和真实边界框的重合程度。
1. 交集计算
- 首先确定预测边界框和真实边界框的交集区域。
- 对于两个以左上角和右下角坐标表示的矩形框分别找出它们在横坐标和纵坐标方向上的重叠区间。
- 如果两个矩形框在横坐标和纵坐标方向上都有重叠部分那么这个重叠区域就是一个矩形其面积就是交集的大小。
2. 并集计算
- 计算预测边界框和真实边界框的并集区域。
- 并集的大小等于两个矩形框各自的面积之和减去它们的交集面积。
3. 比值计算
- 最后IoU的值就是交集面积与并集面积的比值。2.2. 基于最小点距离的IoU度量
原论文中受水平矩形的几何特性启发设计了一种基于最小点距离的新型IoU度量MPDIoU直接最小化预测边界框和真实边界框的左上角和右下角点之间的距离。MPDIoU的计算通过两个任意凸形状 A A A和 B B B用其左上角和右下角点的坐标来表示通过计算两个框的交集与并集之比再减去左上角和右下角两点距离的归一化值来得到MPDIoU。
2.3. 作为边界框回归损失函数
在训练阶段通过最小化基于MPDIoU的损失函数 L M P D I o U 1 − M P D I o U L_{MPDIoU}1-MPDIoU LMPDIoU1−MPDIoU使模型预测的每个边界框 B p r d B_{prd} Bprd接近其真实框 B g t B_{gt} Bgt。现有损失函数中的所有因素如非重叠区域、中心点距离、宽高偏差等都可以通过左上角和右下角两点的坐标确定这意味着提出的 L M P D I o U L_{MPDIoU} LMPDIoU不仅考虑了这些因素还简化了计算过程。 2.4 MPDIoU的计算公式 MPDIoU的计算公式 M P D I o U A ∩ B A ∪ B − d 1 2 w 2 h 2 − d 2 2 w 2 h 2 MPDIoU\frac{A\cap B}{A\cup B}-\frac{d_{1}^{2}}{w^{2}h^{2}}-\frac{d_{2}^{2}}{w^{2}h^{2}} MPDIoUA∪BA∩B−w2h2d12−w2h2d22其中 A A A和 B B B是两个任意凸形状 ( x A 1 , y A 1 ) (x_{A1}, y_{A1}) (xA1,yA1) ( x A 2 , y A 2 ) (x_{A2}, y_{A2}) (xA2,yA2)表示(A)的左上角和右下角点坐标 ( x B 1 , y B 1 ) (x_{B1}, y_{B1}) (xB1,yB1) ( x B 2 , y B 2 ) (x_{B2}, y_{B2}) (xB2,yB2)表示 B B B的左上角和右下角点坐标。 d 1 2 ( x 1 B − x 1 A ) 2 ( y 1 B − y 1 A ) 2 d_{1}^{2}(x_{1}^{B}-x_{1}^{A})^{2}(y_{1}^{B}-y_{1}^{A})^{2} d12(x1B−x1A)2(y1B−y1A)2 d 2 2 ( x 2 B − x 2 A ) 2 ( y 2 B − y 2 A ) 2 d_{2}^{2}(x_{2}^{B}-x_{2}^{A})^{2}(y_{2}^{B}-y_{2}^{A})^{2} d22(x2B−x2A)2(y2B−y2A)2。 基于MPDIoU的损失函数计算公式 L M P D I o U 1 − M P D I o U L_{MPDIoU}1-MPDIoU LMPDIoU1−MPDIoU。
三、添加步骤
3.1 ultralytics/utils/metrics.py
此处需要查看的文件是ultralytics/utils/metrics.py
metrics.py中定义了模型的损失函数和计算方法我们想要加入新的损失函数就只需要将代码放到这个文件内即可
将下方的bbox_iou函数替换原本的bbox_iou函数即可
def bbox_iou(box1, box2, xywhTrue, GIoUFalse, DIoUFalse, CIoUFalse, MDPIoUFalse, feat_h640, feat_w640, eps1e-7):# Returns Intersection over Union (IoU) of box1(1,4) to box2(n,4)# Get the coordinates of bounding boxesif xywh: # transform from xywh to xyxy(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 / 2b1_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_else: # x1, y1, x2, y2 box1b1_x1, b1_y1, b1_x2, b1_y2 box1.chunk(4, -1)b2_x1, b2_y1, b2_x2, b2_y2 box2.chunk(4, -1)w1, h1 b1_x2 - b1_x1, b1_y2 - b1_y1 epsw2, h2 b2_x2 - b2_x1, b2_y2 - b2_y1 eps# Intersection areainter (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 Areaunion w1 * h1 w2 * h2 - inter eps# IoUiou inter / unionif CIoU or DIoU or GIoU:cw torch.max(b1_x2, b2_x2) - torch.min(b1_x1, b2_x1) # convex (smallest enclosing box) widthch torch.max(b1_y2, b2_y2) - torch.min(b1_y1, b2_y1) # convex heightif CIoU or DIoU: # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1c2 cw ** 2 ch ** 2 eps # convex diagonal squaredrho2 ((b2_x1 b2_x2 - b1_x1 - b1_x2) ** 2 (b2_y1 b2_y2 - b1_y1 - b1_y2) ** 2) / 4 # center dist ** 2if CIoU: # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47v (4 / math.pi ** 2) * torch.pow(torch.atan(w2 / h2) - torch.atan(w1 / h1), 2)with torch.no_grad():alpha v / (v - iou (1 eps))return iou - (rho2 / c2 v * alpha) # CIoUreturn iou - rho2 / c2 # DIoUc_area cw * ch eps # convex areareturn iou - (c_area - union) / c_area # GIoU https://arxiv.org/pdf/1902.09630.pdfelif MDPIoU:d1 (b2_x1 - b1_x1) ** 2 (b2_y1 - b1_y1) ** 2d2 (b2_x2 - b1_x2) ** 2 (b2_y2 - b1_y2) ** 2mpdiou_hw_pow feat_h ** 2 feat_w ** 2return iou - d1 / mpdiou_hw_pow - d2 / mpdiou_hw_pow # MPDIoUreturn iou # IoU 3.2 修改ultralytics/utils/loss.py
utils\loss.py用于计算各种损失。
在BboxLoss函数内修改如下代码使模型调用此MPDIoU损失函数。 iou bbox_iou(pred_bboxes[fg_mask], target_bboxes[fg_mask], xywhFalse, MDPIoUTrue) 3.3 修改ultralytics/utils/tal.py
tal.py中是一些损失函数的功能应用。
在iou_calculation函数内修改如下代码使模型调用此MPDIoU损失函数。
return bbox_iou(gt_bboxes, pd_bboxes, xywhFalse, MPDIoUTrue).squeeze(-1).clamp_(0)四、成功运行截图