当前位置: 首页 > news >正文

【论文精读】Deformable DETR:用于端到端目标检测可变形 Transformer

论文:DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION

代码:Deformable-DETR

摘要

        DETR 最近被提出用于消除目标检测中许多手工设计组件的需求,同时展示了良好的性能。然而,它存在收敛速度慢和特征空间分辨率有限的问题,这主要是由于 Transformer 注意力模块在处理图像特征图时的局限性。为了解决这些问题,我们提出了 Deformable DETR,其注意力模块仅关注参考点周围的少量关键采样点。Deformable DETR 能够在比 DETR 少 10 倍的训练周期内实现更好的性能(尤其是在小目标上)。在 COCO 基准测试上的大量实验验证了我们方法的有效性。

引言

        现代目标检测器使用了许多手工设计的组件(Liu et al., 2020),例如锚点生成、基于规则的训练目标分配以及NMS后处理。这些检测器并不是完全端到端的。最近,Carion et al. (2020) 提出了 DETR,消除了对手工设计组件的需求,并构建了第一个完全端到端的目标检测器,展现出极具竞争力的性能。DETR 采用简单的架构,结合了卷积神经网络(CNN)和 Transformer 编码器-解码器(Vaswani et al., 2017)。它利用 Transformer 强大的关系建模能力来替代手工设计的规则,同时在适当设计的训练信号下实现这一目标。

        尽管 DETR 的设计有趣且性能良好,但它也存在一些问题:(1)与现有的目标检测器相比,它需要更长的训练周期才能收敛。例如,在 COCO(Lin et al., 2014)基准测试中,DETR 需要 500 个训练周期才能收敛,这比 Faster R-CNN(Ren et al., 2015)慢了大约 10 到 20 倍。(2)DETR 在检测小目标时的性能相对较低。现代目标检测器通常利用多尺度特征,其中小目标通过高分辨率特征图进行检测。然而,高分辨率特征图会导致 DETR 的计算复杂度难以接受。上述问题主要归因于 Transformer 组件在处理图像特征图时的不足。在初始化时,注意力模块会对特征图中的所有像素分配几乎均匀的注意力权重。需要经过长时间的训练,注意力权重才能学会聚焦于稀疏且有意义的位置。另一方面,Transformer 编码器中的注意力权重计算与像素数量呈二次方关系。因此,处理高分辨率特征图的计算和内存复杂度极高。

        在图像领域,可变形卷积(Dai et al., 2017)是一种强大且高效的机制,用于关注稀疏的空间位置。它自然地避免了上述问题。然而,它缺乏关系建模机制,而这是 DETR 成功的关键。

        在本文中,我们提出了 Deformable DETR,以缓解 DETR 的收敛速度慢和复杂度高的问题。它结合了可变形卷积的稀疏空间采样优势和 Transformer 的关系建模能力。我们提出了可变形注意力模块,该模块仅关注少量采样位置,作为从所有特征图像素中筛选出关键元素的预过滤器。该模块可以自然扩展到聚合多尺度特征,而无需借助特征金字塔网络(FPN)(Lin et al., 2017a)。在 Deformable DETR 中,我们用(多尺度)可变形注意力模块替换了处理特征图的 Transformer 注意力模块,如图 1 所示。

        Deformable DETR 为探索端到端目标检测器的各种变体提供了可能,这得益于其快速收敛以及计算和内存效率。我们探索了一种简单而有效的迭代边界框细化机制,以提高检测性能。我们还尝试了两阶段的 Deformable DETR,其中区域提议也由 Deformable DETR 的变体生成,并进一步输入到解码器中进行迭代边界框细化。

        在 COCO(Lin et al., 2014)基准测试上的大量实验验证了我们方法的有效性。与 DETR 相比,Deformable DETR 可以在少 10 倍的训练周期内实现更好的性能(尤其是在小目标上)。我们提出的两阶段 Deformable DETR 变体可以进一步提高性能。

2 相关工作

高效注意力机制。 Transformer(Vaswani et al., 2017)包含自注意力和交叉注意力机制。Transformer 最为人熟知的问题之一是其在处理大量关键元素时的时间和内存复杂度较高,这在许多情况下限制了模型的可扩展性。最近,许多研究致力于解决这一问题(Tay et al., 2020b),这些研究大致可以分为以下三类。

第一类是使用预定义的稀疏注意力模式对关键元素进行处理。最直接的方法是将注意力模式限制为固定的局部窗口。大多数工作(Liu et al., 2018a; Parmar et al., 2018; Child et al., 2019; Huang et al., 2019; Ho et al., 2019; Wang et al., 2020a; Hu et al., 2019; Ramachandran et al., 2019; Qiu et al., 2019; Beltagy et al., 2020; Ainslie et al., 2020; Zaheer et al., 2020)都遵循这一范式。尽管将注意力模式限制在局部邻域可以降低复杂度,但这种方法会丢失全局信息。为了弥补这一点,Child et al. (2019); Huang et al. (2019); Ho et al. (2019); Wang et al. (2020a) 以固定间隔关注关键元素,以显著增加关键元素的接收场。Beltagy et al. (2020); Ainslie et al. (2020); Zaheer et al. (2020) 允许少量特殊标记访问所有关键元素。Zaheer et al. (2020); Qiu et al. (2019) 还添加了一些预定义的稀疏注意力模式,以便直接关注远处的关键元素。

第二类是学习数据依赖的稀疏注意力。Kitaev et al. (2020) 提出了一种基于局部敏感哈希(LSH)的注意力机制,该机制将查询和关键元素分别哈希到不同的桶中。Roy et al. (2020) 提出了一个类似的想法,通过 k-means 找出最相关的关键元素。Tay et al. (2020a) 学习块排列以实现块稀疏注意力。

第三类是探索自注意力中的低秩特性。Wang et al. (2020b) 通过在线性投影中减少关键元素的数量来降低复杂度,而不是在通道维度上进行操作。Katharopoulos et al. (2020); Choromanski et al. (2020) 通过核化近似重写了自注意力的计算。

在图像领域,高效注意力机制的设计(例如 Parmar et al., 2018; Child et al., 2019; Huang et al., 2019; Ho et al., 2019; Wang et al., 2020a; Hu et al., 2019; Ramachandran et al., 2019)仍然局限于第一类。尽管理论上复杂度有所降低,但 Ramachandran et al. (2019); Hu et al. (2019) 承认,由于内存访问模式的内在限制,这些方法在实现时比传统卷积慢得多(至少慢 3 倍),即使它们的浮点运算量(FLOPs)相同。

另一方面,如 Zhu et al. (2019a) 所讨论的,卷积的变体(例如可变形卷积(Dai et al., 2017; Zhu et al., 2019b)和动态卷积(Wu et al., 2019))也可以被视为一种自注意力机制。特别是,可变形卷积在图像识别中比 Transformer 自注意力运行得更高效,但它缺乏元素关系建模机制。

我们提出的可变形注意力模块受到可变形卷积的启发,属于第二类。它仅关注从查询元素特征中预测出的少量固定采样点。与 Ramachandran et al. (2019); Hu et al. (2019) 不同,可变形注意力在相同 FLOPs 下仅比传统卷积稍慢。

多尺度特征表示用于目标检测。 目标检测的一个主要困难是如何有效地表示不同尺度的目标。现代目标检测器通常利用多尺度特征来解决这一问题。作为开创性工作之一,特征金字塔网络(FPN)(Lin et al., 2017a)提出了一个自顶向下的路径来组合多尺度特征。PANet(Liu et al., 2018b)进一步在 FPN 的基础上增加了自底向上的路径。Kong et al. (2018) 通过全局注意力操作将所有尺度的特征结合起来。Zhao et al. (2019) 提出了一个 U 形模块来融合多尺度特征。最近,NAS-FPN(Ghiasi et al., 2019)和 Auto-FPN(Xu et al., 2019)通过神经架构搜索自动设计跨尺度连接。Tan et al. (2020) 提出了 BiFPN,这是 PANet 的一个简化版本。我们提出的多尺度可变形注意力模块可以通过注意力机制自然地聚合多尺度特征图,而无需借助这些特征金字塔网络。

3 重温 Transformer 和 DETR

Transformer 中的多头注意力机制。 Transformer(Vaswani et al., 2017)是一种基于注意力机制的网络架构,用于机器翻译。给定一个查询元素(例如输出句子中的目标单词)和一组关键元素(例如输入句子中的源单词),多头注意力模块会根据衡量查询-关键元素对兼容性的注意力权重,自适应地聚合关键内容。为了使模型能够关注来自不同表示子空间和不同位置的内容,不同注意力头的输出会通过可学习的权重进行线性聚合。假设索引一个查询元素,其表示特征为,而索引一个关键元素,其表示特征为 ,其中 C 是特征维度, 分别指定查询和关键元素的集合。那么多头注意力特征的计算公式为:

其中 m 索引注意力头,和 Wm​∈RC×Cv​ 是可学习的权重。注意力权重 经过归一化处理,使得 ,其中 也是可学习的权重。为了区分不同的空间位置,表示特征 通常是元素内容和位置嵌入的拼接/求和。

Transformer 存在两个已知问题。第一个问题是 Transformer 需要较长的训练时间才能收敛。假设查询和关键元素的数量分别为​,在适当的参数初始化下,的分布均值为 0,方差为 1,这使得当 很大时,注意力权重 。这会导致输入特征的梯度模糊,因此需要较长的训练时间,以便注意力权重能够聚焦于特定的关键元素。在图像领域,关键元素通常是图像像素, 可能非常大,因此收敛过程非常缓慢。

另一方面,当查询和关键元素数量较多时,多头注意力的计算和内存复杂度可能非常高。公式(1)的计算复杂度为。在图像领域,查询和关键元素都是像素,,复杂度主要由第三项主导,即。因此,多头注意力模块的复杂度随着特征图尺寸呈二次方增长。

DETR。 DETR(Carion et al., 2020)基于 Transformer 编码器-解码器架构构建,并结合了一种基于集合的匈牙利损失函数,该函数通过二分图匹配强制为每个真实边界框生成唯一的预测结果。我们简要回顾其网络架构如下。

给定由 CNN 主干网络(例如 ResNet(He et al., 2016))提取的输入特征图,DETR 利用标准的 Transformer 编码器-解码器架构将输入特征图转换为目标查询的特征集合。在解码器的输出上添加了一个 3 层前馈神经网络(FFN)和一个线性投影,作为检测头。FFN 作为回归分支,用于预测归一化的边界框坐标,其中表示边界框中心的归一化坐标、边界框的高和宽(相对于图像尺寸)。线性投影作为分类分支,用于生成分类结果。

对于 DETR 中的 Transformer 编码器,查询和关键元素都是特征图中的像素。输入为带有位置嵌入的 ResNet 特征图。假设 H 和 W 分别表示特征图的高度和宽度,编码器中自注意力的计算复杂度为,随着空间尺寸呈二次方增长。

对于 DETR 中的 Transformer 解码器,输入包括编码器输出的特征图以及 N 个目标查询(由可学习的位置嵌入表示,例如 N=100)。解码器中有两种类型的注意力模块:交叉注意力和自注意力模块。在交叉注意力模块中,目标查询从特征图中提取特征。查询元素是目标查询,关键元素是编码器输出的特征图。在这种情况下,,交叉注意力的复杂度为 。复杂度随着特征图的空间尺寸线性增长。在自注意力模块中,目标查询相互交互,以捕获它们之间的关系。查询和关键元素都是目标查询。在这种情况下,,自注意力模块的复杂度为 。当目标查询的数量适中时,这种复杂度是可以接受的。

DETR 是一种吸引人的目标检测设计,它消除了对手工设计组件的需求。然而,它也存在一些问题,这些问题主要归因于 Transformer 注意力在处理图像特征图作为关键元素时的不足:(1)DETR 在检测小目标时的性能相对较低。现代目标检测器使用高分辨率特征图来更好地检测小目标。然而,高分辨率特征图会导致 DETR 中 Transformer 编码器的自注意力模块复杂度不可接受,因为其复杂度与输入特征图的空间尺寸呈二次方关系。(2)与现代目标检测器相比,DETR 需要更多的训练周期才能收敛。这主要是因为处理图像特征的注意力模块难以训练。例如,在初始化时,交叉注意力模块几乎对整个特征图进行平均注意力分配,而在训练结束时,注意力图被训练成非常稀疏的,仅聚焦于目标的边缘。似乎 DETR 需要较长的训练时间来学习注意力图的这种显著变化。

4 方法

4.1 用于端到端目标检测的可变形 Transformer

可变形注意力模块。 将 Transformer 注意力应用于图像特征图的核心问题是它会查看所有可能的空间位置。为了解决这一问题,我们提出了可变形注意力模块。该模块受到可变形卷积(Dai et al., 2017; Zhu et al., 2019b)的启发,仅关注参考点周围的少量关键采样点,而与特征图的空间尺寸无关,如图 2 所示。通过为每个查询仅分配少量固定数量的关键点,可以缓解收敛速度慢和特征空间分辨率有限的问题。

给定输入特征图 ,假设 q 索引一个查询元素,其内容特征为 z_{q},2D 参考点为 p_{q},可变形注意力特征的计算公式为:

 其中 m 索引注意力头,k 索引采样的关键点,K 是采样关键点的总数(K≪HW)。​ 和 分别表示第 m 个注意力头中第 k 个采样点的采样偏移量和注意力权重。标量注意力权重 的取值范围为 [0,1],并满足归一化条件是二维实数,其取值范围不受限制。由于是分数坐标,因此在计算时采用双线性插值,与 Dai et al. (2017) 中的方法一致。均通过查询特征 z_{q}的线性投影获得。在实现中,查询特征z_{q}输入到一个 3MK 通道的线性投影算子中,其中前 2MK 通道编码采样偏移量​,其余 MK 通道通过 softmax 操作获得注意力权重​。

可变形注意力模块旨在处理卷积特征图作为关键元素。假设查询元素的数量为N_{q},当 MK 相对较小时,可变形注意力模块的复杂度为(详细信息见附录 A.1)。当应用于 DETR 编码器时,,复杂度变为,与空间尺寸呈线性关系。当应用于 DETR 解码器中的交叉注意力模块时,(N 是目标查询的数量),复杂度变为,与空间尺寸 HW 无关。

多尺度可变形注意力模块。 大多数现代目标检测框架受益于多尺度特征图(Liu et al., 2020)。我们提出的可变形注意力模块可以自然扩展到多尺度特征图。

假设是输入的多尺度特征图,其中​。假设是每个查询元素 q 的归一化坐标,则多尺度可变形注意力模块的计算公式为:

其中 m 索引注意力头,l 索引输入特征级别,k 索引采样点。分别表示第 l 级特征图中第 m 个注意力头的第 k 个采样点的采样偏移量和注意力权重。标量注意力权重满足归一化条件。这里,我们使用归一化坐标以清晰表示尺度公式,其中坐标 (0, 0) 和 (1, 1) 分别表示图像的左上角和右下角。函数在公式 3 中将归一化坐标转换为第 l 级输入特征图的坐标。多尺度可变形注意力模块与单尺度版本非常相似,区别在于它从多尺度特征图中采样 LK 个点,而不是从单尺度特征图中采样 K 个点。 

当 L=1,K=1,且为单位矩阵时,我们提出的注意力模块退化为可变形卷积(Dai et al., 2017)。可变形卷积是为单尺度输入设计的,仅关注每个注意力头的一个采样点。然而,我们的多尺度可变形注意力模块会从多尺度输入中查看多个采样点。我们提出的(多尺度)可变形注意力模块也可以被视为 Transformer 注意力的高效变体,其中通过可变形采样位置引入了预筛选机制。当采样点覆盖所有可能的位置时,我们提出的注意力模块等同于 Transformer 注意力。

可变形 Transformer 编码器。 我们用提出的多尺度可变形注意力模块替换了 DETR 中处理特征图的 Transformer 注意力模块。编码器的输入和输出均为具有相同分辨率的多尺度特征图。在编码器中,我们从 ResNet(He et al., 2016)的 C3 至 C5 阶段提取多尺度特征图(通过 1×1 卷积转换),其中C_{l}的分辨率比输入图像低 2^{l}倍。通过在 C5 阶段的最终输出上应用 3×3、步长为 2 的卷积,获得最低分辨率的特征图x^{L}​,记为 C6。所有多尺度特征图的通道数均为 C=256。需要注意的是,我们没有使用 FPN(Lin et al., 2017a)中的自顶向下结构,因为我们的多尺度可变形注意力模块本身就可以在多尺度特征图之间交换信息。多尺度特征图的构建过程也在附录 A.2 中进行了说明。第 5.2 节的实验表明,添加 FPN 并不会提升性能。

在编码器中应用多尺度可变形注意力模块时,输出是与输入具有相同分辨率的多尺度特征图。关键元素和查询元素均为多尺度特征图中的像素。对于每个查询像素,参考点就是其自身。为了识别每个查询像素所在的特征级别,我们在特征表示中添加了一个尺度级别嵌入 e_{l},以及位置嵌入。与具有固定编码的位置嵌入不同,尺度级别嵌入是随机初始化的,并与网络一起联合训练。

可变形 Transformer 解码器。 解码器中包含交叉注意力和自注意力模块。两种注意力模块的查询元素均为目标查询。在交叉注意力模块中,目标查询从特征图中提取特征,其中关键元素是编码器输出的特征图。在自注意力模块中,目标查询相互交互,其中关键元素是目标查询本身。由于我们提出的可变形注意力模块是为处理卷积特征图作为关键元素而设计的,因此我们仅将交叉注意力模块替换为多尺度可变形注意力模块,而保留自注意力模块不变。

对于每个目标查询,参考点的二维归一化坐标通过其目标查询嵌入经由一个可学习的线性投影并结合 Sigmoid 函数预测得到。

由于多尺度可变形注意力模块提取的是参考点周围的图像特征,我们让检测头预测边界框为相对于参考点的偏移量,以进一步降低优化难度。参考点被用作边界框中心的初始猜测,检测头预测相对于参考点的偏移量。更多细节见附录 A.3。通过这种方式,学习到的解码器注意力与预测的边界框具有强相关性,这也加速了训练的收敛。

通过将 DETR 中的 Transformer 注意力模块替换为可变形注意力模块,我们建立了一个高效且快速收敛的检测系统,称为 Deformable DETR(见图 1)。

4.2 Deformable DETR 的额外改进和变体

由于 Deformable DETR 具有快速收敛以及计算和内存效率高的特点,它为探索端到端目标检测器的多种变体提供了可能性。由于篇幅有限,这里仅介绍这些改进和变体的核心思想,具体实现细节在附录 A.4 中给出。

迭代边界框细化。 这一机制受到光流估计中迭代细化(Teed & Deng, 2020)的启发。我们建立了一个简单而有效的迭代边界框细化机制,以提高检测性能。具体来说,每一层解码器都会根据前一层的预测结果对边界框进行细化。

两阶段 Deformable DETR。 在原始的 DETR 中,解码器中的目标查询与当前图像无关。受两阶段目标检测器的启发,我们探索了一种用于生成区域提议的 Deformable DETR 变体,作为第一阶段。生成的区域提议将被输入到解码器中作为目标查询,以进行进一步细化,形成两阶段 Deformable DETR。

在第一阶段,为了实现高召回率的提议,多尺度特征图中的每个像素都充当一个目标查询。然而,直接将目标查询设置为像素会为解码器中的自注意力模块带来不可接受的计算和内存成本,因为其复杂度与查询数量的平方成正比。为了避免这一问题,我们移除了解码器,形成了一个仅包含编码器的 Deformable DETR,用于区域提议生成。在这一阶段,每个像素都被分配为一个目标查询,直接预测一个边界框。选择得分最高的边界框作为区域提议。在将区域提议输入到第二阶段之前,不应用NMS。

5 EXPERIMENT

数据集 我们在 COCO 2017 数据集(Lin et al., 2014)上进行实验。模型在训练集上进行训练,并在验证集和测试开发集上进行评估。

实现细节 我们使用在 ImageNet(Deng et al., 2009)上预训练的 ResNet-50(He et al., 2016)作为主干网络进行消融实验。在不使用 FPN(Lin et al., 2017a)的情况下提取多尺度特征图。默认情况下,可变形注意力模块中注意力头的数量 M 设置为 8,采样点的数量 K 设置为 4。可变形 Transformer 编码器在不同特征级别上的参数是共享的。其他超参数设置和训练策略主要遵循 DETR(Carion et al., 2020),唯一的区别是使用了 Focal Loss(Lin et al., 2017b),其权重为 2,用于边界框分类,并且目标查询的数量从 100 增加到 300。我们还报告了在这些修改下 DETR-DC5 的性能,记作 DETR-DC5+。默认情况下,模型训练 50 个周期,并在第 40 个周期将学习率降低 0.1 倍。按照 DETR(Carion et al., 2020)的设置,我们使用 Adam 优化器(Kingma & Ba, 2015)进行模型训练,基础学习率为 2\times 10^{-4}\beta _{1}​=0.9,\beta _{2}=0.999,权重衰减为 10^{-4}。用于预测目标查询参考点和采样偏移量的线性投影的学习率乘以 0.1 的因子。运行时间在 NVIDIA Tesla V100 GPU 上进行评估。

5.1 与 DETR 的比较

如表 1 所示,与 Faster R-CNN + FPN 相比,DETR 需要更多的训练周期才能收敛,并且在检测小目标时性能较低。与 DETR 相比,Deformable DETR 在少 10 倍的训练周期内实现了更好的性能(尤其是在小目标上)。详细的收敛曲线如图 3 所示。借助迭代边界框细化和两阶段机制,我们的方法可以进一步提高检测精度。

我们提出的 Deformable DETR 的计算量与 Faster R-CNN + FPN 和 DETR-DC5 相当,但运行速度比 DETR-DC5 快 1.6 倍,仅比 Faster R-CNN + FPN 慢 25%。DETR-DC5 的速度问题主要是由于 Transformer 注意力模块中大量的内存访问。我们提出的可变形注意力模块可以缓解这一问题,但代价是无序的内存访问。因此,它的速度仍然略低于传统卷积。

 图 3:Deformable DETR 和 DETR-DC5 在 COCO 2017 验证集上的收敛曲线。对于 Deformable DETR,我们通过改变学习率降低的周期(即 AP 分数跳跃的位置)来探索不同的训练计划。

5.2 可变形注意力的消融研究

表 2 展示了可变形注意力模块不同设计选择的消融实验结果。使用多尺度输入代替单尺度输入可以有效提高检测精度,特别是在小目标上,APS 提高了 2.9%,整体 AP 提高了 1.7%。增加采样点的数量 K 可以进一步提高 0.9% 的 AP。使用多尺度可变形注意力(允许在不同尺度级别之间交换信息)可以额外提高 1.5% 的 AP。由于已经采用了跨尺度特征交换,因此添加 FPN 不会提升性能。当不使用多尺度注意力且 K=1 时,我们的(多尺度)可变形注意力模块退化为可变形卷积,其精度明显较低。

5.3 与最新方法的比较

表 3 比较了我们提出的方法与其他最新方法的性能。在我们的模型中,迭代边界框细化和两阶段机制都被使用。使用 ResNet-101 和 ResNeXt-101(Xie et al., 2017)作为主干网络时,我们的方法分别达到了 48.7 AP 和 49.0 AP,没有任何额外的技巧。通过使用 ResNeXt-101 和可变形卷积(DCN)(Zhu et al., 2019b),精度可以提高到 50.1 AP。在测试时使用水平翻转和多尺度测试等增强手段后,我们的方法达到了 52.3 AP。

6 结论 

Deformable DETR 是一种高效且快速收敛的端到端目标检测器。它使我们能够探索更多有趣且实用的端到端目标检测器变体。Deformable DETR 的核心是(多尺度)可变形注意力模块,这是一种在处理图像特征图时高效的注意力机制。我们希望我们的工作能够为端到端目标检测的进一步探索开辟新的可能性。

A 附录

A.1 可变形注意力的复杂度

假设查询元素的数量为 N_{q}​,在可变形注意力模块(见公式 2)中,计算采样坐标偏移量 和注意力权重 ​ 的复杂度为。给定采样坐标偏移量和注意力权重后,计算公式 2 的复杂度为,其中因子 5 来自双线性插值和注意力中的加权求和。另一方面,我们也可以在采样之前计算,因为它与查询无关,因此计算公式 2 的复杂度将变为 。因此,可变形注意力的整体复杂度为。在我们的实验中,默认情况下 M=8,K≤4,且 C=256,因此 5K+3MK<C,复杂度为

A.2 为 Deformable DETR 构建多尺度特征图

如第 4.1 节所述(并见图 4),编码器的输入多尺度特征图是从 ResNet(He et al., 2016)的 C3 至 C5 阶段的输出特征图中提取的(通过 1×1 卷积转换)。通过在最终的 C5 阶段应用 3×3、步长为 2 的卷积,获得最低分辨率的特征图 x^{L}。需要注意的是,我们没有使用 FPN(Lin et al., 2017a),因为我们的多尺度可变形注意力模块本身就可以在多尺度特征图之间交换信息。

A.3 Deformable DETR 中的边界框预测

由于多尺度可变形注意力模块提取的是参考点周围的图像特征,我们设计检测头以预测边界框为相对于参考点的偏移量,从而进一步降低优化难度。参考点被用作边界框中心的初始猜测,检测头预测相对于参考点的偏移量 ,其中 \mathbb{R} 是由检测头预测的值。σ 和 \sigma ^{-1} 分别表示 Sigmoid 函数及其反函数。使用 σ 和 \sigma ^{-1}的目的是确保 \widehat{b}是归一化坐标,即 。通过这种方式,学习到的解码器注意力与预测的边界框具有强相关性,这也加速了训练的收敛。

A.4 更多实现细节

迭代边界框细化 每个解码器层根据前一层的预测结果对边界框进行细化。假设解码器有 D 层(例如 D=6),给定第 (d−1) 层解码器预测的归一化边界框​,第 d 层解码器对边界框进行细化:

其中 是在第 d 层解码器中预测的值。不同解码器层的预测头不共享参数。初始边界框设置为系统对 的选择较为鲁棒。我们尝试了将它们设置为 0.05、0.1、0.2 和 0.5,结果相似。为了稳定训练,类似于 Teed & Deng (2020),梯度仅通过反向传播,而在 处被阻断。

在迭代边界框细化中,对于第 d 层解码器,我们根据第 (d−1) 层解码器预测的边界框采样关键元素。对于公式 3 中第 d 层解码器的交叉注意力模块, 作为新的参考点。采样偏移量 也根据边界框的大小进行调整,即。这些修改使得采样位置与之前预测的边界框的中心和大小相关。

两阶段 Deformable DETR 在第一阶段,给定编码器的输出特征图,对每个像素应用检测头。检测头由一个 3 层前馈网络(FFN)组成,用于边界框回归,以及一个线性投影用于边界框的二元分类(即前景和背景)。假设 i 索引来自特征级别的像素,其二维归一化坐标为,则对应的边界框预测为:

其中基础目标尺度 s 设置为 0.05,是由边界框回归分支预测的值。使用 DETR 中的匈牙利损失进行检测头的训练。

给定第一阶段预测的边界框,选择得分最高的边界框作为区域提议。在第二阶段,这些区域提议被输入到解码器中作为初始边界框进行迭代边界框细化,其中目标查询的位置嵌入设置为区域提议坐标的嵌入。

多尺度可变形注意力的初始化 在实验中,注意力头的数量设置为 M=8。在多尺度可变形注意力模块中,是随机初始化的。用于预测​ 和的线性投影的权重参数初始化为零。偏置参数初始化为使,且 在初始化时。

对于迭代边界框细化,解码器中用于预测​ 的偏置参数的初始值进一步乘以​,以确保所有采样点在初始化时都位于前一层解码器预测的边界框内。

A.5 Deformable DETR 关注了什么?

        为了研究 Deformable DETR 在最终检测结果中依赖哪些像素,我们绘制了最终预测中每个项目(即目标中心的 x/y 坐标、目标边界框的宽/高以及目标类别分数)相对于输入图像每个像素的梯度范数,如图 5 所示。根据泰勒定理,梯度范数可以反映输出相对于像素扰动的变化程度,因此它可以展示模型主要依赖哪些像素来进行每个项目的预测。

        图 5 的可视化结果表明,Deformable DETR 关注目标的极点来确定其边界框,这与 DETR(Carion et al., 2020)中的观察结果类似。具体来说,Deformable DETR 关注目标的左/右边界来预测 x 坐标和宽度,关注目标的上/下边界来预测 y 坐标和高度。与此同时,与 DETR(Carion et al., 2020)不同的是,我们的 Deformable DETR 还会关注目标内部的像素来预测其类别。

 图 5:输入图像 I 中每个像素相对于最终检测结果中每个项目(目标中心的坐标 x,y、目标边界框的宽/高 w,h 以及目标类别分数 c)的梯度范数。

A.6 多尺度可变形注意力的可视化

为了更好地理解学习到的多尺度可变形注意力模块,我们可视化了解码器最后一层的采样点和注意力权重,如图 6 所示。为了便于阅读,我们将来自不同分辨率特征图的采样点和注意力权重合并到一张图中。

  • 多尺度可变形自注意力(编码器):与 DETR(Carion et al., 2020)类似,Deformable DETR 的编码器已经能够区分不同的实例。编码器中的注意力模块通过多尺度特征图的采样点和权重分布,展示了模型如何关注不同尺度的特征来提取目标信息。

  • 多尺度可变形交叉注意力(解码器):与 DETR 不同,我们的模型不仅关注目标的极点(如边界框的边缘),还关注目标内部的像素,以确定目标的类别。这与 DETR 的行为有所不同,DETR 主要关注目标的极点来预测边界框。通过可视化​​(图 5 中目标类别分数相对于输入图像的梯度范数),我们可以推测 Deformable DETR 需要同时关注目标的极点和内部像素来确定目标类别。

  • 多尺度适应性:可视化结果还表明,提出的多尺度可变形注意力模块能够根据前景目标的不同尺度和形状自适应地调整采样点和注意力权重。这种自适应性使得模型在处理不同大小和形状的目标时更加灵活和高效。

图 6:多尺度可变形注意力的可视化。为了便于阅读,我们将不同分辨率特征图中的采样点和注意力权重绘制在同一张图中。每个采样点用一个实心圆表示,其颜色表示对应的注意力权重大小。参考点用绿色十字标记表示,在编码器中,它等同于查询点。在解码器中,预测的边界框用绿色矩形表示,类别和置信度分数显示在矩形上方。 

A.7 符号表

相关文章:

【论文精读】Deformable DETR:用于端到端目标检测可变形 Transformer

论文&#xff1a;DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION 代码&#xff1a;Deformable-DETR 摘要 DETR 最近被提出用于消除目标检测中许多手工设计组件的需求&#xff0c;同时展示了良好的性能。然而&#xff0c;它存在收敛速度慢和特征空…...

Odoo18 Http鉴权+调用后端接口

最近在调研Odoo18&#xff0c;包括它的前后端原理、源码等。发现官方的开发文档并不十分实用&#xff0c;比如标题这种简单的实用需求&#xff0c;竟然浪费了一点时间&#xff0c;特此记录。 官方文档&#xff1a;External API — Odoo 18.0 documentation 前提&#xff1a;首…...

doris:SQL 方言兼容

提示 从 2.1 版本开始&#xff0c;Doris 可以支持多种 SQL 方言&#xff0c;如 Presto、Trino、Hive、PostgreSQL、Spark、Clickhouse 等等。通过这个功能&#xff0c;用户可以直接使用对应的 SQL 方言查询 Doris 中的数据&#xff0c;方便用户将原先的业务平滑的迁移到 Doris…...

Linux红帽:RHCSA认证知识讲解(六)创建、管理和删除本地用戶和组

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;六&#xff09;创建、管理和删除本地用戶和组 前言一、用户和组概念用户类型对比表格主要组和补充组对比表格&#xff1a; 二、本地用户账户增删改查三、本地组账户 前言 上篇博客我们详细了解了从红帽和 DNF 软件仓库下载…...

【Repos系列】yum install nginx 是怎么从仓库中下载并安装的?

yum install nginx 是 YUM 包管理工具从配置的软件仓库中下载并安装软件包的核心操作。以下是其完整工作流程的详细步骤&#xff08;结合缓存机制和依赖处理&#xff09;&#xff1a; ​1. 隐式元数据同步&#xff08;若缓存过期&#xff09;​ ​检查缓存有效性&#xff1a;…...

《JavaScript高级程序设计(第5版)》学习大纲

《JavaScript高级程序设计&#xff08;第5版&#xff09;》学习大纲 《JavaScript高级程序设计&#xff08;第5版&#xff09;》是JavaScript领域的经典“红宝书”&#xff0c;它从基础语法讲到高级特性&#xff0c;还包含浏览器环境和前端工程化等内容。本书2024年12月出版&a…...

基于微信小程序开发的宠物领养平台——代码解读

项目前端 一、项目的技术架构概况 一句话概括&#xff1a;该项目是基于微信小程序开发的宠物领养平台&#xff0c;采用原生小程序框架进行用户界面的构建&#xff0c;使用 wx.request 进行 API 请求&#xff0c;并通过 getApp() 和本地存储来管理全局状态和用户信息。 一&am…...

KICK第五课:Mac 系统下安装 Xcode 或 Clang

Mac 系统下安装 Xcode 或 Clang 详细指南 一、安装前的准备 确认系统版本 macOS 10.9 及以上版本支持 Xcode 和 Clang。若版本过低&#xff0c;需先升级系统。 了解工具区别 Xcode&#xff1a;苹果官方 IDE&#xff0c;包含完整开发环境、模拟器、调试工具等&#xff0c;适合…...

PHP语法基础

PHP语法基础 一&#xff0c;变量 在PHP中&#xff0c;变量是存储数据的容器&#xff0c;其灵活性和动态类型系统是PHP的核心特性之一。以下是PHP变量的详细解析&#xff0c;涵盖声明、作用域、类型转换及最佳实践&#xff1a; 1. 变量基础 声明与命名规则 无需显式声明类型&…...

嵌入式硬件: GPIO与二极管基础知识详解

1. 前言 在嵌入式系统和硬件开发中&#xff0c;GPIO&#xff08;通用输入输出&#xff09;是至关重要的控制方式&#xff0c;而二极管作为基础电子元件&#xff0c;广泛应用于信号整流、保护电路等。本文将从基础原理出发&#xff0c;深入解析GPIO的输入输出模式&#xff0c;包…...

母婴商城系统Springboot设计与实现

项目概述 《母婴商城系统Springboot》是一款基于Springboot框架开发的母婴类电商平台&#xff0c;旨在为母婴产品提供高效、便捷的在线购物体验。该系统功能全面&#xff0c;涵盖用户管理、商品分类、商品信息、商品资讯等核心模块&#xff0c;适合母婴电商企业或个人开发者快…...

Redis相关面试题

以下是150道Redis相关面试题&#xff1a; Redis基础概念 1. Redis是什么&#xff1f; Redis是一个开源的、基于内存的高性能键值存储数据库&#xff0c;常用于缓存、消息队列等场景。 2. Redis的特点有哪些&#xff1f; • 高性能&#xff0c;读写速度快。 • 支持多种数据…...

ArcGIS助力水文分析:数据处理、地图制作与流域特征提取

在水文水环境保护中&#xff0c;对于信息的采集、处理和分析是关键步骤。水文水环境及其相关数据均具有空间分布特征&#xff0c;传统的方法难以发挥作用。地理信息系统&#xff08;GIS&#xff09;强大的空间数据管理和分析功能&#xff0c;在空间信息处理上有独到的优势&…...

docker桌面版启动redis,解决无法连接

docker run -d --name redis -p 6379:6379 -v E:\2\redis\redis.conf:/usr/local/etc/redis/redis.conf redis redis-server /usr/local/etc/redis/redis.conf 在本地创建一个目录&#xff0c;里面有个redis.conf文件&#xff0c;内容如下&#xff0c;启动时绑定这个配置文件目…...

Vue 项目中 CDN 引入的利弊及解决方案

在Vue项目中&#xff0c;引入到工程中的所有js、css文件&#xff0c;编译时都会被打包进vendor.js&#xff0c;浏览器在加载该文件之后才能开始显示首屏。若是引入的库众多&#xff0c;那么vendor.js文件体积将会相当的大&#xff0c;影响首屏的体验。通过调试发送时间主要消耗…...

【QT】】qcustomplot的使用

1.下载并添加qcustomplot.c和qcustomplot.h文件 拖动一个Widget&#xff0c;提升为qcustomplot 成功后是这样的&#xff0c; 改第三行&#xff1a;greaterThan(QT_MAJOR_VERSION, 4): QT widgets printsupport 编译&#xff0c;不报错&#xff0c;出现带坐标轴的界面&#…...

第三周日志-web(2)

原本计划的web不是这个&#xff0c;但是b站上一个大佬讲web做到了连我都能听懂&#xff0c;不趁热打铁学一学记一记就怕忘记了 指路&#xff1a;Shiro反序列化漏洞(一)-shiro550流程分析_哔哩哔哩_bilibili khttps://www.zhihu.com/question/486555909 学模板先看看结构和功…...

KICK第四讲Linux 系统下安装 GCC 编译器全指南

Linux 系统下安装 GCC 编译器全指南 GCC&#xff08;GNU Compiler Collection&#xff09;是 Linux 系统下最常用的编译器之一&#xff0c;支持 C/C、Java 等多种编程语言。本文将介绍不同 Linux 发行版下的安装方法&#xff0c;帮助开发者快速配置开发环境。 一、使用包管理…...

SpringCloud 学习笔记1(Spring概述、工程搭建、注册中心、负载均衡、 SpringCloud LoadBalancer)

文章目录 SpringCloudSpringCloud 概述集群和分布式集群和分布式的区别和联系 微服务什么是微服务&#xff1f;分布式架构和微服务架构的区别微服务的优缺点&#xff1f;拆分微服务原则 什么是 SpringCloud &#xff1f;核心功能与组件 工程搭建父项目的 pom 文件 注册中心Rest…...

go 安装swagger

1、依赖安装&#xff1a; # 安装 swag 命令行工具 go install github.com/swaggo/swag/cmd/swaglatest# 安装 gin-swagger 和 swagger 文件的依赖 go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files 2、测试 cmd中输入&#xff1a; swag -v 如果…...

Java中关于Optional的 orElse 操作,以及 orElse 与 orElseGet 的区别

文章目录 1. 大概说明2. 详细分析2.1 .orElse 操作2.2 .orElse 的作用&#xff1a;避免空指针异常2.3 为什么要用&#xff1f;2.4 orElseGet如何使用2.5 orElse和orElseGet的区别 1. 大概说明 这篇文章的目的是为了说明&#xff1a; orElse 如何使用orElseGet 如何使用两者的…...

Sqlmap注入工具简单解释

安装 1. 安装 Python SQLMap 是基于 Python 开发的&#xff0c;所以要先安装 Python 环境。建议安装 Python 3.9 或更高版本&#xff0c;可从 Python 官方网站 下载对应操作系统的安装包&#xff0c;然后按照安装向导完成安装。 2. 获取 SQLMap 可以从 SQLMap 的官方 GitHu…...

petalinxu 在zynq的FPGA下的ST7735S的驱动配置

spi的接线&#xff1a; 【TFT模块排针8】 【开发板spi,gpio】【antminers9】 VCC ----------- 3.3V ----------- 3.3V GND ----------- GND ----------- GND BLK(背光&#xff09;-------GPIO----------- BANK34_L4N_RXD2(w13; j2.12; gpio[2]) RST(复位&#xff…...

数据篇| App爬虫入门(一)

App 的爬取相比 Web 端爬取更加容易,反爬虫能力没有那么强,而且数据大多是以 JSON 形式传输的,解析更加简单。在 Web 端,我们可以通过浏览器的开发者工具监听到各个网络请求和响应过程,在 App 端如果想要查看这些内容就需要借助抓包软件。常见抓包软件有: ‌工具名称‌‌…...

【6】拓扑排序学习笔记

前言 有向无环图和拓扑排序直接关联到中后期的图论建模思想&#xff0c;是很重要的基础知识。这个如果不彻底弄懂&#xff0c;以后图论会很困难。 有向无环图 正如其名&#xff0c;一个边有向&#xff0c;没有环的图&#xff0c;也叫DAG。 DAG图实际运用&#xff1a;描述含…...

OpenCV实现图像特征提取与匹配

‌一、特征检测与描述子提取‌ ‌选择特征检测器‌ 常用算法包括&#xff1a; ‌ORB‌&#xff1a;一种高效的替代SIFT和SURF的算法&#xff0c;主要用于移动机器人和增强现实等领域。适合实时应用&#xff0c;结合FAST关键点与BRIEF描述子‌。‌SIFT&#xff08;尺度不变特征变…...

MyBatis 的核心配置文件是干什么的? 它的结构是怎样的? 哪些是必须配置的,哪些是可选的?

MyBatis 的核心配置文件&#xff08;通常命名为 mybatis-config.xml&#xff09;是 MyBatis 应用程序的入口点&#xff0c;它定义了 MyBatis 的全局配置信息 。 核心配置文件的作用&#xff1a; 配置 MyBatis 的运行时行为: 通过 <settings> 标签设置全局参数&#xff…...

VLAN,DHCP实验访问物理机

目标 三层交换机完成DHCP自动分配IP地址不同vlan间完成通信DNS服务器能够解析www.baidu.com&#xff0c;使PC机能够访问连接真实物理机&#xff0c;PC机与物理机能够互相访问 步骤 一、创建VLAN&#xff0c;配置好PC机和交换机的IP地址 LSW1 [LSW1]vlan batch 10 20 Info: T…...

六十天前端强化训练之第十七天React Hooks 入门:useState 深度解析

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、知识讲解 1. Hooks 是什么&#xff1f; 2. useState 的作用 3. 基本语法解析 4. 工作原理 5. 参数详解 a) 初始值设置方式 b) 更新函数特性 6. 注意事项 7. 类组…...

解决 HTTP 请求中的编码问题:从乱码到正确传输

文章目录 解决 HTTP 请求中的编码问题&#xff1a;从乱码到正确传输1. **问题背景**2. **乱码问题的原因**2.1 **客户端编码问题**2.2 **请求头缺失**2.3 **服务器编码问题** 3. **解决方案**3.1 **明确指定请求体编码**3.2 **确保请求头正确**3.3 **动态获取响应编码** 4. **调…...

跨国企业网络案例分析:SD-WAN智能组网

跨国企业面临的网络问题日益增加&#xff0c;如全球供应链协同、跨国研发协作及实时生产数据传输等场景&#xff0c;对网络质量提出更高要求。本文将深度解析某跨国工业集团如何通过SD-WAN实现网络架构智能化转型。 该集团以上海全球总部为核心&#xff0c;构建了覆盖亚欧美三大…...

视频孪生与三维视频融合:重构工业现场的“数字视网膜“

在浙江某精密制造企业的总控中心&#xff0c;30米长的曲面屏上实时跳动着工厂的每个生产细节&#xff1a;机械臂的运动轨迹与数字模型完全同步&#xff0c;质检工位的操作误差被自动标记&#xff0c;AGV小车的行进路径在三维空间中以光带形式可视化呈现。这种虚实交融的场景并非…...

STM32Cubemx-H7-7-OLED屏幕

如何把江科大的OLED标准库文件换成hal库的文件 前言 本文讲解如在hHAL库中使用OLED&#xff0c;其实江科大做的文件好已经很好了 只讲操作&#xff0c;不讲废话&#xff0c;默认大家都有32基本操作 创建工程 首先创建工程 把那两个引脚设置成开漏 获取标准库文件 打开江科大O…...

FPGA为何要尽量减少组合逻辑的使用

在FPGA设计中&#xff0c;组合逻辑的使用确实需要谨慎&#xff0c;尤其是要尽量减少它的复杂性。这并不是因为组合逻辑本身不好&#xff0c;而是因为它在实际应用中容易引发一系列问题&#xff0c;而这些问题往往与FPGA的设计哲学和硬件特性相冲突。让我从几个关键点来和你聊聊…...

缓存使用的具体场景有哪些?缓存的一致性问题如何解决?缓存使用常见问题有哪些?

缓存使用场景、一致性及常见问题解析 一、缓存的核心使用场景 1. 高频读、低频写场景 典型场景&#xff1a;商品详情页、新闻资讯、用户基本信息。特点&#xff1a;数据更新频率低&#xff0c;但访问量极高。策略&#xff1a; Cache-Aside&#xff08;旁路缓存&#xff09;&a…...

基于 RWA 模型与 AI - Agent 协同的企业级 aPAAS 架构设计

一、引言 在企业数字化转型不断深化的当下&#xff0c;现实世界资产&#xff08;RWA&#xff09;模型与人工智能智能体&#xff08;AI - Agent&#xff09;的协同融合&#xff0c;为企业级应用平台即服务&#xff08;aPAAS&#xff09;架构的创新发展带来了新契机。这种架构旨在…...

基于“动手学强化学习”的知识点(一):第 14 章 SAC 算法(gym版本 >= 0.26)

第 14 章 SAC 算法&#xff08;gym版本 &#xff1e; 0.26&#xff09; 摘要SAC 算法&#xff08;连续&#xff09;SAC 算法&#xff08;离散&#xff09; 摘要 本系列知识点讲解基于动手学强化学习中的内容进行详细的疑难点分析&#xff01;具体内容请阅读动手学强化学习&…...

【QT:信号和槽】

QT信号涉及的三要素&#xff1a;信号源、信号类型、信号的处理方式。 QT的信号槽机制&#xff1a; 给按钮的点击操作关联一个处理函数&#xff0c;用户点击按钮时触发&#xff0c;对应的处理函数就会执行 QT中使用connect函数将信号和槽关联起来&#xff0c;信号触发&#xf…...

Oracle中的INHERIT PRIVILEGES权限

Oracle中的INHERIT PRIVILEGES权限 存储过程和用户函数的AUTHID属性调用者权限vs定义者权限一个简单的示例INHERIT PRIVILEGES权限的含义INHERIT PRIVILEGES权限的安全隐患注意到Oracle 19c数据库中有如下权限信息: SQL> select grantor,grantee,table_name,privilege fro…...

Compose笔记(九)--Checkbox

这一节主要了解一下Compose中的Checkbox&#xff0c;它是Jetpack Compose UI框架中的一个组件&#xff0c;用于创建复选框功能。它允许用户从一个集合中选择一个或多个项目&#xff0c;可以将一个选项打开或关闭。与传统的Android View系统中的Checkbox相比&#xff0c;Compose…...

CSS中粘性定位

1.如何设置为粘性定位? 给元素设置posttion:sticky 即可实现粘性定位. 可以使用left, right ,top, bottom 四个属性调整位置,不过最常用的是top 值. 2.粘性定位的参考点在哪里? 离他最近的一个拥有"滚动机制"的祖先元素,即便这个祖先不是最近的真实可滚动祖先. 3.粘…...

日本IT|AWS工作内容及未来性、以及转职的所需资质和技能

AWSとは AWSはAmazon Web Services&#xff08;アマゾンウェブサービス&#xff09;の略称です。 名称から分かるとおり、ネットを通じた通販などを事業として行っているAmazon.com社がクラウドサービスとして運営しています。 本来であれば自分たちでインフラ環境を構築する…...

《Spring日志整合与注入技术:从入门到精通》

1.Spring与日志框架的整合 1.Spring与日志框架进行整合&#xff0c;日志框架就可以在控制台中&#xff0c;输出Spring框架运行过程中的一些重要的信息。 好处&#xff1a;方便了解Spring框架的运行过程&#xff0c;利于程序的调试。 Spring如何整合日志框架 Spring5.x整合log4j…...

如何判断一个项目用的是哪个管理器

如何判断一个项目用的是哪个管理器 npm: 如果项目中存在 package-lock.json 文件&#xff0c;这通常意味着项目使用 npm 作为包管理器。package-lock.json 文件会锁定项目的依赖版本&#xff0c;确保在不同环境中安装相同的依赖。 pnpm: 如果项目中存在 pnpm-lock.yaml 文件&a…...

软件工程概述

软件开发生命周期 软件定义时期&#xff1a;包括可行性研究和详细需求分析&#xff0c;任务是确定软件开发的总目标。 问题定义可行性研究&#xff08;经济、技术、操作、社会可行性&#xff0c;确定问题和解决办法&#xff09;需求分析&#xff08;确定功能需求&#xff0c;性…...

文件系统 linux ─── 第19课

前面博客讲解的是内存级文件管理,接下来介绍磁盘级文件管理 文件系统分为两部分 内存级文件系统 : OS加载进程 ,进程打开文件, OS为文件创建struct file 和文件描述符表 ,将进程与打开的文件相连, struct file 内还函数有指针表, 屏蔽了底层操作的差异,struct file中还有内核级…...

一篇博客搞定时间复杂度

时间复杂度 1、什么是时间复杂度&#xff1f;2、推导大O的规则3、时间复杂度的计算3.1 基础题 13.2 基础题 23.3基础题 33.4进阶题 13.5进阶题 23.6 偏难题 13.7偏难题 2&#xff08;递归&#xff09; 前言&#xff1a; 算法在编写成可执行程序后&#xff0c;运行时要耗费时间和…...

微信小程序实现根据不同的用户角色显示不同的tabbar并且可以完整的切换tabbar

直接上图上代码吧 // login/login.js const app getApp() Page({/*** 页面的初始数据*/data: {},/*** 生命周期函数--监听页面加载*/onLoad(options) {},/*** 生命周期函数--监听页面初次渲染完成*/onReady() {},/*** 生命周期函数--监听页面显示*/onShow() {},/*** 生命周期函…...

S_on@atwk的意思

S_onatwk 可能是某种自动化或控制系统中的符号或标记&#xff0c;尤其在PLC&#xff08;可编程逻辑控制器&#xff09;编程中&#xff0c;类似的表达方式通常用于表示特定的信号、状态或操作。 我们可以分析这个表达式的各个部分&#xff1a; S_on&#xff1a;通常&#xff0…...

Liunx启动kafka并解决kafka时不时挂掉的问题

kafka启动步骤 先启动zookeeper&#xff0c;启动命令如下 nohup ./zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties > /home/kafka/kafka/zookeeper.log 2>&1 &再启动kafka&#xff0c;启动命令如下 nohup ./kafka-server-start.sh…...