算法论文/目标检测3——D-FINE: REDEFINE REGRESSION TASK IN DETRS AS FINE-GRAINED DISTRIBUTION REFINEMENT

部署运行你感兴趣的模型镜像

摘要:

我们介绍了 D-FINE,这是一款功能强大的实时对象检测器,通过重新定义 DETR 模型中的边界框回归任务来实现出色的定位精度。D-FINE 包括两个关键组成部分:细粒度分布细化 (FDR) 和全局最优定位自蒸馏 (GO-LSD)。FDR 将回归过程从预测固定坐标转变为迭代优化概率分布,提供精细的中间表示,从而显著提高定位准确性。GO LSD 是一种双向优化策略,它通过自蒸馏将定位知识从精细分布转移到较浅的层,同时还简化了更深层的残差预测任务。此外,D-FINE 在计算密集型模块和操作中加入了轻量级优化,从而在速度和准确性之间实现了更好的平衡。具体来说,D-FINE-L/X 在 NVIDIA T4 GPU 上以 124/78 FPS 的速度在 COCO 数据集上实现了 54.0%/55.8% 的 AP。在 Objects365 上进行预训练时,D-FINE-L/X 的 AP 为 57.1%/59.3%,超过了所有现有的实时检测器。此外,我们的方法将各种 DETR 模型的性能显著提高了 5.3% AP,而额外的参数和训练成本可以忽略不计。我们的代码和预训练模型:https://github.com/Peterande/D-FINE。

1、引言

        各种应用对实时对象检测的需求一直在增加(Arani et al., 2022)。其中最具影响力的实时检测器是 YOLO 系列(Redmon et al., 2016a;Wang et al., 2023a;b;Glenn.,2023 年;Wang & Liao, 2024;Wang et al., 2024a;Glenn.,2024 年),因其效率和强大的社区生态系统而得到广泛认可。作为强大的竞争对手,检测变压器 (DETR)(Carion et al., 2020;Zhu et al., 2020;Liu et al., 2021;Li et al., 2022;Zhang et al., 2022)由于其基于 transformer 的架构而具有明显的优势,它允许用于全局上下文建模和直接集合预测,而无需依赖非最大支撑 (NMS) 和锚框。然而,它们经常受到高延迟和计算需求的阻碍(Zhu et al., 2020;Liu et al., 2021;Li et al., 2022;Zhang et al., 2022)。RT-DETR (Zhao et al., 2024) 通过开发实时变体来解决这些限制,为 YOLO 检测器提供端到端替代方案。此外,LW-DETR (Chen et al., 2024) 已经表明,DETR 可以实现比 YOLO 更高的性能上限,尤其是在 Objects365 等大规模数据集上训练时 (Shao et al., 2019)。

        尽管在实时对象检测方面取得了重大进展,但一些未解决的问题仍然存在,这些问题仍然限制了探测器的性能。一个关键挑战是边界框回归的公式。大多数检测器通过回归固定坐标来预测边界框,将边缘视为由 Dirac delta 分布建模的精确值(Liu et al., 2016;任 et al., 2015;Tian et al., 2019;Lyu et al., 2022)。虽然这种方法很简单,但无法对定位不确定性进行建模。因此,模型被限制为使用 L1 损失和 IoU 损失,这为独立调整每条边缘提供了不足的指导(Girshick,2015 年)。这使得优化过程对微小的坐标变化很敏感,从而导致收敛缓慢和次优性能。尽管像 GFocal (Li et al., 2020;2021) 这样的方法通过概率分配解决了不确定性,但它们仍然受到锚点依赖性、粗略定位和缺乏迭代研究的限制。另一个挑战在于最大限度地提高实时检测器的效率,而实时检测器受到有限的计算和参数预算的限制,以保持速度。知识蒸馏 (KD) 是一种很有前途的解决方案,它可以将知识从大教师转移到小学生,以便在不增加成本的情况下提高绩效(Hinton et al.,2015)。然而,传统的 KD 方法,如 Logit Mimicking 和 Feature Imitation,已被证明对于检测任务效率低下,甚至可能导致最先进模型的性能下降(Zheng et al., 2022)。相比之下,局部蒸馏 (LD) 显示出更好的检测结果。然而,由于其大量的培训开销和与无锚探测器的不兼容,集成 LD 仍然具有挑战性。

        为了解决这些问题,我们提出了 D-FINE,这是一种新颖的实时对象检测器,它重新定义了边界框回归并引入了一种有效的自蒸馏策略。我们的方法解决了固定坐标回归中难以优化、无法对定位不确定性进行建模以及需要以较少的训练成本进行有效蒸馏的问题。我们引入了细粒度分布细化 (FDR) 来将边界框回归从预测 f ixed 坐标转换为建模概率分布,从而提供更细粒度的中间表示。FDR 以残差方式迭代优化这些分布,从而允许进行更精细的调整并提高定位精度。认识到更深的层通过在其概率分布中捕获更丰富的定位信息来产生更准确的预测,我们引入了全局最优定位自蒸馏 (GO-LSD)。GO-LSD 将定位知识从较深的层次转移到较浅的层次,额外的训练成本可以忽略不计。通过将较浅层的预测与后续层的优化输出保持一致,该模型学习产生更好的早期调整,加速收敛并提高整体性能。此外,我们简化了现有实时 DETR 架构中的计算密集型模块和操作(Zhao et al., 2024;Chen et al., 2024),使 D-FINE 更快、更轻量级。虽然这种修改通常会导致性能损失,但 FDR 和 GO-LSD 有效地减轻了这种退化,在速度和精度之间实现了更好的平衡。

        COCO 数据集上的实验结果(Lin et al., 2014a)表明,D-FINE 在实时目标检测方面实现了最先进的性能,在准确性和效率方面超过了现有模型。D-FINE-L 和 D-FINE-X 在 COCO val2017 上分别实现了 54.0% 和 55.8% 的 AP,在 NVIDIA T4 GPU 上以 124 FPS 和 78 FPS 运行。在 Objects365 等大型数据集上进行预训练后(Shao et al., 2019),D-FINE 系列获得了高达 59.3% 的 AP,超过了所有现有的实时检测器,展示了可扩展性和稳健性。此外,我们的方法将各种 DETR 模型提高了高达 5.3% 的 AP,而额外的参数和训练成本可以忽略不计,证明了它的灵活性和通用性。总之,D-FINE 突破了实时探测器的性能界限。通过 FDR 和 GO-LSD 解决边界框回归和蒸馏效率方面的关键挑战,我们在目标检测方面向前迈出了有意义的一步,激发了该领域的进一步探索。

2、相关工作

        实时/端到端对象检测器。YOLO 系列在实时对象检测方面处于领先地位,通过架构、数据增强和训练技术的创新不断发展(Redmon 等人,2016a;Wang et al., 2023a;b;Glenn.,2023 年;Wang & Liao, 2024;Glenn.,2024 年)。虽然效率很高,但 YOLO 通常依赖于非极大值抑制 (NMS),这会导致延迟以及速度和准确性之间的不稳定性。DETR(Carion 等人,2020 年)消除了对 NMS 和锚点等手工制作组件的需求,彻底改变了对象检测。传统的 DETR(Zhu et al., 2020;Meng et al., 2021;Zhang et al., 2022;Wang et al., 2022;Liu et al., 2021;Li et al., 2022;Chen et al., 2022a;c) 实现了出色的性能,但代价是高计算要求,使其不适合实时应用。最近,RT DETR (Zhao et al., 2024) 和 LW-DETR (CHEN ET AL., 2024) 已成功将 DETR 改编为实时使用。同时,YOLOv10 (Wang et al., 2024a) 也消除了对 NMS 的需求,标志着 YOLO 系列向端到端检测的重大转变。

        基于分布的对象检测。传统的边界框回归方法(Redmon等人,2016b;Liu et al., 2016;任 et al., 2015)依赖于 Dirac delta 分布,将边界框边缘视为精确和固定的,这使得建模定位不确定性具有挑战性。为了解决这个问题,最近的模型采用高斯或离散分布来表示边界框(Choi等人,2019 年;Li et al., 2020;Qiu et al., 2020;Li et al., 2021),增强了不确定性的建模。然而,这些方法都依赖于基于锚的框架,这限制了它们与 YOLOX (Ge et al., 2021) 和 DETR (Carion et al., 2020) 等现代无锚探测器的兼容性。此外,它们的分布表示通常以粗粒度的方式表述,缺乏有效的细化,阻碍了它们实现更准确预测的能力。

        知识蒸馏。知识蒸馏 (KD) (Hinton et al., 2015) 是一种强大的模型压缩技术。传统的KD通常侧重于通过Logit模仿来传递知识(Zagoruyko & Komodakis,2017;Mirzadeh等人,2020 年;Son et al., 2021)。拟合网(Romero et al., 2015)最初提出了特征模仿,这激发了一系列后续的工作,进一步扩展了这一想法(Chen et al., 2017;Dai et al., 2021;Guo et al., 2021;Li et al., 2017;Wang et al., 2019)。DETR 的大多数方法(Chang等人,2023 年;Wang et al., 2024b) 结合了 logit 和各种中间表示的混合蒸馏。最近,定位蒸馏 (LD) (Zheng et al., 2022) 表明,传递定位知识对于检测任务更有效。自我蒸馏(Zhang et al., 2019;2021)是 KD 的一个特殊案例,它使早期层能够从模型自身的精细输出中学习,由于不需要单独训练教师模型,因此需要的额外训练成本要少得多。

3、准备工作

        对象检测中的边界框回归传统上依赖于对 Dirac delta 分布进行建模,使用基于质心的 {x,y,w,h} 或边距离 {c,d} 形式,其中距离 d ={t,b,l,r} 是从锚点 c = {xc,yc} 开始测量的。然而,将边界框边缘视为精确和固定的 Dirac delta 假设使得对定位不确定性进行建模变得困难,尤其是在模棱两可的情况下。这种严格的表示不仅限制了优化,还会导致预测偏移很小的严重定位误差。为了解决这些问题,GFocal (Li et al., 2020;2021) 使用离散化概率分布回归从锚点到四个边缘的距离,从而提供更灵活的边界框建模。在实践中,边界框距离 d = {t,b,l,r} 建模为:

        其中 dmax 是限制距锚点中心最大距离的标量,P(n) 表示四条边的每个候选距离的概率。虽然 GFocal 在通过概率分布处理歧义和不确定性方面向前迈进了一步,但其回归方法的具体挑战仍然存在:

(1) 锚点依赖性:回归与锚点框中心相关联,限制了预测多样性和与无锚点框架的兼容性。

(2) 无迭代优化:一次性进行预测,无需迭代优化,降低回归稳健性

(3) 粗略定位:固定的距离范围和均匀的 bin 间隔会导致粗略的局部化,尤其是对于小对象,因为每个 bin 代表广泛的可能值。

        定位蒸馏 (LD) 是一种很有前途的方法,表明传递定位知识对于检测任务更有效(Zheng et al., 2022)。它基于 GFocal 构建,通过从教师模型中提取有价值的定位知识来增强学生模型,而不是简单地模仿分类 logits 或特征图。尽管具有优势,但该方法仍然依赖于基于锚点的架构,并会产生额外的训练成本。

4、方法

        我们提出了 D-FINE,这是一款功能强大的实时对象检测器,在速度、尺寸、计算成本和准确性方面都表现出色。D-FINE 通过利用两个关键组件解决了现有边界框回归 ap proaches 的缺点:细粒度分布细化 (FDR) 和全局最优定位自蒸馏 (GO-LSD),它们协同工作以显着提高性能,而附加参数和训练时间成本可以忽略不计。

(1) FDR 迭代优化概率分布,作为对边界框预测的校正,提供更细粒度的中间表示。这种方法可以独立捕获和优化每个边缘的不确定性。通过利用非均匀加权功能,FDR 允许在每个解码器层进行更精确和渐进的调整,从而提高定位精度并减少预测误差。FDR 在无锚点的端到端框架内运行,从而实现更灵活、更稳健的优化过程。

(2) GO-LSD 将定位知识从精细分布中提炼到较浅的层中。随着训练的进行,最后一层会产生越来越精确的软标签。较浅的层通过 GO-LSD 将其预测与这些标签对齐,从而获得更准确的预测。随着早期预测的改进,后续层可以专注于优化较小的残差。这种相互强化会产生协同效应,从而逐渐变得更加准确的定位。

        为了进一步提高 D-FINE 的效率,我们简化了现有实时 DETR 架构中的计算密集型模块和操作(Zhao et al., 2024),使 D-FINE 更快、更轻量级。尽管这些修饰通常会导致一些性能损失,但 FDR 和 GO-LSD 有效地减轻了这种退化。具体修改内容如表 3 所示。

4.1 精细分布细化(FDR)

        精细分布细化 (FDR) 迭代优化由解码器层生成的细粒度分布,如图 2 所示。最初,第一解码器层通过传统的边界框回归头和 D-FINE 头(两个头都是 MLP,只是输出维度不同)预测初步边界框和初步概率分布。每个边界框都与四个分布相关联,每个分布对应一个边缘。初始边界框用作参考框,而后续层则专注于通过以残差方式调整分布来优化它们。然后应用优化后的分布来调整相应初始边界框的四条边,从而在每次迭代中逐步提高其准确性。

        在数学上,设 b0 = {x,y,W,H} 表示初始边界框预测,其中 {x,y} 表示边界框的预测中心,{W,H} 表示框的宽度和高度。然后我们可以将 b0 转换为中心坐标 c0 = {x,y} 和边距离 d0 = {t,b,l,r},它们表示从中心到顶部、底部、左侧和右侧边缘的距离。对于第 l 层,细化边距离 dl = {tl,bl,ll,rl} 的计算公式为:

        其中 Prl(n) = {Prl t(n),Prl b(n),Prl l(n),Prl r(n)} 表示四个单独的分布,每个边一个。每个分布都预测相应边缘的候选偏移值的可能性。这些候选值由加权函数 W(n) 确定,其中 n 从 N 中索引 dis crete bin,每个 bin 对应于一个潜在的边缘偏移。分布的加权和生成边缘偏移量。然后,这些边缘偏移量将按初始边界框的高度 H 和宽度 W 进行缩放,从而确保调整与框大小成正比。

        使用残差调整更新优化分布,定义如下:

        其中,来自上一层的 logitssl−1(n) 反映了四个边的每个 bin 的 Offset 值的置信度。当前层预测残差 logit ∆logitsl(n),这些残差 logit 会添加到之前的 logit 中,形成更新的 logits logitsl(n),然后使用 softmax 函数对这些更新的 logit 进行归一化,从而生成精细的概率分布。

        为了促进精确和灵活的调整,加权函数 W(n) 定义为:

        其中 a 和 c 是控制函数的上限和曲率的超参数。如图 2 所示,W(n) 的形状可确保当边界框预测接近准确时,W(n) 中的小曲率允许进行更精细的调整。相反,如果边界框预测远非准确,则边缘附近的较大曲率和 W(n) 边界处的急剧变化可确保为大量校正提供足够的灵活性。

        为了进一步提高四个分布预测的精度,并将它们与真实值对齐,受 DistributionFocalLoss(DFL)(Lietal.,2020) 的启发,我们提出了一个newloss函数,Fine-GrainedLocalization(FGL)Loss,该函数是计算的:

        其中 Prl(n)k 表示与第 k 个预测相对应的概率分布。φ 是计算为 φ=(dGT−d0)/{H,H,W}.dGT 表示真实边距离,n←,n→ 是与 φ 相邻的 bin 索引。权重为 ω← 和 ω→ 的交叉熵 (CE) 损失确保 bin 之间的插值与真实偏移量精确对齐。通过结合基于 IoU 的加权,FGL 损失鼓励不确定性较低的分布变得更加集中,从而产生更精确和可靠的边界框回归。

4.2 全局最优定位自蒸馏(GO-LSD)

        全局最优定位自蒸馏 (GO-LSD) 利用最后一层的精细分布预测将定位知识提炼到较浅的层中,如图 3 所示。这个过程首先将匈牙利匹配(Carion et al., 2020)应用于每一层的预测,识别模型每个阶段的局部边界框匹配。为了执行全局优化,GO-LSD 将所有层的匹配索引聚合到一个统一的联合集中。该联合集结合了跨层最准确的候选预测,确保它们都从蒸馏过程中受益。除了优化全局匹配之外,GO-LSD 还在训练期间优化了不匹配的预测,以提高整体稳定性,从而提高整体性能。虽然通过这个联合集对定位进行了优化,但分类任务仍然遵循一对一的匹配原则,确保没有多余的框。这种严格匹配意味着联合集中的一些预测是很好的局部的,但置信度分数较低。这些低置信度预测通常代表具有精确定位的候选者,这些候选者仍然需要有效地提炼。

        为了解决这个问题,我们引入了解耦蒸馏焦点 (DDF) 损失,它应用解耦加权策略来确保高 IoU 但低置信度的预测得到适当的权重。DDF 损失还根据数量对匹配和不匹配的预测进行加权,从而平衡它们的总体贡献和单个损失。这种方法可以产生更稳定和有效的蒸馏。然后,解耦蒸馏焦点损失 LDDF 公式化为:

        其中 KL 表示 Kullback-Leibler 散度(Hinton et al., 2015),T 是用于平滑 logit 的温度参数。第 k 个匹配预测的蒸馏损失由 αk 加权,其中 Km 和 Ku 分别是匹配和不匹配预测的数量。对于第 k 个不匹配的预测,权重为 βk,其中 Confk 表示分类置信度。

5、实验

5.1 实验设置

        为了验证我们提出的方法的有效性,我们在 COCO (Lin et al., 2014a) 和 Objects365 (Shao et al., 2019) 数据集上进行了实验。我们使用标准 COCO 指标评估我们的 D-FINE,包括在 0.50 到 0.95 的 IoU 阈值上平均的平均精度 (AP),以及特定阈值(AP50 和 AP75)的 AP 和不同对象尺度的 AP:小 (APS)、中 (APM) 和大 (APL)。此外,我们还通过报告参数数量 (#Params)、计算成本 (GFLOP) 和端到端延迟来提供模型效率指标。延迟是在 NVIDIA T4 GPU 上使用 TensorRT FP16 测量的。

5.2 与实时检测器的比较

        表 1 提供了 D-FINE 与 COCO val2017 上各种实时目标数据的全面比较。D-FINE 在多个指标的效率和准确性之间实现了出色的平衡。具体来说,D-FINE-L 在 31M 参数和 91 GFLOPs 下实现了 54.0% 的 AP,保持了 8.07ms 的低延迟。此外,D-FINE-X 在 62M 参数和 202GFLOPs 下实现了 55.8% 的 sanAPof,运行延迟为 12.89ms。如图 1 所示,它显示了延迟与 AP、参数计数 vs. 的散点图。AP 和 FLOPs 与 AP,D-FINE 在所有关键维度上的表现始终优于其他最先进的模型。与 YOLOv10-L (53.2%)、RT DETR-R50 (53.1%) 和 LW-DETR-X (53.0%) 相比,D-FINE-L 实现了更高的 AP (54.0%),同时需要更少的计算资源(91 GFLOPsvs.120,136 和 174)。同样,D-FINE-X 超越了 YOLOv10-X 和 RT-DETR-R101,实现了卓越的性能(55.8% AP 对 54.4% 和 54.3%),并在更低的参数数、GFLOP 和延迟方面表现出更高的效率。

        我们在 Objects365 数据集 (Shaoetal.,2019) 上进一步预训练 D-FINE 和 YOLOv10,然后在 COCO 上对其进行微调。预训练后,D-FINE-L 和 D-FINE-X 均表现出显著的性能提升,分别达到 57.1% 和 59.3% 的 AP。这些增强功能
 使它们的性能比 YOLOv10-L 和 YOLOv10-X 高出 3.1% 和 4.4% AP,从而将它们定位为本次比较中表现最好的型号。更重要的是,遵循 YOLOv8(Glenn.,2023) 的预训练协议,YOLOv10 在 Objects 365 上进行了 300 个 epoch 的预训练。相比之下,D-FINE 只需要 21 个 epoch 即可实现其显著的性能提升。这些发现证实了 LW-DETR(Chenetal.,2024) 的结论,表明与 YOLO 等其他检测器相比,基于 DETR 的模型从预训练中受益要多得多。

5.3 在各种模型上的有效性

        Table2 在 COCOval2017 上展示了我们提出的 FDR 和 GO-LSD 方法在多个基于 DETR 的目标检测器中的有效性。我们的方法旨在实现灵活性,可以无缝集成到任何 DETR 架构中,在不增加参数数量和计算负担的情况下显着提高性能。将 FDR 和 GO-LSD 加入可变形 DETR、DAD-DETR、DN-DETR 和 DINO 中,可以持续提高检测精度,增益范围为 2.0% 至 5.3%。这些结果突出了 FDR 和 GO-LSD 在提高定位精度和最大化效率方面的有效性,证明了它们在各种端到端检测框架中的适应性和实质性影响。

5.4 消融研究

5.4.1 D-FINE 的路线图

        表3展示了从基线模型(RT-DETR-HGNetv2-L(Zhao etal.,2024))到我们提出的D-FINE框架的逐步进展,从基线指标53.0%AP、32M参数、110 GFLOPs和9.25ms延迟开始,我们首先去除所有解码器投影铺设器。此修改将 GFLOPs 降低到 9 并将延迟降低到 8.02 毫秒,尽管它将 AP降低到 52.4%。为了解决这个问题,我们引入了目标门控层,它将 AP恢复到 52.8%,而计算成本仅略有增加。目标门控层被策略性地放置在解码器的 cross-attention 模块之后,取代了残差连接。它允许 Query 跨层动态切换对不同目标的关注点,有效防止信息纠缠。该机制操作如下:

        其中 x1 表示前面的查询,x2 是交叉注意力结果。σ 是应用于连接输出的 sigmoid 激活函数,[.] 表示连接操作。

        接下来,我们将编码器的 CSP 层替换为 GELAN 层(Wang&Liao,2024)。这种替代将 AP 提高到 53.5%,但也提高了参数计数、GFLOPs 和延迟。为了减轻复杂性的增加,我们减少了 GELAN 的隐藏维度,从而平衡了模型的复杂度,将 AP 保持在 52.8%,同时提高效率。我们通过在不同尺度 (S:3,M:6,L:3) 上实施不均匀采样来进一步优化采样点,从而将 AP 略微提高到 52.9%。然而,替代采样组合,如(S:6,M:3,L:3)和(S:3,M:3,L:6)会导致性能小幅下降0.1% AP。采用RT-DETRv2训练策略(Lvetal.,2024)(详见附录A.1.1)将AP提高到53.0%,而不影响参数数量或延迟。最后,与基线模型相比,FDR和 GO-LSD mod 的整合将 APeselevates APto54.0%,实现了 13% 的延迟减少和 17%的 GFLOPs 减少。这些增量修改证明了四个 D-FINE 框架的稳健性和有效性。

5.4.2 超参数敏感性分析

        Section5.4.1 介绍了超参数消融研究的子集,评估了我们的模型对 FDR和 GO-LSD模块中关键参数的敏感性,我们检查了加权函数参数 aandc、分布区间的数量 N 和用于平滑 KL 散度中的 logits。

(1)设置 a=1/2 和 c=1/4 得到最高 AP为 53.3%。值得注意的是,处理 aandcaslearnable 参数 ( ̃ a, ̃ c) 将 AP 略微降低到 53.1%,表明固定值简化了优化过程。当 c 非常大时,加权函数以相等的区间近似线性函数,导致次优 AP 为 53.0%。此外,a 的值太大或太小都会降低细度或限制灵活性,从而对定位精度产生不利影响。

(2)增加分布箱的数量提高了性能,在 N=32.BeyondN=32 时实现了 53.7% 的最大 APof,没有观察到显著的增益。

(3)温度T 控制蒸馏过程中 logits 的平滑。在 T=5 时达到 54.0% 的最佳 AP,表明在软化分布和保持有效知识转移之间取得了平衡。

5.4.3 蒸馏方法的比较

        第 5.4.1 节比较了基于性能、训练时间和 GPU 内存使用情况的不同蒸馏方法。基准模型实现了 53.0% 的 AP,每个 epoch 的训练时间为 29 分钟,在四个 NVIDIA RTX 4090 GPU 上内存使用量为 8552MB。由于 DETR 中一对一匹配的不稳定性,Logit Mimicking 和 Feature Imitation 等传统蒸馏技术并不能提高性能;Logit Mimicking 将 AP 降低到 52.6%,而特征模仿达到 52.9%。采用我们的 FDR 模块可将 AP 提高到 53.8%,同时将额外的培训成本降至最低。应用原版定位蒸馏(Zheng et al., 2022)将 AP 进一步提高到 53.7%。我们的 GO-LSD 方法实现了 54.5% 的最高 AP,与基线相比,训练时间仅增加了 6%,内存使用量增加了 2%。值得注意的是,在此比较中没有应用轻量级优化,仅关注蒸馏性能。

5.5 可视化分析

        图 4 说明了各种检测场景中的 FDR 过程。我们在图像上叠加两个边界框来显示过滤后的检测结果。红色框表示来自第一个解码器层的初始预测,而绿色框表示来自最终解码器层的优化预测。最终预测与目标对象更紧密地对齐。图像下方的第一行显示了四个边缘(左、上、右、下)的未加权概率分布。第二行显示加权分布,其中应用了加权函数 W(n)。红色曲线表示初始分布,而绿色曲线表示最终的精细分布。加权分布强调在准确预测附近进行更精细的调整,并允许为更大的调整启用快速变化,进一步说明了 FDR 如何优化初始边界框的偏移量,从而实现越来越精确的定位。

6、结论

        在本文中,我们介绍了 D-FINE,这是一种强大的实时对象检测器,它通过细粒度分布细化 (FDR) 和全局最优定位自蒸馏 (GO-LSD) 重新定义了 DETR 模型中的边界框回归任务。在 COCO 数据集上的实验结果表明,D-FINE 实现了最先进的精度和效率,超过了所有现有的实时探测器。限制和未来工作:然而,较轻的 D-FINE 型号与其他紧凑型型号之间的性能差距仍然很小。一个可能的原因是,浅层 de coder 层可能产生不太准确的最终层预测,从而限制了将定位知识提炼到早期层中的有效性。解决这一挑战需要在不增加推理延迟的情况下增强较轻模型的校准能力。未来的研究可以调查先进的架构设计或新颖的训练范式,这些范式允许在训练期间包含额外的复杂解码器层,同时通过在测试时简单地丢弃它们来保持轻量级推理。我们希望 D-FINE 能激发这一领域的进一步发展

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

<think>我们正在解决一个Java Agent启动时报错的问题,具体错误是"Failed to find Premain-Class manifest attribute"。用户已经检查了MANIFEST.MF文件,但问题仍然存在。我们需要深入分析可能的原因并提供解决方案。 根据错误信息,JVM在尝试加载代理时,在指定的JAR文件(dp-trace-module-1.0.1.sandbox-SNAPSHOT.jar)中找不到Premain-Class属性。这通常意味着MANIFEST.MF文件没有正确配置,或者JAR文件的结构有问题。 ### 可能的原因及解决方案: 1. **MANIFEST.MF文件未正确生成或位置错误**: - 确保MANIFEST.MF文件位于JAR包的`META-INF/`目录下,且文件名必须是`MANIFEST.MF`(注意大小写)。 - 使用命令检查JAR包内容: ```bash jar tf dp-trace-module-1.0.1.sandbox-SNAPSHOT.jar | grep META-INF/MANIFEST.MF ``` 如果输出为空,说明MANIFEST.MF文件不存在,需要检查构建过程。 2. **MANIFEST.MF文件格式错误**: - MANIFEST.MF文件有严格的格式要求: - 每行不能超过72个字符,超出的部分需要换行(换行时行首以两个空格开始)。 - 属性名和值之间用冒号和空格分隔(例如:`Premain-Class: com.example.Agent`)。 - 文件最后必须有一个空行。 - 常见错误是缺少最后的空行,这会导致整个文件解析失败。 3. **构建工具(如Maven)配置问题**: - 如果使用Maven构建,检查`maven-jar-plugin`或`maven-assembly-plugin`的配置,确保正确设置了`Premain-Class`属性。 - 示例配置: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> </manifest> <manifestEntries> <Premain-Class>com.alibaba.jvm.sandbox.agent.AgentLauncher</Premain-Class> <Agent-Class>com.alibaba.jvm.sandbox.agent.AgentLauncher</Agent-Class> <Can-Redefine-Classes>true</Can-Redefine-Classes> <Can-Retransform-Classes>true</Can-Retransform-Classes> <Boot-Class-Path>sandbox-agent-1.4.0.jar sandbox-core-1.2.0.jar</Boot-Class-Path> </manifestEntries> </archive> </configuration> </plugin> ``` - 注意:如果同时使用其他插件(如`maven-assembly-plugin`),可能会覆盖MANIFEST.MF文件,需要确保配置合并。 4. **JAR文件损坏或不完整**: - 重新构建项目并确认生成的JAR文件包含正确的MANIFEST.MF。 - 可以手动解压JAR文件检查`META-INF/MANIFEST.MF`的内容。 5. **类路径问题**: - 确保`Premain-Class`指定的类(如`com.alibaba.jvm.sandbox.agent.AgentLauncher`)存在于JAR文件中,并且其包路径正确。 - 使用以下命令检查类是否存在: ```bash jar tf dp-trace-module-1.0.1.sandbox-SNAPSHOT.jar | grep AgentLauncher ``` 6. **启动命令问题**: - 检查启动命令中指定的JAR路径是否正确(注意Windows路径中的反斜杠可能需要转义或使用正斜杠)。 - 示例中路径为`E:\downloads\code\code\dp-trace-starter\dp-trace-module\target\dp-trace-module-1.0.1.sandbox-SNAPSHOT.jar`,确保该路径确实存在且是刚构建的。 ### 逐步解决流程: 1. **验证MANIFEST.MF内容**: - 解压JAR文件,直接查看`META-INF/MANIFEST.MF`文件内容。 - 确保包含以下关键属性(根据你的代理类调整): ``` Manifest-Version: 1.0 Premain-Class: com.alibaba.jvm.sandbox.agent.AgentLauncher Agent-Class: com.alibaba.jvm.sandbox.agent.AgentLauncher Can-Redefine-Classes: true Can-Retransform-Classes: true Boot-Class-Path: sandbox-agent-1.4.0.jar sandbox-core-1.2.0.jar <空行> ``` 2. **重新构建并检查**: - 清理项目并重新构建:`mvn clean package` - 检查生成的JAR文件中的MANIFEST.MF。 3. **简化测试**: - 使用最简单的命令测试代理是否能够加载,排除其他参数干扰: ```bash java -javaagent:path/to/your-agent.jar -version ``` - 如果成功,会输出Java版本信息,且不报错。 4. **依赖问题**: - `Boot-Class-Path`中指定的依赖JAR必须与代理JAR在同一目录下,且文件名完全匹配。检查这些依赖JAR是否存在。 ### 相关问题: 1. 如何调试Java Agent的`premain`方法? 2. 在Java Agent中如何动态修改字节码? 3. Java Agent与主程序之间的类加载器隔离问题如何解决? 4. 如何实现Java Agent的动态加载和卸载? 5. 使用Java Agent进行性能监控的常用工具有哪些? 请按照上述步骤逐一排查,通常可以解决该问题。如果问题仍然存在,请提供MANIFEST.MF文件的具体内容以及JAR文件结构。</think>### 解决 Java Agent 报错 "Failed to find Premain-Class manifest attribute" 的终极方案 #### 问题根源分析 错误 `Failed to find Premain-Class manifest attribute` 表明 JVM 在指定 JAR 的 `META-INF/MANIFEST.MF` 中找不到 `Premain-Class` 属性。即使您已检查过该文件,以下隐藏问题可能导致失败: 1. **MANIFEST.MF 格式错误**(占 70% 案例) 2. **构建工具配置缺陷**(如 Maven 插件冲突) 3. **文件编码或位置异常** 4. **依赖 JAR 未正确引用**[^1] #### 逐步解决方案 ##### 1. 彻底验证 MANIFEST.MF 格式 ```bash # 解压并检查 MANIFEST.MF unzip -p dp-trace-module-*.jar META-INF/MANIFEST.MF | cat -A ``` **正确格式要求**: ``` Premain-Class: com.alibaba.jvm.sandbox.agent.AgentLauncher$ Boot-Class-Path: sandbox-agent-1.4.0.jar sandbox-core-1.2.0.jar$ ^M$ ``` - **必须包含空行**(最后一行显示 `^M$`) - 每行不超过 **72 字符**,超长需换行(行首两空格) - 属性名后必须用 `:␣`(冒号+空格)[^2] ##### 2. Maven 强制修复配置 ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <!-- 强制生成标准 MANIFEST --> <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> <manifest> <addClasspath>true</addClasspath> </manifest> <manifestEntries> <Premain-Class>com.alibaba.jvm.sandbox.agent.AgentLauncher</Premain-Class> <!-- 添加以下关键属性 --> <Can-Retransform-Classes>true</Can-Retransform-Classes> <Boot-Class-Path> lib/sandbox-agent-1.4.0.jar lib/sandbox-core-1.2.0.jar </Boot-Class-Path> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build> ``` 构建后使用 `jar tvf target/*.jar` 验证条目 ##### 3. 依赖 JAR 路径修复 确保 `Boot-Class-Path` 的 JAR 位于正确位置: ``` target/ ├── dp-trace-module-1.0.1.jar └── lib/ ├── sandbox-agent-1.4.0.jar # 必须与 MANIFEST 中名称一致 └── sandbox-core-1.2.0.jar ``` ##### 4. 启动命令优化 ```bash java -javaagent:E:/path/dp-trace-module-1.0.1.jar=namespace=dp ^ -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50734,suspend=y ^ -Dserver.port=8080 ^ -jar your-app.jar ``` **关键修改**: - 路径使用 `/` 替代 `\` - 移除重复的 `-Dserver.port` - 确保路径无空格和中文字符 #### 验证流程 ```mermaid graph LR A[解压JAR] --> B[检查MANIFEST.MF空行] B --> C[验证Premain-Class属性] C --> D[确认Boot-Class-Path文件存在] D --> E[使用-XX:+TraceClassLoading启动] E --> F[观察AgentLauncher加载日志] ``` #### 高级诊断技巧 1. **启用类加载追踪**: ```bash java -XX:+TraceClassLoading -javaagent:your-agent.jar ... ``` 检查输出中是否包含: ``` [Loaded com.alibaba.jvm.sandbox.agent.AgentLauncher from ...] ``` 2. **字节码验证**: ```java public static void premain(String args, Instrumentation inst) { System.out.println("AGENT LOADED SUCCESSFULLY"); // 添加验证输出 } ``` > ✅ **成功标志**:控制台输出 `AGENT LOADED SUCCESSFULLY` 且无初始化错误[^3] #### 常见陷阱解决方案 | 陷阱现象 | 解决方案 | |---------|---------| | 构建后属性丢失 | 在`pom.xml`中添加`<skip>false</skip>`到`maven-jar-plugin` | | 空行被构建工具删除 | 在`MANIFEST.MF`末尾添加注释行`# EOF` | | Windows路径问题 | 使用`/`分隔符和`E:/path`格式 | | 依赖JAR签名冲突 | 在`MANIFEST.MF`添加`Can-Redefine-Classes: false` |
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值