适应还是不适应?语义分割的实时自适应方法

news/2024/7/5 3:26:05

6b7dded872046bca05c3f87655d6c8c0.png

文章信息

6ee4241daa55f258e8fca638776b27c7.png

论文题目为《To Adapt or Not to Adapt? Real-Time Adaptation for Semantic Segmentation》,该文于2023年发表于IEEE/CVF International Conference on Computer Vision (ICCV)会议上。文章提出一种用于实时域自适应的硬件感知模块化最便宜的训练框架,能够主动控制模型的自适应。

ec18e36b584d96e2e626d552afb03bb2.png

摘要

5b9dc703008c5fc9b5de0c9db6c5cd6d.png

在线域自适应方法的目标是应对在实际生活中出现的无法预见的领域变化,比如突发的天气变化。然而,采用蛮力适应方法会带来高昂的计算成本,不切实际。本文提出了HAMLET框架,这是一种基于硬件感知的模块化、成本最低的实时域适应训练方法。该方法包括了一个硬件感知的反向传播协调代理(HAMT)和一个专门的领域漂移检测器,它能主动控制模型何时以及如何进行适应(LT)。由于这些创新,我们的方法能够在一台普通的GPU上以每秒29帧以上的速度执行语义分割任务。实验结果表明该框架在OnDA和SHIFT基准测试上能较好的权衡准确性和速度。

102ad7e68c7da3f95e72023efec45134.png

引言

047ed3bfb5cda198448f49b90e639fb8.png

语义分割旨在基于局部和全局上下文在像素级别对图像进行分类,以便对所描述的内容进行更高层次的理解。近年来,通过使用各种卷积神经网络(CNNs)或最近的transformers模型能有效解决这一任务,但是需要对图像进行像素标记,这非常耗时且昂贵。利用模拟和图形引擎生成带标注的帧可以显著减少收集标记数据所需的时间和成本。但由图形引擎生成的模拟数据与真实世界图像之间存在实质性差异,因此将这些数据进行实际应用需要适应大幅度的领域变化。

为解锁这一廉价且丰富的训练数据资源的潜力,许多无监督领域自适应(Unsupervised Domain Adaptation,UDA)技术应运而生,这些技术通过在带标注的合成帧(源域)上训练语义分割网络,然后将网络适应到真实图像(目标域)上,而无需人工标注。但是,从合成数据到真实数据的领域变化只是众多领域变化的一种。在实际部署中,领域变化可以由多种原因引起,例如不同的相机位置、不同的光照、天气条件、城市场景等,甚至各种因素相互组合,所以不可能在数据集中均匀地代表所有可能的部署领域,这就导致了性能的不稳定性。

在线领域自适应的概念使得我们在部署时,面对连续和不可预测的领域变化,无需事先具有与这些领域变化相关的数据。然而,它仍然存在一些不足,比如逐帧调度上连续执行反向传播,计算成本高导致对网络的性能产生负面影响,从而降低其整体帧率以满足连续适应的要求。作者指出,参数数量越多,自适应过程越复杂,逐帧优化是自适应本身的过度过程,网络可能只需要更少的优化步骤来有效对抗领域变化,而这种强烈的自适应可能会导致对以前的领域出现灾难性遗忘。为了解决在线领域自适应中存在的问题,从而实现实时在线领域自适应。作者提出了一个新颖的框架,主要贡献如下:

自适应训练机制:为解决在线训练的问题,作者设计了一个轻量级的自动机制,能够显著减少反向传播的复杂性。他们充分利用模型的模块性,自动选择训练网络子集,以获得分配的优化时间内产生最大改进的子集。这一方法降低了反向传播的浮点运算次数(FLOPS)达34%,同时最小化对准确性的影响。

轻量级领域检测器:与前述方法互补,作者引入了一种轻量级的领域检测器。仅在真正需要时激活训练,并设置超参数以最大化自适应速度。其更够将速度提高了5倍以上,而mIoU的牺牲不到2.6%。

作者在多个在线领域自适应基准上进行了评估,包括全合成数据集和半合成的CityScapes领域序列。实验结果表明,与其他测试时间自适应策略相比,其方法在准确性和速度方面表现更好。图1展示了与CoTTA等较慢的方法相比,HAMLET具有优越的实时自适应性能。CoTTA等较慢的方法在被迫每50帧只适应一次以保持相似的帧率时,性能会显著下降。相比之下,HAMLET在保持高精度的情况下达到了令人印象深刻的29 FPS。此外,图2展示了HAMLET在风暴增加情况下的表现,进一步突出了其良好的准确性和速度权衡。

cd9357810785c5352474e5bd863bcd92.png

图 1 HAMLET与其他方法的对比效果展示

e1a83b33c6279331855cf5079174479f.png                    

图 2 各自适应方法在风暴增加情况下的表现

b898349d96e70776a9871d5aeca181a1.png

方法

bd02bf53119cf2de2e73935a5da3abba.png

作者引入了一个硬件感知的模块化训练(HAMT)代理,能够在线优化模型准确性和适应时间之间的权衡。HAMT能够显著减少在线训练时间和GFLOPS(浮点运算每秒次数)。然而,最经济的训练其实是不训练。因此,第二个策略是引入了一种形式化的几何模型,用于在线领域变化的可靠检测和领域估计信号,这些信号可以轻松集成,只在特定时刻激活自适应过程,以尽可能少地进行适应。此外,再引入主动训练调制,其可以通过设计自适应训练策略,动态调整与领域相关的超参数,更进一步利用这些信号。

模型设置

HAMLET应用于无监督域自适应和分割网络,以DAFormer模型为例,采用SegFormer作为分割主干网络。使用三个骨干实例,它们都基于SegFormer在源域上进行了预训练分别是:一个学生、一个教师和一个静态(即冻结)教师。在训练过程中,学生接收到目标图像和源图像的混合图像,并受到混合样本交叉熵损失6b86425bb22a51e27ea1b69c3cb304dc.png(图3中由绿色、蓝色和红色虚线表示)的监督。这种损失是通过混合教师的伪标签和源注释来计算的。

为了提高训练的稳定性,老师以学生的指数移动平均值(EMA)进行更新。为了进一步正则化学生,我们使用存储在回放缓冲区中的源样本,并应用两个额外的损失(图3中的蓝线)。首先,我们最小化学生和静态教师编码器606c80243003c346f4825f94a7dde356.png之间的特征距离,然后,采用监督交叉熵任务损失a03e3ed10441c1d856d1c70d4c2ba885.png。完整的目标损失函数是896e24e9ea46e3816e2d5ff6aeeb5697.png,其中3eeed3af5c4f8bb8edc1d822ed147cd5.png是一个权重因子。在目标域上进行预测时,只使用学生(图3中的红线)。

30774bc7d886739d447b10d3eca79573.png

图 3 HAMLET流程

硬件感知模块化训练(HAMT):

在线自适应在部署时需要更新模型参数,但反向传播在计算上代价高昂,因此在部署的代理中连续应用起来太慢。作者提出可以选择进行部分权重更新,例如通过微调网络的最后模块,以提高训练效率。然而,领域漂移可能会表现为数据输入分布的变化(例如图像属性,比如白天/夜晚),以及输出分布的变化(例如类别先验概率)。这些信息可能被编码在网络的不同部分,因此仅仅更新最后一部分网络可能不足以应对领域漂移。

作者提出可以对训练过程进行编排,以确保充分的训练同时尽量减小计算负担。作者引入了一个编排代理,通过权衡伪损失最小化速率和计算时间来决定网络应该进行多深的微调。与以前的高效反向传播方法不同,因模型在任务上进行了预训练,所以只需要更小的更新来适应。

建模如下:

模型骨干表示为f,由四个不同的模块组成:f = m4◦m3◦m2◦m1。

定义一个行动空间A 和连续状态空间S。

行动空间 A = {T1, T2, T3, T4}:其中 T4 对应于仅训练网络的最后一个模块 m4;T3 对应于训练最后两个模块,即 m4 ◦ m3;T2 对应于训练最后三个模块,即 m4◦m3◦m2;T1 对应于训练整个网络 f。

连续状态空间 S = {R, V}:其中 R 表示随时间变化的EMA教师伪损失的二阶导数,表示模型性能的变化速度,因此,95a6efb6e30932f0c7fc912bad49fa84.png,其离散形式计算为964ba28360a754d94c69ef1245d9c0a8.png,而 V 表示一个累积向量与动作空间 A 具有相同的维度,初始化为0,它是一个记录了不同动作对模型性能改进的估计向量,每个元素39f1d096140fa14c35bfbc8142f58b57.png表示动作7d600be0dd4fc3202fd15cb7be7a6421.png对性能改进的估计。在每个时间步t,检查向量V中各元素,每个元素对应A中的每个动作,然后选择具有最大V值的动作,其索引为j,并执行动作78405af900f26866b92658fbb96f542f.png。在训练步骤t中,d47a564cfb4b522212a6c2243f259079.png更新为:

1041b64ddd50ba4dc4df3c43dae1ccd9.png

其中 α 是平滑因子,例如 0.1。该策略可以看作是一种贪婪的模块选择策略,基于线性近似的最高期望损失改进。然而,有一个明显缺点是,它可能会选择更具回报但更昂贵的动作,如 T1 和 T2,而不是更高效但潜在效果较差的动作,如 T3 和 T4。这反映了在训练时间和性能之间的权衡关系。

作者指出,他们不仅关注性能改进的速度,还关注实际训练过程中的时间间隔。他们的目标不是仅仅最大化损失函数二阶导数e965db8483e134db4a3488616bedadd6.png,其中 ∆t 表示更新的次数,而是还要最大化d84d30d4c02b9f0720972fcb8f1fd3f3.png,其中 ∆τ 是实时间隔,即考虑了时间因素。为了考虑实际训练成本,作者测量了与每个动作 A 相关的训练时间,得到了向量bb67e1b91036953ec05467286ed3e595.png,表示了每个训练模块的实际训练时间。

作者还引入了时间条件向量 γ,用于在优化策略中考虑训练成本。这个时间条件向量通过将每个动作的训练时间考虑在内,来调整模型的选择。

20c30bf68d4a331ce2cbafd3417502ba.png

其中,β 是 softmax 温度, K 是动作的数量,在文中为4。所以,修改的策略如下:

77886584e3ff48d88898d077f98fcca6.png

该策略使得代价更大的动作会得到更小的奖励和更大的惩罚。平均反向传播β的浮点运算次数FLOPS显着降低,即β = 2.75时- 30%,β = 1时- 43%。文中最后选择β = 1.75,获得−34%的FLOPS降低。

主动训练调制:

连续和测试时间适应方法将在线学习视为在数据流上进行的连续和恒定的过程。然而,当涉及到实际部署时,这种方法存在几个缺点。在部署域不变的情况下执行适配不会对当前域的性能有进一步改进;相反它可能会导致对先前领域灾难性遗忘,从而阻碍模型泛化。即使有了HAMT的缓解,在线训练仍然是一个计算成本很高的过程,这是因为几个教师必要的前向传播过程。作者指出,知道什么时候需要什么样的适应是很重要的,故引入自适应域检测机制来解决这个问题,然后引入一组策略来减少训练时间,同时相应地优化学习率。

在线适应系统的一个关键要素是获取学生模型在部署期间所经过的数据分布空间(即域)中的轨迹的感知。我们可以通过在源域中设置轨迹原点来对问题建模。对于高维数据,数据分布难以处理,因此不能用封闭形式描述轨迹。因此,作者添加了一个轻量级分割头3e117c74393848f4f60edf440bbc2ccf.png,并将其连接在第一个编码器模块4d3017e648fafc809a805b6d064474bd.png之后,用来修改用于特征距离损失fe5f1d835465472637be6021ab0a8ba3.png的静态教师ce4004e4aa5293f83e50a3c2d51d6130.png的主干:536af5781c8474f5820789bcafcc1343.png

作者在源数据上离线训练这个轻量级分割头,而不会在模型的主干结构上传播梯度(即,d66458de9ed6c2f78e862654909756a9.png被冻结)。这个轻量级分割头会生成目标领域数据的预测。在目标预测时,对于给定的目标样本7268fecd549ba4235afe50c4bc868274.png,作者提出计算学生模型预测40fe484f820a808ff3f3349fcf3a95ee.png与轻量级分割头的预测7dfce27fab9715a4aac28fb7402fe02f.png之间的交叉熵,公式如下:

eea74b42f7b6f5a55454384924ef73d3.png

由于学生模型具有更高的泛化能力(因为更多的参数和无监督的自适应过程),它将始终优于轻量级解码器头。然而,由于现在距离是在预测空间中测量的,不会受到模型误校准的影响。此外,由于学生模型处于不断的适应中,域距离精度实际上会随着时间的推移而提高,从而导致更好的结果。

接下来使用使用分箱平均和信号离散化来检测领域的变化,使用了分箱平均的方法。定义了一个经过降噪的信号:

dd8fd714729f6295730b580888488c9b.png

其中,ba9c66ade62ee3e9b75c2a200b6b84a1.png表示某个特定时刻 j 的信号值,m表示分箱的大小或数量。

领域被建模为1a7eba17628bf817ce1e4bb564ee75b2.png的离散步骤。通过该方法,将连续的数据分成离散的部分,每个状态代表一个不同的领域,以便更容易进行建模和分析。引入了一个新的信号B,用来表示离散化后的信号:

3b3d09cc7ddb12d3b15d742970ef58d3.png

当 af6598a6f070a71c9a5b28e833af664d.png大于给定的阈值z时,7e35872c5caf5b109f38afce50f8219d.png将等于8c888988c11d391f2c87eea2f740f6c8.png,否则它将等于上一个信号fb72cef974d8e130d61020d8b15ec594.png。这个步骤用来将连续的信号分成不同的领域。

最后,引入了一个有符号的域变化幅度6a53f4fcdeb088ad1f2574ad184edeaf.png,用来表示领域的变化,每当 |∆Bi| 大于给定的阈值 z 时,就会检测到领域的变化。

最小训练和自适应学习率:

作者指出,通过B 就可以自定义训练过程,作者采用了一种最小训练(LT)的策略,只有在面对新的领域时(即|∆Bi| > z)才触发适应过程。在线学习性能的有效性在很大程度上取决于一些超参数的选择,如学习率 η 和学习率衰减率。因此,我们可以根据遇到的领域转变的性质和强度来调整这些参数,以便促进适应性,作者将这种协调称为“自适应学习率 (ALR)”。例如,领域转变非常大,即 |∆Bi| 较大,那么需要更多的适应来抵消其影响。适应方法是可以通过增加优化迭代次数或者在适应期间使用更高的学习速率。

当检测到领域转变时,根据 |∆Bi| 相对于设定的阈值 z 的大小,计算所需的适应迭代次数:

8b2bf878030a13fa6b8e5045ef540419.png

其中60c9ee8eab7dba18a8efde2e51d37e63.png是一个乘法因子,代表了最小的适应迭代次数。这样,适应迭代次数与领域转变的幅度成比例。积累适应步骤:如果在适应过程完成之前发生新的领域转变,那么需要累积所需的优化步骤。这确保了模型可以适应连续的领域变化,而不仅仅是应对单次变化。然后,我们可以使用两个进一步的参数:8aca26010124e33ec75def96fd469c14.png和学习率计划。3b9380c99574afbf102a7c992f62e746.png用于调整适应过程中的迭代次数,该数的设置根据领域转变的性质和强度来调整,以确保适应过程更平滑。学习率 η 是一个关键的超参数,它会在适应过程中逐渐减小。这个减小的速度是根据领域转变的大小来调整的。如果领域转变较小,学习率会以较快的速度下降,以更快地完成适应。如果领域转变较大,学习率下降的速度会相对较慢,以确保适应过程更充分。初始学习率47d627bec830bcf52e218d811cfd86cb.png也会根据领域转变的位置和距离源领域的远近进行调整,以确保模型在不同领域转变情况下都有合适的学习率。

b019d030c912da775d3393c9670e5491.png

其中,ecb09f724f92d24c6916f53513f47ff4.png3ed4c47860b2a5dec92566a9ae6351de.png是对领域转变信号 B 的估计,分别表示模型接近源领域和远离源领域时的领域转变信号。21e322098455dc4728aeed4055c667a5.png22b6c3915da41ad51cd982ad90f32b61.png是学习率的最小值和最大值。

假设,向源移动比向更难的领域移动需要更少的适应:由于采用了正则化策略,该模型对先前探索的领域显示出良好的回忆。根据模型当前位置与源领域的距离来调整103cc37af52cdda58382ff8efc90b7d5.png表示如下:

e937e1f382955846175a365a38d375ab.png

其中,∆Bi 表示当前领域转变的信号,355a42e40862b544866ee0011fdfe396.png表示适应迭代次数的参数。

1b2ece44fc25f5b5d9990015a02e8759.png

实验

5e0bca87f021b2e17a9e01fa1e235c96.png

实验是在(a) OnDA基准和(b) SHIFT数据集上进行的。(a)是半合成基准,因为它适用于4种不同强度剖面的合成雨和雾。主要基准Increasing Storm呈现出金字塔型的风暴强度剖面;见图4。相比之下,(b)是一个纯合成数据集,其中底层图像和天气都是合成生成的,因此区域变化是完全可控的。所有模型都使用mIoU进行评估,展示了域上的谐波平均值,以呈现整体自适应性能。

8b2fcf6b1b079f4af70c4f2cb7a35bc4.png

图 4 HAMLET在风暴数据上的表现

消融实验:

在表1中,作者从准确性和效率两方面研究了各贡献对适应性能的影响。对于每种配置,我们报告序列不同部分的mIoU,帧率和GFLOPS的数量-分别为:总的,前向和后向传播,以及仅专用的适应也分为前向(Fwd)和后向(Bwd)。表1 (a)显示了增大风暴情景的结果。在这里,展示了200mm领域的mIoU,即序列中最困难的领域,以及从前向适应到200mm雨和反向适应的mIoU平均值。结果是根据不同的种子平均值计算的,同时报告了标准偏差。

(A) 展示了通过简单地对模型进行完全适应性训练所实现的结果。HAMT可以通过减少34%的后向传递GFLOPS的代价,将帧率提高约15%,但平均mIoU减少了0.7,即在200mm领域大约下降了2个点。在速度方面,主要的提升显然来自LT(C),它阻止了在检测到领域漂移时进行训练。LT通过减少总GFLOPS而增加帧率,但不影响适应性的后向传递GFLOPS。然而,这也以mIoU方面的代价为代价,平均下降了约4个点,而在200mm领域下降了超过10个点,这已经不是一个轻微的下降了。LT的影响高度依赖于部署过程中经历的领域序列:频繁的领域变化可能会阻止训练的抑制,从而忽略了LT在效率方面的收益,后文将进一步讨论。通过添加ALR(D),逐渐恢复了准确性,进一步的改进由DCM(E)和RCS(F)之一或两者一起(G)产生,从而导致完整的HAMLET配置。这三者共同使mIoU的差距缩小到2.5个点 - 在200mm领域下是4个点 - 而不牺牲任何效率。

表1(b)展示了更多的结果。作者展示了单个领域的mIoU,以及源领域和目标领域以及所有帧的调和平均值。在这个基准测试中,仅LT(C)的效果明显较之前差,FPS和GFLOPS增幅更低。在这里,HAMT、LT和其他组件(G)之间的协同作用允许获得最佳准确性和速度提升,甚至胜过完整训练变体(A),突出它们的互补性。

表 1 消融实验结果

0422e0753a768b5b9690d94fa65644f2.png

风暴增加的实验结果:

表格2中是HAMLET与其他相关方法的直接比较,特别是与TENT和CoTTA这两种测试时自适应策略进行了比较。公平起见,所有方法都使用相同的初始权重,其中HAMLET需要额外的轻量级解码器。他们都使用了SegFormer MiT-B1作为主干网络。

表 2 风暴增加情况下各方法对比

bb0cbdb970eb67e884aff70289a9bda5.png

其结果如下:

A. DeepLabv2仅在源数据上进行训练。

B. 使用全监督的Oracle模型进行训练。

C. OnDA作为参考。

D和E. SegFormer模型仅在源领域上进行训练。

F. 使用全监督的Oracle SegFormer模型进行训练。

G和H. TENT模型在测试时自适应,分别使用和不使用帧缓冲。

I. CoTTA模型在测试时自适应。

J. 强制CoTTA以接近30FPS的实时速度运行时的性能。

 K. HAMLET模型的性能。

对于SegFormer模型,结果显示其在面对领域变化时比DeepLabv2更加稳健。同时优于OnDA(C)。更快的SegFormer变体(D)在速度和准确性方面都优于OnDA,达到48 FPS。然而,领域变化仍然限制了SegFormer的潜力。TENT模型在测试时自适应,前向适应性表现略逊于预训练模型(D),但在后向适应方面表现更好。尽管TENT优于SegFormer MiT-B1,但它在速度和准确性方面都不如没有任何自适应的SegFormer MiT-B5,这进一步表明了后者的稳健性,使TENT不适用于实际部署。

相反,CoTTA模型在测试时自适应,虽然性能优于仅在源数据上训练的SegFormer模型,但帧率下降到1FPS以下。需要注意的是,这些指标是在每个模型单独完成每个领域后收集的。在一个规定了共享时间框架的评估设置中,较慢的模型会呈现更低的指标,因为它们的自适应过程将不断滞后。实际上,将CoTTA强制运行在接近30FPS的实时速度时,即每50帧进行一次训练,会显著降低自适应过程的有效性,导致在最困难的领域中性能急剧下降。

最后,HAMLET在各方面都取得了成功,将基准(D)的性能提高了约10个点,只以25%的速度代价,同时在准确性(+2.5 mIoU)和速度(3倍更快)上优于SegFormer MiT-B5(E)。这是唯一一个能够实现这一点的方法,因此也是适用于实时应用的唯一选择。图4展示了HAMLET在"增加的风暴"情景中适应的整体行为。图中展示了雨强度以及在每个领域上实现的mIoU(活跃为粗体,非活跃为虚线),即部署时当前面对的领域的mIoU,以及当前自适应如何影响其他领域的性能以突出对遗忘的稳健性。

其他实验结果:雾和SHIFT:

作者使用了与之前的"增加的风暴"情景相同的超参数,因为在这两种情况下,最开始的SegFormer模型都是在相同的源领域上进行训练的。作者使用"增加的雾气"作为测试集,结果如表3,与在源领域上训练的SegFormer模型(不进行自适应)和通过全面的在线训练优化进行自适应的模型进行比较(即表1中的配置(A))。结果显示,HAMLET几乎可以像全面的在线训练模型一样进行自适应,只有不到3个mIoU的差距,同时以近5倍的速度进行实时自适应,使用了40%的FLOPS。这表明HAMLET在应对不同类型的领域变化时具有较好的泛化能力。

表 3 雾天的实验结果

901f69ec3f0aaa5ae6e95c84dd1a55d2.png

在SHIFT数据集上进一步测试了HAMLET。表4收集了在Clear、Cloudy、Overcast、Small rain、Mid rain和Heavy rain领域上,分别由SegFormer在源领域上训练、进行全面在线训练和使用HAMLET进行前向和后向自适应所实现的结果。在这里,HAMLET的结果与全面的训练模式竞争力很强,只有平均mIoU下降了0.5个点,同时速度快了5倍以上。图5从上到下依次描述了SHIFT数据集上每个领域的雨强度、在当前领域(粗体)和非当前领域(虚线)上实现的mIoU、基于领域漂移检测的学习率变化以及在任何步骤中实现的帧率。

表 4 在SHIFT数据集上的结果

cc7b4298d32f90fe86a07b86f5bb98c5.png

6c1261ab094a83df1f54ef746eece7c7.png

图  5 HAMLET在SHIFT数据上的表现

图6显示了来自CityScapes数据集的一些定性示例。可以看到,在强降雨条件下,SegFormer的准确性下降(第二行),而HAMLET(第三行)能够在风暴中保持相同的分割质量。这进一步证明了HAMLET在处理不同天气条件下的语义分割任务时的优越性。

13884bbe6839b1683e67a1e502e32c98.png

图 6 HAMLET的定性结果

8ccc738b037c7d6e12d437a38e5c48e0.png

结论

4e11c2b50ecf3ffacd41aeeaaabaf3fb.png

作者提出了HAMLET,这是一个实时适应语义分割的框架,可以在具有连续域变化的既定基准上实现最先进的性能。该方法结合了硬件感知的反向传播编排器和专门的域移位检测器,以实现对模型适应的主动控制,从而在消费级GPU上实现高帧率。这些进步使HAMLET成为野外部署的有前途的解决方案,使其成为在面对不可预见的域变化时需要健壮性能的应用程序的有价值的工具。


http://lihuaxi.xjx100.cn/news/1721054.html

相关文章

零基础Linux_23(多线程)线程安全+线程互斥(加锁)+死锁

目录 1. 线程安全 1.1 线程不安全前期 1.2 线程不安全原因 2. 线程互斥 2.1 加锁保护(代码) 2.2 锁的本质 3. 可重入对比线程安全 4. 死锁 4.1 死锁的必要条件 4.2 避免死锁 5. 笔试面试题 答案及解析 本篇完。 1. 线程安全 基于上一篇线程…

python实现ModBusRTU客户端

python实现基于串口通信的ModBusRTU客户端是一件简单的事情,只要通过pymodbus模块就可以实现。 一、关于ModbusRTU 1、什么是ModbusRTU Modbus RTU(Remote Terminal Unit)是一种串行通信协议,用于在工业自动化系统中传输数据。它…

2023NOIP A层联测18-划分

对于一个长度为 n n n 的 01 字符串 S S S,请你求出将其分为至少 k k k 段,将每一段看为二进制数求和后的最大值以及取到这个最大值的划分方案的数量。 n ≤ 2 1 0 6 n\le2\times10^6 n≤2106 字符串编号从 1 1 1 开始。 若 n k nk nk&#xff0…

Java基于ssm+vue开发的失物招领小程序

演示视频: 小程序 https://www.bilibili.com/video/BV1sg4y1d75T/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 管理员 https://www.bilibili.com/video/BV1UH4y167xe/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07a…

解决vi编辑器方向按键和删除按键无法使用问题

1.解决上下左右键出现ABCD现象 首先执行 echo "set nocp" >> ~/.vimrc 再执行下面代码即可 source ~/.vimrc 2.解决删除键无法使用现象 首先执行 echo "set backspace2" >> ~/.vimrc 再执行下面代码即可 source ~/.vimrc

2011-2021年北大数字普惠金融指数数据(包括省市县)第四期

2011-2021年北大省市县数字普惠金融指数数据(第四期) 1、时间:2011-2021年 2、指标:index_aggregate、coverage_breadth、usage_depth、payment、insurance、monetary_fund、investment、credit、credit_investigation、digitiz…

RK3399平台开发系列讲解(基础篇)嵌入式编码规范有哪些

🚀返回专栏总目录 文章目录 一、什么是GNU二、GNU C 编码规范2.1、格式2.2、注释2.3、语法约定2.4、命名2.5、系统可移植性2.6、CPU 可移植性2.7、系统函数2.8、国际化2.9、字符集沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 GNU 编码规范的出发点,是确保所有 G…

Zoho Mail荣登福布斯2023年企业邮箱榜单,引领行业新方向!

几十年来,电子邮件一直是电子通信的重要形式,并且在未来的许多年里,它可能会无处不在。尽管有大量免费电子邮件服务可供用户和企业使用,但其中许多服务缺乏专门的功能,例如适合办公室使用的集中管理。 福布斯小型企业顾…