Generalized Focal Loss论文个人理解

论文地址:Generalized Focal Loss: Towards Efficient Representation Learning for Dense Object Detection

论文解决问题

研究人员最近更加关注边界框的表示(representation)及其定位质量估计(LQE,本论文中指的是IoU score),导致该领域取得了令人鼓舞的进展。具体来说,边界框表示被建模为简单的狄拉克δ分布,该分布在过去几年中被广泛使用。在 FCOS 中,当 LQE 与分类置信度相结合(通常是相乘)作为Non_max_suppression中排序的最终分数时,预测额外的定位质量(例如IoU score或Centerness score)会带来检测精度的持续提高。尽管取得了巨大的成功,但我们在密集检测器的现有实践中观察到这些表示(分类、定位和 LQE)存在以下三个问题:

  • 训练和推理之间 LQE 和分类分数的使用不一致
    在这里插入图片描述
    图 1 图1 1论文中阐述,如图1a所示,在最近的密集检测器中,LQE和分类分数通常是独立训练的,但在推理过程中综合利用(例如乘法)。目前,LQE 的监督仅分配给正样本 [18]、[20]、[42],这是不可靠的(只有正样本计算box_loss),因为负样本可能有机会获得无法控制的更高质量的预测(图 2)。 这两个因素导致训练和测试之间存在差距,并可能降低检测性能,例如,在 NMS 期间,具有随机高质量分数的负实例可能排在具有较低质量预测的正实例之前。
    在这里插入图片描述 图 2 图2 2注意yolov8中的是NMS排序分数是conf,conf是cls中最大的那个,并不是conf * iou。

    conf, j = cls.max(1, keepdim=True)
    x = torch.cat((box, conf, j.float(), mask), 1)[conf.view(-1) > conf_thres]
    
    x = x[x[:, 4].argsort(descending=True)[:max_nms]]  # sort by confidence and remove excess boxes
    
    boxes, scores = x[:, :4] + c, x[:, 4]  # boxes (offset by class), scores
    i = torchvision.ops.nms(boxes, scores, iou_thres)  # NMS
    
  • 边界框的不灵活表示
    广泛使用的边界框表示可以看作目标框坐标的狄拉克δ分布。 然而,它没有考虑数据集中的模糊性和不确定性(见图3中图形边界不清晰)。 尽管最近的一些工作]将框建模为高斯分布,但捕获边界框位置的真实分布过于简单。 事实上,真实分布可以更加任意和灵活,而不需要像高斯函数那样对称。
    在这里插入图片描述 图 3 图3 3

  • 缺乏可靠 LQE 的明确指导
    许多先前的作品探索了LQE。 例如,YOLO家族首先采用Objectness来描述定位质量,其定义为预测框和真实框之间的交并集(IoU)。 此后,IoU在IoU-Net、IoU-aware、PAA、GFL和VFNet中被进一步探索并证明是有效的。 最近,FCOS和ATSS引入了Centerness,即到物体中心的距离程度,以抑制低质量的检测结果。 一般来说,上述方法都有一个共同的特点,即它们都是基于普通的卷积特征,例如点、边界或区域的特征(见图4a、4b、4c、4d、4e、4f和4g)来估计定位质量。 不幸的是,这些抽象的卷积特征无法具有推断 LQE scores的明确含义,而只是由定位质量信号隐式监督,从而使其可靠 LQE 的效率较低。
    在这里插入图片描述
    图 4 图4 4

论文解决方案(因为yolov8中使用了DFL,会结合介绍一下)

Improved Representations

  • For object classification representation,我们建议将其与 LQE 分数合并为单个统一的表示:
    Classification -> Classification-IoU Joint Representation
    下面的 J \mathbf{J} J就是预测框标签的分类分数, y \mathbf{y} y就是真实框标签的分类分数
    为了解决上述训练和测试阶段之间的不一致问题,我们提出了联合表示 J = [ J 1 , J 2 , … , J m ] \mathbf{J}=[J_1,J_2,\ldots,J_m] J=[J1,J2,,Jm](m 表示类别总数)的定位质量(即 IoU 分数)和分类分数(称为“Classification-IoU Joint Representation”),其supervision软化了标准的one-hot类别标签,并且导致可能的浮点向量 y = [ y 1 , y 2 , … , y m ] \mathbf{y}=[y_1,y_2,\ldots,y_m] y=[y1,y2,,ym]。 给定一个对象类别标签 c ∈ { 1 , 2 , … , m } c\in\{1,2,\ldots,m\} c{ 1,2,,m}, y 满足
    y i = { I o U ( B p r e d , B g t ) , if  i = c ; 0 , otherwise , \left.y_i=\left\{\begin{array}{ll}\mathrm{IoU}(B_{pred},B_{gt}),&\text{if }i=c;\\0,&\text{otherwise},\end{array}\right.\right. yi={ IoU(Bpred,Bgt),0,if i=c;otherwise,其中 I o U ( B p r e d , B g t ) \mathrm{IoU}(B_{pred},B_{gt}) IoU(Bpred,Bgt)表示预测边界框 B p r e d B_{pred} Bpred和真实框 B g t B_{gt} Bgt之间的 IoU。 具体来说, y = 0 y=0 y=0表示负样本的质量分数为0, 0 < y ≤ 1 0<y\leq1 0<y1表示正样本的质量分数为IoU分数 y y y。(原先的真实标签的分类分数一般是{0, 1}, 现在将正样本的对应的真实标签的分类分数变为 I o U ( B p r e d , B g t ) \mathrm{IoU}(B_{pred},B_{gt}) IoU(Bpred,Bgt),负样本的对应的真实标签的分类分数变为0。这个yolov8介绍的跟这个差不多,yolov8中的在经过TAA正负样本标签分配后,原始的target_scores正样本的真实标签的分类分数乘以weights,负样本的真实标签的分类分数是0(可以见yolov8下面截取代码)) 。对于多类别,作者采用带有 sigmoid 运算符 σ ( ⋅ ) \sigma(\cdot) σ()的多重二元分类。 为了简单起见,将 sigmoid 的输出标记为 σ \sigma σ。 请注意,如图1b所示,训练时,J 受到质量焦点损失(QFL)的监督,推理时,直接作为NMS 分数,这大大减少了训练和推理之间的 LQE 和对象分类的不一致。

    # Normalize
    # 设定一个动态权重,更加关注那些与真实目标对齐良好且重叠程度较高的预测框
    # 这个动态权重由overlaps和align_metric决定,那些align_metric和overlaps小的预测框,它们对应的target_scores也小
    # 这样求解bce_loss(分类损失)的时候相对来说会变小,这样模型在训练过程中就不会过多关注那些align_metric和overlaps小的预测框了
    # 注意align_metric是跟预测分类分数和ciou都有关,这样模型在预测的时候,分类分数和iou会保持一致性,尽可能的不会存在分类分数低,而iou高的情况。
    align_metric *= mask_pos
    pos_align_metrics = align_metric.amax(axis=-1, keepdim=True)  # b, max_num_obj
    pos_overlaps = (overlaps * mask_pos).amax(axis=-1, keepdim=True)  # b, max_num_obj
    norm_align_metric = (align_metric * pos_overlaps / (pos_align_metrics + self.eps)).amax(-2).unsqueeze(-1)
    target_scores = target_scores * norm_align_metric
    
  • For bounding box representation,我们建议通过直接学习连续空间上的离散概率分布来表示框位置的任意分布(在本文中表示为“一般分布”),而不引入任何其他更强的先验(例如,高斯):学习到的任意分布提供了对真实数据本质的复杂性进行建模的灵活性,不仅可以预测精确的边界框回归,还可以反映信息丰富的潜在不确定性估计
    Dirac delta -> General Distribution Representation
    作者采用该位置(在yolov8中是anchor points)到边界框四个边的相对偏移量(anchor points到bbox的距离)作为回归目标。 边界框回归的传统操作将回归标签 y y y建模为 δ ( x − y ) \delta(x-y) δ(xy)狄拉克分布,其中满足 ∫ − ∞ + ∞ δ ( x − y ) d x = 1 \int_{-\infty}^{+\infty}\delta(x-y)\mathrm{d}x=1 +δ(xy)dx=1,并且通常通过全连接层实现。更正式地说,恢复 y y y 的积分形式如下(不好意思,高数还给老师了,忘记怎么推的):
    y = ∫ − ∞ + ∞ δ ( x − y ) x d x y=\int_{-\infty}^{+\infty}\delta(x-y)x\mathrm{d}x y=+δ(xy)xdx作者提出直接学习没有先验知识的基础一般分布 P ( x ) P(x) P(x)。给定标签 y y y 的范围,其中最小 y 0 y_0 y0 和最大 y n y_n yn ( y 0 ≤ y ≤ y n , n ∈ N + ) (y_0\leq y\leq y_n,n\in\mathbb{N}^+) (y0yyn,nN+),我们可以通过下面的计算公式从模型( y ^ \hat{y} y^也满足 y 0 ≤ y ^ ≤ y n y_0\leq \hat{y}\leq y_n y0y^yn)中获得估计值 y ^ \hat{y} y^。(这个 P ( x ) P(x) P(x)就是 y 0 y_0 y0~ y n y_n yn之间的概率分布)。
    y ^ = ∫ − ∞ + ∞ P ( x ) x d x = ∫ y 0 y n P ( x ) x d x . \hat{y}=\int_{-\infty}^{+\infty}P(x)x\mathrm{d}x=\int_{y_0}^{y_n}P(x)x\mathrm{d}x. y^=+P(x)xdx=y0y<

<think>好的,我现在需要回答用户关于Distribution Focal Loss(DFL)函数的概念、介绍、使用方法以及示例的问题。首先,我需要回顾一下DFL的背景和应用场景。根据提供的引用资料,DFL出自NeurIPS2020的Generalized Focal Loss论文,主要用于密集目标检测中的边界框回归问题。 首先,概念部分。用户可能想知道DFL的基本思想是什么。根据引用[3],DFL将边界框坐标视为概率分布,通过最小化预测分布和真实分布之间的差异来优化模型。这和传统的回归方法不同,传统方法可能直接预测坐标值,而DFL则是预测一个分布,从而得到更准确的定位。 接下来是介绍部分。需要说明DFL与传统损失函数的区别,例如L1或L2损失。DFL属于Focal Loss的扩展,旨在解决类别不平衡问题,同时处理定位任务。引用[1]提到Generalized Focal Loss结合了分类和定位的改进,而DFL是其中的一部分,专注于边界框的分布学习。 然后是使用方法。这部分需要解释DFL在模型中的具体应用步骤。例如,在目标检测模型中,如何将边界框坐标建模为分布,如何计算损失。根据引用[3],DFL将坐标视为离散的概率分布,模型预测每个可能位置的概率,然后通过计算交叉熵或其他分布差异指标来优化。 示例部分可能需要给出伪代码或者代码片段,但用户提到参考YOLOv8中结合CIOU和DFL的代码。根据引用[2],在损失函数计算时,会分别调用CIOU损失和DFL损失,并将结果相加。因此,示例可以展示如何在一个损失函数中结合这两种损失。 同时,需要注意用户提供的格式要求:行内公式用$...$,独立公式用$$...$$,使用中文回答,生成相关问题。还要确保引用正确,比如在相关部分添加[^1]、[^3]等。 需要验证DFL的数学公式是否正确。根据论文,DFL的公式可能涉及预测分布和真实分布之间的交叉熵,或者类似Focal Loss的调整。假设引用[3]提到的公式是正确的,需要正确呈现。 可能遇到的问题包括如何将连续坐标转化为离散分布,以及如何处理分布之间的差异。这部分需要明确说明,例如使用积分或离散化的方法,将真实坐标转化为目标分布,然后计算损失。 最后,生成的相关问题需要与DFL相关,例如它的优势、实现细节或与其他损失函数的对比。确保问题具有针对性,帮助用户深入理解。 总结回答的结构:概念、核心思想、使用方法、示例代码(伪代码或简要说明)、相关引用,最后生成问题。需要检查LaTeX语法是否正确,如分布公式是否正确使用$$...$$,变量是否用斜体等。</think>### Distribution Focal Loss(DFL)函数详解 #### 1. **概念与核心思想** Distribution Focal Loss(DFL)是一种用于目标检测任务的损失函数,属于Generalized Focal Loss(GFL)框架的一部分[^1]。其核心思想是将边界框坐标(如中心点、宽度、高度)的回归问题转化为**概率分布学习问题**。 - 传统方法直接回归坐标值(如L1/L2损失),而DFL将坐标建模为**离散概率分布**,预测每个可能位置的概率值,并通过最小化预测分布与真实分布之间的差异来优化模型[^3]。 - 这种分布学习方式能更好地捕捉边界框的不确定性,提升检测精度,尤其在密集目标场景中效果显著。 #### 2. **数学公式** DFL的公式定义如下: $$ \text{DFL}(p_l, p_r) = -\left( (y_{r+1} - y) \log(p_l) + (y - y_l) \log(p_r) \right) $$ 其中: - $y$ 是真实的坐标值(连续值), - $y_l$ 和 $y_{r+1}$ 是离$y$最近的两个离散化锚点(如$y_l = \lfloor y \rfloor$, $y_{r+1} = \lceil y \rceil$), - $p_l$ 和 $p_r$ 是模型预测的$y_l$和$y_{r+1}$对应的概率值。 #### 3. **使用方法** DFL通常与定位损失(如CIoU Loss)结合使用,具体步骤如下: 1. **离散化坐标**:将连续坐标空间划分为离散区间(例如,对特征图上的每个位置生成$n$个锚点)。 2. **预测分布**:模型输出每个锚点的概率值,形成概率分布。 3. **计算损失**: - 使用DFL计算预测分布与真实分布的差异。 - 结合其他损失(如分类损失、CIoU损失)进行联合优化。 **代码示例(伪代码)**: ```python def distribution_focal_loss(pred_dist, target): # pred_dist: [batch, n_anchors, 4, n_classes] # target: [batch, n_anchors, 4](真实坐标) left = torch.floor(target).long() right = left + 1 weight_right = target - left weight_left = 1 - weight_right # 提取左右锚点的预测概率 prob_left = pred_dist[..., left] prob_right = pred_dist[..., right] # DFL公式计算 loss = - (weight_left * torch.log(prob_left + 1e-6) + weight_right * torch.log(prob_right + 1e-6)) return loss.mean() # 实际使用中,DFL与CIoU Loss结合 total_loss = dfl_loss + 0.25 * ciou_loss # 加权系数根据任务调整[^2] ``` #### 4. **优势与场景** - **优势**: - 解决边界框回归的模糊性问题,提升定位精度。 - 对遮挡、密集小目标等复杂场景更鲁棒。 - **应用场景**: - 密集目标检测(如YOLOv8、FCOS等模型)。 - 需要高精度定位的任务(如自动驾驶、医学图像分析)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值