《Decoupled Contrastive Learning for Long-Tailed Recognition》阅读笔记

论文标题

《Decoupled Contrastive Learning for Long-Tailed Recognition》

针对长尾识别的解耦对比学习

作者

Shiyu Xuan 和 Shiliang Zhang

来自北京大学计算机学院多媒体信息处理国家重点实验室

初读

摘要

  • 监督对比损失(Supervised Contrastive Loss, SCL)

    • 监督对比损失在视觉表征学习中非常流行。

    • 给定一个锚定图像,SCL 会将两种正样本(即其增强版本和来自同一类的其他图像)拉在一起,同时将负样本推开以优化学习到的嵌入。

  • SCL 在长尾识别中的局限性

    • 在长尾识别的场景中,每个类的样本数量不平衡,将两种正样本平等对待会导致对类内距离的偏向优化。
    • 此外,被 SCL 忽略的负样本之间的相似性关系也呈现出有意义的语义线索。
  • 为了提高长尾识别的性能,本文通过解耦训练目标来解决 SCL 的这两个问题。

    • 具体来说,它将 SCL 中的两种正样本解耦,并针对不同的目标优化它们的关系,以减轻不平衡数据集的影响。
    • 我们进一步提出了一种基于补丁的自我蒸馏方法,将知识从头部类别传递到尾部类别,以缓解尾部类别的代表性不足。
      • 它使用基于补丁的特征来挖掘不同实例之间的共享视觉模式,并利用自我蒸馏过程来传递此类知识。
  • 在不同的长尾分类基准测试上的实验证明了我们方法的优势。

    • 例如,在 ImageNet-LT 数据集上实现了 57.7% 的 top-1 准确率。
    • 结合基于集成的方法,性能可以进一步提升到 59.7%,这大大超过了许多最近的工作。我们的代码将会发布。

结论

  • 为了解决长尾识别的挑战,本文分析了 SCL 中的两个问题,并通过 DSCL 和 PBSD 来解决这些问题。
    • DSCL 解耦了 SCL 中的两种正样本,并针对不同的目标优化它们的关系,以减轻不平衡数据集的影响。
    • PBSD 利用头部类别通过探索补丁级别的相似性关系来促进尾部类别的表征学习。
  • 在不同基准测试上的实验证明了我们方法的有希望性能,其中它超过了使用更昂贵设置的近期工作。
  • 将我们的方法扩展到长尾检测被认为是未来的工作。

再读

Section 1 Introduction

  • 长尾视觉识别

    • 益于强大的深度学习方法,各种视觉任务在手动平衡数据集上的性能已经显著提升。
    • 在现实世界的应用中,训练样本通常表现出长尾分布,其中少数头部类别贡献了大部分的观察结果,而许多尾部类别只与少数样本相关。
    • 长尾分布对视觉识别带来了两个挑战:
      • 为平衡数据集设计的损失函数可能很容易偏向头部类别。
      • 每个尾部类别包含的样本太少,无法代表视觉差异,导致尾部类别的代表性不足。
  • 监督对比损失(Supervised Contrastive Loss, SCL)

    • 通过优化类内-类间距离,SCL 已在平衡数据集上取得了令人印象深刻的性能。

    • 给定一个锚定图像,SCL 将两种正样本(即通过数据增强生成的锚定图像的不同视图,以及来自同一类的其他图像)拉在一起,

    • 这两种正样本指导模型学习不同的表征,

      • 即来自同一类别的图像强制学习语义线索,
      • 而通过外观变化增强的样本主要导致学习低级外观线索。
    • 图1(a)显示,SCL 有效地为头部类别学习语义特征,例如,学习的语义“蜜蜂”对杂乱背景具有鲁棒性。如图1(b)所示,SCL为尾部类别学习的表征对低级外观线索(如形状、纹理和颜色)更具区分性。

      在这里插入图片描述

      • 图片注解:图 1:使用 SCL 在头部类别(a)和尾部类别(b)上学习的特征进行的检索结果示例。在(b)中,SCL 学习的特征偏向于低级外观线索,而我们方法学习的特征对语义线索更具区分性。
  • 解耦对比学习(Decoupled Contrastive Learning,DCL)

    • 我们在概述部分的理论分析表明,SCL 对两种正样本施加了不平衡的梯度,导致对头部和尾部类别的偏向优化。
    • 因此,我们提出了解耦对比学习,它采用解耦监督对比损失(Decoupled Supervised Contrastive Loss,DSCL)来处理这个问题。具体来说,
      • DSCL 解耦了两种正样本,以重新制定类内距离的优化。它减轻了两种正样本的不平衡梯度。
      • 我们还提供了一个理论证明,DSCL 防止了学习偏向的类内距离。在图1(b)中,我们方法学习的特征对语义线索具有区分性,并在尾部类别的检索性能上有了实质性的提升。
  • 基于补丁的自我蒸馏(Patch-based Self Distillation, PBSD)

    • 为了进一步减轻长尾分布的挑战,我们提出了基于补丁的自我蒸馏,以利用头部类别来促进尾部类别的表征学习。
    • PBSD 采用自我蒸馏策略,通过挖掘不同类别之间的共享视觉模式,并将知识从头部类别传递到尾部类别,来更好地优化类间距离。
      • 我们引入了基于补丁的特征来表示来自一个对象的视觉模式。
      • 通过计算基于补丁的特征与实例级特征之间的相似性来挖掘共享的视觉模式,也就是说,如果一个实例与一个基于补丁的特征共享视觉模式,那么它们将具有高相似性。
      • 我们利用自我蒸馏损失来维持样本之间的相似性关系,并将这些知识整合到训练中。
  • 实验结果

    DSCL 和 PBSD 易于实现,并且显著提升了长尾识别的性能。

    • 我们在包括 ImageNet-LT、iNaturaList 2018 和 Places-LT 在内的几个长尾数据集上评估了我们的方法。实验结果表明,我们的方法比 SCL 提高了6.5%,并且与近期工作相比取得了更优的性能。
    • 例如,在 ImageNet-LT 上,它比最近的基于对比学习的方法 TSC 高出5.3%。
    • 我们的方法可以灵活地与例如 RIDE 这种基于集成的方法结合,后者在 iNaturaList 2018 上实现了74.9%的整体准确率,比最近的工作 CR 在整体准确率上高出 1.4%。
  • 本文贡献总结

    • 据我们所知,这是一个原创性贡献,它通过解耦两种正样本,并使用基于补丁的自我蒸馏来提升 SCL 在长尾识别上的性能。提出的 DSCL 解耦了不同类型的正样本,以追求在头部和尾部类别之间更平衡的类内距离优化。
    • 它还引入了相似性关系线索,以利用头部类别中的共享模式来优化尾部类别。
    • 在三个常用数据集上的大量实验已经展示了其有希望的性能。
    • 我们的方法易于实现,并且代码将会发布,以利于未来对长尾视觉识别的研究。

Section 2 Related Work

  • 长尾识别(Long-tailed recognition)
    • 长尾识别旨在解决在少数类别拥有大量样本而其他类别只与少量样本相关的情况下模型训练的问题。当前的研究可以分为四大类,分别是重新平衡方法(re-balancing)、解耦方法(decoupling)、迁移学习方法(transfer learning)和基于集成的方法(ensemble-based)。
    • 重新平衡方法使用重新采样(re-sampling)或重新加权(re-weighting)来处理长尾识别问题。
      • 重新采样方法通常包括对尾部类别的过采样或对头部类别的欠采样。
      • 除了重新采样,损失函数的重新加权也是一种有效的解决方案。
        • 例如,Balanced-Softmax (Ren et al. 2020) 基于贝叶斯估计提出了Softmax的无偏扩展。
      • 重新平衡方法可能会损害学习到的主干网络的区分能力。
    • 因此,解耦方法提出了两阶段训练,以解耦表征学习和分类器训练。
    • 迁移学习方法通过从头部类别转移知识到尾部类别来增强模型的性能。
      • BatchFormer 引入了一个单层 Transformer来通过学习每个小批量中的样本关系来转移知识。
    • 基于集成的方法利用多个专家来解决长尾视觉学习问题。RIDE 提出了一个多分支网络来并行学习多样化的分类器。尽管基于集成的方法取得了优越的性能,但引入多个专家增加了参数数量和计算复杂性。
  • 对比学习(Contrastive learning)
    • 对比学习因其在表征学习上的优越性能而受到了广泛关注。对比学习的目标是找到一个能够通过将正样本对拉近同时将负样本对推开来编码语义相似性的特征空间。
    • 一些研究者已经在长尾识别中利用了对比学习。
      • 例如,KCL 发现基于对比学习的自监督学习可以学习到一个平衡的特征空间。为了利用有用的标签信息,他们通过引入k-正采样方法扩展了 SCL。
      • TSC 通过使不同类的特征收敛到预定义的均匀分布目标来改善特征分布的均匀性。
      • 一些方法(Yun et al. 2022; Zhang et al. 2023)通过结合局部化信息来扩展对比学习,以利于密集预测任务。
  • 本文工作与之前的工作在几个方面有所不同:
    • 现有的使用对比学习的长尾识别工作平等对待两种正样本。据我们所知,这是最早揭示平等对待两种正样本会导致跨类别优化偏差的工作之一。因此,我们提出了一个解耦的监督对比损失,以追求平衡的类内距离优化。
    • 我们进一步通过引入基于补丁的自我蒸馏来扩展对比学习,以在类别之间转移知识,减轻尾部类别的代表性不足,并导致对类间距离的更有效优化。
    • 与其他迁移学习方法不同,PBSD 利用基于补丁的特征来挖掘不同类别之间的共享模式,并设计一个自我蒸馏过程来转移知识。自我蒸馏过程不依赖于大型教师模型或多专家模型(Li et al. 2022),使其效率更高。
    • 与仅从图像的不同视图挖掘相似补丁的基于补丁的对比学习方法相比,PBSD 在不同的图像之间转移知识。这些差异以及在大量实验中的有希望性能突出了这项工作的贡献。

Section 3 Methodology

3.1 Analysis of SCL

  • 长尾图像分类任务的公式化描述:

    • 给定一个训练数据集 D = { x i , y i } i = 1 n \mathcal{D}=\{x_i,y_i\}^n_{i=1} D={xi,yi}i=1n,其中 x i x_i xi 表示一个图像, y i ∈ { 1 , … , K } y_i\in\{1,\dots,K\} yi{1,,K} 是其类别标签。
    • 假设 n k n^k nk 表示类 k k k D \mathcal{D} D 中的基数(即样本数量),并且类的索引按基数降序排序,即如果 a < b a<b a<b,则 n a ≥ n b n^a\ge n^b nanb
    • 在长尾识别中,训练数据集是不平衡的,即 n 1 ≫ n K n^1\gg n^K n1nK,不平衡比定义为 n 1 / n K n^1/n^K n1/nK
    • 对于图像分类任务,算法旨在学习一个特征提取主干网络 v i = f θ ( x i ) v_i=f_θ(x_i) vi=fθ(xi),和一个线性分类器,
      • 它首先将图像 x i x_i xi 映射到一个全局特征图 u i u_i ui,并使用全局池化得到一个 d d d 维特征向量 v i v_i vi
      • 然后,它将特征向量分类到一个 K K K 维的分类得分。通常,测试数据集 T \mathcal{T} T 是平衡的。
  • 监督对比学习(Supervised Contrastive Learning, SCL)通常被用来学习特征提取主干网络。

    • 给定一个锚定图像 x i x_i xi,定义 z i = g γ ( v i ) z_i=g_\gamma(v_i) zi=gγ(vi) 为通过主干网络和一个额外的投影头 g γ g_\gamma gγ 提取的归一化特征, z i + z^+_i zi+ 为通过数据增强生成的 x i x_i xi 的正样本的归一化特征。
    • 我们使用 M M M 来表示可以通过记忆队列获取的样本特征集合,并使用 P i P_i Pi 来表示从 M M M 中提取的 x i x_i xi 的正特征集合,其中 P i = { z t ∈ M : y t = y i } P_i=\{z_t\in M:y_t=y_i\} Pi={ztM:yt=yi}
  • SCL 通过将锚定图像及其正样本拉近来减小类内距离,同时通过将不同类标签的图像推开来增大类间距离,即:
    L s c l = − 1 ∣ P i ∣ + 1 ∑ z t ∈ { z i + ∪ P i } log ⁡ p ( z t ∣ z i ) , ( 1 ) \mathcal{L}_{scl}=\frac{-1}{|P_i|+1}\sum_{\mathrm{z}_t\in\{\mathrm{z}_i^+\cup P_i\}}\log p(\mathrm{z}_t|\mathrm{z}_i),\qquad(1) Lscl=Pi+11zt{zi+Pi}logp(ztzi),(1)

    • 其中 ∣ P i ∣ |P_i| Pi P i P_i Pi 的基数(即集合中元素的数量)。

    • 使用 τ \tau τ 表示一个预定义的温度参数,条件概率 p ( z t ∣ z i ) p(z_t|z_i) p(ztzi) 计算如下:
      p ( z t ∣ z i ) = exp ⁡ ( z t ⋅ z i / τ ) ∑ z m ∈ { z i + ∪ M } exp ⁡ ( z m ⋅ z i / τ ) . ( 2 ) p(\mathrm{z}_t|\mathrm{z}_i)=\frac{\exp(\mathrm{z}_t\cdot\mathrm{z}_i/\tau)}{\sum_{\mathrm{z}_m\in\{\mathrm{z}_i^+\cup M\}}\exp(\mathrm{z}_m\cdot\mathrm{z}_i/\tau)}.\qquad(2) p(ztzi)=zm{zi+M}exp(zmzi/τ)exp(ztzi/τ).(2)

    • 等式(1)可以表述为一个分布对齐任务,
      L a l i g n = ∑ z t ∈ { z i + ∪ M } − p ^ ( z t ∣ z i ) log ⁡ p ( z t ∣ z i ) , ( 3 ) \mathcal{L}_{align}=\sum_{\mathrm{z}_t\in\{\mathrm{z}_i^+\cup M\}}-\hat{p}(\mathrm{z}_t|\mathrm{z}_i)\log p(\mathrm{z}_t|\mathrm{z}_i),\qquad(3) Lalign=zt{zi+M}p^(ztzi)logp(ztzi),(3)

      • 其中 p ^ ( z t ∣ z i ) \hat{p}(z_t|z_i) p^(ztzi) 是目标分布的概率。

      • 对于 z i + z^+_i zi+ z t ∈ P i z_t\in P_i ztPi,SCL 将它们平等地视为正样本,并将它们的目标概率设置为 1 / ( ∣ P i ∣ + 1 ) 1/(|P_i|+1) 1/(Pi+1)

      • 对于 M M M 中不同类标签的其他图像,SCL 将它们视为负样本,并设置它们的目标概率为 0。

  • 关于梯度:

    • 对于锚定图像 x i x_i xi 的特征 z i z_i zi,SCL 的梯度为:
      ∂ L s c l ∂ z i = 1 τ { ∑ z j ∈ N i z j p ( z j ∣ z i ) + z i + ( p ( z i + ∣ z i ) − 1 ∣ P i ∣ + 1 ) + ∑ z t ∈ P i z t ( p ( z t ∣ z i ) − 1 ∣ P i ∣ + 1 ) } , ( 4 ) \frac{\partial\mathcal{L}_{scl}}{\partial\mathrm{z}_{i}}=\frac{1}{\tau}\Bigg\{\sum_{\mathrm{z}_{j}\in N_{i}}\mathrm{z}_{j}p(\mathrm{z}_{j}|\mathrm{z}_{i}) +\mathrm{z}_{i}^{+}\left(p(\mathrm{z}_{i}^{+}|\mathrm{z}_{i})-\frac{1}{|P_{i}|+1}\right)+\sum_{\mathrm{z}_{t}\in P_{i}}\mathrm{z}_{t}\left(p(\mathrm{z}_{t}|\mathrm{z}_{i})-\frac{1}{|P_{i}|+1}\right)\Bigg\},\qquad(4) ziLscl=τ1{zjNizjp(zjzi)+zi+(p(zi+zi)Pi+11)+ztPizt(p(ztzi)Pi+11)},(4)

      • 其中 N i N_i Ni x i x_i xi 的负集合,包含从 { z j ∈ M : y j ≠ y i } \{\mathrm{z}_j\in M:y_j\ne y_i\} {zjM:yj=yi} 中提取的特征。
    • SCL 涉及两种类型的正样本 z i + z^+_i zi+ z t ∈ P i z_t\in P_i ztPi。我们将锚定图像与两种类型的正样本拉近的梯度计算为:
      ∂ L s c l ∂ z i ∣ z i + = z i + ( p ( z i + ∣ z i ) − 1 ∣ P i ∣ + 1 ) , ∂ L s c l ∂ z i ∣ z t = z t ( p ( z t ∣ z i ) − 1 ∣ P i ∣ + 1 ) , z t ∈ P i . ( 5 ) \begin{align} \left.\frac{\partial\mathcal{L}_{scl}}{\partial\mathrm{z}_{i}}\right|_{\mathrm{z}_{i}^{+}}&=\mathrm{z}_{i}^{+}\left(p(\mathrm{z}_{i}^{+}\mid\mathrm{z}_{i})-\frac{1}{|P_{i}|+1}\right), \\ \frac{\partial\mathcal{L}_{scl}}{\partial\mathrm{z}_{i}}\Bigg|_{\mathrm{z}_{t}}&=\mathrm{z}_{t}\left(p(\mathrm{z}_{t}|\mathrm{z}_{i})-\frac{1}{|P_{i}|+1}\right),\mathrm{z}_{t}\in P_{i}. \end{align}\qquad(5) ziLscl zi+ziLscl zt=zi+(p(zi+zi)Pi+11),=zt(p(ztzi)Pi+11),ztPi.(5)

    • 在训练开始时,两种正样本的梯度 L 2 L_2 L2 范数之比为,
      ∥ ∂ L s c l ∂ z i ∥ z i + ∑ z t ∈ P i ∥ ∂ L s c l ∂ z i ∥ z t ≈ 1 ∣ P i ∣ . ( 6 ) \frac{\left\|\frac{\partial\mathcal{L}_{scl}}{\partial\mathbf{z}_{i}}\right\|_{\mathbf{z}_{i}^{+}}}{\sum_{\mathbf{z}_{t}\in P_{i}}\left\|\frac{\partial\mathcal{L}_{scl}}{\partial\mathbf{z}_{i}}\right\|_{\mathbf{z}_{t}}}\approx\frac{1}{|P_{i}|}.\qquad(6) ztPi ziLscl zt ziLscl zi+Pi1.(6)

  • 当 SCL 收敛时, z i + z^+_i zi+ 的最优条件概率为,
    p ( z i + ∣ z i ) = 1 ∣ P i ∣ + 1 . ( 7 ) p(\mathrm{z}_i^+|\mathrm{z}_i)=\frac{1}{|P_i|+1}.\qquad(7) p(zi+zi)=Pi+11.(7)

上述计算的详细证明可以在补充材料中找到。

  • SCL 的偏向性:

    • 在 SCL 中,记忆队列 M M M 是从训练集中均匀采样的,这导致 ∣ P i ∣ ≈ n y i n ∣ M ∣ |P_i|\approx\frac{n^{y_i}}{n}|M | PinnyiM。在一个平衡的数据集中, n 1 ≈ n 2 ≈ ⋯ ≈ n K n_1\approx n_2 \approx\cdots\approx n_K n1n2nK,从而使得不同类别之间的 ∣ P i ∣ |P_i| Pi 保持平衡。
    • 对于一个具有不平衡 ∣ P i ∣ |P_i| Pi 的长尾数据集,由于方程 (4) 中的第三项主导了梯度,SCL 使得头部类别更加关注将锚定特征 z i z_i zi P i P_i Pi 中的特征拉近。
  • 头类与尾类的不同特征表示:

    • 如图 2 所示,两种正样本拉扯的梯度 L 2 L_2 L2 范数之比是不平衡的。

      在这里插入图片描述

      • 图片注解:图 2:在 ImageNet-LT 上,根据方程 (6) 计算的拉扯锚定图像与两种正样本的平均梯度 L2 范数比。‘*’ 表示理论比值。SCL 平等对待两种正样本,导致优化不平衡。两种正样本指的是数据增强和其他同类的图像。
    • 当 SCL 的训练收敛时, p ( z i + ∣ z i ) p(\mathrm{z}^+_i|\mathrm{z}_i) p(zi+zi) 的最优值也受到 ∣ P i ∣ |P_i| Pi 的影响,如图 7 所示。不同类别间学习到的特征不一致性在图 1 (a) 和 (b) 中得到了说明。

    • 这一现象也被 (Wei et al. 2020) 所验证,即通过与 z i + z^+_i zi+ P i P_i Pi 中的样本拉扯 z i z_i zi 会导致学习到不同的表示,即分别对尾部类别和头部类别学习外观特征和语义特征。

  • 方程 (4) 也表明,SCL 平等地推开所有负样本来增大类间距离。这种策略忽略了不同类别之间有价值的相似线索。为了寻求更好地优化类内和类间距离的方法,我们提出了解耦监督对比损失(DSCL)来解耦两种正样本以防止偏置优化,以及基于补丁的自我蒸馏(PBSD)来利用类别之间的相似线索。

3.2 Decoupled Supervised Contrastive Loss

解耦监督对比损失

  • DSCL 的提出是为了确保对不同类别之间的类内距离进行更均衡的优化。它解耦了两种正样本,并为它们添加不同的权重,使得梯度 L2 范数比和 p ( z i + ∣ z i ) p(\mathrm{z}^+_i|\mathrm{z}_i) p(zi+zi) 的最优值不受每个类别样本数量的影响。我们表示 DSCL 为:
    L d s c l = − 1 ∣ P i ∣ + 1 ∑ z l ∈ { z i + ∪ P i } log ⁡ exp ⁡ w t ( z t ⋅ z i / τ ) ∑ z m ∈ { z i + ∪ M } exp ⁡ ( z m ⋅ z i / τ ) , ( 8 ) \mathcal{L}_{dscl}=\frac{-1}{|P_{i}|+1}\sum_{\mathrm{z}_{l}\in\{\mathrm{z}_{i}^{+}\cup P_{i}\}}\log\frac{\exp w_{t}(\mathrm{z}_{t}\cdot\mathrm{z}_{i}/\tau)}{\sum_{\mathrm{z}_{m}\in\{\mathrm{z}_{i}^{+}\cup M\}}\exp(\mathrm{z}_{m}\cdot\mathrm{z}_{i}/\tau)},\qquad(8) Ldscl=Pi+11zl{zi+Pi}logzm{zi+M}exp(zmzi/τ)expwt(ztzi/τ),(8)

    • 其中
      w t = { α ( ∣ P i ∣ + 1 ) , z t = z i + ( 1 − α ) ( ∣ P i ∣ + 1 ) ∣ P i ∣ , z t ∈ P i ( 9 ) w_t=\begin{cases}\alpha(|P_i|+1),&\mathrm{z}_t=\mathrm{z}_i^+\\\frac{(1-\alpha)(|P_i|+1)}{|P_i|},&\mathrm{z}_t\in P_i\end{cases}\qquad(9) wt={α(Pi+1),Pi(1α)(Pi+1),zt=zi+ztPi(9)

      • 其中 α ∈ [ 0 , 1 ] \alpha\in[0,1] α[0,1] 是一个预定义的超参数。
    • 所提出的 DSCL 是 SCL 在平衡和不平衡两种情况下的广义化。如果数据集是平衡的,通过设置 α = 1 / ( ∣ P i ∣ + 1 ) \alpha=1/(|P_i|+1) α=1/(Pi+1),DSCL 就等同于 SCL。

  • 接下来我们将说明为什么公式 (8) 能带来更均衡的优化。

    • 在训练开始时,两种正样本的梯度 L2 范数比为:
      ∥ ∂ L d s c l ∂ z i ∣ z i + ∥ 2 ∑ z t ∈ P i ∥ ∂ L d s c l ∂ z i ∣ z t ∥ 2 ≈ α 1 − α . ( 10 ) \frac{\left\|\frac{\partial\mathcal{L}_{dscl}}{\partial\mathrm{z}_i}|_{\mathrm{z}_i^+}\right\|_2}{\sum_{\mathrm{z}_t\in P_i}\left\|\frac{\partial\mathcal{L}_{dscl}}{\partial\mathrm{z}_i}|_{\mathrm{z}_t}\right\|_2}\approx\frac{\alpha}{1-\alpha}.\qquad(10) ztPi ziLdsclzt 2 ziLdsclzi+ 21αα.(10)

    • 当 DSCL 收敛时, z i + \mathrm{z}^+_i zi+ 的最优条件概率为 p ( z i + ∣ z i ) α p(\mathrm{z}^+_i|\mathrm{z}_i)\alpha p(zi+zi)α,详细证明见补充材料。

    • 如图 2 所示,方程(10)表明,两种正样本的梯度比不受 ∣ P i ∣ |P_i| Pi 的影响。DSCL 还确保 p ( z i + ∣ z i ) p(\mathrm{z}^+_i|\mathrm{z}_i) p(zi+zi) 的最优值不受 ∣ P i ∣ |P_i| Pi 的影响,从而减轻了头部和尾部类别之间不一致的特征学习问题。

3.3 Patch-based Self Distillation

基于补丁的自我蒸馏

  • 共享视觉模式:

    • 视觉模式可以在不同类别之间共享,例如,“轮子”的视觉模式被“卡车”、“汽车”和“公共汽车”这些类别共享。尾类中许多视觉模式的特征可以从共享这些视觉模式的头类中学习到,从而降低尾部类别表征学习的难度。SCL 在特征空间中将不同类别的两个实例推开,即使它们共享有意义的视觉模式。

    • 如图 4 所示,我们从黄色边界框中提取查询补丁特征,并从数据集中检索出最相似的前 3 个样本。SCL 的检索结果(“w/o PBSD”表示没有 PBSD)与查询补丁在语义上无关,这表明 SCL 在学习和利用补丁级别的语义线索方面并不奏效。

      在这里插入图片描述

      • 图片注解:图 4:在 ImageNet-LT 上的基于补丁的图像检索结果(返回前 3 个)。查询补丁用黄色边界框突出显示。查询补丁特征在检索图像上的响应图也进行了说明。
  • 受细粒度图像识别中基于补丁的方法的启发,我们引入了基于补丁的特征来编码视觉模式。

    • 给定由主干网络提取的图像 x i \mathrm{x}_i xi 的全局特征图 u i \mathrm{u}_i ui,我们首先随机生成一些补丁框。这些补丁框的坐标表示为 { B i [ j ] } j = 1 L \{\mathrm{B}_i[j]\}^L_{j=1} {Bi[j]}j=1L,其中 L L L 是补丁框的数量。

    • 我们根据这些补丁框的坐标应用 ROI 池化,并将池化特征送入一个投影头,以获得归一化的嵌入特征 c i [ j ] j = 1 L {\mathrm{c}_i[j]}^L_{j=1} ci[j]j=1L
      c i [ j ] = g γ ( R O I ( u i , B i [ j ] ) ) . ( 11 ) \mathrm{c}_i[j]=\mathrm{g}_\gamma\left(\mathrm{ROI}\left(\mathrm{u}_i,\mathrm{B}_i[j]\right)\right).\qquad(11) ci[j]=gγ(ROI(ui,Bi[j])).(11)

    • 与公式 (2) 类似,利用条件概率来计算实例之间的相似性关系,
      p ( z t ∣ c i j ) = exp ⁡ ( z t ⋅ c i [ j ] / τ ) ∑ z m ∈ { z i + ∪ M } exp ⁡ ( z m ⋅ c i [ j ] / τ ) . ( 12 ) p(\mathrm{z}_t|\mathrm{c}_i^j)=\frac{\exp(\mathrm{z}_t\cdot\mathrm{c}_i[j]/\tau)}{\sum_{\mathrm{z}_m\in\{\mathrm{z}_i^+\cup M\}}\exp(\mathrm{z}_m\cdot\mathrm{c}_i[j]/\tau)}.\qquad(12) p(ztcij)=zm{zi+M}exp(zmci[j]/τ)exp(ztci[j]/τ).(12)

    • 如果 z t \mathrm{z}_t zt 所对应的图像与基于斑块的特征具有共同的视觉模式,则 z t \mathrm{z}_t zt c i [ j ] \mathrm{c}_i[j] ci[j] 将具有很高的相似性。因此,公式(12)编码了每对实例之间的相似性线索。

    • 我们将相似性线索作为监督训练过程的知识。为了维持这种知识,我们还根据 B i [ j ] j = 1 L {\mathrm{B}_i[j]}^L_{j=1} Bi[j]j=1L 从图像中裁剪多个图像补丁,并使用主干网络提取它们的特征嵌入 s i [ j ] j = 1 L {\mathrm{s}_i[j]}^L_{j=1} si[j]j=1L
      s i [ j ] = g γ ( f θ ( C r o p ( x i , B i [ j ] ) ) ) . ( 13 ) \mathrm{s}_i[j]=\mathrm{g}_\gamma\left(\mathrm{f}_\theta\left(\mathrm{Crop}(\mathrm{x}_i,B_i[j])\right)\right).\qquad(13) si[j]=gγ(fθ(Crop(xi,Bi[j]))).(13)

    • PBSD 通过以下损失强制图像补丁的特征嵌入产生与基于补丁的特征相同的相似度分布:
      L p b s d = 1 L ∑ j = 1 L ∑ z t ∈ { z i + ∪ M } − p ( z t ∣ c i [ j ] ) log ⁡ p ( z t ∣ s i [ j ] ) , ( 14 ) \mathcal{L}_{pbsd}=\frac{1}{L}\sum_{j=1}^{L}\sum_{z_{t}\in\{z_{i}^{+}\cup M\}}-p(\mathrm{z}_{t}|\mathrm{c}_{i}[j])\log p(\mathrm{z}_{t}|\mathrm{s}_{i}[j]),\qquad(14) Lpbsd=L1j=1Lzt{zi+M}p(ztci[j])logp(ztsi[j]),(14)
      注意, p ( z t ∣ c i [ j ] ) p(\mathrm{z}_t|\mathrm{c}_i[j]) p(ztci[j]) 已经从计算图中分离出来以阻止梯度传播。

  • 对象的局部视觉模式可以被不同的类别共享。

    • 因此,我们使用基于补丁的特征来表示视觉模式。通过计算 p ( z t ∣ c i [ j ] ) p(\mathrm{z}_t|\mathrm{c}_i[j]) p(ztci[j]) 来挖掘图像之间共享模式的关系。
    • 最小化方程(14)可以保持共享模式,以传递知识并减轻尾部类别的代表性不足。
    • 图 4 中展示的检索结果表明,我们的方法有效地加强了补丁级特征和补丁到图像相似性的学习,使得能够挖掘不同类别之间的共享视觉模式。实验也验证了 PBSD 损失对性能提升的重要性。
  • 多裁剪技巧在自监督学习中常用,用于生成锚定图像的更多增强样本。

    • 它引入低分辨率裁剪以减少计算复杂性。我们的动机和损失设计及多裁剪策略不同。

    • PBSD 的动机是利用头部和尾部类别之间的共享模式来辅助尾部类别的学习。

    • 通过 ROI 池化获得的基于补丁的特征来表示共享模式。方程(14)执行自我蒸馏以保持共享模式。

    • 我们进行了一项实验,通过用多裁剪技巧替换 PBSD。如表 1 所示,在 ImageNet-LT 上的性能从 57.7% 下降到 56.1%,这表明 PBSD 比多裁剪策略更有效。

      在这里插入图片描述

      • 图片注解:表 1:我们方法中每个组件在 ImageNet-LT 上的有效性。SCL 作为基准。 ∗ * 表示使用全局视图的特征而不是基于补丁的特征来计算方程(14)。 † \dagger 表示使用多裁剪技巧而不是 PBSD。

3.4 Training Pipeline

训练流程

  • 我们在图 3 中展示了我们的方法。

    在这里插入图片描述

    • 图片注解:图 3:所提出方法的说明。对训练图像进行数据增强以获得两个全局视图。然后从全局视图中裁剪出一个小补丁。使用主干网络和指数移动平均(EMA)主干来提取归一化特征。这些特征用于计算与记忆队列 M 的相似度分布。 L d s c l \mathcal{L}_{dscl} Ldscl 通过拉近锚定图像与其正样本并推开锚定图像与其负样本来优化特征空间。 L p b s d \mathcal{L}_{pbsd} Lpbsd 通过模仿两个相似度分布来传递知识。
  • 为了维护一个记忆队列,我们使用了如 (He et al. 2020) 所述的动量更新模型。训练是由两种损失监督的,即解耦的监督对比损失和基于补丁的自我蒸馏损失。整体训练损失表示为:
    L o v e r a l l = L d s c l + λ L p b s d , ( 15 ) \mathcal{L}_{overall}=\mathcal{L}_{dscl}+\lambda\mathcal{L}_{pbsd},\qquad(15) Loverall=Ldscl+λLpbsd,(15)

    • 其中, λ \lambda λ 是损失重量。
  • 我们的方法专注于表征学习,可以通过拼接他们的损失应用于不同的任务。

    • 遵循 (Li et al. 2021; Kang et al. 2020) 的做法,在主干网络的训练完成后,我们丢弃了学习的投影头 g γ ( ⋅ ) g_\gamma(\cdot) gγ(),并在学习的主干网络上使用标准的交叉熵损失和类平衡采样策略训练一个线性分类器。
    • 下一节将介绍我们对所提出方法的评估。

Section 5 Experiments

5.1 Experimental Setup

  • 数据集:

    我们使用三个流行的数据集来评估长尾识别性能。

    • ImageNet-LT 包含1,000个类别的115,846张训练图像,这些图像是从ImageNet-1K 中采样而来的,类基数从 5 到 1,280 不等。
    • iNaturaList 2018 是一个真实世界中的长尾数据集,包含 8,142 个类别的 437,513 张训练图像,类基数从 2 到 1,000 不等。
    • Places-LT 包含 365 个类别的 62,500 张训练图像,这些图像是从 Places 中采样而来的,类基数从 5 到 4,980 不等。
  • 评估指标

    • 我们遵循标准评估指标,在测试集上评估我们的模型,并报告所有类别的整体 top-1 准确率。
    • 为了进行详细分析,我们遵循 (Liu et al. 2019) 的做法,根据类别的图像数量将类别分组为多个部分:许多(Many,> 100),中等(Medium,20 - 100),以及少数(Few,< 20)。
  • 实现细节

    • 为了公平比较,我们遵循 TSC 和 KCL 的实现,
      • 首先在第一阶段训练主干网络,然后在第二阶段使用冻结学习的 backbone 训练线性分类器。
      • 除了使用在 ImageNet1K 上预训练的 ResNet-152 用于 Places-LT 外,我们在所有实验中都采用 ResNet-50 作为主干网络。
      • 方程(9)中的 α \alpha α 设置为 0.1,方程(15)中的损失权重 λ \lambda λ 设置为 1.5。
    • 在第一阶段,基本框架与 MoCoV2 相同,
      • 用于更新 EMA 模型的动量值为 0.999,温度 τ \tau τ 设置为 0.07,记忆队列 M M M 的大小为 65536,投影头的输出维度为 128。
      • 数据增强与 MoCoV2 相同。
      • 从全局视图中随机采样补丁特征的位置,其缩放比例为 (0.05, 0.6)。从全局视图中裁剪的图像补丁被调整大小到 64。
      • 每个锚定图像的基于补丁的特征 L L L 为 5。
      • 使用 SGD 优化器,学习率从 0.1 开始,通过余弦调度器在 200 个 epoch 中从 0.1 衰减到 0,批次大小为 256,使用 2 张 Nvidia RTX 3090 进行训练。
      • 对于 Places-LT,我们只对主干网络的最后块进行微调,训练 30 个 epoch。
    • 在第二阶段,参数与 (Li et al. 2021) 相同。
      • 使用 SGD 优化器,ImageNet-LT, iNaturaList 2018, 和 Places-LT 数据集上学习率分别初始化为 10, 30, 2.5 ,且分别在 epoch 20 和 30 乘以 0.1,
      • 使用 CE 损失和类平衡采样训练线性分类器,批次大小为 2048,训练 40 个 epoch。

5.2 Ablation Study

消融实验

  • 组件分析(Components analysis)

    • 我们在表 1 中对每个提出的组件在 ImageNet-LT 上的有效性进行了分析。SCL 被用作基准。
    • 与 SCL 基线相比,DSCL 提高了 top-1 准确率 1.4%。这个结果已经比最近基于对比学习的 TSC 方法更好。
    • 许多用于长尾分类的方法可以提高尾部类别的性能,但会牺牲头部类别的性能。与那些工作不同,PBSD 提高了头部和尾部类别的性能。
    • 表 1 清楚地表明,DSCL 和 PBSD 的组合实现了最佳性能。引入基于补丁的特征对 PBSD 非常重要。我们进行了实验,使用全局视图的特征来计算方程(14)。这导致整体准确率下降了约 1.5%。
    • 此外,我们的方法也比多裁剪技巧更有效,即它比多裁剪技巧提高了 1.6% 的整体准确率。
    • 总的来说,我们方法中的每个组件都有助于提高性能。
  • 不同主干网络的组件分析(Components analysis on different backbones)

    • 为了验证我们的方法在不同主干网络上都能很好地推广,我们在 ImageNet-LT 上进一步进行了使用 ResNeXt50 作为主干网络的实验。

    • 结果总结在表 2 中,其中我们的提出的组件在 ResNext50 上也有效。DSCL 和 PBSD 都可以带来性能提升。它们的组合实现了最佳性能。

      在这里插入图片描述

      • 图片注解:表 2:在不同主干网络上对我们方法中每个组件的消融研究。
  • α \alpha α 在方程(9)中的影响(The impact of α \alpha α in Eq)

    • α \alpha α 在方程(9)中的影响在图 5(a)中进行了调查

      在这里插入图片描述

      • 图片注解:图5:在 ImageNet-LT 上,分别对方程(9)中的 α \alpha α、每个锚定图像的基于补丁的特征数量 L L L,以及损失权重 λ \lambda λ 进行评估,如图(a)、(b)和(c)所示。图(a)中的绿色虚线表示基线 SCL。
    • α \alpha α 决定了拉锚定图像与其数据增强的样本的权重。

    • α = 0 \alpha=0 α=0 意味着只拉锚定图像与其同一类的其他图像。

      • 这种设置将准确率从 57.7% 降低到 56.8%,显示了涉及两种正样本的重要性。
      • 此外,这种设置仍然优于 SCL 基线,如图中的绿色虚线所示。这表明防止偏差特征是重要的。
    • α = 1 \alpha=1 α=1 会使损失退化为自监督损失。

      • 由于缺乏标签信息,准确率仅为 39.8%。我们设置 α \alpha α 为 0.1,这得到了最佳性能。
      • α \alpha α 设置为 0.1 也在不同数据集上取得了有竞争力的性能,如图随后的实验所示。
  • 每个锚定图像的基于补丁的特征数量的影响(The impact of the number of patch-based features)

    • 每个锚定图像的基于补丁的特征数量的影响在图 5(b)中显示。
    • 模型受益于将更多基于补丁的特征纳入训练。
    • 当将 L L L 从 1 增加到 5 时,top-1 准确率从 55.0% 提高到 57.7%。
      • 我们设置 L L L 为 5,以在训练成本和准确率之间取得合理的权衡。
  • 损失权重 λ \lambda λ 的影响(The impact of the loss weight λ \lambda λ

    • 损失权重 λ \lambda λ 的影响在图 5(c)中显示。
    • 因为 λ \lambda λ 权重 PBSD 的影响,该图显示 PBSD 很重要。
      • λ \lambda λ 从 1 增加到 2 获得相似的性能。
      • 我们为不同数据集将其设置为 1.5。

5.3 Comparison with Recent Works

与近期工作的比较

  • 我们将我们的方法与 ImageNet-LT、iNaturaList 2018 和 Places-LT 上的最近工作进行了比较。比较的方法包括:

    • 重新平衡方法(Ren et al. 2020)

    • 解耦方法(Kang et al. 2019; Zhang et al. 2021)

    • 基于迁移学习的方法(Hou, Yu, and Tao 2022)

    • 扩展 SCL 方法(Kang et al. 2020; Li et al. 2021; Cui et al. 2021; Zhu et al. 2022)

    • 基于集成的方法(Li et al. 2022; Zhang et al. 2022; Wang et al. 2020)

    • 实验结果总结在表3中。

      在这里插入图片描述

      • 图片注解:表 3:在 ImageNet-LT、iNaturaList2018 和 Places-LT 上与最近方法的比较。CE 表示使用交叉熵损失训练模型。 ∗ ∗ 表示我们方法的第二阶段学习率初始化为 2.5。 ‡ ‡ 表示模型训练没有使用 RandAug 并且为了公平比较,训练了 200 个 epoch。 † \dagger 表示模型使用了 RandAug 并且训练了 400 个 epoch,这比我们的训练设置更昂贵。
  • 如表 3 所示,直接使用交叉熵损失会导致尾部类别的性能较差。

    • 大多数长尾识别方法可以提高整体性能,但会牺牲“许多”部分的准确性。
    • 与重新平衡方法相比,解耦方法在训练后调整分类器,并取得了更好的性能,展示了两阶段训练策略的有效性。
    • 与上述工作相比,基于迁移学习的方法在头部类别上取得了更好的性能。例如,BatchFormer 在“许多”部分比与它具有相同整体准确率的 DisAlign 获得了更高的准确性。
  • 我们的方法在 ImageNet-LT 上实现了最高的整体准确率 57.7%。它还超过了使用更强数据增强和两倍训练周期的 PaCo。

    • 为了公平比较,我们使用与我们的方法相同的数据增强和训练周期来训练 PaCo,这使得其准确率从 57.0% 下降到 53.6%。
    • 我们还发现,第二阶段线性分类器训练的学习率可以改变“许多”、“中等”和“少数”部分的准确性分布,同时保持相同的整体准确率。
      • 例如,在第二训练阶段使用 2.5 的学习率,少数部分的准确性从 35.4% 增加到 38.7%,而整体准确率仅下降了约 0.3%。
      • 因此,我们注意到,整体准确率可能比每个部分的准确率更有意义,这可以通过超参数进行调整。
  • 我们的方法还可以与基于集成的方法相结合,以进一步提高其性能。

    • 与 RIDE 结合后,我们的方法在 ImageNet-LT 上实现了 59.7% 的整体准确率,优于所有比较的基于集成的方法。
    • 我们的方法在 iNaturaList 2018 上也取得了优越的性能,其表现与使用更强数据增强和两倍训练周期的 NCL 相当。
    • 仅使用单个模型,我们的方法在 Places-LT 上取得了最佳性能。

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

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

相关文章

前后端分离项目中的一些疑惑

1、前后端分离项目&#xff0c;浏览器发起请求后&#xff0c;请求的是前端服务器还是后端服务器&#xff1f; 在前后端分离的项目中&#xff0c;当浏览器发起请求时&#xff0c;它首先会请求的是前端服务器。 前后端分离的工作流程大致如下&#xff1a; 用户在浏览器中输入网…

有没有国内个人可用的GPT平替?推荐5个AI工具

随着AI技术的快速发展&#xff0c;AI写作正成为创作的新风口。但是面对GPT-4这样的国际巨头&#xff0c;国内很多小伙伴往往望而却步&#xff0c;究其原因&#xff0c;就是它的使用门槛高&#xff0c;还有成本的考量。 不过&#xff0c;随着GPT技术的火热&#xff0c;国内也涌…

MY SQL 实验一:

一、实验目的 通过实验了解MYSQL数据库服务器的基本架构及基本的使用方法。 二、实验原理、条件 本实验采用著名的开源数据库软件MYSQL 作为实验平台。MYSQL有多种版本&#xff0c;常用的是服务器版。数据库引擎是用于存储、处理和保护数据的核心服务。MYSQL有多个数据库引擎&a…

电商店铺经验分享,抖店/视频号小店统统适用(2024新版)

我是王路飞。 如果你已经开通了抖店或者视频号小店&#xff0c; 但是做了几天发现做不起来/不好做。 不要担心&#xff0c;也不要放弃。 既然已经选择了电商这条路&#xff0c;就要对项目有信心&#xff0c;对自己有信心。 我给你们分享一些我做电商的一些踩坑经验&#xf…

自主抓取IMAP流量

自主抓取IMAP流量 根据测试需求&#xff0c;需要抓取IMAP流量包&#xff0c;使用wireshark Python&#xff08;IMAP库&#xff09;实现 实现Python 代码 不废话直接上&#xff1b; 注意别用SSL&#xff0c;这个是加密无法被抓包&#xff1b;port&#xff1a;143是公开&…

深入浅出 BERT

Transformer 用于学习句子中的长距离依赖关系&#xff0c;同时执行序列到序列的建模。 它通过解决可变长度输入、并行化、梯度消失或爆炸、数据规模巨大等问题&#xff0c;比其他模型表现更好。使用的注意力机制是神经架构的一部分&#xff0c;使其能够动态突出显示输入数据的…

WMS仓储管理系统库存分类的详细讲解

在当今日益复杂和快速变化的商业环境中&#xff0c;仓库管理成为了一个企业不可或缺的关键环节。WMS仓储管理系统解决方案凭借其自动化和信息化的优势&#xff0c;为企业带来了革命性的改变&#xff0c;特别是在库存分类方面。接下来&#xff0c;我们将深入探讨WMS仓储管理系统…

智慧农业可视化,探索未来农业的新天地

在科技日新月异的今天&#xff0c;农业领域也迎来了翻天覆地的变化。不再只是面朝黄土背朝天&#xff0c;现代科技与农业的结合正在逐步改变着我们的耕种方式。 一、智慧农业&#xff0c;未来已来 步入智慧农业展馆&#xff0c;仿佛进入了一个科幻世界。看似复杂的农业数据&am…

API开发淘宝(京东)API接口:获取淘宝京东等平台数据的api接口分享

接口应用场景——电商产品定价 电商平台产品的定价问题是很多品牌非常重视的一个问题&#xff0c;产品的定价取决于很多因素&#xff0c;包括成本、供需情况、促销策略及竞争对手的价格等。因此&#xff0c;想要更合理地定价&#xff0c;品牌需要获取到影响产品定价的各类数据&…

Windows下 nignx启动报nginx: [emerg] bind() to 0.0.0.0:80 failed (10013:

1、Windows下 nignx启动报nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions) 解决办法&#xff1a; &#xff08;原因是端口被占用了&#xff09; 1、找到nginx.conf文件 2、修改…

618热门好物大盘点,省心购物指南快看过来!

在618购物节即将拉开帷幕之际&#xff0c;整个互联网仿佛都弥漫着一种节日的热闹与期待。各大品牌纷纷亮出他们的杀手锏&#xff0c;推出了一系列诱人的优惠活动和特色产品&#xff0c;让人眼花缭乱&#xff0c;心动不已。如果你此刻正犹豫着该把哪一件宝贝收入囊中&#xff0c…

C++-9

C 1.已知C风格的字符串&#xff0c;完成对字符串通过下标访问时的异常处理机制(越界访问) 2.写一个程序&#xff0c;程序包含两个类&#xff0c;类中实现一个成员函数&#xff0c;MyGetChar(), 类A中每调用一 次&#xff0c;按顺序得到一个数字字符&#xff0c;比如第-次调用得…

浏览器的使用心得和探索

文章目录 前言一、浏览器二、个人推荐2.1 3602.2 猎豹2.3 火狐2.4 chorme2.5 Opera2.6 QQ浏览器2.7 猫眼&#xff08;Catsxp&#xff09;2.8 edge 三、Browser plugin3.1 AdGuard 广告拦截器3.2 Axure RP 查看器3.3 Edge深度清理者3.4 FeHelper(前端助手)3.5 MarkDownload - Ma…

uniapp——列表分享当前话题(一个页面多个分享)

案例 分享的时候弹出对应的标题和默认第一张图片 代码 <view v-for"(item,index) in list" :key"index"><button open-type"share" :id"index" click.stop"()>{}"><image src"/static/images/cir…

OpenAI推出DALL·E 3识别器、媒体管理器

5月8日&#xff0c;OpenAI在官网宣布&#xff0c;将推出面向其文生图模型DALLE 3 的内容识别器&#xff0c;以及一个媒体管理器。 随着ChatGPT、DALLE 3等生成式AI产品被大量应用在实际业务中&#xff0c;人们越来越难分辨AI和人类创建内容的区别&#xff0c;这个识别器可以帮…

使用API有效率地管理Dynadot域名,设置所有域名默认whois信息

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

电瓶车充电桩:潜藏的暴利行业,简单入门到月入万元!

近几年来&#xff0c;电瓶车凭借其环保、经济特点已成为居民出行的必备工具之一。而促使电瓶车快速普及的原因之一即是电瓶车充电桩的普及。如果留心观察的话&#xff0c;相信大家都可以看出&#xff0c;国内大部分小区都已安装了充电桩设备&#xff0c;电瓶车充电桩已实现了大…

AI中转计费平台系统源码

AI中转计费平台系统源码 源码免费下载地址抄笔记 (chaobiji.cn)

软件开发的 20 条基本原则:LoD、SoC、SOLID 等

Introduction 介绍 Software design principles are the foundation of software development. As a software engineer, you can find them in your work tools, languages, frameworks, paradigms, and patterns. They are the core pillars of “good” and “readable” co…

测试人员在面试时的注意事项

一、技术方面面试 在某种程度上来说&#xff0c;技术面试重要到能够决定你是否被聘用。在技术岗位方面&#xff0c;在个人品德没有问题的前提下&#xff0c;招聘公司对技术是最关心的。 我现在并不能给你分析具体的面试题&#xff0c;因为与笔试题相比&#xff0c;面试题千变万…