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

news2024/11/25 5:37:16

论文标题

《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.coloradmin.cn/o/1651440.html

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

相关文章

LeetCode //C - 85. Maximal Rectangle

85. Maximal Rectangle Given a rows x cols binary matrix filled with 0’s and 1’s, find the largest rectangle containing only 1’s and return its area. Example 1: Input: matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“…

Netty HTTP 示例-响应式编程-013

🤗 ApiHug {Postman|Swagger|Api...} = 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Next Generation API Development Platform…

The provided password or token is incorrect or your account

IDEA使用git技巧 【/n】 01 问题出现场景 我的gitlab上个月生成的token到期了,于是今天推上去的时候报了这个错误 The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password. See ht…

【知识碎片】2024_05_07

今天记录了两个代码和C的几个破碎知识。 第一段代码是基础型的&#xff0c;关于数组。第二段代码是二分的&#xff0c;一开始没通过全部案例&#xff0c;值得再看。 每日代码 1.记负均正 输入一个数组&#xff0c;输出负数的个数&#xff0c;整数的平均值&#xff08;0都不参…

AI伦理和安全风险管理终极指南

人工智能&#xff08;AI&#xff09;正在迅速改变各个领域的软件开发和部署。驱动这一转变的两个关键群体为人工智能开发者和人工智能集成商。开发人员处于创建基础人工智能技术的最前沿&#xff0c;包括生成式人工智能&#xff08;GenAI&#xff09;模型、自然语言处理&#x…

深入探索van Emde Boas树:原理、操作与C语言实现

van Emde Boas (vEB) 树是一种高效的数据结构&#xff0c;用于处理整数集合。它是由荷兰计算机科学家Jan van Emde Boas在1977年提出的。vEB树在处理整数集合的查找、插入、删除和迭代操作时&#xff0c;能够以接近最优的时间复杂度运行。vEB树特别适合于那些元素数量在某个较小…

Jenkins +配置邮件 centos8.5 安装部署 运维系列一

1 jenkins的war包下载地址: Download and deploy 2 xftp 等方式上传到服务器 #安装jdk tar zxvf jdk-11.0.8_linux-x64_bin.tar.gz mv jdk-11.0.8/ /usr/local/jdk vim /etc/profile export JAVA_HOME/usr/local/jdk export PATH$JAVA_HOME/bin:$PATH CLASSPATH.:$JAVA_…

WPF基础学习笔记

目录 基础知识&#xff1a; WPF的特点: WPF的优点 什么是XAML&#xff1f; 布局基础&#xff1a; 样式的应用&#xff1a; 控件模板&#xff08;ControlTemplate&#xff09;&#xff1a; 数据模板&#xff08;DataTemplate&#xff09;&#xff1a; 静态资源StaticRe…

智慧工地,筑牢安全防线:严防塔吊相撞,守护施工安全之巅!

塔吊相撞的事故是一个严重的施工安全问题&#xff0c;而智慧工地则是一种利用现代科技手段提高施工安全性的解决方案。 为了避免类似事故的发生&#xff0c;智慧工地可以采取以下措施&#xff1a; 一、建立全面的监控系统 智慧工地可以建立完善的监控系统&#xff0c;通过安装…

Github 2024-05-08 C开源项目日报 Top8

根据Github Trendings的统计,今日(2024-05-08统计)共有8个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目8PHP项目1Python项目1C++项目1PHP:流行的Web开发脚本语言 创建周期:4710 天开发语言:C, PHP协议类型:OtherStar数量:37340 个Fork数量…

Layer创建流程

在SurfaceFlinger中&#xff0c;Layer表示一个显示图层&#xff0c;是surfaceflinger合成过程中最重要的基本单元&#xff0c;它提供了一系列属性定义了如何参与合成并与其他Layer交互&#xff0c;包括&#xff1a; 位置&#xff1a;定义Layer出现在屏幕上的位置&#xff0c;包…

营销H5测试综述

H5页面是营销域最常见的一种运营形式&#xff0c;业务通过H5来提供服务&#xff0c;可以满足用户对于便捷、高效和低成本的需求。H5页面是业务直面用户的端点&#xff0c;其质量保证工作显得尤为重要。各业务的功能实现具有通用性&#xff0c;相应也有共性的测试方法&#xff0…

蓝桥杯13届JAVA A组 国赛

​​​​​​​ package 蓝桥杯国赛; // 贪心选个数最少的进行摆 // 2:1 ,3:1, 4:1,5 : 3,6:3,7:1 // 选 1&#xff0c;7&#xff0c;4&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;9 // 然后都选满10个 public class 火彩棒数字 {public static void main(String[] a…

人工智能-2024期中考试

前言 人工智能期中考试&#xff0c;认真准备了但是没考好&#xff0c;结果中游偏下水平。 第4题没拿分 &#xff08;遗传算法&#xff1a;知识点在课堂上一笔带过没有细讲&#xff0c;轮盘赌算法在书本上没有提到&#xff0c;考试的时候也没讲清楚&#xff0c;只能靠猜&…

主数据准确性和完整性竟如此重要?确保这两大特性做好这些就够了

主数据是企业运营的心脏&#xff0c;它包含了客户、产品、供应商和员工等关键业务实体的详细信息。这些数据的准确性、一致性和完整性对于确保企业决策的质量、优化业务流程、提高客户满意度、推动数据驱动的创新、遵守法规要求以及维护数据安全至关重要。 主数据的准确性指的…

亚信科技精彩亮相2024中国移动算力网络大会,数智创新共筑“新质生产力”

4月28至29日&#xff0c;江苏省人民政府指导、中国移动通信集团有限公司主办的2024中国移动算力网络大会在苏州举办。大会以“算力网络点亮AI时代”为主题&#xff0c;旨在凝聚生态伙伴合力&#xff0c;共同探索算力网络、云计算等数智能力空间&#xff0c;共促我国算网产业和数…

目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)

文章目录 一、目标检测介绍二、YOLOv7介绍三、源码/论文获取四、环境搭建4.1 环境检测 五、数据集准备六、 模型训练七、模型验证八、模型测试九、错误总结9.1 错误1-numpy jas mp attribute int9.2 错误2-测试代码未能跑出检测框9.3 错误3- Command git tag returned non-zero…

利用Jenkins完成Android项目打包

问题和思路 目前存在的问题 打包操作由开发人员完成&#xff0c;这样开发进度容易被打断。 解决问题的思路 将打包操作交测试/产品/开发人员来完成&#xff0c;主要是测试/开发。 按照以上的思路&#xff0c;那么JenkinsGradle的解决方案是比较经济的&#xff0c;实现起来…

[Kotlin]创建一个私有包并使用

1.创建Kotlin项目 创建项目&#xff1a; 在Android Studio或其他IDE中选择“Create New Project”。选择Kotlin和Gradle作为项目类型和构建系统。指定项目名称和位置&#xff0c;完成设置。 添加依赖: 如果你的库需要额外的依赖&#xff0c;可以在 build.gradle (Module: app…

PostgreSQL自带的命令行工具13- pg_waldump

PostgreSQL自带的命令行工具13- pg_waldump 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777pg_waldump 是 Po…