LW-DETR: A Transformer Replacement to YOLO for Real-Time Detection

news2024/11/17 10:52:43

LW-DETR: A Transformer Replacement to YOLO for Real-Time Detection

论文链接:http://arxiv.org/abs/2406.03459

代码链接:https://github.com/Atten4Vis/LW-DETR

一、摘要

  介绍了一种轻量级检测变换器LWDETR,它在实时物体检测方面超越了YOLO系列。LWDETR的架构简单,由ViT编码器、投射器和浅层DETR解码器堆叠而成。该方法利用了如有效的训练技巧(如改进的损失函数和预训练)、以及交叉的窗口和全局注意力,以降低ViT编码器的复杂性。通过聚合多级特征图以及ViT编码器中的中间和最终特征图,形成了更丰富的特征图,从而改进了ViT编码器。同时,引入了窗口优先的特征图组织方式,以提高交叉注意力计算的效率。实验结果表明,该方法在COCO和其他基准数据集上,相对于现有的实时检测器(如YOLO及其变种)具有显著优势。
在这里插入图片描述

文章目录

  • LW-DETR: A Transformer Replacement to YOLO for Real-Time Detection
    • 一、摘要
    • 二、创新点
    • 三、原理
      • 1、Architecture
      • 2、Instantiation
      • 3、Effective Training
      • 4、Efficient Inference
      • 5、Empirical Study
    • 四、实验
      • 1、Settings
      • 2、Results
      • 3、Discussions
      • 4、Experiments on more datasets
    • 五、总结

二、创新点

  • 构建了一个轻量级DETR方法,用于实时物体检测。一个普通的ViT编码器[17],通过卷积投影器与DETR解码器相连。提出聚合多级特征图,包括编码器中的中间和最终特征图,形成更强的编码特征图。

  • 使用了高效的推理技术。采用了交错窗口和全局注意力[36,37],在普通的ViT编码器中替换一些全局注意力,以减少复杂性。通过窗口优先的特征图组织方法实现交错注意力的高效实现,有效地减少了昂贵的内存重排操作。

三、原理

1、Architecture

 LW-DETR 由一个ViT编码器(Vision Transformer Encoder)、一个投影器(Projector)和一个DETR解码器(DETR Decoder)组成。

Encoder 采用ViT [17] 作为检测编码器。原始的ViT包含一个分块层和Transformer编码层。Transformer编码层在最初的ViT中包含一个对所有token(patch)的全局自注意力层和一个FFN层。全局自注意力计算成本较高,其时间复杂度与token(patch)数量的平方成正比。通过使用窗口自注意力来降低计算复杂度(详细内容见4)。作者提出将多级特征图、编码器中间层和最终特征图进行聚合,形成更强的编码特征图。编码器的一个例子如图2所示。
在这里插入图片描述

Decoder 解码器是一个堆叠的Transformer解码层。每个层包含一个自我注意力、一个交叉注意力和一个FFN(前向传播神经网络)。为了提高计算效率,采用了可变形的交叉注意力 [74]。DETR及其变体通常采用6个解码层。论文实现使用了3个Transformer解码层。这使得时间从1.4毫秒减少到0.7毫秒,相对于所提方法中Tiny版本的其余部分(1.3毫秒)来说,这是一个显著的减少。

 采用混合查询选择策略 [67]来形成对象查询,它是内容查询和空间查询的组合。内容查询是可学习的嵌入,类似于DETR。空间查询基于两阶段方法:首先从Projector的最后一层中选择前K个特征,然后预测边界框,并将相应的框转换为嵌入作为空间查询。

Projector 使用投影器连接编码器和解码器。投影器以编码器的聚合特征图作为输入。投影器是一个C2f块(密集连接网络(DenseNet)的跨阶段部分扩展[26,60]),在YOLOv8 [29]中实现。

  在构建LW-DETR的largexlarge版本时,修改了投影器Projector,使其输出两种尺度( 1 8 \frac{1}{8} 81 1 32 \frac{1}{32} 321 )的特征图,并相应地使用多尺度解码器[74]。投影器包含两个并行的C2f块。一个处理通过反卷积上采样的 1 8 \frac{1}{8} 81 尺度特征图,另一个处理通过步长卷积下采样的 1 32 \frac{1}{32} 321尺度特征图。图3展示了单尺度投影器和多尺度投影器的pipeline。
在这里插入图片描述

Objective function 采用了一种IoU感知分类(Intersection over Union-aware classification)损失,即IA-BCE损失[3]:
L c l s = ∑ i = 1 N p o s B C E ( s i , t i ) + ∑ j = 1 N n e g s j 2 B C E ( s j , 0 ) ,   ( 1 ) L_{cls} = \sum^{N_{pos}}_{i=1} BCE(s_{i}, t_{i}) + \sum^{N_{neg}}_{j=1} s^{2}_{j} BCE(s_{j}, 0), \ (1) Lcls=i=1NposBCE(si,ti)+j=1Nnegsj2BCE(sj,0), (1)

其中, N p o s N_{pos} Npos N n e g N_{neg} Nneg 分别表示正样本和负样本的数量。 s s s是预测的分类得分, t t t是吸收了IoU得分 u u u(与真实值)的目标得分: t = s α u 1 − α t = s^{\alpha}u^{1−\alpha} t=sαu1α,其中$\alpha$实际上被设置为0.25(参见Cai等人2023年的工作[3])。

 整体损失是分类损失和与DETR框架(如[4,67,74]中相同的)相结合的边界框损失,其公式如下:
L c l s + λ i o u L i o u + λ L 1 L 1 。  ( 2 ) L_{cls} + \lambda_{iou} L_{iou} + \lambda_{L_{1}}L_{1}。 \ (2) Lcls+λiouLiou+λL1L1 (2)

其中, λ i o u \lambda_{iou} λiou λ L 1 \lambda_{L_{1}} λL1 被设置为 2.0 和 5.0,这与[4, 67, 74]中的做法相似。 L i o u L_{iou} Liou L 1 L_{1} L1 分别是广义IoU(GIoU)损失[52] 和用于边界框回归的L1损失

2、Instantiation

  文中实例化了5个实时检测器:tiny、small、medium、large和xlarge。详细的设置见表2。
在这里插入图片描述

tiny检测器包含一个6层的transformer编码器。每层由多头自注意力模块和前馈网络(FFN)组成。每个图像块被线性映射到一个 192 192 192维的表征向量。投影器输出单尺度特征图,具有 256 256 256个通道。解码器有 100 100 100个对象查询。

small检测器包含 10 10 10层编码器, 300 300 300个对象查询。与tiny检测器相同,输入图像块的表征维度和投影器输出为 192 192 192 256 256 256。medium检测器与small类似,区别在于输入图像块的表征维度提升到 384 384 384,因此编码器的维度也相应调整为 384 384 384

large检测器 10 10 10层编码器组成,并使用两尺度特征图(参见第1部分的投影器)。输入图像块的表征维度和投影器输出为 384 384 384 384 384 384。xlarge检测器与large类似,区别在于输入图像块的表征维度提升到 768 768 768

3、Effective Training

More supervision. 为了加速DETR的训练,已经发展出多种技术,例如 [6, 27, 75]。采用了易于实施且不影响推理过程的Group DETR [6]。按照[6]的做法,使用了13个并行的权重共享解码器进行训练。对于每个解码器,从投射器的输出特征中为每个组生成对象查询。同样遵循[6],使用主解码器进行推理。

Pretraining on Objects365. 预训练过程分为两阶段。首先,基于预训练模型,使用MIM方法CAEv2 [71] 在Objects365数据集上预训练ViT,这使得在COCO上的mAP提高了0.7。其次,按照[7, 67]的做法,重新训练编码器,并在Objects365上监督地训练投影器和解码器。

4、Efficient Inference

 采用了交错的窗口和全局注意力:将一些全局自注意力层替换为窗口自注意力层。例如,在一个6层的ViT中,第一、第三和第五层使用窗口注意力。窗口注意力通过将特征图划分为不重叠的窗口,并分别在每个窗口上执行自注意力来实现。

  采用了一种窗口优先的特征图组织(window-major feature map organization)策略,以实现高效的交错注意力。这种组织方式按窗口方式排列特征图。ViTDet实现[36]中,特征图按行(row-major organization)排列,为了转换为窗口优先的组织,需要昂贵的’permutation’操作。论文实现去除了这些操作,从而减少了模型延迟。通过一个简单的示例来说明窗口优先的方式。给定一个 4 × 4 4 \times 4 4×4的特征图:
[ f 11   f 12   f 13   f 14 f 21   f 22   f 23   f 24 f 31   f 32   f 33   f 34 f 41   f 42   f 43   f 44   ( 3 ) ] [f_{11} \ f_{12} \ f_{13} \ f_{14} \\ f_{21} \ f_{22} \ f_{23} \ f_{24} \\ f_{31} \ f_{32} \ f_{33} \ f_{34} \\ f_{41} \ f_{42} \ f_{43} \ f_{44} \ (3) ] [f11 f12 f13 f14f21 f22 f23 f24f31 f32 f33 f34f41 f42 f43 f44 (3)]
  对于大小为 2 × 2 2 \times 2 2×2的窗口,其窗口主导向组织如下:
f 11 , f 12 , f 21 , f 22 ; f 13 , f 14 , f 23 , f 24 ; f 31 , f 32 , f 41 , f 42 ; f 33 , f 34 , f 43 , f 44 .   ( 4 ) f_{11}, f_{12}, f_{21}, f_{22}; f_{13}, f_{14}, f_{23}, f_{24}; \\ f_{31}, f_{32}, f_{41}, f_{42}; f_{33}, f_{34}, f_{43}, f_{44}. \ (4) f11,f12,f21,f22;f13,f14,f23,f24;f31,f32,f41,f42;f33,f34,f43,f44. (4)
  这种组织方式适用于不重新排列特征的窗口注意力和全局注意力。行主序组织
f 11 , f 12 , f 13 , f 14 ; f 21 , f 22 , f 23 , f 24 ; f 31 , f 32 , f 33 , f 34 ; f 41 , f 42 , f 43 , f 44 ,  ( 5 ) f_{11}, f_{12}, f_{13}, f_{14}; f_{21}, f_{22}, f_{23}, f_{24}; \\ f_{31}, f_{32}, f_{33}, f_{34}; f_{41}, f_{42}, f_{43}, f_{44}, \ (5) f11,f12,f13,f14;f21,f22,f23,f24;f31,f32,f33,f34;f41,f42,f43,f44 (5)
  对于全局感知是合适的,但为了实现窗口注意力,它需要进行昂贵的permutation操作。

5、Empirical Study

  实证展示了训练技巧和高效推理技术如何提升DETR的性能。以small检测器为例进行研究。本研究基于一个初始检测器:编码器采用所有层的全局注意力,并输出最后一层的特征图。实验结果见表2。

Latency improvements. ViTDet采用的交错窗口和全局注意力,将计算复杂度从23.0GFlops降低到16.6 GFlops,验证了用更快捷的窗口注意力替换昂贵的全局注意力的益处。然而,延迟并未减少,反而增加了0.2 ms。这是因为行优先特征图组织需要额外昂贵的(permutation)操作。采用列优先特征图组织(window-major)可以缓解这一副作用,导致更大的延迟降低,从3.7 ms降至2.9 ms。

Performance improvements.多级特征聚合带来了0.7的mAP提升。IoU感知的分类损失和更多的监督将mAP分数从34.7提升到35.4和38.4。对边界框回归目标的重新参数化(参考 [40],详情见附录)略有性能提升。预训练在Objects365上的显著改进达到8.7的mAP,表明transformer确实从大数据中获益。更长的训练周期可以带来进一步的提升,形成了LW-DETR-small模型。

四、实验

1、Settings

Datasets. 预训练数据集为Objects365 [54]。遵循[7,67]的做法,将train集的图像与validate集(除前5000张图像外)的图像合并进行检测预训练。使用微软COCO2017的标准数据划分策略[39],并在COCO val2017上进行评估。

Data augmentations. 采用DETR及其变体 [4, 74]中的数据增强方法。遵循实时检测算法 [1, 29, 46],在训练时随机将图像调整为正方形。为了评估性能和推理时间,按照实时检测算法 [1, 29, 46]的评估方案,将图像调整为 640 × 640 640 \times 640 640×640像素。使用 10 × 10 10 \times 10 10×10的窗口大小,以确保图像大小可以被窗口大小整除。

Implementation details. 在Objects365 [54]上预训练检测模型30个轮次(epoch),然后在COCO [39]上进行总共 180 , 000 180,000 180,000次迭代的微调。采用指数移动平均(EMA)技术 [55],衰减率为0.9997。实验使用AdamW优化器 [44]进行训练。

  预训练时,投影器和DETR解码器的初始学习率为 4 × e − 4 4 \times e^{−4} 4×e4,ViT主干网络的初始学习率为 6 × e − 4 6 \times e^{−4} 6×e4,批次大小为128。在微调阶段,投影器和DETR解码器的初始学习率为 1 × e − 4 1 × e^{−4} 1×e4,ViT主干网络的初始学习率为 1.5 × e − 4 1.5 ×e^{−4} 1.5×e4。tiny、small和medium模型的批次大小设置为32,large和xlarge模型的批次大小设置为16。对于180,000次迭代,tiny、small和medium模型为50个轮次,large和xlarge模型为25个轮次。更多细节,如权重衰减、ViT编码器的层别衰减以及微调过程中的组件衰减(component-wise decay)[7],请参阅补充材料。

  以fp16精度和1个批次在COCO val2017上,使用T4 GPU进行端到端的平均推理延迟测量,环境设置为TensorRT-8.6.1、CUDA-11.6和CuDNN-8.7.0。采用TensorRT中的efficientNMSPlugin实现高效的NMS。所有实时检测器的性能和端到端延迟都在官方实现中进行测量。

2、Results

在这里插入图片描述

  五个LW-DETR模型的结果在表3中报告。LW-DETR-tiny 在T4 GPU上以500 FPS的速度实现了42.6的mAP。LW-DETR-small 和LW-DETR- medium 分别达到48.0 mAP,速度超过340 FPS,以及52.5 mAP,速度超过178 FPS。large 和xlarge 模型分别以113 FPS的速度达到56.1 mAP,以及58.3 mAP,速度为52 FPS。

Comparisons with state-of-the-art real-time detectors.
  表3报告了LW-DETR模型与代表性的实时检测器(包括YOLO-NAS [1]、YOLOv8 [29]和RTMDet[46])的比较。可以看到,无论是否使用预训练,LW-DETR都持续优于先前的实时检测器最先进的性能。

  LW-DETR在tiny到xlarge五个尺度上,无论是延迟还是检测性能,都明显优于YOLOv8和RTMDet。

  与先前最佳方法之一YOLO-NAS(通过神经架构搜索获得)相比,LW-DETR模型在small和medium尺度上分别提高了0.4 mAP和0.9 mAP,速度分别快1.6倍和约1.4倍。随着模型规模增大,改进更为显著:在large尺度上以相同速度运行时,LW-DETR的mAP提高了3.8。

  进一步通过精细调整NMS过程中的分类得分阈值,提高了其他方法的表现,并在右两列报告了结果。这些方法的性能大幅提高,但仍低于LW-DETR。所提方法可能从先前实时检测器采用的改进中受益,如神经架构搜索(NAS)、数据增强、伪标签数据和知识蒸馏[1,29,46]。

Comparison with concurrent works.
  将LW-DETR与实时检测中的同期工作进行比较,包括YOLO-MS [12], Gold-YOLO [58], RT-DETR [45], 和YOLOv10 [57]。YOLO-MS通过增强多尺度特征表征来提高性能。(multi-scale feature representation)Gold-YOLO通过增强多尺度特征融合,并应用MAE风格的预训练[22],以提升YOLO的性能。YOLOv10设计了几个兼
顾效率和精度的模块来提升性能。(efficiency-driven modules)

  RT-DETR [45],与LW-DETR密切相关,也是基于DETR框架,但在主干(backbone)、投影器(projector)、解码器(decoder)和训练方案上与所提方法有许多不同。
在这里插入图片描述

在这里插入图片描述

  比较结果见表4 和图4。LW-DETR在检测性能和延迟之间始终实现更好的平衡。YOLO-MS和Gold-YOLO在所有模型规模上都明显表现出比LW-DETR较差的结果。(worse results)LW-DETR-large 比相关性高的RT-DETR-R50在mAP上高出0.8,速度更快(8.8 ms vs. 9.9 ms)。其他规模的LW-DETR也表现出优于RT-DETR的结果。与最新工作YOLOv10-X [57]相比,LW-DETR-large 在性能上更高(56.1 mAP vs. 54.4mAP),延迟更低(8.8 ms vs. 10.70 ms)。

3、Discussions

NMS post-processing. DETR 方法是一种端到端的算法,不需要NMS后处理步骤。相比之下,现有的实时检测器,如 YOLO-NAS [1]、YOLOv8[29] 和 RTMDet [46],需要NMS [24]后处理。NMS过程会消耗额外的时间。在测量端到端推理成本时,包括了这个额外时间,这在实际应用中是需要考虑的。

  作者对使用NMS的方法进行了进一步优化,通过调整NMS后处理的分类得分阈值。实验观察到,YOLO-NAS、YOLOv8和RTMDet的默认得分阈值(0.001)虽然能获得较高的mAP,但会产生大量框,从而导致较高的延迟。特别是当模型较小时,端到端延迟主要由NMS延迟主导。调整了阈值,以在mAP分数和延迟之间取得良好的平衡。实验发现,mAP分数略有下降(例如,-0.1 mAP到-0.5 mAP),而运行时间大幅减少,例如,减少了约4-5ms,对于RTMDet和YOLOv8,减少了1-2ms(YOLO-NAS的延迟)。这些减少来自于调整得分阈值后,输入NMS的预测框数量减少。不同得分阈值下的详细结果,以及COCO val2017上剩余框数的分布,见补充材料。

  图1展示了与其他方法(经过良好调优的NMS流程)的比较。带有NMS的方法有所提升,但所提方法仍然优于其他方法。排名第二的YOLO-NAS是一种网络架构搜索算法,其性能非常接近实验的基线。作者认为,像YOLO-NAS中使用的复杂网络架构搜索过程可能对DETR方法有利,预计未来还有进一步的改进空间。

在这里插入图片描述

Pretraining. 实验性地研究了预训练的效果。如表5所示,预训练对所提方法带来了显著的改进,平均提高了5.5个mAP。tiny模型的mAP提高了6.1,而xlarge模型的mAP提高了5.3。这表明在大型数据集上对DETR类模型的预训练非常有益。

  实验表明,训练过程适用于使用卷积编码器的DETR方法。用ResNet-18和ResNet-50替换transformer编码器。从表5中可以看出,这些LW-DETR变体在延迟和mAP方面的性能接近使用transformer编码器的LW-DETR,而且预训练带来的好处与transformer编码器的LW-DETR相似,但略低一些。

在这里插入图片描述

  同时,作者研究了预训练对非端到端检测器的改进。根据表3, 4和6的结果,似乎在Objects365上预训练仅对非端到端检测器(如 [12, 29, 46, 58])显示出有限的提升,这与DETR基检测器中预训练带来的大幅改进不同。由于非端到端检测器可能训练300个甚至500个epoch,这种有限的提升是否与训练轮次有关?表6显示,随着训练轮次的增加,提升逐渐减小,这部分支持了上述假设。

4、Experiments on more datasets

  实验检验了LW-DETR模型在更多检测数据集上的泛化能力。采用了两种评估方法,即跨域评估多域微调。对于跨域评估,实验直接在COCO数据集上训练的实时检测器上评估在Unidentified Video Objects(UVO) [61]上的性能。在多域微调部分,使用预训练的实时检测器在多域检测数据集Roboflow 100 (RF100) [13]上进行微调。实验在每个数据集上对所有模型的超参数进行了粗略搜索,例如学习率。更多详细信息请参阅附录材料。

Cross-domain evaluation. 评估模型泛化能力的一种方法是直接在不同领域数据集上进行评估。实验采用了类agnostic的物体检测基准UVO [61],其中57%的物体实例不属于COCO的80个类别。UVO基于YouTube视频,其外观与COCO有很大差异,例如,有些视频是第一人称视角且存在显著的运动模糊。实验使用COCO(参见表3)训练的模型在UVO的验证集上进行评估。

在这里插入图片描述

  表7给出了结果。LW-DETR在实时检测器中的表现优于当前最先进的方法。具体来说,LW-DETR-small在mAP上比RTMDet-s、YOLOv8-s和YOLO-NAS-s中的最佳结果高出1.3,而在AR上高出4.1。在召回率方面,它也显示出更强的检测不同尺度(小、中、大)物体的能力。上述发现表明,LW-DETR相对于先前的实时检测器的优势并非源于对COCO的特定调优,而是得益于其生成更通用模型的能力。

Multi-domain finetuning. 另一种方法是在不同领域的小型数据集上微调预训练的检测器。RF100包含100个小型数据集,7个图像领域,224,000张图像和829个类别标签。它可以帮助研究人员用现实生活中的数据测试模型的泛化能力。实验在RF100的每个小型数据集上微调实时检测器。
在这里插入图片描述

  结果见表8。LW-DETR-small在不同领域表现出优于当前最先进的实时检测器的优势。特别是在’documents’和’electromagnetic’,LW-DETR明显优于YOLOv5、YOLOv7、RTMDet和YOLOv8(比这四个中最好的高出5.7AP和5.6 AP)。LW-DETR-medium 在整体上提供了进一步的改进。这些发现突出了LW-DETR的通用性,使其在一系列封闭领域任务中成为强大的基线。

五、总结

  该方法利用了如有效的训练技巧(如改进的损失函数和预训练)、以及交叉的窗口和全局注意力,以降低ViT编码器的复杂性。引入聚合多级特征图窗口优先的特征图组织方式

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

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

相关文章

Flutter集成高德导航SDK(Android篇)(JAVA语法)

先上flutter doctor: flutter sdk版本为:3.19.4 引入依赖: 在app的build.gradle下,添加如下依赖: implementation com.amap.api:navi-3dmap:10.0.700_3dmap10.0.700navi-3dmap里面包含了定位功能,地图功能…

技术反诈指南丨央视报了!基于“AI换脸”的新型电信网络诈骗猖獗

目录 利用“AI换脸”技术的诈骗 技术上防范新型电信网络诈骗 内蒙古鄂尔多斯市居民李女士近日遭遇了一起新型电信网络诈骗案。诈骗团伙利用“AI换脸”技术,合成了与李女士老同学相似的视频通话,以此作为诈骗的关键手段,成功骗取李女士信任。 …

[数据质量]手动实现 阿里云DataWorks 的数据质量监控告警功能

目录 手动实现 DataWorks 的数据质量监控告警功能1. 简介:2. 数据表准备2.1 tmp_monitor_tbl_info (数据监控信息表)2.2 tmp_monitor_rule_info (数据质量监控规则表)2.3 tmp_monitor_tbl_info_log_di (数据监控信息记录表) 3. 程序开发3.1 数据检查程序3.2 告警信息推送程序3.…

Navcat Premium17破解安装及数据库连接教程

一、前言 Navicat Premium 是一套数据库开发工具,是一个可多重连接数据库的管理工具。Navicat Premium让你从单一应用程序中同时连接 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 数据库。目前17已经支持了很久都没有支持的Redis数据库了。…

大数据之Zookeeper部署

文章目录 集群规划环境准备集群部署参考资料 集群规划 确定使用Hadoop101、hadoop102和hadoop103三台服务器来构建Zookeeper集群。 hadoop101hadoop102hadoop103zookeeperzookeeperzookeeper 环境准备 安装zookeeper前需要确保下面的环境配置成功,具体可以参考大…

七一建党节|热烈庆祝中国共产党成立103周年!

时光荏苒,岁月如梭。 在这热情似火的夏日, 我们迎来了中国共产党成立103周年的重要时刻。 这是一个值得全体中华儿女共同铭记和庆祝的日子, 也是激励我们不断前进的重要时刻。 103年, 风雨兼程,砥砺前行。 从嘉兴…

五种肉苁蓉属植物叶绿体基因组-文献精读25

Structural mutations of small single copy (SSC) region in the plastid genomes of five Cistanche species and inter-species identification 五种肉苁蓉属植物叶绿体基因组中小单拷贝 (SSC) 区域的结构突变及物种间鉴定 摘要 背景 肉苁蓉属是列当科的重要属类&#xf…

小型气象站:便携、高效的气象监测新选择

在气象监测领域,一款小巧而功能全面的设备正逐渐受到广泛关注——那就是小型气象站。它不仅体积小巧、重量轻,而且采用了众多先进技术,使其在气象数据的采集、传输和分析中展现出强大的能力。 小型气象站之所以备受青睐,首先得益于…

error LNK2019: 无法解析的外部符号 _SDL_main,该符号在函数 _main_getcmdline 中被引用

VC MFC情况下出现此问题, 网上搜索了很多文章无法解决。 error LNK2019: 无法解析的外部符号 _SDL_main,该符号在函数 _main_utf8 中被引用_sdl2main.lib出现无法解析的外部符号-CSDN博客 字符集必须设置为:

交叉编译 tcpdump libpcap

文章目录 交叉编译 tcpdump & libpcap概述源码下载交叉编译 libpcap交叉编译 tcpdump 交叉编译 tcpdump & libpcap 概述 tcpdump 是一个强大的命令行包分析器,libpcap 是一个可移植的用于网络流量捕获的 C/C 库。tcpdump 依赖于 libpcap 库,同…

Jenkins接口自动化项目的工程创建

jenkins的下载安装 jenkins下载的官网地址 https://www.jenkins.io/download/ java环境变量的配置下载 jenkins是用java语言编写的所以要配置java环境 需要安装java的JDK 推荐安装JDK17(https://blog.csdn.net/wochunyang/article/details/138520209) JDK17的下载地址 ht…

红黑树模拟

1.红黑树概念 红黑树,是一种二叉搜索树,但每个节点上增加了一个存储位表示结点的颜色,可以是RED或BLACK。通过任何一条根到叶子节点的途径上各个节点的着色方式的限制,红黑树确保没有一条路径会超过其他路径的二倍,因…

基于Cisco模拟器的组网实验

课程目的 综合运用所学的网络原理、网络规划和网络集成等知识理论,按照下图所示,完成网络的规划、集成与配置,并利用ACL实现对网络的管理。 实验内容 连接并配置路由器,配置路由协议(RIP或OSPF)&#xf…

[Microsoft Office]Word设置页码从第二页开始为1

目录 第一步:设置页码格式 第二步:设置“起始页码”为0 第三步:双击页码,出现“页脚”提示 第四步:选中“首页不同” 第一步:设置页码格式 第二步:设置“起始页码”为0 第三步:双…

现在电气真的比不过计算机吗 ?

电气工程和计算机科学在今天的科技和工业领域中各有其重要性和发展空间,并不存在简单的比较谁“比不过”谁的情况。我收集制作一份plc学习包,对于新手而言简直不要太棒,里面包括了新手各个时期的学习方向,包括了编程教学&#xff…

【爱上C++】详解string类2:模拟实现、深浅拷贝

在上一篇文章中我们介绍了string类的基本使用,本篇文章我们将讲解string类一些常用的模拟实现,其中有很多细小的知识点值得我们深入学习。Let’s go! 文章目录 类声明默认成员函数构造函数析构函数拷贝构造函数深浅拷贝问题传统写法现代写法…

哪个量化软件最好用?散户也可以很快上手!QMT!

一、QMT是什么 QMT(Quantitative Multi-market Trading System)是一款专为高净值客户、量化爱好者及专业量化投资者设计的量化交易软件。它集行情显示、策略研究、交易执行和风控管理于一体,为投资者提供全方位的量化交易解决方案 二、QMT量化…

SAP配置发布WebService接口并调用(超级详细)

文章目录 前言一、案例介绍/笔者需求二、WebService是什么? a.传输协议 b.数据协议 c.WSDL d.UDDI 三、WebService 和 WebApi 的区别以及优缺点 a.主要区别 b.优缺点 四、SAP如何发布一个webser…

Perforce网络研讨会预告 | HelixCore vs SVN vs ClearCase:嵌入式开发中的数据管理趋势及工具对比分析

现如今,开发嵌入式软件涉及的规模比以往任何时候都庞大。团队在全球范围内不断扩展,文件数量呈指数级增长,项目每年所涉及的数字资产和元数据也更多,并且越来越多的团队成员要在相同的复杂项目中并行工作。 面对如此庞大的开发规…

《梦醒蝶飞:释放Excel函数与公式的力量》7.4 MID函数

第七章:文本处理函数 第4节:7.4 MID函数 7.4.1.MID函数简介 MID函数用于从文本字符串的指定位置开始提取指定数量的字符。它特别适用于从字符串中提取子字符串或处理具有特定格式的数据。 语法: MID(text, start_num, num_chars) - **t…