论文精读:基于概率教师学习的跨域自适应目标检测(ICML2022)

news2024/12/30 2:10:49

原文标题:Learning Domain Adaptive Object Detection with Probabilistic Teacher

中文标题:基于概率教师学习的域自适应目标检测

代码地址: GitHub - hikvision-research/ProbabilisticTeacher: An official implementation of ICML 2022 paper "Learning Domain Adaptive Object Detection with Probabilistic Teacher"."

论文地址: https://arxiv.org/abs/2206.06293

1、摘要

无监督域自适应目标检测的自训练是一项具有挑战性的任务,其性能在很大程度上取决于伪标签框(pseudo boxes)的质量。 尽管取得了令人鼓舞的结果,但之前的工作在很大程度上忽略了自我训练过程中伪标签框的不确定性。 在本文中,作者提出了一个简单而有效的框架,称为概率教师(PT,Probabilistic Teacher),旨在从逐渐发展的教师中捕捉未标记目标数据的不确定性,并以互惠互利的方式指导学生的学习。具体来说,作者建议利用不确定性指导的一致性训练来促进分类适应和定位适应,而不是通过精心设计的置信度阈值来过滤伪标签框。此外,作者将锚点自适应与定位自适应并行进行,因为锚点可以看作是一个可学习的参数。与此框架一起,作者还提出了一种新的熵焦点损失(EFL),以进一步促进不确定性引导的自我训练。配备了EFL后,PT比以前的所有基线都要好得多,达到了最新的水平。

2、Introduction

2.1、跨域目标检测面临的需求与挑战

当在大规模和高质量的带标注数据上进行训练时,卷积神经网络在目标检测方面表现出了卓越的性能;然而,当部署到模型事先未曾见过的数据时,检测器会由于天气变化、光照条件变化或图像损坏等领域变化导致性能显著降低。为了解决这个问题,提出了无监督域自适应目标检测(UDA-OD)方法,其目标是将预训练模型从已标记源域转移到具有不同数据分布的未标记目标域。最近,UDA-OD方法在自动驾驶和边缘人工智能等现实场景中提出了强烈的需求,这些场景中不同领域之间的转移很常见,并且收集高质量的带标注信息的目标数据成本很高。

2.2、现有的解决方法

针对该任务提出了各种方法,它们可以分为领域对齐、领域翻译和自训练方法。领域对齐旨在使用域分类器和梯度反转层学习域的特征不变表示。另一方面,领域翻译试图将已标记的源数据翻译成类似目标域的样式,以驱动自适应训练。最近,自我训练方式的提出,是通过利用师生相互学习来逐步提高未标记目标数据的性能;具体来说,自我训练消除了额外训练范例的必要性,如对抗性训练和风格转移,并且最近展现出有希望的结果。如下图1所示,不同模型在正常天气和大雾天气下的适应性能比较,作者的框架通过简单地采用自我训练机制​​就达到了最先进的结果。

2.3、自训练方式面临的问题和挑战

自我训练的关键在于伪标签;一种流行的解决方案是通过精心设计类别置信度阈值来过滤伪框。然而,这种模式存在两个固有的挑战;1)依赖性挑战,此范例中的性能在很大程度上取决于阈值的选择,而在许多情况下,难以获得带标注信息的目标数据用于置信度阈值调优;2)性能挑战,由于只考虑了类别置信度,而不考虑定位置信度,这种简单的解决方案无法保证伪盒的质量。

2.4、伪标签框的不确定性

伪标签框的不确定性是指在无监督学习或半监督学习中,由模型自身预测生成的标签(而非由人工标注)的可信度问题。在目标检测任务中,模型通常会对未标记的数据生成预测结果,即伪标签框,但这些预测结果可能不完全准确,因此存在不确定性。如果直接使用不准确的伪标签进行训练,可能会误导模型,导致性能下降。同时,伪标签的不确定性相当于引入了噪声,需要通过特定策略来减少其对训练的负面影响。在本文中,作者将预测结果表示为概率分布,而不是确定性的标签;例如,使用高斯分布来表示定位预测的不确定性。通过比较教师模型和学生模型的预测分布,利用两者之间的不确定性差异来引导训练,从而提高学生模型的预测准确性。

2.5、本文提出的方法

为了以上问题,作者从不确定性的角度出发,提出了一个无阈值框架,称为概率教师(PT),这与传统方法不同,传统方法通常需要预先设定一个阈值来决定哪些预测框足够“好”以至于可以被用作训练数据。它不依赖于固定的置信度阈值,而是利用预测的不确定性来改进跨域目标检测任务中的自训练过程。为了做到这一点,作者对传统的Faster-RCNN模型进行了扩展,使其能够输出类别和定位的概率分布形式的预测结果,从而让教师模型能够以一种包含不确定性的方式为未标记的目标域样本生成伪标签。这种方法为教师模型和学生模型之间的一致性训练提供了基础,使得学生模型能够在训练过程中更好地适应目标域;教师模型生成伪标签以训练学生模型,而学生模型的预测又可以用来更新教师模型。

2.5.1、锚框自适应(anchor adaptation)

此外,先前工作中的另一个问题是锚框。锚框形状作为对场景敏感的参数,必须通过手动调整以提高基于锚点的检测器对特定目标检测数据集的准确性。在现有的工作中,源域和目标域通常共享相同的锚点;然而,由于域的转变,源域和目标域通常具有不同的边界框 (bbox) 大小分布。在本文中,作者提出了定位自适应与锚框自适应并行进行的方法,从而将分类、定位和锚点适应统一到一个框架中。

2.5.2、熵焦点损失(Entropy Focal Loss, EFL)

为了进一步促进不确定性引导自训练,作者还设计了一个熵焦点损失(Entropy Focal Loss, EFL),通过在分类和定位两个分支上推动一致性训练来引导模型更关注那些不确定性较低(即熵较低)的伪标签框,因为这些标签代表了更可靠的预测,这样模型可以更有效地从高质量的伪标签中学习,同时减少错误标签的负面影响。熵是信息论中的一个概念,用来衡量随机变量的不确定性或复杂度。在这里,熵越低表示预测结果的不确定性越小,预测越自信。在实际应用中,EFL会计算每个预测的熵,并使用这个熵值来加权损失函数。对于那些熵值较低的预测,损失函数会赋予更高的权重,使得模型在优化时更加重视这些预测。相反,对于那些熵值较高的预测,损失函数会赋予较低的权重,从而减少它们在训练过程中的影响。

2.6、取得的效果

与现有的自训练方法相比,作者的方法不需要使用精心调整的置信度阈值来过滤目标伪框。这使得作者的模型特别适合于难以获得带标注信息的目标数据用于置信度阈值调优的无监督域自适应目标检测(UDA-OD)场景。最重要的是,与之前的方法相比,作者的 PT 方法可以无缝且毫不费力地扩展到只有未标记的目标域数据被用于自训练而不使用源域数据的无源 UDA-OD 场景(隐私关键场景),从而达到保护隐私,防止数据泄露或滥用的目的。

2.7、本文贡献

1)提出了一个无阈值框架,该框架不依赖于固定的置信度阈值来选择用于训练的伪标签,而是通过不确定性驱动的自我训练来探索跨域目标检测。它将分类、定位以及锚点适应统一到一个框架中。

2)为 PT 框架设计了 EFL 损失,有助于模型更加关注那些不确定性较低的预测,以进一步促进不确定性引导的跨域自我训练。

3)作者提出的框架在多个基于源的/无源的 UDA-OD 基准测试中取得了最先进的结果,并大幅超越了以前的方法。

3、Preliminary

Faster-RCNN是一种用于UDA-OD任务的基准检测器,它将目标检测解耦为基于交叉熵的分类分支和基于L1正则的bbox定位回归分支。在分类分支中,标签空间上的预测概率分布能够很自然地捕捉到分类的不确定性,而基于Dirac delta建模的bbox回归分支则无法获得定位的不确定性。为了解决这个问题,在本节中,作者将现有的 Faster-RCNN 检测器增强为概率检测器,称为Probabilistic Faster-RCNN,其中类别和定位标签都表示为概率分布,而不是一个确定的标签值。

具体来说,每个 bbox 的坐标(tx、ty、tw、th)都可以被建模为单个高斯模型;设坐标 t 为单变量高斯分布随机变量,由均值 µ 和方差 σ2 参数化,表示为:t N(µ, σ2,并且σ2 被 sigmoid 函数限制为 0 到 1 之间的值。这样,bbox的回归损失可以通过真实分布 tGT (Dirac delta one)和预测分布 t (Gaussian one)之间的交叉熵函数来实现;狄拉克δ分布是一种理想化的分布,其中所有概率质量都集中在一个点上,这对应于边界框的真实坐标。边界框回归的损失函数公式如下:

其中,H(tGTi , ti)表示预测坐标  ti 和真实坐标 tGT 之间的标准交叉熵;tGTi 是与第 i 个预测 bbox ti 相关的真实 bbox 坐标;Nbbox 是边界框bbox的数量;fg(·)是一个符号函数,用于指示预测的bbox是否与真实边界框匹配,如果预测的边界框  ti 是前景(即与真实边界框匹配),则值为1,否则为0;µi 和​​ σ2i 是预测的坐标均值和方差;N(tGTi ; µi ; σ2i  ) 表示 tGTi 在高斯分布中的概率;公式中的 * 表示交叉熵可以展开为预测高斯分布的概率密度函数的对数。

通过对 bbox 回归的概率建模,Probabilistic Faster-RCNN 能够捕获每个预测的分类和定位的不确定性。因此,总体训练目标函数可以重新表述为:以下四项都是交叉熵损失,并且按照原始 Faster-RCNN 进行同等加权。

第一项是区域提议网络(Region Proposal Network, RPN)中的分类损失。RPN负责生成可能包含目标的候选区域(proposals),分类损失衡量RPN产生的proposals中每个anchor是否正确分类为前景或背景,预测是否有框住物体

第二项是感兴趣区域(Region of Interest, ROI)池化层后的分类损失。ROI层从RPN生成的proposals中提取特征,并进行进一步的分类,这个损失衡量模型对每个ROI是否正确分类为目标类别,预测RPN输出的候选区域中物体的类别

第三项是RPN中的边界框回归损失。它衡量RPN生成的proposals的边界框坐标与真实边界框坐标之间的差异,旨在快速粗略地调整候选区域,生成高质量的proposals,经过NMS(非极大值抑制)处理后用于ROI层。

第四项是ROI层后的边界框回归损失。它衡量模型对每个ROI预测的边界框坐标与真实边界框坐标之间的差异,旨在进行更精细的调整,精确最终的目标检测坐标

4、Probabilistic Teacher 概率老师

4.1、Overview

下图描绘了概率教师的概述,其主要思想是从逐渐优化的概率教师那里捕捉未标记目标数据的不确定性,并以互惠互利的方式指导学生模型的学习。Probabilistic Teacher包含两个训练步骤,预训练和相互学习。

1)Pretraining,先使用已标记的源数据训练检测器作为检测器的初始化,然后将训练好的权重复制到教师和学生模型中。

2)Mutual learning,教师模型接收经过弱增强未标记的目标域数据(Unlabeled Target Data (T)),生成伪标签框,每个伪框的类别和位置分别是在标签空间上的一般分布形式和四个高斯分布形式;然后使用这些伪框通过不确定性指导的一致性训练来训练分类分支和定位分支;学生模型使用教师模型生成的伪标签框和经过强增强已标记的源域数据进行训练;最后学生模型通过指数移动平均线(EMA)方式将所学知识传递给教师。EMA是一种权重更新方法,使得教师模型可以缓慢地向学生模型的权重靠拢;通过这种方式,教师模型和学生模型可以共同演化,不断互相改进,从而提高模型的整体性能。

4.2、Mutual Learning

4.2.1、Uncertainty-Guided Consistency Training(不确定性引导的一致性训练)

学生模型在已标记的源数据和未标记的目标数据上进行优化,并使用从教师模型生成的伪框进行优化。训练目标函数如下:

其中,LS 是已标记源数据的监督损失,对应于方程2的公式;LT 是对未标记目标数据的自监督损失,它在教师和学生模型之间添加了不确定性引导的一致性;λT 是目标域的损失权重,默认设置为1。

为了优化第二项,将经过弱增强未标记的目标域数据输入教师模型以生成伪框,其包含分类概率分布 pPL 和 bbox 坐标概率分布 tPL。两种分布都经过“锐化”以指导学生训练,sharpened用于增强教师模型输出的概率分布的置信度,使其更加尖锐和极端化;具体来说,就是提高概率分布中最高概率值,使得模型对其预测更加自信,并且减少熵值使得分布更集中,减少预测的不确定性。

具体来说,LT 由四个训练损失组成,包括 RPN 和 ROIhead 中的两个分类损失和两个 bbox 回归损失:

前两项又可以被表述为:

其中,pPLi 是教师模型预测的第 i 个分类概率分布;pRPNipROIi 是学生预测的 RPN 和 ROIhead 中的第 i 个分类概率分布;Scls(·,τcls)是锐化函数,其中 τcls 是温度因子,用于控制锐化的强度;M(⋅)是合并操作,将所有前景类别的概率相加,以获得前景/背景概率分布来指导RPN训练;H(⋅,⋅)是交叉熵损失函数,用于计算锐化后的教师预测和学生预测之间的差异;NRPNclsNROIcls 分别是 RPN 和 ROIhead 中的批量大小。

提问:为什么第一项有求和操作但是第二项却有锐化操作?

1)在RPN层,求和操作是将所有可能的前景类别概率加起来,形成一个通用的前景指示器。RPN的主要任务是生成大量的候选区域,这些区域可能包含不同的对象类别。因此,RPN的输出是多个前景类别的概率,需要将这些概率合并成一个二分类问题(前景 vs 背景,是否包含目标)。

2)在ROI层,每个候选区域已经由RPN选定为可能包含特定对象的区域,因此ROI层的任务是确定这些区域内的具体对象类别。这里使用锐化操作是为了增强模型对其分类预测的置信度。锐化操作通过增加最高预测概率的值并降低其他概率的值,使得模型对某个类别的预测更加自信。这在ROI层尤其重要,因为我们需要从较少的候选区域中精确地识别出具体的类别。

3)RPN的目的是生成高质量的候选区域,它需要区分前景和背景,而不是确定具体的类别。因此要将所有前景类别合并为一个统一的前景概率。ROI的目的是精确分类,在已经确定为前景的候选区域中,需要精确地识别出对象的具体类别。因此要使用锐化操作来增强对特定类别的置信度。

后两项可以统一为一般形式:

其中, tPLi 是教师模型预测的第 i 个 bbox 坐标概率分布(这两项都是在 ROIhead 中预测);ti 是学生在 RPN 或 ROIhead 中预测的 bbox 坐标概率分布,并与 tPLi 相关联;Sbbox(·, τbbox) 是bbox 回归的锐化函数,τbbox 是温度因子。

4.2.2、Sharpening Functions(锐化函数)
对于分类分支,Scls(·, τcls) 被定义为温度为 τcls 的 SoftMax 函数。

对于bbox回归分支,高斯分布的熵是其方差σ2的函数。当τ=1(包括τcls和τbbox)时,锐化函数相当于原来的SoftMax或Gaussian函数。当τ→0或τ→+∞时,趋于狄拉克δ分布或均匀分布,分别对应最低熵或最高熵情况,本文设置 τ < 1。因此Sbbox(·, τbbox) 设计为:

通过这种专门用于 bbox 回归的锐化函数,公式6 LT−bbox 可以详细的表示为:

其中,(μPLi , σPLi ) 和 (μi, σi) 分别是教师模型和学生模型预测的 bbox 坐标的第 i 个均值和方差;C是常数。

4.2.3、Teacher Updating(教师模型的更新)

为了获得更准确的伪框,学生模型通过EMA的正反馈逐步更新教师模型。给定学生 θS 的权重,教师 θT 的计算公式如下:

θT = αθT + (1 −α)θS,其中 α 是 EMA 比率。逐步更新的教师模型可以被视为不同训练时间戳下的学生模型集合。

4.2.4Anchor Adaptation(锚框自适应)

在当前工作中,源域和目标域通常共享相同的锚点。 然而由于领域的变化,源域和目标域通常具有不同的bbox大小分布。作者提出在师生通过EMA机制相互学习过程中缓慢地调整锚点形状,以匹配目标域中bbox的分布。总体优化目标为:

其中,{(wk, hk)}Ak=1 表示所有可能的锚框宽度和高度的集合,A为锚框的总数。

4.3、Entropy Focal Loss(熵焦损失)

虽然PT模型已经逐步利用了伪框,使得预测逐渐趋向于低熵,但现有的有噪声的伪框不可避免地会对性能造成损害。由于所提出的框架可以获得每个bbox(类别加四个坐标)的不确定性,因此可以应用这些不确定性信息来提高性能。作者使用类别和位置的熵来描述每个bbox的不确定性,并引入熵焦点损失以进一步促进分类和定位分支的不确定性引导一致性训练。

分类和回归分支的熵焦点损失可以统一为通用形式:

其中,λ 是超参数;E 是教师的预测熵;Enorm 是范数项,在本文被设置为熵的最大值。理论上,分类时 Enorm 等于 log(n + 1),位置回归时 Enorm 等于 1/2*log(2π) + 1/2,n 是前景类的数量 。利用获得的类别和伪框每个坐标的不确定性,熵焦点损失鼓励模型更多地关注分类分支中噪声较小的类别预测和回归分支中更准确的坐标个体。

5、Strong Augmentation for UDA-OD(无监督域自适应目标检测的强数据增强)

5.1、Intra-Domain Gap(域内差距)

作者在下图中可视化了只在源数据训练的模型在目标域上预测的真阳性 (TP,绿色) 和假阴性 (FN,金色)。可以观察到,较小、较严重模糊和遮挡的物体往往具有较差的适应性能,反之亦然,作者将这种现象称为域内差距。下图展示了“正常城市景观到白雾城市景观”适应任务中的域内差距,h和w分别表示预测边界框的高度和宽度。

5.2、Intra-Domain Alignment via Strong Augmentation(通过强增强进行域内对齐)

由于大尺寸、明显的对象通常能在伪标记生成中获得较高的置信度分数,因此作者通过强大的数据增强(随机调整大小、高斯模糊、颜色抖动等)将它们转换为类似那些小规模、模糊和受遮挡的对象。通过这种办法,这些具有低熵伪标签的变换对象将引导模型更加关注小尺度、模糊和遮挡的对象。从这个角度来看,强数据增强实际上是一种隐式的域内对齐方法,以弥合域内差距。

6、Experiments

6.1、Experimental Settings

6.1.1、Datasets(数据集)

作者对以下四种不同类型的域转换的多个基准进行了广泛的实验

1) C2F:从正常天气到大雾天气的适应                  2) C2B:从小规模数据集到大规模数据集的适应

3) K2C:跨摄像机的适应                                        4)S2C:从合成图像到真实图像的适应

在本次实验,使用了5种公共数据集

1)城市景观Cityscapes(C):包含2,975张训练图像和500张带有像素级注释的验证图像。

2)大雾城市景观Foggy Cityscapes (F):由三个级别的大雾天气(0.005,0.01,0.02)的城市景观渲染的合成数据集,分别对应于600,300和150米的能见度范围。

3)BDD100k (B):由100k张图像组成的大规模数据集。白天场景的图像具有标注信息,包括36,728张训练图像和5,258张验证图像。

4)Sim10k (S):由游戏引擎渲染的 10k 图像组成,在10,000 张训练图像中提供了 58,701 辆汽车的边界框。

5)KITTI (K):由自动驾驶平台收集,包括 14999 张图像和 80256 个边界框。本实验仅使用火车组。

6.1.2、Network Architecture(网络架构)

作者将 Faster-RCNN 作为基础检测器(Chen et al., 2018),并使用在 ImageNet 上预训练的 VGG16 作为检测器的主干。通过将每个图像的短边设置为 600 来重新缩放所有图像,同时保持长宽比不变。

6.1.3、Strong Augmentation(强力数据增强)

除了 RandomResizedCrop 之外,还在(Chen et al., 2020b)中使用相同的数据增强策略。弱增强是指随机水平翻转。

6.1.4、Optimization(优化)

在单个 GPU 上对源域数据和目标域数据使用 16 的批量大小,并以 0.016 的固定学习率训练 30k 迭代,包括用于预训练的 4k 迭代和用于互相学习的 26k 迭代。检测器使用 SGD 优化器训练,动量为 0.9,权重衰减为 10−4。EMA 比率 α 设置为 0.9996。本文中的损失权重均设置为1。此外,EFL中的 λ 以及温度 τclsτbbox 都简单地设置为0.5。

6.1.5、Evaluation Protocol and Comparison Baselines(评估方案和基线对比)

根据现有的工作,作者在 IOU 阈值为 0.5 的前提下使用标准平均精度(mAP)进行评估。在实验中,作者观察到强力增强和Probabilistic Faster-RCNN 都对基线性能有贡献。

6.2、C2F:从正常天气到大雾天气的适应

在现实场景中,例如自动驾驶,目标检测器可能会被用在不同的天气条件下。为了研究从正常天气到雾天的适应性,作者使用已标记的Cityscapes和未标记的Foggy Cityscapes(训练集)进行跨域自训练,然后报告Foggy Cityscapes验证集的评估结果。如下表所示:

1)“†”表示在对应方法的基础上增加了本文提出的强力增强和Probabilistic Faster-RCNN;

2)“Source only” and “Oracle”分别是指仅使用已标记的源域数据和已标记的目标域数据进行训练的模型;

3)“FR”代表经典单纯的 Faster-RCNN;“UN”代表未知

4)“split”列中的“0.01”、“0.02”和“ALL”分别表示雾度为0.01、0.02和所有三个雾度。

由表可知,强力增强将0.02级和所有三个级别的“Source only”模型分别提高了+4.8和+6.2 mAP。与其他方法相比,作者的方法在0.02级达到42.7 mAP,在所有三个级别达到47.1 mAP,远优于最佳基线MeGA (VS et al., 2021)(+0.9/+5.3)。

6.3、C2B:从小规模数据集到大规模数据集的适应

目前,大量收集和标注具有不同场景布局的图像数据成本极高,例如,从一个城市到另一个城市的自动驾驶。为了研究本文方法对不同场景布局的大规模数据集的适应性,作者使用 Cityscapes 作为较小的源域数据集,使用包含不同属性的 BDD100k 作为大型未标记目标域数据集。在ICR-CCR(徐等人,2020a)和SFOD(Li等人,2020a)之后,报告了两个数据集上七个常见类别的结果。下表显示了这个实验的结果,其中作者的方法优于所有基线,实现了34.9 mAP,与ICR-CCR相比,有很大的进步(+5.4)。

6.4、K2C:跨摄像机的适应     

现实世界中广泛存在不同的相机设置(例如角度,分辨率,质量和类型),这会导致领域漂移。在本实验中,作者研究了两个真实数据集之间的自适应。KITTI 和 Cityscapes 数据集分别用作源域和目标域。结果如下表所示。作者提出的方法比最佳方法GPA (Xu et al., 2020b)提高了+12.7 mAP。并且也优于最近的工作 SimROD,该工作以YOLOv5 (Jocher等人,2021)作为基础检测器,并依赖于大规模教师模型。

6.5、S2C:从合成图像到真实图像的适应

合成图像提供了一种缓解数据收集和注释问题的替代方案。然而合成数据和真实数据之间存在分布差距。为了使合成场景适应真实场景,作者利用整个 Sim10k 数据集作为源域数据,使用 Cityscapes 训练集作为目标域数据,由于两个域中都只标注了汽车类别,因此只报告了 Cityscapes 测试集中汽车的 AP。如下表所示,作者的方法大大优于现有方法,比当前最佳方法提高了 +3.0 mAP。

7、Conclusions

在本文中,作者提出了一个简单而有效的框架,概率教师,来研究跨领域自训练过程中不确定性的利用。该框架配备了新颖的熵焦点损失,可以在多个基于源的/无源的 UDA-OD 基准测试上实现新的最先进的结果。

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

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

相关文章

信息安全工程师(42)VPN类型和实现技术

前言 VPN&#xff08;Virtual Private Network&#xff0c;虚拟专用网络&#xff09;是一种在公共网络上建立专用网络连接的技术。 一、VPN类型 VPN可以根据不同的分类标准划分为多种类型&#xff0c;主要包括以下几种&#xff1a; 按协议分类&#xff1a; PPTP&#xff08;Poi…

JAVA实现公众号扫码登录和关注功能实战

前言 使用第三方插件 <dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>4.6.0</version> </dependency>准备APPID和appSecet 登录微信公众号后台&#xff0c;复制ap…

防火墙的混合模式配置

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

刘洋,一个爱 drink 的好运程序员|MarsCoders 开发者说

「MarsCoders 开发者说」是 AI 时代下各类技术栈、各种经历的开发者的故事记录&#xff0c;我们捕捉并再现他们在技术洪流中的职场蜕变与角色定位重塑&#xff0c;希望给更多开发者带来启发。 同时&#xff0c;该系列也记录了众多豆包MarsCode 用户和 AI 爱好者们的实践案例&am…

ICE/TURN/STUN/Coturn服务器搭建

ICE 当我们想要实现在公网环境下的语音/视频通话功能时&#xff0c;就需要用到ICE交互式连接建立。ICE不是一种协议&#xff0c;整合了 STUN 和 TURN 两种协议&#xff08;用于 NAT 穿透&#xff09;的框架。 ICE的主要目标是解决NAT&#xff08;网络地址转换&#xff09;穿越…

5分钟英文论文降重工具:DeepL【翻译、改写、缩写】

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 5分钟英文论文降重工具&#xff1a;DeepL【翻译、改写、缩写】 视频学习&#xff1a;5分钟英文论文降重工具&#xff1a;DeepL【翻译、改写、缩写】 DeepL网址 官方网址&#xff1a;https://www.deepl.com/zh/…

超越单线程:Web Worker 在前端性能中的角色

在当今快速发展的数字时代&#xff0c;用户对网页性能的期待已经达到了前所未有的高度&#xff0c;想象一下&#xff0c;当你打开一个网站&#xff0c;瞬间加载、流畅操作&#xff0c;没有任何卡顿和延迟&#xff0c;这种体验无疑会让你倍感惊喜。然而在前端开发中&#xff0c;…

机器学习——多模态学习

多模态学习&#xff1a;机器学习领域的新视野 引言 多模态学习&#xff08;Multimodal Learning&#xff09;是机器学习中的一个前沿领域&#xff0c;它涉及处理和整合来自多个数据模式&#xff08;如图像、文本、音频等&#xff09;的信息。随着深度学习的蓬勃发展&#xff0…

编译链接的过程发生了什么?

一&#xff1a;程序的翻译环境和执行环境 在 ANSI C 的任何一种实现中&#xff0c;存在两个不同的环境。 第 1 种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。 第 2 种是执行环境&#xff0c;它用于实际执行代码 也就是说&#xff1a;↓ 1&#xff1…

纠删码参数自适应匹配问题ECP-AMP实验方案(下)

7.参数选择 7.1.综合性能goal 根据权重和性能指标&#xff0c;本方案为每个文件确定最佳的纠删码参数&#xff0c;并将文件分组到不同的数据池中。本文使用了以下公式计算每个文件的评分&#xff0c;表示该文件在使用不同的纠删码参数时的综合性能。 s i j k ∑ j 1 6 c j…

2023 CCPC哈尔滨 报告

比赛链接&#xff1a;Dashboard - 10.6组队训练赛-2023CCPC哈尔滨站 - Codeforceshttps://codeforces.com/group/w6iGs8kreW/contest/552949 做题数&#xff1a;3 题 三题都是队友写的。所以来补一下 B L J。 B题&#xff1a; B. Memory Little G used to be a participant …

【MySQL】基本查询(上):创建、读取

1.Create(创建) 语法&#xff1a; INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ...value_list: value, [, value] ... 接下来我们用这个下表作为例子&#xff1a; -- 创建一张学生表 CREATE TABLE students ( id INT UNSIGN…

Http 协议和 RPC 协议有什么区别?

Http 协议和 RPC 协议有什么区别&#xff1f; 三个层面来述说&#xff1a; 从功能特性来说&#xff1a; HTTP是一个属于应用层的超文本传输协议&#xff0c;是万维网数据通信的基础&#xff0c;主要服务在网页端和服务端的数据传输上。 RPC是一个远程过程调用协议&#xff0…

【JS】哈希法解决两数之和

思路 使用哈希法&#xff1a;需要快速查询一个元素是否出现过&#xff0c;或者一个元素是否在集合里时 本题需要一个集合来存放我们遍历过的元素&#xff0c;然后在遍历数组的时候去询问这个集合&#xff0c;符合要求的某元素是否遍历过&#xff0c;也就是 是否出现在这个集合。…

【算法】链表:24.两两交换链表中的节点

目录 1、题目链接 2、题目介绍 3、解法 4、代码 1、题目链接 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 2、题目介绍 3、解法 引入伪头节点&#xff1a; 为了处理头节点可能被交换的情况&#xff0c;我们引入一个伪头节点&#xff08;dummy no…

jenkins远程调用

curl -G -d tokenfetch_coverage_token&systemmes2&typefull&envsit&resetno http://remote_user:1172e3d5524629fabef5dd55c652646232192.168.36.196:8080/job/fetch_coverage/buildWithParameters 在jenkins的用户界面设置一个token就可以了 remote_user 为…

Android笔记(二十四)基于Compose组件的MVVM模式和MVI模式的实现

仔细研究了一下MVI(Model-View-Intent)模式&#xff0c;发现它和MVVM模式非常的相识。在采用Android JetPack Compose组件下&#xff0c;MVI模式的实现和MVVM模式的实现非常的类似&#xff0c;都需要借助ViewModel实现业务逻辑和视图数据和状态的传递。在这篇文章中&#xff0c…

ESP32-C3实现UART

配置串口参数 在编写代码之前&#xff0c;你需要确定要使用的 UART 端口号和配置参数&#xff08;波特率、数据位、停止位等&#xff09;。 // 定义 UART 端口 #define TX_PIN 1 // TX 管脚 #define RX_PIN 3 // RX 管脚// 定义串口配置参数 #define UART_BAUDRATE 115200 // …

springboot 项目使用 gitlab 的 API

springboot 项目使用 gitlab 的 API 前言获取用户 access tokenSpring boot项目集成GitLab依赖1 pom依赖2 配置文件3 启动类4 核心代码gitlab 的 API 说明前言 需求是通过gitlab的api获取其中的数据。 gitlab官方API文档:https://docs.gitlab.com/ee/api/users.html gitla…

SpringBoot实现电子文件签字+合同系统

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在现代企业中&#xff0c;合同管理和电子文件签字已成为日常运营不可或缺的一部分。为了提升效率和安全性&#xff0c;我们可以使用SpringBoot框架来实现一个电子文件签字和合同管理系统。本文将详细介绍如何…