MS-DETR: Efficient DETR Training with Mixed Supervision论文学习笔记

论文地址:https://arxiv.org/pdf/2401.03989.pdf

代码地址(中稿后开源):GitHub - Atten4Vis/MS-DETR: The official implementation for "MS-DETR: Efficient DETR Training with Mixed Supervision"

摘要 DETR 通过迭代生成多个基于图像特征的目标候选者,并为每个真实目标分配一个候选者,从而实现端到端的目标检测。在原始DETR中使用一对一监督的传统训练方法缺乏对检测候选者的直接监督。

作者旨在通过明确监督候选生成过程,将一对一监督和多对多监督混合,来提高DETR训练效率。MS-DETR简单地将多对多监督应用到用于推理的主要解码器(primary decoder)object query 上。与现有具有多对多监督的DETR变体(如Group DETR和Hybrid DETR)相比,MS-DETR不需要额外的解码器分支或object query ;MS-DETR中主要解码器object query 直接从多对多监督中受益,因此在目标候选预测方面优于其他方法。实验结果表明,MS-DETR优于相关DETR变体,如DN-DETR、Hybrid DETR和Group DETR,并且与相关DETR变体的结合进一步提高了性能。


简单总结:在不引入额外decoder分支和object query的情况下,由object query 同时产生一对一和一对多的预测。在传统DETR的基础上将SA和CA交换了次序,变成先做CA后做SA,并将CA后的query作为一对多的预测,对应下图(c),模型效果进一步提升。在无需额外decoder分支或object query的情况下即可超越DN/Group-DETR


1. Introduction

Detection Transformer(DETR),是一种端到端的目标检测方法,已经引起了大量的研究关注。它由一个卷积神经网络(CNN) Backbone ,一个Transformer编码器和解码器组成。解码器是一个解码器层堆栈,每个层都包括自注意、交叉注意和FFNs,然后是分类器和框预测器。

DETR解码器生成多个物体候选,这些候选以object query 的形式表示,以端到端的方式学习促使每一个候选接近GT,并抑制其他重复候选。这些重复候选,即接近真实目标,如图1所示。候选生成的主要作用由解码器交叉注意力承担。候选去重的主要作用由解码器自注意力和一对一监督共同承担,以确保每个真实物体选择一个单一的候选。与基于NMS的方法(如Faster R-CNN)通常为候选生成引入监督不同,DETR训练过程缺乏明确监督来生成多个目标检测候选。

作者提出了一种监督方式,即混合一对一监督和额外的多对多监督,来提高训练效率。该架构非常简单。作者在一个一对多监督中,添加了一个类似一对一监督中预测头的模块,包括一个框预测器和类别预测器。所得的方法名为MS-DETR,如图3所示。作者想要指出的是,额外的模块仅影响训练过程,而推理过程保持不变。

图1说明了额外的监督如何影响候选检测。作者观察到,没有一对多监督的DETR也会为每个真实目标生成多个候选。在添加额外的一对多监督后,作者可以看到预测的框更好,这意味着候选更好。作者观察到,当添加额外的一对多监督时,一对一分类和框回归损失会减小(如图2所示)。这提供了证据,即一对多监督能够改善候选,从而有助于优化一对一监督损失。

        MS-DETR通过引入额外的监督来收集图像特征信息,从而改善了object query 的质量。它不同于相关的高效训练方案,并对其进行了补充,如conditional DETR和Deformable DETR,它们修改了交叉注意力架构或改变了 Query 形式。MS-DETR与使用一对多监督的DETR变体不同。具体来说,MS-DETR直接将一对多监督施加在主要解码器object query上。相比之下,Group DETR和Hybrid DETR将监督施加在主要解码器以外的额外解码器中的 Query 。与密切相关方法的区别如图3所示。

        实验结果显示,MS-DETR在DETR基础方法上取得了一致的改进,包括修改了交叉注意力或 Query 形式的DETR变体(如Deformable DETR,DAB-DETR),以及其他训练高效的变体(如DN-DETR,Group DETR,Hybrid-DETR)。将MS-DETR与其他具有一对多监督的DETR变体(如Group DETR和Hybrid DETR)结合,可以进一步提高性能,表明MS-DETR可以补充这些变体。此外,作者观察到,由于MS-DETR不包括额外的解码器分支和object query ,因此具有更高的计算和内存效率。

2 Related Work

Decoder cross-attention and query formulation modification.交叉注意力在图像特征和当前object query之间执行交互,以细化以object query的形式表示的检测候选。

Deformable DETR 使用变形注意力,这是DCN的扩展,用于选择高度有用的区域,以替换原始的交叉注意力架构。Conditional DETR 将空间和内容 Query 分开,并计算空间注意力来软选择有用的区域。SMCA 使用高斯类似的权重进行空间注意力计算。DAB-DETR 和Conditional DETR v2 使用Box表示 Query 的位置。 Anchor DETR  使用 Anchor 框作为预定义的参考区域,以帮助检测不同大小的目标。

One-to-many supervision with parallel decoders.一对多监督将一个真实目标分配给多个object query ,以加快DETR训练。现有方法依赖于额外的并行权重共享解码器。

DN-DETR 引入了每个解码器处理一组由添加噪声的真实目标形成的噪声 Query 的并行权重共享解码器。Group DETR 则学习额外解码器的object query 。DN-DETR和Group DETR 对每个object query 组执行一对一监督,从而实现所有目标 Query 组的一对多监督。DINO 类似于DN-DETR,引入了对比去噪 Query 以实现组间一对一监督。DQS 在其独特的 Query 分支之外添加了一个并行密集 Query 分支,并将其与一对一监督的并行分支相结合。Hybrid DETR 添加了一个额外的并行解码器,其中可以直接对附加解码器进行一对多监督。

作者的方法MS-DETR与那些方法有关,因为MS-DETR也引入了一对多监督。MS-DETR明显与那些不修改原始(主要)解码器监督的方法不同。MS-DETR没有引入额外的解码器、额外的 Query ,并且仅在原始解码器上执行一对多监督。

DETA 直接在带有额外解码器和 Query 的同一解码器上执行一对多监督。不幸的是,它删除了一对一监督,并引入了NMS作为后处理。在单个解码器上混合一对一和一对多监督且不使用NMS的方法还没有得到充分探索。

One-to-many supervision in traditional methods.一对多分配在深度学习方法中广泛应用于目标检测。例如,Faster R-CNN 和 FCOS 通过为一个真实目标分配多个 Anchor 点和多个中心像素来构建目标函数,然后使用NMS后处理进行重复删除。

MS-DETR部分受到DETR与传统方法之间的相似之处的启发:DETR解码器通过交叉注意力与图像特征相互作用来寻找候选者,并通过自注意力和一对一监督来过滤重复候选者。后者部分类似于NMS后处理,而前者部分类似于大多数检测器。因此,作者将一对多监督引入DETR解码器以提高候选质量。

3. MS-DETR

3.1. Preliminaries

DETR architecture.DETR的初始架构包括一个卷积神经网络(CNN)、一个Transformer编码器、一个Transformer解码器以及目标类别和框位置预测器。

输入图像I经过编码器,获得图像特征。

可学习的object query Q和图像特征X被输入到解码器中,最终得到最终的object query 。

object query 通过预测器被解析为框和分类分数。 

为了简洁起见,作者使用下标11和1m分别表示一对一和一对多。

Decoder.Transformer解码器是一个解码器层的堆叠。有两个主要层:一个自注意层,为每个query收集其他query(候选)的信息,以删除重复的候选,一个交叉注意力层,用于从图像特征中以 Query 的形式收集目标候选者,然后进入一个FFN层,之后是框和分类预测器。

One-to-one supervision.原始的DETR使用一对一监督进行训练。一个候选预测对应一个真实目标,反之亦然。

其中\sigma (\cdot )是最优的N索引的排列,[\overline{y}_{1},\overline{y}_{2},...\overline{y}_{N}]=\widetilde{Y}对应真实值,并且y=[s^{T}b^{T}]^{T}。一对一损失函数的计算方式如下:

其中l_{c11}(\cdot )表示分类损失,l_{b11}(\cdot )表示框回归损失。

一对一监督有助于抑制重复候选者并促使每个真实目标只有一个候选者,通过自注意力从其他候选者收集信息,并将每个候选者与所收集的信息进行比较。一对一监督和自注意力共同作用,在object query 之间进行交互,通常起着传统目标检测方法中使用的NMS的作用。

3.2. Mixed Supervision

One-to-many supervision.一对多监督在传统的检测方法中用于学习和提供更好的候选者以便进行NMS后处理。例如,Faster R-CNN如果预测框与真实目标有足够的重叠,则动态地将真实目标分配给预测框。FCOS将真实目标分配给目标中心的像素。

鉴于NMS与自注意力和一对一监督之间的相似之处,作者提出使用一对多分配监督来明确提高object query 的质量,从而相应地提高检测候选的质量。作者采用一个额外的模块进行一对多预测。

一对多的损失函数:

其中\left \{ (s_{n1},b_{n1}),(s_{n2},b_{n2}),...,(s_{n_{Kn}},b_{n_{Kn}}) \right \} 是被分配给第n个真实目标的预测。K_{n}是第n个真实目标的匹配预测数量。

One-to-many matching.一对多匹配是基于从一对多预测器(one-to-many predictors)得到的预测(s,b)和真实值(\overline{c},\overline{b})之间的匹配分数。匹配分数是将IoU(Intersection over Union,交并比)和分类分数组合在一起得到的。

作者选择每个真实目标的匹配分数的前K个 Query ,然后过滤掉匹配分数低于阈值\tau的 Query ,形成匹配 Query 集。作者还将从一对一匹配中获得的Query 包含到每个GT的匹配Query集中,这带来了更好的增益(+0.2 mAP)。

3.3. Implementation

        用于一对多监督的额外模块包括框预测器和类别预测器,它们与一对一监督中使用的相同。框预测器实现为一个三层MLP(多层感知器)结构,使用ReLU激活,而类别预测器实现为一个单线性层。

        一种直接的实现方式(图4(a))是在每个解码器层的输出object query 上执行一对多预测,这与一对一预测相似。作者将一对一的框预测合并到一对多框预测中。对于一个真实目标,其损失函数由三部分组成:一对一分类损失、一对多框回归损失和一对一分类损失。

        考虑到DETR交叉注意力的作用是根据图像特征生成多个候选者,而自注意力的作用是收集其他候选者的信息以便进行重复移除,作者改变了解码器层组件的顺序,将其从自注意交叉注意力FFN更改为交叉注意力自注意FFN。

这(如图4(b)所示)类似于传统方法,如Faster R-CNN:首先为每个目标生成多个候选者,然后使用NMS移除重复候选者。这几乎不影响性能。

        然后作者在经过交叉注意力处理并输出FFN的内部object query 上放置一对多监督(如图4(c)所示)。作者假设经过交叉注意力处理的解码器层内部object query 包含关于每个候选者的大量信息,而经过自注意力处理的解码器层输出object query 还包含关于其他候选者的信息。因此,在内部object query 上施加一对多监督(来自交叉注意力)可能有助于训练,这在Table 5中得到了实证验证。

        相比之下,在交叉注意力和自注意力交换顺序的情况下,在内部object query 上施加一对多监督(如图4(d)所示)会导致性能下降。原因可能是监督放置与交叉注意力和自注意力的角色不一致:交叉注意力主要生成多个候选者,而自注意力主要收集其他候选者的信息,主要是为了推广获胜候选者。

4. Experiments

4.1. Object Detection

Setting.作者在各种代表性的基于DETR检测器上验证MS-DETR,例如DAB-DETR,Deformable DETR及其强大的扩展Deformable-DETR++,该方法实现了三个额外的技巧:mixed query selection, look forward twice, and zero dropout rate。

作者将结果与具有一对多监督代表性的DETR变体进行比较,包括DN-DETR,Hybrid DETR,Group DETR和DINO。使用ResNet-50作为CNN Backbone 。模型主要用于训练12个epochs,部分为24个epochs。模型在COCO train2017上进行训练,并在COCO val2017上进行评估。

Comparison against DETR variants with one-to-many supervision.结果如表1所示。MS-DETR在不同的DETR Baseline 上都带来了持续的改进。具体来说,在12个周期下,相对于DAB-Deformable-DETR,Deformable DETR和Deformable DETR++,其mAP提高了3.7,3.7和1.8。

 

与具有单一监督的DETR变体进行比较,MS-DETR相对于Group DETR和DN-DETR在DAB-Deformable-DETR上的改进更大:在12个epochs下,相对于Group DETR和DN-DETR,作者的改进分别为 +1.5mAP和+3.7 AP,+1.8mAP和+3.7 mAP。

作者的改进也大于基于Deformable DETR和Deformable DETR++的Hybrid DETR:在12个epochs下,相对于Hybrid DETR,改进分别为 +2.2mAP vs +3.7mAP,+1.7 mAP vs +1.8 mAP。与具有单一监督的DINO进行比较,改进也更大:相对于DINO,改进分别为 +1.4mAP vs +2.4mAP,+0.8 mAP vs +1.1mAP,分别对应在12个epochs和24个epochs下。

相对于具有单一监督的DETR变体,MS-DETR的优势在于MS-DETR直接对主解码器中的目标 Query 施加一对多监督。

Combination with DETR variants with one-to-many supervision.表2显示了将MS-DETR与其他具有单一监督的DETR变体组合的结果。MS-DETR在这些方法上始终有所改进。在12个epochs下,相对于DN-DETR(-DCS) ,Group-DETR,DAC-DETR,Hybrid DETR和DINO,MS-DETR分别取得了2.0,0.6,1.0,0.8和1.3的mAP提升。MS-DETR在更长的训练计划(24个epochs)下进一步改进了DINO的性能,使其mAP提高了1.3。

这些方法在额外的解码器分支上应用一对多监督,而主解码器分支上的 Query 仍然以一对一的方式进行监督。相比之下,MS-DETR直接在主解码器分支上的 Query 上应用一对多监督,从而实现了对这些方法的良好的互补。

Computation and memory efficiency.表3报告了 Baseline (使用300个 Query 的Deformable DETR++)以及Hybrid DETR,Group DETR和作者的MS-DETR的计算成本和内存成本。所有方法的基本批量大小相同。每个周期的训练时间是通过在12个周期内平均时间得出的。

 

可以看到,对于MS-DETRMS-DETR,多对多监督带来的额外时间非常小:相对于 Baseline 的时间成本增加了2分钟。相比之下,Group DETR和Hybrid DETR的额外时间成本分别为+36和+28分钟,远大于MS-DETR。MS-DETR在内存效率方面也更具优势。例如,与 Baseline 相比,MS-DETR只增加了127M的内存(约2%),而Hybrid DETR和Group DETR的内存增加分别达到了 Baseline 的近60%和40%。原因在于Hybrid DETR和Group DETR引入了更多的 Query ,从而导致了更多的计算开销。

Convergence curves.在图6中,作者呈现了MS-DETR与相应 Baseline 的收敛曲线,分别是具有300个 Query 的Deformable DETR和具有900个 Query 的Deformable DETR++。这些模型都使用了ResNet-50作为 Backbone 架构,并经过12个周期的训练。作者观察到,在MS-DETR中引入混合监督可以加速训练收敛。

Combination with IoU-aware loss.作者研究了将MS-DETR与另一项改进DETR的IoU感知损失的工作相结合。作者在基于DINO Baseline 的Align-DETR上应用MS-DETR。表4显示,在12和24个周期的训练计划下,MS-DETR分别将Align-DETR的性能提高了0.5 AP和0.6 AP。这表明MS-DETR也可以补充IoU感知损失。

4.2. Ablation Study

Hyperparameters in one-to-many matching.作者说明了一对一匹配中的三个超参数的影响。

图5(a)说明了超参数K对top Query 选择的影响。实际发现,当K=6时,MS-DETR达到了最优性能。较小的K值会减少阳性 Query 的数量。较大的K值会导致目标不平衡问题。

图5(b)可视化了用于过滤一对多监督中低质量 Query 的阈值的影响。MS-DETR在\tau = 0.4时取得了最佳结果。降低\tau的值会增加低质量 Query 的包含,而提高\tau的值则会减少有资格进行一对多监督的阳性 Query 的数量。

在图5(c)中呈现了一对多匹配分数中的分数权重\alpha的影响。较高的\alpha值会增加分类分数的重要性,而较低的\alpha值会增加IoU分数的重要性。在实践中发现,当\alpha设置为0.4时,MS-DETR达到了最佳性能。

One-to-many supervision placement.报告了将一对多监督放置在解码器层内部和输出目标 Query 上的实际结果,以及跨注意力和自注意力的层内放置顺序的两种配置。这四个变体如图4所示。

结果如表5所示。四个MS-DETR变体在 Baseline 上获得了显著的改进。直接将一对多监督放置在每个解码器层上的简单变体,在mAP方面获得了3.3的改进,而交换注意力和自注意力的顺序不会影响结果。如果将一对多监督放置在交叉注意力自注意力FFN配置的内部目标 Query 输出上,则可以进一步获得0.6的改进。这证实了第3.3节的分析。

Weight sharing for predictors of one-to-many and one-to-one supervision.作者对一对一和一对多监督的预测器之间的权重共享进行了实证分析。结果如表6所示。

可以看到,将权重共享给Box和类别预测器都取得了最佳性能。共享Box的预测器权重相对容易理解:一对多监督和一对一监督的Box预测器都需要提取相同的特征进行Box预测,而在某种意义上共享权重会增加监督。

作者假设将类别预测器的权重共享会导致:

  1. 为训练某些对一对多和一对一分类都有效的预测器权重添加更多的监督;

  2. 留下从一对一监督中学习到的为重复候选者评分的权重,这些权重不会影响一对多监督的预测。

Illustration of better candidate prediction from one-to-many supervision.在图7中通过一对多监督提高候选者预测质量的更多示例进行了说明。这些预测来自最终的物体 Query 。将IoU得分作为检测结果可视化。在顶部一行中展示了仅通过一对一监督训练的Deformable DETR Baseline 的检测结果。底部一行显示了MS-DETR的检测结果。可以看出,在混合监督下产生的候选者具有更好的质量,这证明了提高候选者质量的有效性。

4.3. Application to Instance Segmentation

        作者报告了实例分割的结果,以进一步证明其有效性。在Mask-Deformable-DETR Baseline 在COCO-2017 val集上的实例分割结果。在ResNet50 Backbone 上进行了12和50个epoch的实验。表7显示,在12个epoch的训练计划下,MS-DETR在 Baseline 的mask mAP上显著提高了3.2 mAP。在更长的50个epoch的训练计划下,它可以进一步提高 Baseline 的mask mAP,达到2.5 mAP。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微调您的Embedding模型以最大限度地提高RAG管道中的相关性检索

英文原文地址:https://betterprogramming.pub/fine-tuning-your-embedding-model-to-maximize-relevance-retrieval-in-rag-pipeline-2ea3fa231149 微调您的Embedding模型以最大限度地提高RAG管道中的相关性检索 微调嵌入前后的 NVIDIA SEC 10-K 文件分析 2023 年…

高效工作法:占位图片生成工具助力项目快速迭代

在现代设计和开发项目中,图片资源的重要性不言而喻。然而,项目中经常会遇到寻找合适图片、调整图片尺寸和格式等问题,这些问题不仅耗时耗力,还可能影响到项目的进度和质量。此时,占位图片生成工具应运而生,…

Jmeter 测试脚本录制器-HTTP 代理服务器

Jmeter 测试脚本录制器-HTTP 代理服务器 Jmeter 配置代理服务器代理服务器获取请求地址示例图配置步骤 浏览器配置代理Google 浏览器插件配置代理windows 本地网络配置代理 启动录制,生成证书生成证书导入证书Jmeter 配置证书 浏览器点击页面,录制请求地…

【算法与数据结构】343、LeetCode整数拆分

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:博主做这道题的时候一直在思考,如何找到 k k k个正整数, k k k究竟为多少合适。…

linux终端查看文件

ls 命令:ls 命令用于列出当前目录下的文件和子目录。默认情况下,它以字母顺序列出文件和目录的名称。例如,要列出当前目录下的所有文件和目录,可以运行以下命令: ls ls -l 命令:ls -l 命令以长格式显示文件…

Nacos 高级详解

一 、服务集群 1 需求 服务提供者搭建集群 服务调用者,依次显示集群中各服务的信息 2 搭建 1)修改服务提供方的controller,打印服务端端口号 package com.czxy.controller;import org.springframework.web.bind.annotation.*;import …

数据结构学习 jz39 数组中出现次数超过一半的数字

关键词:排序 摩尔投票法 摩尔投票法没学过所以没有想到,其他的都自己想。 题目:库存管理 II 方法一: 思路: 排序然后取中间值。因为超过一半所以必定在中间值是我们要的结果。 复杂度计算: 时间复杂度…

大数据Doris(五十六):SQL函数之地理位置函数

文章目录 SQL函数之地理位置函数 一、​​​​​​​ST_AsText(GEOMETRY geo)

电阻表示方法和电路应用

电阻 电阻的表示方法 直标法 直标法是将电阻器的类别及主要技术参数的数值直接标注在电阻器表面上 通常用3位阿拉伯数字来标注片状电阻的阻值,其中第1位数代表阻值的第1位有效数;第2位数代表阻值的第二位有效数字;第3位数代表阻值倍率&…

L1-025 正整数A+B(Java)

题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。 输入格式: 输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求的正整数&#xff0…

Oracle常见操作

知识点1:格式化日期 select to_char(sysdate,yyyy-MM-dd HH:mm:ss) as time from dual;运行截图: 知识点2:解锁用户 alter user test account unlock;知识点3:修改密码 alter user test identified by test2;知识点4&#xff…

【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案

微服务架构的分布式事务解决方案 前提介绍知识系统回顾事务ACID事务的难点刚性事务和柔性事务 刚性事务优点局限 分布式事务全局事务(DTP模型)— 标准分布式事务全局事务(DTP模型) — XAXA接口的实现XA的2PC机制2PC机制的分析 2PC机制的局限 JavaEE平台中…

城市信息模型平台顶层设计与实践-CIM-读书笔记

城市信息模型平台顶层设计与实践-CIM-读书笔记 1、地理空间框架 GB/T 30317—2013《地理空间框架基本规定》规定地理空间框架为:“地理信息数据及其采集、加工、交换、服务所涉及的政策、法规、标准、技术、设施、机制和人力资源的总称,由基础地理信息…

小程序中使用微信同声传译插件实现语音识别、语音合成、文本翻译功能----语音合成(二)

官方文档链接:https://mp.weixin.qq.com/wxopen/plugindevdoc?appidwx069ba97219f66d99&token370941954&langzh_CN#- 要使用插件需要先在小程序管理后台的设置->第三方设置->插件管理中添加插件,目前该插件仅认证后的小程序。 语音合成…

排序算法之八:计数排序

1.计数排序思想 计数排序,顾名思义就是计算数据的个数 计数排序又称非比较排序 思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 操作步骤: 统计相同元素出现次数 根据统计的结果将序列回收到原来的序列中 计数…

HNU-算法设计与分析-实验2

算法设计与分析实验2 计科210X 甘晴void 202108010XXX 目录 文章目录 算法设计与分析<br>实验21 用动态规划法实现0-1背包问题重述想法代码验证算法分析 2 用贪心算法求解背包问题问题重述想法代码验证算法分析 3 半数集问题&#xff08;实现题2-3&#xff09;问题重述…

Ubuntu 22.04 安装Fail2Ban

Fail2Ban是一种用来防止暴力破解的工具&#xff0c;一般要和iptables配合使用。其原理是读取系统日志&#xff0c;并通过正则表达式匹配&#xff0c;监控IP在一段时间内的登录尝试、身份验证失败日志等并进行计数。超过阈值则进行IP封禁&#xff0c;过一段时间后再解封。 总的…

ant design vue Tree组件叶子节点横向排列

antdesignvue的树形组件要实现组件叶子节点横向排列有点坑&#xff0c;没有 配置属性&#xff0c;需要自己想办法。 要实现的效果 看tree组件的dom结构&#xff0c;父元素flex竖向布局&#xff0c;子项不论节点层级都在同一层&#xff01;&#xff01;&#xff01; 难点在于想…

8个 Python 开发者必备的 PyCharm 插件

这8个顶级插件保证了更快、更轻松、更愉悦的开发过程。 在 PyCharm 插件列表中&#xff0c;我们发现了几个瑰宝插件&#xff0c;它们各自以独特的方式帮助开发者快速、简便、愉悦地开发。 今天我就给大家逐个介绍它们。 1. Key Promoter X 【下载链接】&#xff1a;https://…

Openlayer【四】—— 控件

控件 控件是一个可见的小部件&#xff0c;其 DOM 元素位于 屏幕。它们可以涉及用户输入&#xff08;按钮&#xff09;&#xff0c;也可以仅供参考; 位置是使用 CSS 确定的。默认情况下&#xff0c;它们位于 容器&#xff0c;但可以使用 任何外部 DOM 元素。 其中ol/control是…