集智书童 | 英伟达和斯坦福基于 Transformer 的异常检测最新研究!

news2025/4/21 11:13:25

本文来源公众号“集智书童”,仅用于学术分享,侵权删,干货满满。

原文链接:英伟达和斯坦福基于 Transformer 的异常检测最新研究!

在作者推动各种视觉任务性能边界的同时,模型的大小也在相应增长。为了跟上这种增长,作者需要在边缘设备上进行高效推理和部署的非常激进的剪枝技术。

现有的剪枝方法仅限于通道剪枝,并且在大幅减少参数时遇到困难。在本文中,作者提出了一种新颖的多维剪枝框架,它可以在遵守延迟约束的同时,跨通道、层和块联合优化剪枝。

作者开发了一种能够准确捕捉剪枝期间全模型延迟变化的延迟建模技术,这对于在高剪枝比下实现延迟-准确度最优权衡至关重要。

作者将剪枝重新定义为混合整数非线性规划(MINLP),以高效地仅通过一次遍历确定最优剪枝结构。作者广泛的结果表明,与之前的方法相比,特别是在大剪枝比下,作者的方法有显著改进。

在分类任务中,作者的方法在Top-1准确度上显著优于HALP,达到70.0(对比68.6),并且在每秒帧数(FPS)上达到5262 im/s(对比4101 im/s)。

3D目标检测中,作者通过在45%的剪枝比下剪枝StreamPETR [60],比密集 Baseline 实现了更高的FPS(37.3 对比 31.7)和mAP(0.451 对比 0.449),确立了新的最先进水平。

1 Introduction

深度神经网络已经成为高级计算机视觉应用的事实标准,从图像分类[25]到目标检测[43]和分割[46]。当代网络[65, 15, 60]通常由基于卷积神经网络(CNN)的特征提取器和 Transformer 块组成,以捕捉全局线索。随着性能的提升,模型的大小也相应地膨胀,包含数百万甚至数十亿个参数[33]。这种模型大小的增长对于在资源受限的边缘设备上部署提出了挑战,阻碍了自动驾驶等实时推理任务,并且在云系统上进行训练和推理也产生了显著的成本。剪枝[50, 23, 54],即从网络中移除多余的参数,已成为一种有效的策略,以减少模型计算和大小,满足实时要求,而不会显著降低其准确性。为了跟上不断增长的模型大小,作者需要非常激进的剪枝技术来显著降低延迟,以便高效和实时地部署模型。

特别是通道剪枝作为减少模型计算的有效剪枝技术,已经引起了广泛关注,通常可以减少30% - 50%的计算量,实际上不需要对硬件进行更改。通道剪枝涉及根据某些重要性标准[39, 40, 50]移除多余的卷积滤波器,通常从预训练模型开始。尽管有所进步,但这些方法有两个关键限制。首先,通道剪枝方法仅限于通道 Level 的剪枝,而作者不能避免移除整个块或层以实现所需的更大剪枝比例(70%-90%)。只有少数工作涉及层或块剪枝。这些方法可以提供比通道剪枝更大的加速,但它们仅限于在层或块粒度上进行剪枝,并且不能同时引入通道稀疏性,导致次优的准确性。

其次,当前剪枝方法直接减少推理延迟时使用的延迟模型只考虑了每层输出通道数的变体,忽略了剪枝同时对输入通道的影响。这种不准确的延迟估计导致了在准确性和延迟之间的次优权衡,特别是在边缘上进行推理所需的大剪枝比例下。在大剪枝比例下,引导剪枝向最优结构变得更加具有挑战性,同时还要紧密遵循所需的延迟,而没有精确的建模。

本文提出了一种新颖的剪枝框架,有效克服了现有方法的局限性。具体来说,作者没有单独对通道或层进行建模。相反,作者首先在作者的公式中将同一块内的通道和层分组,使它们能够在优化过程中一起处理。这种统一的方法无缝集成了通道、层和块剪枝,使作者能够高效地确定所有 Level 的最优剪枝结构。其次,为了准确建模各层在不同配置下的延迟,作者提出了“双层面配置延迟”的概念,它考虑了所有层输入和输出通道数的同时变化。为了融合这两种策略,作者将剪枝重新定义为混合整数非线性规划(MINLP)。这使得作者能够直接求解符合特定延迟预算的最优剪枝结构,仅需一次遍历。因此,作者的框架在显著减少延迟的同时提高了剪枝性能。总的来说,作者将作者的方法称为多维剪枝(MDP)。作者的代码将在接受后提供。

作者在图1中简要展示的广泛实验验证了作者的方法在高度剪枝比例下的优越性能。在具有激进85%剪枝比例的分类任务中,作者明显超过了之前的工作HALP [54],速度提高了+1161 im/s,准确度提升了+1.4%。对于3D目标检测,作者对由CNN特征提取器和基于变换的解码器组成的StreamPETR [60]模型进行了剪枝。作者在45%的剪枝比例下建立了新的最新技术水平,与稠密 Baseline 相比,在FPS(37.3 vs. 31.7)和mAP(0.451 vs. 0.449)方面取得了更高的成绩。在70%的更大剪枝比例下,作者在FPS(43.3 vs. 42.5)和mAP(0.394 vs. 0.373)方面明显超过了HALP [54]。作者的贡献总结如下:

  • 作者引入了一种用于同时进行通道和块剪枝的“块分组”策略,允许在优化中进行集体决策。

  • 作者提出了一种准确制定不同层配置延迟的方法,捕捉输入和输出通道的变化。

  • 作者将上述策略与一个新的剪枝框架有机结合,将剪枝重新定义为混合整数非线性规划(MINLP),它可以直接有效地在一次遍历中求解特定延迟约束内的全局最优剪枝结构。

  • 作者进行了大量实验,并在各种设置中观察到了最先进的准确度-延迟权衡,包括:(a)用于分类的ImageNet [16],用于2D检测的Pascal VOC [20],以及用于3D检测的Nuscenes [9];(b)三种模型架构:ResNet-50 [25],SSD [43]和StreamPETR [60];(c)在各种延迟降低剪枝比例下。

2 Related Works

作者的工作可以归类为一般的剪枝方法。接下来,作者将简要概述该领域,并突出作者与先前方法的区别。剪枝方法主要设计重要性标准来对参数进行排序,并移除排名最低的参数,然后通过额外的微调来恢复准确度。

通道剪枝 一些剪枝方法在结构约束下操作,例如从CNN中移除卷积通道[39],从而在不使用特定硬件或库支持的情况下立即获得性能提升。典型的通道重要性标准依赖于诸如权重范数、泰勒展开[41, 50, 68]、几何中位数[28]和特征图排名[40]等指标。作者的方法利用了泰勒[50]的通道重要性标准,但将其扩展到评估整个层和块的配置,不仅限于剪枝通道,还包括层和块的移除。

层和块剪枝 通道剪枝方法在移除适量参数时有效减少了性能损失。然而,当涉及到更广泛的剪枝时,它们的效果有限。这是因为它们仅关注移除通道,但在实现显著剪枝的最优结果时,有必要移除整个层或块。只有少数工作关注剪枝层和块。[12]和[19]使用每层的中间特征来计算层排名分数,使用线性分类器 Prob [12]或印记[19]并移除排名最低的层。[61]在每个块后引入线性分类器 Prob 来检查性能,并从上一个块中移除改进最小的块。最近的方法[62]还研究单独移除每个块,并根据性能下降计算重要性。

尽管这些方法已经显示出比通道剪枝提供更大的加速,但它们仅在层或块粒度上操作,如果同时想要引入通道稀疏性则会失败。此外,有些方法还添加了额外的模块或参数,如线性 Prob [12, 61],这需要额外的训练并使流程复杂化。作者的方法_无缝地统一了通道和块剪枝,这使得作者可以在仅一次预训练模型传递的情况下,有效地确定通道和块 Level 的最优剪枝结构,无需任何额外的训练或参数。_

硬件感知剪枝

由于参数压缩比例并不直接转化为计算减少比例,一些工作[63, 67, 38]主要关注于减少模型的FLOPs。最新的方法更进了一步,执行硬件感知剪枝,旨在直接减少硬件推理延迟。代表性工作HALP[54]首先为目标硬件上所有可剪枝参数配置准备了一个延迟查找表,然后将剪枝公式化为一个背包问题[55],在给定预算内最大化总参数重要性同时约束总关联延迟。[52]后来证明了HALP可以应用于自主系统以实现实时检测性能。为了增强剪枝模型的学习能力,SMCP[31]在HALP框架内引入了软 Mask ,使得在迭代剪枝设置中可以重新考虑早期剪枝的权重。

尽管这些方法[52, 54, 31]在准确性和速度方面取得了显著进展,但它们依赖于不准确的延迟估计,导致准确性和延迟权衡次优。它们考虑了输出通道的变化,但忽略了由于剪枝前一层引起的输入通道的同时变化。当旨在实现大的延迟减少时,这个问题变得更加明显,因为没有准确的延迟建模,更难以引导剪枝以满足所需的延迟预算。在作者的工作中,作者也关注硬件感知剪枝,_但引入了一种更准确的延迟建模技术,该技术考虑了所有层输入和输出通道数的同时变化,使作者能够全局确定最优配置_。

混合整数非线性规划(MINLP)[37, 6, 7]:由于作者的块剪枝策略和精确延迟建模统一采用了MINLP公式化,作者将简要介绍这个领域。在文献[37]中正式定义,MINLP是同时包含整数和连续变量的优化问题,其中目标和约束都是非线性函数。有效地解决MINLP[3, 4, 5, 17, 21, 22, 23]是优化研究中的一个关键领域,其关键组成部分通常涉及将问题分解为混合整数线性规划(MILP)和非线性规划(NLP)。最近,使用Python方便地建模和解决MINLP已成为可能,这要归功于Pyomo[8]和MindtPy[2]。在本文中,作者使用Pyomo[8]和MindtPy[2]结合外近似(OA)[17, 21]方法来解决作者的剪枝MINLP。

3 Methodology

作者现在将介绍作者的剪枝框架。作者首先建立基础知识,定义作者的目标并声明相关符号。然后详细描述作者提出的剪枝公式。

Multi-Dimensional Pruning (MDP)

4 Experiments

为了验证作者提出的方法,作者在一系列全面的场景中进行了大量实验。作者在3个任务上展示了作者的剪枝结果:使用ImageNet [16]和ResNet50 [25]的图像分类,使用Pascal VOC [20]和SSD [43]的2D目标检测,以及使用Nuscenes [9]和StreamPETR [60]的3D目标检测。

作者的方法相较于先前的方法有所改进,主要体现在:(a)更精确的延迟估计和(b)能够处理整个层和块结构的移除。这些改进在作者更优的结果中得到了体现,与先前技术[31, 54]和其他竞争 Baseline [38, 59]相比,作者在更高的剪枝比例下显著提高了准确度-延迟的权衡。为了全面理解作者提出的剪枝框架,作者还进行了深入消融研究,突出了改进(a)和(b)各自的贡献。

设置对于ResNet50和SSD,作者的目标是优化它们在Nvidia TITAN V GPU上的推理延迟,批量大小为256。在剪枝StreamPETR [60]时,作者调整了方法,以Nvidia GeForce RTX 3090 GPU批量大小为1为目标,与StreamPETR原文的关注点保持一致。这使作者能够公平地评估速度提升的好处,并展示作者的方法针对不同硬件平台的泛化能力。

作者所有的训练都使用了8块Nvidia Tesla V100 GPUs,并使用PyTorch [51] V1.4.0进行。作者的CPU是Intel Xeon E5-2698,用于解决MINLP优化问题(方程式4)。

Classification Results on ImageNet

在表1中,作者报告了在ResNet50 [25]和ImageNet [16]上与 Baseline 方法的剪枝结果及比较。作者使用Top-1准确率和Top-5准确率来评估微调后恢复的准确率。此外,作者还包括推理FPS(每秒图像数)以直接展示在目标硬件上的速度提升。为了完整性,作者还呈现了FLOPs。

与HALP [54]和SMCP [31]等先前方法相比,作者在准确率-延迟权衡方面取得了显著改进。例如,SMCP在3784 im/s的推理速度下达到72.7的Top-1准确率;作者的方法在Top-1准确率上略高于其,达到72.8,但推理速度显著更快,达到4210 im/s。在更大的剪枝上,HALP达到68.6的Top-1准确率和4101 im/s的推理速度,作者的方法在Top-1准确率上显著优于它,为70.0,并且FPS达到令人印象深刻的5262 im/s。值得注意的是,从表1作者可以看出,当从预训练模型中进行大量剪枝以追求高FPS时,作者的方法尤其出色,这证实了作者的方法改进的有效性。作者的改进在FPS对Top-1帕累托曲线上表现得更为清晰,如图1所示。

作者还包括与专门讨论层和块移除的方法[19, 61, 64]的直接比较。如表1所示,作者的结果显著更好。例如,与LayerPrune [19]相比,作者实现了更高的Top-1准确率(74.6 对 74.3)和大幅度提高的FPS(3092 对 1828)。

2D Object Detection Results on PascalVOC

为了展示作者方法的广泛应用性,作者还使用了广受认可的Pascal VOC数据集[20]在2D目标检测领域进行了实验。在图2(b)中,作者展示了将作者的剪枝方法应用于具有ResNet50 Backbone 网络的SSD512[43]模型的结果。作者的性能与各种竞争 Baseline 进行了对比,包括HALP[54]和SMCP[31]。作者绘制了帕累托前沿图,展示了FPS和平均精度(mAP)之间的权衡。

作者的结果明显优于该领域的现有方法,标志着实质性的进步。与SMCP直接对比,作者的方法在各个推理FPS水平上一致获得显著更高的mAP分数。例如,作者以mAP 79.2 (相较于78.3)超越SMCP,同时还将FPS略微提升到 146.4 (相较于144.4)。值得注意的是,作者剪枝后的模型甚至在mAP上超过了预训练的密集SSD512-RN50(80.0 对比 78.0),同时在FPS上大幅提升(125.4 对比 68.2)。

3D Object Detection Results on Nuscenes

图3:使用SSD512的PascalVOC结果。FPS在配备256批量大小的NVIDIA TITAN V上进行测量。作者的方法比 Baseline 在mAP-FPS和mAP-FLOPs权衡上取得了更好的效果。

到目前为止,作者已经证明了作者的剪枝方法对于完全由卷积层组成的模型(如ResNet50和SSD)是有效的。现代系统使用卷积层提取特征和 Transformer 层捕捉全局线索[15, 65]。在本节中,作者探讨这些混合模型的剪枝效果。作者关注的是具有挑战性的3D目标检测任务,使用广泛认可的Nuscenes[9]数据集和最先进的StreamPETR[60]模型,该模型由一个基于重CNN的编码器和一个基于 Transformer 的解码器组成。作者对系统延迟的分析显示,基于CNN的编码器延迟(16.7ms)高于 Transformer 解码器(14ms)。这表明将作者的方法应用于卷积层仍然可以有效加速整个网络。

详细的实验结果和与几个竞争 Baseline 的比较如表2所示。作者的评估包含了3D目标检测任务常用的多样化度量标准集[9, 42, 60],包括平均精度(mAP)和归一化检测分数(NDS)。此外,作者报告了FPS以突出速度的改进。

值得注意的是,与密集预训练的StreamPETR模型相比,作者的技术实现了大约18%的显著加速,达到了令人印象深刻的37.3 FPS,而 Baseline 为31.7 FPS。重要的是,这种速度提升没有牺牲性能:作者的剪枝模型获得了更高的mAP(0.451 对 0.449)和NDS(0.551 对 0.546)。与先前的剪枝方法HALP[54]相比,作者的方法在各个剪枝比例下在准确度-延迟权衡上表现出了显著的改进。例如,HALP设法生成了一个剪枝后的StreamPETR模型,其mAP为0.373,NDS为0.489,推理FPS为42.5。相比之下,作者的方法超过了这些结果,实现了mAP为0.394,NDS为0.512,推理FPS为43.3

Ablation Study

正如在第3.1节中详细讨论的,作者的剪枝方法从前置方法中引入了两项关键改进:**(a)“双层配置延迟”用于精确的延迟建模;(b)**“块分组”用于将块移除与通道稀疏性集成。

作者现在将探讨(a)(b)各自对剪枝性能的影响。这里的_基准线_是一个没有(a)(b)的纯延迟剪枝算法。然后作者通过在基准线上分别添加每个组件来检查单独的改进。基准线性能在图4中用标签“_Baseline_”表示。

双层配置延迟在这种设置中,作者在基准线上加入了“_双层配置延迟_”,但放弃了“块分组”步骤,以将块决策变量从MINLP程序4中排除。这个变体通过考虑输入和输出通道数量的变化来准确估计剪枝的延迟影响,但它无法处理整个块的移除。图4中标记为“_Ours(仅双层延迟)_”的结果明显比基准线在准确度-延迟权衡上表现更好,即使单独使用也证明了其有效性。

块分组在这种设置中,作者在基准线上加入了“_块分组_”步骤,但没有使用作者的“_双层配置延迟_”来建模剪枝的延迟影响。相反,作者使用了之前方法的延迟建模[31, 52, 54],这些方法只考虑输出通道数量的变化。这个变体可以有效处理块的移除结构,以适应高的剪枝比例,但不能准确地通过考虑输入和输出通道数量的变化来估计延迟影响。图4中标记为“_Ours(仅块分组)_”的结果与基准线相比,在准确度-延迟权衡上有明显改善,特别是在大的剪枝比例和延迟减少(曲线最右端的点)方面。这表明即使独立使用,“块分组”也是有效的。

通过将上述两种策略集成到一个统一的MINLP框架中,作者实现了高效的单次剪枝。

单次剪枝与迭代剪枝作者的单次剪枝方法只需一步即可实现目标延迟,而像HALP [54]这样的迭代方法需要多达30步。表3展示了作者的方法与HALP在不同剪枝步骤之间的性能比较。

如观察所示,无论剪枝步骤如何,作者的方法表现始终一致良好。作者的单次剪枝性能甚至优于作者的30步迭代剪枝。作者认为这可能是由于一次性使用数据集中所有样本的重要性分数所带来的好处。

相比之下,HALP的性能随着剪枝步骤的减少而恶化,特别是在单次剪枝中,它违反了延迟预算并且过度剪枝,导致Top-1为65.1和FPS为4444。这种行为是因为多次剪枝步骤可以某种程度上减轻(a)和(b)的疏忽,但在一次或更少的步骤中变得更加明显。

5 Conclusion

在本文中,作者提出了一种名为MDP的新颖剪枝框架,它将通道、层和块剪枝整合到一个统一的优化过程中,并开发了一种精确的延迟建模技术,捕捉输入和输出通道的同时变化。

为了融合这些策略,作者将剪枝重新定义为混合整数非线性规划(MINLP),以在单次传递中高效地识别在特定延迟预算内的最优剪枝结构。

作者的结果显示,与之前的方法相比,在需要大量剪枝的场景中,作者的方法取得了显著的改进。

作者还提供了深入的消融研究,以单独调查每个贡献的效果。

参考

[1].Multi-Dimensional Pruning: Joint Channel, Layer and Block Pruning with Latency Constraint.

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

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

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

相关文章

SPIN-Diffusion:自我博弈微调提升文本到图像扩散模型性能

扩散模型作为生成AI的关键实体,已经在多个领域展现出了卓越的能力。然而,现有的扩散模型,如Stable Diffusion和SDXL,通常在预训练阶段后需要进行微调以更好地符合人类偏好。最近,研究者们开始尝试使用强化学习&#xf…

昇思MindSpore学习笔记4-03生成式--Diffusion扩散模型

摘要: 记录昇思MindSpore AI框架使用DDPM模型给图像数据正向逐步添加噪声,反向逐步去除噪声的工作原理和实际使用方法、步骤。 一、概念 1. 扩散模型Diffusion Models DDPM(denoising diffusion probabilistic model) (无)条件…

06-6.4.4 拓扑排序

👋 Hi, I’m Beast Cheng 👀 I’m interested in photography, hiking, landscape… 🌱 I’m currently learning python, javascript, kotlin… 📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

计算机网络浅谈—什么是 OSI 模型?

开放系统通信(OSI)模型是一个代表网络通信工作方式的概念模型。 思维导图 什么是 OSI 模型? 开放系统互连 (OSI) 模型是由国际标准化组织创建的概念模型,支持各种通信系统使用标准协议进行通信。简单而言,OSI 为保证…

C++左值右值

在C中,左值(lvalue)和右值(rvalue)是表达式分类的关键概念,它们主要影响表达式的赋值、函数调用以及操作符的使用方式。这些概念在C11及以后的版本中变得更加重要,因为引入了移动语义和右值引用…

蓄势高飞逐“新”空,卓翼飞思助力打造低空经济产业领域人才智库

2024年,“低空经济”首次写入政府工作报告,掀开新兴产业的崭新一页,而后迅速在全国各地呈现如火如荼的发展态势。这片蕴藏着巨大潜力和产业的蓝海,正蓄势聚能、乘势而起,站在发展的新风口上,面对新前景和新…

MongoDB集群搭建-最简单

目录 前言 一、分片概念 二、搭建集群的步骤 总结 前言 MongoDB分片(Sharding)是一种水平扩展数据库的方法,它允许将数据分散存储在多个服务器上,从而提高数据库的存储容量和处理能力。分片是MongoDB为了应对大数据量和高吞吐量需…

ONLYOFFICE最新8.1版本——桌面编辑器简单测评

前言 大家好,我是小雨,看到最近ONLYOFFICE更新了最新的版本,更新了一下当前版本来具体的测评一下,先来看看官网提供的各类更新信息,下面是我找到的三个主页,包括功能演示链接,官网连接以及专门…

Ros2中goal_handle状态SUCCEED及ACCEPTED及CANCLED在rclpy中的死循环(彻底解决版本)

承接上文,遇到了在动作通信开发中,使用rclpy编写代码进行feedback等操作,但所有逻辑均编写完后,却无法将goal_handle提交为succeed状态,之前的解决方案是更改自己重写的execute()函数名为my_execute()并且在提交SUCCEE…

开始尝试从0写一个项目--后端(二)

实现学生管理 新增学生 接口设计 请求路径:/admin/student 请求方法:POST 请求参数:请求头:Headers:"Content-Type": "application/json" 请求体:Body: id 学生id …

N5 使用Gensim库训练Word2Vec模型

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊# 前言 前言 这周学习训练一个Word2Vec模型,并进行一些基本的词向量操作。 Word2Vec 模型 Word2Vec 是一种基于神经网络的词向量表示方法&#x…

零基础STM32单片机编程入门(八)定时器PWM输入实战含源码视频

文章目录 一.概要二.PWM输入框架图三.CubeMX配置一个PWM输入例程1.硬件准备2.创建工程3.调试 四.CubeMX工程源代码下载五.讲解视频链接地址六.小结 一.概要 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用单…

数学建模算法目标规划

在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济 效益的问题。此类问题构成了运筹学的一个重要分支—数学规划,而线性规划(Linear Programming 简记 LP)则是数学规划的一个重要分支。特别是在计算机能处理成千上万个…

在电子表格中对多列数据去重

一、数据展示 二、代码 Sub 选中区域数据去重()Dim arr()Dim c, d, id Selection.Counti 0For Each c In SelectionIf c.Value <> "" ThenReDim Preserve arr(0 To i)arr(i) c.Valuei i 1End IfNextarr 一维去重(arr)i 0For Each c In Range("O2&…

35.哀家要长脑子了!--二分

模板 int check() {...} // 检查这个数是否符合相应的要求// 把区间[l, r] 划分成[l, mid] 和 [mid1, r] 时使用 // 找到数组中第一个大于等于某一值得元素或满足特定条件的第一个位置 int bsearch_1(int l, int r){int mid l r >> 1;while(l < r) {if(check(mi…

C++(Qt)-GIS开发-简易瓦片地图下载器

Qt-GIS开发-简易瓦片地图下载器 文章目录 Qt-GIS开发-简易瓦片地图下载器1、概述2、安装openssl3、实现效果4、主要代码4.1 算法函数4.2 瓦片地图下载url拼接4.3 多线程下载 5、源码地址6、参考 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;GIS开发 …

智慧景区解决方案PPT(89页)

智慧景区解决方案摘要 解决方案概述智慧景区解决方案旨在利用现代信息技术解决景区管理机构面临的保护与发展矛盾&#xff0c;推动服务职能转变&#xff0c;促进旅游产业跨越式发展&#xff0c;实现旅游经营增长和管理成本优化。 宏观政策背景国家旅游局发布的《“十三五”全国…

c++:struct和class的区别

C和C中struct的区别 (1)C中不支持成员函数&#xff08;只能通过函数指针成员变量间接支持&#xff09;&#xff0c;而C源生支持。 (2)C中不支持static成员&#xff0c;而C中支持。后面会详细讲&#xff0c;C static class是一个大知识点 (3)访问权限&#xff0c;C中默认public…

CS61B Data Structure-Jonathan Lecture2 using objects - OBJECTS METHODS

Recall String s1; // Step 1: declare a String variable s1 new String(); // Step 2: assign it a value, a new empty string objectString s2 new String(); // 1&2 combined今日知识点 situation: pointing to the same object s1 "Yow!";s2 s1; //…

电量监测与电量计基础知识

硬件之路学习笔记 ​-----前文导读----- ①、公众号主页点击发消息 ②、点击下方菜单获取系列文章 -----本文简介----- 主要内容包括&#xff1a; ①&#xff1a;简介 ②&#xff1a;省成本方式-电阻分压 ③&#xff1a;精确方式-电量计与阻抗跟踪技术 ----- 正文 ----…