《Bounding Box Regression with Uncertainty for Accurate Object Detection》论文笔记

代码地址:KL-Loss

1. 概述

导读:这篇文章对于数据集中标注不明确的标注框给检测带来的影响做了研究,其中原有的检测框的回归函数Smooth L1函数并不能很好反应不明确检测框带来的影响,对此文章提出了一个新的检测框损失函数——KL-Loss,它同时学习检测框的变换与定位的方差(localization variance,定位的不确定性),这样的改进可以扩展到多种不同结构的检测网络,扩展之后的网络其精度得以提升,并且带来的计算量很小。学习到的方差信息使得可以在NMS阶段融合掉邻近的检测框,从而进一步提升检测精度。在MS-COCO数据集上使用VGG-16的Faster RCNN网络其AP从23.6%提升到29.1%,对于ResNet-50-FPN的Mask RCNN网络使用文章的方法在AP与 A P 90 AP^{90} AP90上分别提升1.8%与6.2%。

在实际的COCO数据中会存在GT标注不准确的情况,下图1的(a)(c)图是标注不准确的示例,图(d)是存在遮挡的情况。
在这里插入图片描述
一般情况下分类的置信度是与检测框的回归是正相关的,但是也会存在一些不一样的情况,见图2所示:
在这里插入图片描述
对于上面的问题文章提出了KL-Loss用于解决上述问题,它可以同时学习边界框的回归以及定位的不确定性。为了捕捉边界框预测的不确定性,首先将边界框的预测及ground truth 框分别看作时高斯分布及Dirac delta函数。则新定义的回归损失可以看作是预测分布及真实分布之间的KL散度。使用KL-Loss会有三个优点:

  • 1)可以成功捕获数据集中的歧义(不明确)现象。边界框回归器从有歧义的边界框中得到更小的损失;
  • 2)网络学习到的方差信息是在后处理阶段是很有用的,即是使用周围定位的权值来vote出候选框的位置,而这些权重是通过NMS中预测得来的方差;
  • 3)学习到的概率分布是具有解释性的,其反应的是检测框预测的不确定性,这样的性质在诸如自动驾驶车辆上是很有帮助的;

2. 方法设计

2.1 网络结构

由于文章的方法源自于Faster RCNN系列的算法,其前面的网络部分是相似的,其网络结构上最大的区别在于RCNN头的部分,改动了预测回归的目标与添加了一个预测检测框方差的分支,这个分支与检测框的预测组合起来计算KL-Loss,其网络示意见下图所示:
在这里插入图片描述

2.2 检测框的定义

这篇文章没有采用Faster RCNN中 ( x , y , w , h ) (x,y,w,h) (x,y,w,h)形式的检测框表达而是使用了 ( x 1 , y 1 , x 2 , y 2 ) (x_1,y_1,x_2,y_2) (x1,y1,x2,y2)的四维表达,分别表示检测框的4个边界,其预测与反向计算偏移的过程见下面的公式所示:
在这里插入图片描述
其中, t x 1 , t x 2 , t y 1 , t y 2 t_{x_1},t_{x_2},t_{y_1},t_{y_2} tx1,tx2,ty1,ty2代表网络预测的结果,对应的带星号的是GT,带小标 a a a的是anchor。

这篇文章中检测框的概率分布而不是直接检测框的位置。为了表达检测框的概率分布,文章从简单起见假设其是属于独立且但方差的高斯分布,其表述为:
在这里插入图片描述
其中, θ \theta θ是学习到的参数, x e x_e xe是评估的检测框位置,标准差 σ \sigma σ体现了评估的不确定性,当这个标准差接近于0的时候,网络评估的置信度就很高了。

对于GT的边界框也同样计算其对应的高斯分布,不过这里的 σ \sigma σ同样趋近于0,从而得到Dirac delta函数:
在这里插入图片描述
x g x_g xg是GT边界框的位置。

2.3 基于KL_Loss的边界框回归

在上面的参数化描述中已经将预测与GT的高斯分布表示出来了,接下来就是约束他们的KL散度了,其形式见下面的公式所示:
在这里插入图片描述
其中的两个分布的散度可以展开为:
在这里插入图片描述
在图4中展示了 x e x_e xe评估的质量与GT分布的一个关系,在评估质量较差的时候就希望方差尽可能大,从而覆盖到GT的分布。
在这里插入图片描述
由于公式5中后面的两项与阐述 θ \theta θ无关,因而公式4可以描述为与下面两项相关的形式:
在这里插入图片描述
σ = 1 \sigma=1 σ=1的时候KL-Loss退化为标准的Euclidean Loss:
在这里插入图片描述
因而边界框的预测 x e x_e xe与定位的标准差的导数可以描述为:
在这里插入图片描述
由于标准差在分母上,在计算梯度的时候会引起梯度问题,这里使用换元法将 α = l o g ( σ 2 ) \alpha=log(\sigma^2) α=log(σ2),因而公式7就可以描述为:
在这里插入图片描述
在满足 ∣ x g − x e ∣ > 1 |x_g-x_e|\gt1 xgxe>1的时候采用类似Smooth L1类似的损失函数:
在这里插入图片描述
在训练的初始阶段FC层的参数初始化是使用标准差为0.0001,均值为0的高斯分布初始化。

2.4 Variance Voting

这部分算是检测框的后处理部分了,这里涉及到的是合框的算法,其算法流程为:
在这里插入图片描述
完成合并之后的框的概率与坐标表示为:
在这里插入图片描述

3. 实验结果

性能比较:
在这里插入图片描述
消融实验:
在这里插入图片描述

<think>好的,我现在需要帮助用户解决如何改进YOLOv1模型中的损失函数模块的问题。首先,我需要回顾一下YOLOv1的原始损失函数结构。根据记忆,YOLOv1的损失函数主要包含坐标误差、置信度误差和分类误差三个部分,可能使用了平方损失函数。接下来,用户希望改进这一部分,我需要考虑当前常用的改进方法,比如替换IoU损失函数,增加Focal Loss,或者引入其他先进的损失函数如MPDIoU等。 首先,我应该检查现有的引用资料。用户提供了三个引用,其中提到了CIoU、EIoU、SIoU、MPDIoU等损失函数在YOLOv5和YOLOv8中的应用。虽然这些是针对后续版本的改进,但可能可以借鉴到YOLOv1中。例如,EIoU在CIoU的基础上进一步优化了宽高比的计算,而MPDIoU可能考虑了不同的几何因素。这些改进通常是为了解决IoU在边界框回归中的不足,如对重叠情况的敏感度或不同尺度下的表现。 接下来,我需要考虑如何将这些改进应用到YOLOv1中。YOLOv1的原始损失函数可能使用的是简单的L2损失,而后续版本采用了IoU相关的损失函数。因此,第一步可能是替换坐标损失部分,用IoU变体如GIoU、DIoU、CIoU或EIoU来代替。例如,EIoU的论文提到它能够更有效地处理边界框回归,这可能提升检测精度。同时,Focal Loss可以用来解决类别不平衡问题,这可能对置信度损失部分有帮助。 然后,我需要考虑具体的实现步骤。例如,替换坐标损失为EIoU需要计算预测框和真实框的EIoU值,并将其整合到损失函数中。同时,可能需要对置信度损失应用Focal Loss来调整难易样本的权重。此外,参考引用3提到的InnerMPDIoU,可能可以考虑目标内部结构的IoU计算,这在YOLOv1中是否适用需要进一步分析。 用户还要求提供相关的论文代码示例。因此,我需要整理出相关的论文链接,如EIoU的论文,以及可能的代码片段。由于YOLOv1的实现可能较为老旧,需要指导用户如何在其代码结构中修改损失函数部分。例如,在PyTorch中,可以定义新的损失函数类,替换原有的坐标损失计算部分。 此外,还需要考虑兼容性问题。YOLOv1的原始输出格式和边界框的表示方式可能与后续版本不同,因此需要确保新的损失函数与模型输出匹配。例如,YOLOv1将图像划分为SxS的网格,每个网格预测B个边界框,每个框有坐标和置信度,以及类别概率。修改损失函数时,需要正确提取预测和真实框的坐标,并计算相应的损失。 最后,应该提醒用户进行实验验证,因为不同的改进可能在不同数据集或场景下表现不同。建议用户逐步替换各个损失部分,并评估性能变化,比如mAP的提升或收敛速度的改善。同时,代码示例需要简洁明了,展示关键修改部分,如EIoU的实现和Focal Loss的应用。</think>### YOLOv1损失函数改进方法 YOLOv1的原始损失函数由坐标损失、置信度损失和分类损失三部分组成,其核心是平方误差损失函数: $$L = \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^B \mathbb{1}_{ij}^{\text{obj}} \left[ (x_i-\hat{x}_i)^2 + (y_i-\hat{y}_i)^2 \right] + \text{其他项}$$ 这种设计存在对定位误差敏感、类别不平衡等问题。以下是改进方法及实现步骤: --- #### 一、核心改进方向 1. **IoU系列损失函数替换** - 原始坐标损失使用L2距离,无法直接反映预测框与真实框的重叠度 - 改进方案:用EIoU[^1]/MPDIoU[^3]等替代坐标损失- 公式对比: $$L_{\text{CIoU}} = 1 - IoU + \frac{\rho^2(b,\hat{b})}{c^2} + \alpha v$$ $$L_{\text{EIoU}} = 1 - IoU + \frac{\rho^2(b_{cx},\hat{b}_{cx})}{w_c^2} + \frac{\rho^2(b_{cy},\hat{b}_{cy})}{h_c^2} + \frac{\rho^2(w,\hat{w})}{w_c^2} + \frac{\rho^2(h,\hat{h})}{h_c^2}$$[^1] 2. **Focal Loss应用** - 解决简单样本主导梯度的问题 - 置信度损失改进公式: $$FL(p_t) = -\alpha_t(1-p_t)^\gamma \log(p_t)$$ 3. **多任务平衡策略** - 使用动态权重调整坐标/分类/置信度损失比例 - 实现方法:Homoscedastic uncertainty权重法 --- #### 二、代码实现示例(PyTorch) ```python # EIoU损失函数实现 def EIoU(pred_box, target_box): # 预测框格式(cx, cy, w, h) inter_area = ... # 交集计算 union_area = ... # 并集计算 iou = inter_area / (union_area + 1e-7) # 中心点距离 rho_center = (pred_box[:2] - target_box[:2]).pow(2).sum() # 宽高惩罚项 c_w = torch.max(pred_box[2], target_box[2]) c_h = torch.max(pred_box[3], target_box[3]) penalty_w = (pred_box[2] - target_box[2]).pow(2) / (c_w**2 + 1e-7) penalty_h = (pred_box[3] - target_box[3]).pow(2) / (c_h**2 + 1e-7) return 1 - iou + rho_center + penalty_w + penalty_h # 改进后的损失函数类 class YOLOv1ImprovedLoss(nn.Module): def __init__(self, lambda_coord=5, lambda_noobj=0.5): super().__init__() self.lambda_coord = lambda_coord self.lambda_noobj = lambda_noobj def forward(self, pred, target): # 坐标损失使用EIoU coord_mask = target[..., 4].unsqueeze(-1) eious = EIoU(pred[..., :4], target[..., :4]) coord_loss = self.lambda_coord * (coord_mask * eious).sum() # 置信度损失使用Focal Loss obj_mask = target[..., 4] noobj_mask = 1 - obj_mask obj_loss = FocalLoss(pred[..., 4], obj_mask) noobj_loss = F.binary_cross_entropy(pred[..., 4], target[..., 4], weight=noobj_mask) conf_loss = obj_loss + self.lambda_noobj * noobj_loss # 分类损失保持不变 cls_loss = F.mse_loss(pred[..., 5:], target[..., 5:]) return coord_loss + conf_loss + cls_loss ``` --- #### 三、推荐论文与资源 1. **关键论文** - 《Focal and Efficient IOU Loss for Accurate Bounding Box Regression- 《Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression》(CIoU) - 《MPDIoU: A Loss for Efficient Bounding Box Regression》 2. **实验建议** - 分阶段改进:先替换坐标损失→再优化置信度→最后调整分类损失 - 指标监控:关注AP50和AP75的提升幅度 - 消融实验设计:对比不同IoU变体的效果 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值