-
奥维:AI技术赋能水利工程 “人工智能+”展现巨大潜力在全球气候变化与水资源供需矛盾加剧的背景下,传统水利工程正面临“监测滞后、预报精度有限、应急响应缓慢”等痛点,而“人工智能+水利”的深度融合,成为破解行业难题、推动水利数字化转型的关键路径。奥维数字科技凭借对AI技术的深耕与水利场景的深刻理解,打造出奥维水利算法云这一核心解决方案,将AI能力渗透到大坝安全、洪水预报、淹没分析等关键环节,以“精准、实时、可进化”的服务特性,为水利行业智能化升级提供了可落地的技术范式。AI与水利融合的基础架构“人工智能+水利”的落地应用,离不开数据采集、算法建模与专业技术融合三大核心技术体系的支撑,这些技术在行业实践中已形成成熟的应用基础,是水利行业数字化转型的重要技术底座。在数据采集层面,“天空地水工”一体化监测感知体系已成为行业标配,为AI模型提供高密度、高可靠性的数据源。该体系整合空基、地基、水工等多维度监测手段,空基端通过无人机搭载激光雷达、高光谱成像仪等设备实现区域动态测绘;地基端依靠雨量站、渗压计、视频监测站等设施完成点位精准监测;水工端则通过坝体内部传感器阵列捕捉结构应力、形变等核心数据。例如珠江水利委员会在大藤峡水利枢纽布设4000多个安全监测点,涵盖20多种监测类型,仪器完好率达99.8%。同时,ADCP云测流无人船、岸基侧扫雷达等新型装备的应用,进一步突破了传统监测在复杂环境下的局限,实现水质、流速等要素的自动化采集。算法建模方面,水利专用AI模型已形成“物理机理+数据驱动”的融合架构,兼顾预测精度与场景适应性。针对渗流监测等静态场景,物理信息神经网络(如PI-RGSM模型)通过融入水文地质参数与边界条件硬约束,在减少观测数据依赖的同时提升预测精度,平均决定系数可达0.978以上;针对洪水预报等动态场景,深度学习模型通过挖掘历史水文数据与实时降雨、水位数据的关联关系,实现预报参数的动态优化;针对视觉检测场景,YOLO等目标检测模型通过训练漂浮物、冰凌等水利专属数据集,可实现隐患的实时识别与定位。此外,水利部组织研发的“水利标准AI大模型”,基于“SkyLIM”体系采用“海量知识库+双模型+标准服务”架构,进一步推动了AI算法在水利领域的标准化应用。这些算法普遍具备轻量化部署与在线自学习能力,能够适应不同流域的水文特性差异。 技术融合层面,AI与GIS(地理信息系统)、数字孪生的深度结合,打通了“数据-模型-决策”的完整链路。GIS技术为AI提供空间数据支撑,使淹没范围模拟、流域态势呈现等可视化需求成为可能;数字孪生通过构建三维虚拟场景,实现AI模型预测结果与物理实体的实时映射,如山东“智水齐鲁”体系中,大模型与数字孪生流域的融合实现了洪水调度的全流程仿真。同时,标准化API接口技术的应用,让AI模型能与水库运维、应急指挥等现有系统无缝对接,实现跨平台数据共享与协同决策。这种融合模式也契合了水文预测的发展趋势——通过数据驱动模型与物理机理模型的有机结合,弥补各自在非线性刻画与可解释性上的不足。AI驱动三大核心引擎,重塑水利决策流程奥维水利算法云的核心竞争力,在于集成了大坝安全监测(DM)、洪水预报、淹没图集三大智能引擎,且每个引擎都以AI技术为核心驱动力,实现从数据采集到决策输出的全流程智能化。1. 大坝安全监测:AI赋能精准预警与远程管控大坝作为水利工程的“生命线”,其渗流状态、结构稳定性直接关系到下游安全。奥维的大坝安全监测服务,通过AI技术重构了传统监测模式:精准数据分析:采用自研AI算法对大坝典型断面的渗压数据进行深度挖掘,将实时监测数据与理论浸润线进行科学比对,能快速识别异常渗流信号——相比传统人工分析需数小时的流程,该系统可在分钟级内定位安全隐患;智能交互与预警:内置智能问答模块,管理人员通过自然交互即可完成安全评估并获取详尽报告,同时系统具备实时预警机制,一旦监测数据超出阈值,会立即通过多终端通知相关人员,避免延误处置;远程全域管控:支持浏览器与移动端访问,结合AI对多源监测数据(如水位、渗压、雨量)的融合处理,用户可随时随地掌握大坝状态(当前水位、校核水位等关键数据实时可视化呈现),实现“无人值守、有人监管”的高效模式。2. 洪水预报:自研AI算法实现分钟级精准推演洪水预报的“时效性”与“准确性”直接决定防汛决策的有效性。奥维基于AI技术打造的洪水预报引擎,打破了传统水文模型的局限:定制化预见期服务:针对不同等级的水库、河道,AI模型可根据流域特性(如地形、水文历史数据)生成定制化预报方案,支持1-3天的短期预见期,且能纳入气候变化场景,提升预报适应性;轻量化与高响应:采用轻量级API设计,AI模型的计算效率大幅提升,可在分钟级内完成洪峰推演、入库流量预测(系统实时展示“预测入库流量、实际入库流量、计算入库流量”三者对比曲线),助力项目快速上线与应急响应;自学习持续优化:平台支持在线机器学习与参数率定,AI模型会基于历史数据(如 decades of hydrological data)与实时数据(如 rainfall、river level 实时监测值)不断迭代,逐步提升预报精度——例如在某次降雨事件中,通过AI动态调整参数,预报误差可控制在较低范围。3. 淹没图集:AI+GIS构建可视化应急支撑洪水淹没范围与水深分布,是应急管理部门制定疏散方案、调配资源的核心依据。奥维将AI与GIS技术深度融合,打造出高效的淹没图集生成引擎:高精度模拟:基于先进的二维水动力AI模型,输入指定洪水流量后,系统可逐小时生成淹没区域范围与水深分布图,相比传统静态图集,动态模拟能更真实还原洪水演进过程;直观化呈现:采用专业着色技术,以颜色深浅直观表示水深变化(如深色代表高风险深水区),管理人员无需专业水文知识即可快速识别危险区域;应急场景适配:该引擎已服务于应急管理部门、水利机构,能高效模拟完整洪水过程,例如在2024年某次降雨事件中,系统为西麻塔、转临等区域的降雨-淹没关联分析提供了精准数据支撑,助力应急决策。六大产品特性,彰显AI+水利的技术优势奥维水利算法云的“高效、准确、轻便、可进化、可视化、统一接口”六大特性,本质是AI技术在水利场景中落地能力的集中体现:高效:AI对多源数据的并行处理能力,让渗压分析、洪水推演等流程从“小时级”压缩至“分钟级”,大幅提升工作效率;准确:AI模型对历史数据的深度学习与实时数据的动态校正,确保监测结果、预报数据的可靠性——例如大坝渗压异常识别准确率、洪水流量预测精度均处于行业前列;轻便:AI模型的轻量化部署设计,不占用过多硬件资源,且操作界面简洁,支持在不同设备(PC、移动端)上流畅运行;可进化:AI的在线自学习能力是“可进化”的核心——系统无需人工大规模干预,即可通过数据迭代优化模型参数,适应流域水文特性的长期变化;可视化:AI将复杂的水文数据转化为直观的图表、地图(如水位曲线、淹没热力图),降低数据理解门槛,提升决策效率;统一接口:标准化API设计支持与其他水利系统(如水库运维平台、应急指挥系统)的集成,AI模型输出的结构化数据能直接用于跨系统协同,实现信息共享。结语:AI赋能水利的未来潜力奥维通过“AI+水利”的实践证明,人工智能并非简单的“技术叠加”,而是能从“数据处理、模型优化、决策支撑”三个核心环节重构水利工程的运行模式:它让大坝监测更精准、洪水预报更及时、应急响应更科学,也让水利决策从“经验驱动”转向“数据驱动”。未来,随着AI模型与数字孪生、5G等技术的进一步融合,奥维的水利解决方案有望在更广阔的场景落地——例如跨流域水资源调度、极端天气下的洪水联防联控、水利工程全生命周期智能化运维等。可以说,奥维的实践不仅为行业提供了可参考的技术方案,更彰显了“人工智能+”在破解水利行业痛点、守护水安全中的巨大潜力,为水利数字化转型注入了强劲动力。
-
紧接MA3E:面向遥感场景的角度感知的掩码自编码器(一),我们继续分享MA3E的实验与分析。实验与分析MA3E模型首先在无标签的MillionAID数据集~\cite{long2021creating}上自监督预训练,然后迁移MA3E的编码器至下游的场景分类、旋转目标检测和语义分割任务上微调。所有报告的结果中,†\dag†表示使用其官方代码在MillionAID数据集上预训练的复现版本,⋆\star⋆表示直接加载开源预训练权重进行端到端微调或线性探测。预训练设置表1. MA3E的预训练和下游分类设置场景分类所有微调和线性探测实验均在NWPU-RESISC45(NU45)、AID和UC Merced(UCM)数据集上进行。对于NU45,随机选取每个类别20%的图像作为训练集,剩余80%作为测试集。对于AID和UCM,这两个比例均为50%。微调和线性探测的设置如表1所示。数据集缩写:IN1k为ImageNet-1k,MA为MillionAID,S-2为Sentinel-2,$\sim$2M为约两百万张图像,G.I.为GeoPile和ImageNet-22k,f-S为fMoW-Sentinel,f-R为fMoW-RGB。表2. 不同方法在三个场景分类数据集上的微调结果对比表3. 不同方法在三个场景分类数据集上的线性探测结果对比表2和表3分别展示了在三个数据集上的微调和线性探测结果。预训练300 epochsepochsepochs的MA3E取得了有竞争力的结果。尽管在UCM数据集上的微调精度低于 ViT+RVSA,但MA3E仅需后者52%的FLOPs。随着预训练的进行,三个数据集上的微调和线性探测结果持续提升。经过1600 epochsepochsepochs预训练后,MA3E在各项指标上全面领先,这证明了MA3E能够有效学习对角度多样的遥感目标判别的旋转不变性表征。此外,表中统计了单张GPU所需的每epochsepochsepochs的训练时间。与MAE相比,MA3E仅增加约0.2小时的训练时间,却显著提升了准确率。旋转目标检测与语义分割我们在DOTA1.0和DIOR-R数据集上进行的旋转目标检测实验,并使用Oriented R-CNN作为检测器。对于语义分割任务,我们采用UperNet框架,在Potsdam和iSAID数据集上进行端到端的有监督微调。其设置如表4所示。表4. 旋转目标检测和语义分割的端到端微调设置表5. 不同方法在多个数据集上的检测和分割结果对比表5展示了不同方法在DOTA1.0和DIOR-R上的微调结果,其中MA3E仅使用朴素的主干网络就取得了优越的检测性能。预训练300 epochsepochsepochs的版本超越了同样预训练300 epochsepochsepochs的其他方法,而训练1600 epochsepochsepochs的MA3E全面领先。相较于微调主干网络为ViTAE+RVSA的MAE,MA3E在DOTA1.0和DIOR-R上的mAP分别提升了0.51和0.87。这种检测性能的显著提升说明了MA3E在预训练期间感知角度信息的有效性。对于分割结果,在预训练较少epochsepochsepochs下,MA3E便展现出有竞争力的性能,在Potsdam数据集上的mF1仅比CMID低0.04。当预训练1600 epochsepochsepochs时,MA3E再次取得最佳结果,在iSAID和Potsdam数据集上分别比次优方法提高了0.3 mIoU和0.28 mF1。这说明MA3E学到的旋转不变性表征在在语义分割中仍然发挥着重要的作用。可视化分析图1. MillionAID训练图像的重建效果示例。对每一组图像来说,从左至右依次展示原始图像、包含旋转区域的复合图像、掩码图像和MA3E重建图像。为了便于观察,旋转区域都用红框标出。与MAE~\cite{he2022masked}一样,模型在可视图像块上的输出也展示出来以全面展现MA3E的重建质量。图1定量地可视化了MA3E在遥感图像上的重建效果。所有示例图像都随机采样自包含一万张图像的MillionAID训练集。每张图像调整为224×224224 \times 224224×224像素(196个图像块,p=16p=16p=16),并设置旋转区域为96×9696 \times 9696×96(36个图像块)进行重建。旋转区域和背景的掩码比例为75%,分别对应9个和40个可视图像块。从图中可以看到,MA3E在重建原始像素时有效地恢复了旋转区域上预设的角度变化。此外,重建的旋转区域可能会出现一些不均匀色块,例如图1中的水面和操场。这种现象的出现主要是因为本章所提出的最优传输损失函数计算了每个旋转区域的预测图像块与多个作为目标的原始图像块之间的均方误差。小结我们提出了一种面向遥感图像的掩码图像建模方法——角度感知的掩码自编码器MA3E。通过设计了放缩中心裁剪操作构造旋转区域,为每张原始图像引入显式的角度变化。MA3E以创建的复合图像作为输入,旨在同时实现原始像素重建和角度恢复。其中,旋转区域的重建被视为一个最优传输问题,MA3E从而能够有效感知角度并学习判别的旋转不变性表征,并在多种下游任务中均取得了优越的表现。本文已发表在European Conference on Computer Vision 2024(ECCV 2024)会议中,我们希望MA3E能促进遥感领域基础模型的发展。尽管MA3E展现了角度感知的能力,但在大多遥感场景中,只有人造目标的角度信息需要被更加重视。对于广阔的土地覆盖,模型可能无法从角度信息中获得显著收益。在未来的工作中,将考虑所有遥感场景中都普遍存在的尺度信息,进一步探索人造目标的角度感知与土地覆盖的尺度建模的有机结合道路。
-
在之前的研究中,我们分别从多尺度难特征和MLP引导两个角度探索了基于对比学习的遥感图像表征学习方法。随着掩码图像建模逐渐成为计算机视觉领域中自监督表征学习的主流范式,我们将研究重点转向遥感场景下的MIM方法。与自然图像不同,遥感图像中的目标具有多样化的角度分布,这一特性在现有MIM方法中未得到充分考虑。针对这一问题,我们提出了一种新的角度感知的掩码自编码器,通过在像素重建时同时恢复角度变化,引导模型学习更判别的旋转不变性表征,为遥感图像解译任务提供更有效的通用预训练模型。引言在自然图像领域,无需标签的自监督表征学习如SimCLR、MoCo、BEiT和DINO等方法已经成为在大规模数据集上预训练模型的新范式。其中,掩码图像建模(Masked Image Modeling,MIM)通过重建被掩码的部分输入来学习视觉表征,凭借简洁的架构和在下游任务上出色的性能受到了研究者的广泛关注。最近,遥感图像领域出现了一些有趣的MIM工作如SatMAE、ScaleMAE等,它们为视觉Transformer提供了良好的初始化并在一系列下游任务中取得了优越表现,这证明了MIM在遥感图像上的表征学习具有极大潜力。尽管现有针对遥感图像定制的MIM方法考虑了诸多因素,如不同分辨率、蕴含多尺度目标及复杂背景、成像自多光谱波段等,但它们在面对遥感目标多样的角度时并不是一个有效的学习者。自然图像中的目标在重力作用下具有固定的朝向,而通过鸟瞰视角捕获的遥感图像中目标往往具有较大的角度分布范围。同一遥感目标在不同角度下会呈现出不同的形状和外观。正确感知并考虑角度信息符合遥感技术研究中如何捕获目标的本质,有助于更准确的遥感图像解译。然而上述方法仅关注遥感目标的原始像素值重建,对角度信息的学习往往只隐式地伴随在重建过程中。因此,我们提出一种角度感知的掩码自编码器(Masked Angle-Aware Auto Encoder,MA3E),通过在原始像素重建过程中恢复预设的角度变化来感知并学习角度信息。此处提供一个说明性的例子,在旋转目标检测任务中微调预训练模型时,统计了DOTA1.0数据集中所有被正确检测到的目标的角度,并在图1中报告了不同角度范围内目标的AP50^{50}50指标。现有方法RVSA仅在接近水平角度(如0∘^\circ∘或90∘^\circ∘)的目标上获得较高的AP50^{50}50,而MA3E则显著提升了对大倾角目标的AP50^{50}50,这充分说明MA3E有效地感知到目标的多样角度并学到鲁棒的旋转不变性表征。图1. 加载MA3E和MAE预训练模型的检测器对不同角度范围的遥感目标的检测结果,MA3E模型经300 epochsepochsepochs和1600 epochsepochsepochs预训练后,显著提升了对10∘^\circ∘至80∘^\circ∘目标的AP50^{50}50,证明了在预训练期间感知角度信息是有效的。MA3E图2. (a)MA3E的工作流程。通过设计的放缩中心裁剪操作,在原始图像中创建旋转区域以引入显式的角度变化。旋转区域在添加一个角度嵌入向量后,MA3E分别对旋转区域和剩余背景进行随机掩码。之后,所有可视图像块经过顺序编码和解码,最终重建原始图像并恢复旋转区域上预设的角度变化。(b)MA3E将旋转区域的重建视为一个最优运输(OT)问题。基于Sinkhorn-Knopp快速迭代算法求解的运输计划Ω\OmegaΩ,提出了一个OT损失函数来自动为解码器预测的每个旋转区域的图像块分配相似的原始图像块为重建目标。MA3E旨在感知不同的角度并学习旋转不变性视觉表征,其工作流程如图2(a)所示。MA3E在每张遥感图像任意位置上使用放缩中心裁剪操作构建旋转区域来提供显式的角度变化,这些旋转区域具有随机的角度,并替换其原来位置上的场景。MA3E为每个旋转区域上添加一个额外的角度嵌入向量,并分别掩码旋转区域和剩余背景。对于旋转区域的重建,MA3E基于Sinkhorn-Knopp算法求解的传输计划,自动为每个旋转区域的图像块分配多个相似的原始图像块作为重建目标,以避免直接重建引入的偏差。构造旋转区域图3. (a)我们提出的放缩中心裁剪操作在原始图像的任意位置构造具有随机角度的旋转区域,从而引入显式的角度变化。(b)在左列和中列,简单的随机旋转操作导致:i)出现无意义的零值背景;ii)丢失部分场景;iii)场景尺度发生变化。而右列固定角度(如90°、180°、270°)的旋转则限制了场景的多样性。使用简单的随机旋转操作在每张遥感图像中构造边长为aaa的旋转区域会出现如图3(b)所示的不良结果。模型难以从这些区域学习到高质量的表征,从而造成计算资源的浪费。因此,本章提出了一种放缩中心裁剪操作来创建多样化且主要场景得到极大程度保留的旋转区域,如图3(a)所示。对于图像上任意位置的边长为hhh的正方形区域(蓝色),以任何角度旋转该区域均会损失边缘场景(灰色),但该区域内最大内切圆(红色)中的场景能得到完整保留。因此,利用中心裁剪,从红色圆内提取边长为a=22ha = \frac{\sqrt 2}{2}ha=22h的最大内切正方形区域作为最终的旋转区域。该区域场景有任意朝向,它将替换原始场景从而为复合图像引入显式的角度变化。为了确保每个旋转区域能够被完整地划分为图像块,其边长aaa需能被图像块大小ppp整除,并且起始位置为ppp的倍数。角度嵌入除了为复合图像中分离的图像块嵌入向量添加位置嵌入向量外,MA3E还为旋转区域添加了一个额外的角度嵌入向量。每个角度嵌入是一个可学习的向量,并在同一个旋转区域的所有图像块嵌入向量之间共享。角度嵌入能作为一种隐式的提示引导模型感知旋转区域的角度变化,同时将其与剩余背景区分开来。随机掩码策略给定来自旋转区域的Nr=a2/p2N_r = {a^2}/{p^2}Nr=a2/p2个图像块(表示为r={ri∣i=1,2,...,Nr}r = \{{r_i}|i = 1,2,...,{N_r}\}r={ri∣i=1,2,...,Nr})以及来自背景的Nb=N−NrN_b = N - {N_r}Nb=N−Nr个图像块(表示为b={bi∣i=1,2,...,Nb}b = \{{b_i}|i = 1,2,...,{N_b}\}b={bi∣i=1,2,...,Nb}),为了避免随机掩码策略移除旋转区域中过多或全部的图像块,按照一定比例分别掩码rrr和bbb,例如75%。因此,来自背景的可视图像块和被掩码图像块分别表示为bv={biv∣i=1,2,...,Nbv}{b^v} = \{b_i^v|i = 1,2,...,N_b^v\}bv={biv∣i=1,2,...,Nbv}和bm={bim∣i=1,2,...,Nbm}{b^m} = \{b_i^m|i=1,2,...,N_b^m\}bm={bim∣i=1,2,...,Nbm}。对于旋转区域的图像块rrr,同样有着类似的定义,即rvr^vrv和rmr^mrm。像素重建MA3E使用均方误差损失函数来预测背景中被掩码图像块的像素值。对于旋转区域,则提出了一种OT损失函数LOT{\cal L}_{OT}LOT,以最小化每个图像块与其匹配的原始图像块在像素空间中的距离。整体损失函数可表示为:Lrec=LMSE(bm,b^m)+LOT(r,r^),{\cal L}_{rec} = {\cal L}_{MSE}(b^m,\hat b^m) + {\cal L}_{OT}(r,\hat r), Lrec=LMSE(bm,b^m)+LOT(r,r^),其中,b^m∈RNbm×p2C{\hat b^m} \in {\mathbb R}^{N_b^m \times {p^2}C}b^m∈RNbm×p2C表示解码器输出的对背景中被掩码图像块的预测值,而r^∈RNr×p2C\hat r \in {\mathbb R}^{{N_r} \times {p^2}C}r^∈RNr×p2C表示旋转区域中所有的预测图像块。旋转区域的重建经放缩中心裁剪后,旋转区域的每个图像块与原始图像中相同位置上的图像块相比产生内容和角度上的场景偏移。此时直接计算被掩码图像块与原始图像块之间的均方误差不仅会引入不可避免的偏差,还会忽略可视图像块上的场景变化。我们将旋转区域的重建视作一个最优传输问题,使每个预测图像块能够自动匹配相似的原始图像块进行重建。最优传输假设有MMM个供给方和NNN个需求方,其中第iii个供给方拥有uiu_iui单位的货物,第jjj个需求方需要vjv_jvj单位的货物。第iii个供给方给第jjj个需求方运输一单位货物的成本记作cijc_{ij}cij。最优传输问题的目标是找到一个传输方案,记作Ω={ωi,j∣i=1,2,...,M,j=1,2,...,N}\Omega = \{\omega _{i,j}|i = 1,2,...,M,j = 1,2,...,N\}Ω={ωi,j∣i=1,2,...,M,j=1,2,...,N},它能以最小的总传输成本确保所有货物都能从供给方运送至需求方,即:minω∑i=1M∑j=1Ncijωij.s.t.∑i=1Mωij=vj,∑j=1Nωij=ui,∑i=1Mui=∑j=1Nvj,ωij≥0,i=1,2,…,M,j=1,2,…,N.\begin{aligned} \min _\omega & \sum_{i=1}^M \sum_{j=1}^N c_{i j} \omega_{i j} . \\ \text {s.t.} & \sum_{i=1}^M \omega_{i j}=v_j, \sum_{j=1}^N \omega_{i j}=u_i, \\ & \sum_{i=1}^M u_i=\sum_{j=1}^N v_j, \\ & \omega_{i j} \geq 0, i=1,2, \ldots, M, j=1,2, \ldots, N . \end{aligned} ωmins.t.i=1∑Mj=1∑Ncijωij.i=1∑Mωij=vj,j=1∑Nωij=ui,i=1∑Mui=j=1∑Nvj,ωij≥0,i=1,2,…,M,j=1,2,…,N.基于最优传输的重建重建旋转区域的情景如图2(b)所示,考虑有NrN_rNr个原始图像块和NrN_rNr个旋转区域的预测图像块,每个原始图像块可视为供给方,持有p2C{p^2}Cp2C单位的像素值(即ui=p2C,i=1,2,...,Nru_i = {p^2}C, i = 1,2,...,{N_r}ui=p2C,i=1,2,...,Nr),每个预测图像块则视为需求方,它的p2C{p^2}Cp2C单位的通道(即vj=p2C,j=1,2,...,Nrv_j = {p^2}C, j = 1,2,...,{N_r}vj=p2C,j=1,2,...,Nr)需要p2C{p^2}Cp2C单位的像素值进行重建。原始图像块中每一单元的像素值与预测图像块中每一单元的通道间的相似度表示传输成本cijc_{ij}cij。这一过程可扩展为矩阵级的MSE计算以便于GPU加速计算。因此,从第iii个原始图像块到第jjj个预测图像块的传输成本为:cij=∥ri−r^j∥22,{c_{ij}} = \left\| {{r_i} - {{\hat r}_j}} \right\|_2^2, cij=∥ri−r^j∥22,其中,L2距离较近的原始图像块与预测图像块具有更高的相似度,从而倾向于产生更低的传输成本。一种快速迭代算法Sinkhorn-Knopp被用来计算总体传输方案Ω\OmegaΩ。根据求解得到的Ω={ωi,j}\Omega = \{\omega_{i,j}\}Ω={ωi,j},如图2(b)所示,OT损失会自动为第jjj个预测图像块分配多个相似的原始图像块作为重建目标,即:LOT(r,r^)=∑i=1Nr∑j=1Nr∥ri−r^j∥22ωij.\mathcal{L}_{OT}(r, \hat{r})=\sum_{i=1}^{N_r} \sum_{j=1}^{N_r}\left\|r_i-\hat{r}_j\right\|_2^2 \omega_{i j}. LOT(r,r^)=i=1∑Nrj=1∑Nr∥ri−r^j∥22ωij.LOT{\cal L}_{OT}LOT在像素重建和角度恢复过程中,能引导模型感知旋转区域的角度变化。随着训练的进行,MA3E可以有效地学习旋转不变性视觉表征。传输方案分析在旋转区域重建过程中,定义原始图像块为供给方,对旋转区域的预测图像块为需求方,每对图像块间的L2相似度为传输成本。这个OT问题的传输方案Ω\OmegaΩ通过Sinkhorn-Knopp迭代法来快速求解,该算法通过在目标函数上加入熵正则化项,将复杂的边际线性规划问题转化为在平滑可行域上的求解过程。需要注意的是,这个经典算法属于教材教授的知识,并非我们的贡献。图4. 在MillionAID训练图像的示例场景下求解的传输方案Ω\OmegaΩ的热力图可视化。对于每一组,实际求解过程中预测图像块都是从解码器输出的,此处展示被掩码图像块只是为了便于读者观察。图像经分块处理后,按照从左到右、从上到下的顺序为每个目标图像块和预测图像块分配索引。热力图展示了计算索引为iii的目标图像块和索引为jjj的预测图像块之间的MSE权重。每一列的权重和为1/361/361/36,整个热力图的权重和为1。MA3E利用传输方案Ω={ωi,j}\Omega = \{\omega_{i,j}\}Ω={ωi,j}为每个预测图像块分配多个相似的原始图像块作为像素重建目标。图4可视化了部分求解的传输方案的热力图。本质上,ωi,j\omega_{i,j}ωi,j可以看作使用LOT{\cal L}_{OT}LOT计算第iii个目标图像块与第jjj个预测图像块间均方误差时的权重,其中更高的权重赋给了更相似的目标-预测对。在重建第jjj个预测图像块时,模型计算它与多个目标图像块之间的加权MSE和(见图4中热力图第jjj列)。显然,每个预测图像块与分布在多个不同位置的相似目标图像块相匹配,而非仅仅与相同位置(即主对角线上)的目标图像块匹配。这充分证明了MA3E以求解OT问题的方式来重建旋转区域是有效的。实验与分析篇幅所限,请读者移步MA3E:面向遥感场景的角度感知的掩码自编码器(二)
-
紧接MGC:面向遥感场景的MLP引导CNN预训练的对比学习(一),我们继续分享MGC的实验部分。实验预训练设置表1. Fusion数据集包含的类别我们使用三个场景分类数据集MLRSNet, NWPU-RESISC45(NU45)和Aerial Image Dataset (AID)构造预训练数据集Fusion。MLRSNet和NU45数据集中的每个类的样本都随机划分为40%用于训练或微调,60%用于测试。对于AID数据集,划分比例为50%和50%。这三个训练集中相同类别将被合并以构建一个Fusion数据集,该数据集包含61,272张图像,涵盖60个类别,如表1所示,用于MGC预训练。随机采样确保了预训练数据的合理和平衡分布,MGC只专注于探索高效的预训练范式本身而不受不均衡数据分布的影响。我们训练了两个具有不同步长的模型,即MGC-Base和MGC-Large。场景分类对于下游场景分类任务,除了上述三个数据集,我们还在EuroSAT数据集上进行了对比实验,结果如表2所示,表2. 场景分类结果对比可以看到,MGC-B在所有数据集上均取得最佳准确率,但MGC-L在MLRSNet上的表现不及SwAV和CARE,在NU45上的表现也不及CARE。这是由于较大的步长sss使得E:mE_:^mE:m聚合更大范围的空间上下文信息从而增强E:cE_:^cE:c在大规模场景中的定位能力。而相比定位能力,图像级分类任务更依赖于E:cE_:^cE:c本身的局部识别能力。而在MGC-B中,E:cE_:^cE:c学习到的小尺度场景信息提高了其局部识别能力。旋转目标检测我们使用3种检测器Oriented-RCNN、RoI Transformer和S2ANet,在DOTA1.0和HRSC2016数据集上进行实验。篇幅所限,我们只展示部分实验结果。DOTA1.0是一个大规模的旋转目标检测数据集。它包含2,806张图像,尺寸从800×800800 \times 800800×800到4,000×4,0004,000 \times 4,0004,000×4,000像素不等,并且包含188,282个实例,所有实例都有旋转边界框标注,属于15个目标类别,即桥梁(BR)、港口(HA)、船只(SH)、飞机(PL)、直升机(HC)、小型车辆(SV)、大型车辆(LV)、棒球场(BD)、田径场(GTF)、网球场(TC)、篮球场(BC)、足球场(SBF)、环形交叉口(RA)、游泳池(SP)和储油罐(ST)。在实验中,每张图像都被裁剪成1,024×1,0241,024 \times 1,0241,024×1,024的图像块,步幅为824,训练集和验证集都用于训练。HRSC2016是一个广泛用于检测旋转舰船的热门数据集。它只有船一个类别,包含1,061张图像,图像大小从300×300300 \times 300300×300到1,500×9001,500 \times 9001,500×900像素不等。训练集包含436张图像,验证集包含181张图像,其余144张图像用于测试。通过固定图像的长宽比,将图像的较短边调整为800像素,较长边不超过1,333像素。表2-1. 双阶段检测器Oriented R-CNN加载不同预训练模型在DOTA1.0上的旋转目标检测结果对比表2-2. 单阶段检测器S2ANet加载不同预训练模型在DOTA1.0上的旋转目标检测结果对比表2-3. 不同检测器加载多种预训练模型在HRSC2016的检测结果对比从表2-1和表2-2可以看出,MGC-B在预测包含大尺寸目标的类别(如GTF、TC和RA)时表现更好。使用单阶段检测器时,除了在TC和RA上取得相同的高性能外,MGC-L还对小尺寸甚至稠密目标(如BR、LV和SH)有着很好的预测能力。MGC预训练模型的准确率均达到了先进水平,且超越了INP。尽管与监督学习的RSP相比还存在一定的性能差距,但MGC仅依靠前者使用预训练数据集7%左右规模的小规模数据集预训练就取得了极具竞争力的结果。表2-3显示了所有方法在HRSC2016上的检测结果,MGC-B和MGC-L超越了所有其他基于对比学习的预训练方法,并且与监督学习的INP相当。有趣的是,MGC-B在双阶段检测器Oriented R-CNN中总是优于MGC-L。而在单阶段检测器S2ANet中,MGC-L的表现则优于MGC-B。这可能是因为MGC-L中大范围的上下文信息抑制了双阶段检测器对区域候选框的提取,而MGC-B更适合后续区域候选框的分类。语义分割我们使用3种分割框架UperNet、DeeplabV3+和PSPNet,在iSAID和Potsdam数据集上进行实验。iSAID是一个大规模的实例分割数据集。需要注意的是,该数据集与DOTA1.0共享相同的场景,不同之处只在于iSAID 采用语义掩码标签,包括一个背景类和15个前景类别:船舶(Ship)、储油罐(ST)、棒球场(BD)、网球场(TC)、篮球场(BC)、田径场(GTF)、桥梁(Bridge)、大型车辆(LV)、小型车辆(SV)、直升机(HC)、游泳池(SP)、环岛(RA)、足球场(SBF)、飞机(Plane)和港口(Harbor)。该数据集包含2,806张高分辨率图像,像素尺寸范围从800×800800 \times 800800×800到4,000×13,0004,000 \times 13,0004,000×13,000像素。其中训练集、验证集和测试集分别包含1,411、458和937张图像。以512的步长将所有图像裁剪为896×896896 \times 896896×896的小块,并仅使用验证集进行评估,这是因为测试集标签不可用。Potsdam数据集由ISPRS委员会WG II/4发布,包含38幅平均尺寸为6,000×6,0006,000 \times 6,0006,000×6,000像素的图像。这些图像覆盖了德国波茨坦市3.42平方千米的区域,并包含六类场景,即:不透水表面(IS)、建筑物(BD)、低矮植被(LV)、树木(Tree)、汽车(Car)和杂物(Clutter)。其中训练集和测试集分别包含24张和14张图像,以384的步长将所有图像裁剪为512×512512 \times 512512×512的小块。在计算评估指标时,从数据集中排除了杂物(Clutter)类别。表3-1. 不同预训练模型使用UperNet框架在iSAID上的分割结果对比表3-2. 不同预训练模型使用DeeplabV3+框架在iSAID上的分割结果对比表3-3. 不同预训练模型使用UperNet框架在Potsdam上的分割结果对比表3-4. 不同预训练模型使用DeeplabV3+框架在Potsdam上的分割结果对比在iSAID数据集上,MGC模型表现优异,其中MGC-L在UperNet和DeeplabV3+框架下的mIoU分别比RSP高出0.37和0.87。具体而言,表3-1展示了UperNet的结果,MGC-L在BD、HC和RA类别上取得最佳性能。对于DeeplabV3+,MGC模型整体表现优秀,如表3-2所示,在GTF、LV、SV和Bridge类别上达到了最高的IoU。在Potsdam数据集的结果分别展示在表3-3和表3-4中。MGC模型的表现优于所有其他对比学习方法,但整体上仍不及两种监督预训练模型INP和RSP。变化检测我们选择BIT作为统一的变化检测框架,在CDD和LEVIR数据集上进行评估。CDD是一个反映真实季节变化的基准数据集,包括7对4,725×2,2004,725 \times 2,2004,725×2,200和4对1,900×1,0001,900 \times 1,0001,900×1,000像素的多源RGB图像。这些图像均来自Google Earth,分辨率范围从0.03m到1m不等。遵循\parencite{ji2018fully}的方式,图像被裁剪为256×256256 \times 256256×256的小块。最终训练集、验证集和测试集分别包含10,000、3,000和3,000个小图像块。LEVIR数据集包含637对1,024×1,0241,024 \times 1,0241,024×1,024像素的图像,这些图像同样采集自Google Earth,覆盖了美国德克萨斯州2002年到2018年间20个不同的地区。数据集中包含31,333个独立的建筑变化目标,如别墅、公寓、车库和仓库。训练集、验证集和测试集分别包含445、64和128对图像。LEVIR数据集的大图被裁剪为256×256256 \times 256256×256的无重叠小图像块。表4-1. 不同预训练模型使用BIT框架在CDD和LEVIR上的变化检测结果对比所有方法在两个数据集上微调的F1分数如表4-1所示。变化检测任务旨在匹配一对双时相图像中同位置的像素,因此局部识别能力得到加强的MGC-B模型取得了比MGC-L模型更好的效果。遗憾的是,由于Fusion数据集中缺乏对变化检测友好的双时相信息,MGC模型的F1分数均低于INP模型。但是,MGC仍然比所有对比学习方法的效果好,甚至在CDD数据集上MGC-B模型超越了RSP模型。与视觉Transformer比较凭借全局注意力机制,ViT能够捕捉图像中前景与全局场景之间的空间关系。MGC旨在通过MLP分支引导CNN分支关注正确的前景区域。因此,本节对比了自然图像领域基于\textbf{ViT-B}ase的三种最新的预训练方法以进一步验证MGC的有效性,即对比学习方法MoCo v3和DINO,以及掩码图像建模方法MAE。MGC分别与使用这三种方法的默认设置在Fusion数据集上预训练的模型和官方预训练权重进行比较。此外,还将基于时间和光谱图像重建的SatMAE(在约71.2万张遥感图像上预训练)的开源预训练权重用于对比实验。表5. 与基于视觉Transformer的不同预训练方法的综合性能比较当使用小规模的Fusion数据集预训练模型时,MGC在稠密预测任务上的检测和分割表现全部优于三种对比方法,如表5第2、4和6行所示,这也进一步证明MGC能充分学习前景区域的有效判别表征。与在ImageNet-1k上预训练的官方模型相比,除了在DOTA1.0上的检测精度比MAE低0.64的mAP外,MGC仅从有限数据中学习充分的高质量表征,就能与利用大规模数据预训练的模型相媲美。使用大规模遥感图像预训练与RSP方法类似,我们采用大规模公开的场景分类数据集MillionAID进行预训练。由于MillionAID数据集未公开训练集标签,因此全部图像均用于预训练。MillionAID是一个大规模的遥感场景数据集,包含1,000,848张从Google Earth收集的RGB图像。训练集由10,000张图像组成,分为51个类别,而测试集包含其余990,848张未标注的图像。这些图像由不同的传感器拍摄,因此具有从0.5m至153m不等的空间成像分辨率,图像大小从110×110110 \times 110110×110到31,672×31,67231,672 \times 31,67231,672×31,672像素不等。表6. 不同预训练模型在来自多种传感器源图像上的分割性能比较各种下游任务的结果如表6所示。在大规模数据集上预训练的MGC模型的分类性能得到显著提升。此外,它在DOTA1.0和iSAID上超越了INP和RSP方法。在HRSC2016和Potsdam上,MGC模型的性能几乎与INP相当。MillionAID中的多样化场景有助于MGC学习更全面的视觉表征,从而获得更优的结果。然而,这些进步往往需要较高的训练成本(训练200 epochsepochsepochs,约148小时)。相比之下,尽管使用小规模Fusion数据集的MGC方法在旋转目标检测任务中的表现相对较差,但对于大多数任务,小规模预训练的MGC能够在约49小时的时间训练800 epochsepochsepochs,提高获得通用预训练模型的效率。可视化结果图1. 不同模型在多种场景下的注意力图。(a)原始图像;(b)INP;(c)MoCo v2;(d)MGC-B的CNN分支;(e)MGC-B的MLP分支;(f)MGC-L的CNN分支;(g)MGC-L的MLP分支。MGC的MLP分支(绿框)有效地引导CNN分支(红框)关注正确的前景区域。图1展示了使用GradCAM++技术可视化的不同模型在多样场景中的注意力图。可以看到,无论面对稠密目标还是稀疏目标,CNN主干网络(红框)在MLP分支(绿框)的引导下,都能将注意力集中在正确的前景区域。与MGC-B相比,MGC-L的注意力更加判别,这也解释了为什么MGC-L预训练的CNN主干模型有着更强的定位能力。例如,MGC-L减少了在纯纹理场景(如沙漠)中的冗余注意力;MGC-L的CNN主干从小规模区域中学到的纹理信息具有高判别性。相比之下,MoCo v2预训练模型对有着大纵横比的目标(如桥梁、机场)或区域目标(如教堂、湖泊)的注意力不完全,而对于稠密目标(如密集住宅区)则表现出冗余的注意力。INP由于域差异出现了错误的关注。小结我们提出了一种基于MLP引导的CNN预训练的对比学习方法——MGC。通过独特设计的的MLP分支,MGC能有效引导传统的CNN分支克服浅层的局部性问题,从而将注意力集中在正确的前景区域上并提取高质量判别表征。MGC预训练的模型不仅拥有着最佳的场景分类性精度,而且在旋转目标检测、语义分割和变化检测任务上也表现出极具竞争力的性能。MGC为遥感图像领域提供了一种有效且通用的预训练方法,对其他特殊类型的图像(如高光谱或合成孔径雷达图像)的预训练同样具有一定的参考价值。本文已发表在2024年的IEEE Transactions on Geoscience and Remote Sensing(TGRS)期刊上。
-
引言现有一些工作已经充分探讨了专门针对遥感图像的预训练,但它们通常需要多样化的遥感图像数据源,此外,在大规模数据集上进行预训练需要大量的计算资源,这使得只有少数研究机构能够实施。我们的目标是在随机采样得到的小规模遥感图像数据集上仅使用有限的计算资源(例如,四块NVIDIA V100 GPU)就训练出具有竞争力的通用预训练模型。我们采用了一种基于对比学习的CNN预训练范式。CNNs依靠局部性建模强大的判别特征有助于对比模型挖掘成对样本间的一致性,促进了对比学习在自然场景下取得进步。局部性即卷积层的局部感知性,通过卷积操作将卷积核与场景中相应位置的局部区域相乘,从而捕获当前位置的空间结构和局部模式。经过卷积操作,特征图的高和宽变小,固定大小的卷积核会带给深层卷积层更大的感受野。换句话说,局部性使CNNs的浅层关注局部区域而深层关注全局。但这一特点适用于自然场景而非遥感场景,我们利用Grad-CAM++可视化不同方法预训练的CNNs每一层的注意力图并排除域差异的影响来更好的说明。图1. 不同预训练模型各层的注意力图(a)MoCo v2在ImageNet-1k上预训练的ResNet-50(b)MoCo v2在小规模遥感图像数据集上预训练的ResNet-50(c)MGC在小规模遥感图像数据集上预训练的ResNet-50(d)MGC在小规模遥感图像数据集上预训练的MLP分支对于图1(a)的自然场景,由于前景目标单一且尺寸较大,与背景间差异明显,CNN的layer1layer1layer1和layer2layer2layer2从不同位置的局部场景中有极大概率捕获到前景狗和背景的差异。感受野较大的layer3layer3layer3能逐渐从更大区域中定位部分狗的判别区域。到layer4layer4layer4阶段,CNN的关注域能覆盖正确前景区域并从中提取强大的判别表征。相反,遥感场景通常覆盖广阔而复杂的地形,卫星传感器质量的变化可能导致遥感图像模糊或失真。此外,图像中的前景目标、感兴趣区域和土地覆盖等主要判别要素在尺度和分布上也不均匀。在图1(b)的遥感场景中,预训练CNN的layer1layer1layer1和layer2layer2layer2只能从有限的局部区域中学习前景桥梁和背景之间的差异信息,限制了layer3layer3layer3建立对更大区域内正确前景的认识。进一步地,这导致layer4layer4layer4对海面等背景的冗余关注和对前景桥梁的不充分关注,并认为该处判别。遥感场景下浅层的局部性导致CNN不完全定位正确前景,提取的低质量表征不利于对比模型学习一致性,这也造成了对数据的浪费。为此,我们提出一种用于遥感图像的MLP指导CNN预训练的对比学习方法(MLP-Guided CNN Pre-training,MGC)。MGC在CNN分支之外额外引入了MLP分支,以克服浅层的局部性问题,并引导CNN分支关注正确的前景区域。MLP分支由三层卷积层和多个MLP组成,能够从特征图中的不同位置聚合空间上下文信息。在图1(c)和(d)的遥感场景中,尽管layer3layer3layer3仍错误地关注了桥梁右下角的土地覆盖区域,但MLP分支的各层通过聚合来自不同区域的特征逐步定位到了完整的桥梁,成功引导CNN关注正确的前景区域。MGC模型架构MGC采用经典的孪生编码器架构进行对比预训练。其中,编码器kkk的参数通过动量更新机制平滑的从编码器qqq获得,即:θk←α⋅θk+(1−α)⋅θq\theta_k \leftarrow \alpha \cdot \theta_k+(1-\alpha) \cdot \theta_qθk←α⋅θk+(1−α)⋅θq,其中θq\theta_qθq和θk\theta_kθk表示编码器的参数。如图~\ref{mgc-fig2}(a)所示,每个编码器由一个普通CNN分支(EqcE_q^cEqc / EkcE_k^cEkc)和一个对前景敏感的MLP分支(EqmE_q^mEqm / EkmE_k^mEkm)组成。与SimCLR方法相同,输入遥感图像xxx通过随机数据增强创建两个视图vqv_qvq和vkv_kvk,然后分别输入到两个编码器的各个分支中来提取多种形式的表征。在图2(a)中,灰色的ck−c_{k^-}ck−和mk−m_{k^-}mk−表示来自除xxx以外其他图像的特征。图2. MGC的完整架构CNN分支CNN分支E:cE_:^cE:c包括来自编码器qqq的EqcE_q^cEqc和来自动量编码器kkk的EkcE_k^cEkc,它们均由ResNet-50主干网络链接着一个投影头组成,EqcE_q^cEqc连接着一个额外的预测头,投影头与预测头结构相同,均由通道全连接层(Channel FC layer,即线性层)、BN层、ReLU激活函数和另一个通道全连接层组成。MLP分支图3. MLP分支结构MLP分支E:mE_:^mE:m与E:cE_:^cE:c唯一区别在于主干结构上的差异。E:mE_:^mE:m的主干网络中仅保留ResNet-50的前三层,之后与一个单独设计的MLP网络相连,其结构如图3所示由两个普通的MLP和nnn个CycleMLP组成。CycleMLP中的Cycle FC层可以沿着特征图的通道维度进行循环偏移和采样,从而在不同的高度和宽度维度上聚合空间上下文信息,具体计算方式如下:Mh,w,:cycleFC=∑c=0cinWc⋅Fh+Δh,w+Δw,c+b,M_{h, w,:}^{\text {cycleFC}}=\sum_{c=0}^{c_{in}} W_c \cdot F_{h+\Delta h, w+\Delta w, c}+b, Mh,w,:cycleFC=c=0∑cinWc⋅Fh+Δh,w+Δw,c+b,其中Fh+Δh,w+Δw,cF_{h+\Delta h, w+\Delta w, c}Fh+Δh,w+Δw,c表示在动态循环位置(h+Δh,w+Δw)(h + \Delta h, w + \Delta w)(h+Δh,w+Δw)处第ccc通道的值。Wc∈RCin×CoutW_c \in {\mathbb R}^{C_{in} \times C_{out}}Wc∈RCin×Cout和b∈RCoutb \in {\mathbb R}^{C_{out}}b∈RCout分别是Cycle FC中可学习的权重和偏置。在第ccc通道上高度和宽度两个方向上的偏移量通过计算Δh=(c mod s)−1\Delta h = (c \bmod s) - 1Δh=(cmods)−1和Δw=(⌊c/s⌋ mod s)−1\Delta w = (\left\lfloor {c/s} \right\rfloor \bmod s) - 1Δw=(⌊c/s⌋mods)−1来获得,其中sss是可调节步长。较大的步长sss意味着E:mE_:^mE:m能聚合更多空间上下文信息。随着训练的进行,E:mE_:^mE:m能够挖掘与前景区域相关的判别表征。随着sss的增加,E:mE_:^mE:m关注更大且更具判别性的前景区域。模型训练MGC中每个提出的组件的工作流程如图2所示。首先,同分支对比学习利用从编码器qqq的CNN分支EqcE_q^cEqc提取的特征cqc_qcq和来自动量编码器kkk的EkcE_k^cEkc的特征ckc_kck,或由MLP分支 E:mE_:^mE:m提供的特征mqm_qmq和mkm_kmk,构建正负样本对,通过典型的对比学习来探索一致性。同时,正样本对引导策略推动cqc_qcq (mqm_qmq)从其正样本ck+c_{k^+}ck+(mk+m_{k^+}mk+)中学习信息,从而促进同分支对比学习。之后,跨分支对比学习从EqcE_q^cEqc选择cqc_qcq和来自EkmE_k^mEkm的mk+m_{k^+}mk+与mk−m_{k^-}mk−,构建成对样本;类似地,mqm_qmq也被用来与ck+c_{k^+}ck+和ck−c_{k^-}ck−创建正负对,进一步丰富模型学到的一致性。最终,注意力引导策略被提出用以拟合同一编码器中E:cE_:^cE:c和E:mE_:^mE:m提取的特征的分布,从而驱使E:mE_:^mE:m引导E:cE_:^cE:c逐渐关注前景区域并学习判别表征,最终克服E:cE_:^cE:c浅层的局部性问题。经过充分的训练,编码器qqq的CNN分支EqcE_q^cEqc作为通用预训练模型微调一系列下游遥感任务。同分支对比学习同分支对比学习的目标是为“查询向量”检索与之相关的“键向量”,并使它们在嵌入空间中彼此接近,这通过最小化infoNCE损失函数来实现。因此,在获得由E:cE_:^cE:c编码的cqc_qcq和ckc_kck后,损失计算如下:Lc↔c(cq,ck)=−logexp(cq⋅ck+/τ)exp(cq⋅ck+/τ)+∑k−exp(cq⋅ck−/τ),\mathcal{L}_{c \leftrightarrow c}(c_q,c_k){\rm{ = }} - \log \frac{\exp (c_q \cdot {c_{k^+}} /\tau )}{\exp (c_q \cdot {c_{k^+}}/\tau ) + \sum\nolimits_{k_{\rm{ - }}} {\exp (c_q \cdot {c_{k^-}}/\tau )} }, Lc↔c(cq,ck)=−logexp(cq⋅ck+/τ)+∑k−exp(cq⋅ck−/τ)exp(cq⋅ck+/τ),其中τ\tauτ是用于控制相似度计算尺度的温度系数,ck+c_{k^+}ck+和cqc_qcq来自同一图像的不同视图,即一个正样本对。ck−c_{k^-}ck−是从其他图像中提取的,通常被视为cqc_qcq的负样本。当然,遵循相同的设置再次计算来自MLP分支E:mE_:^mE:m的mqm_qmq与mkm_kmk间的infoNCE损失。模型通过同分支对比学习来挖掘基本的一致性信息,其完整的损失函数写为:Lconsame=Lc↔c(cq,ck)+Lm↔m(mq,mk).\mathcal{L}_{con}^{\rm{same}} = {\mathcal{L}_{{\rm{c}} \leftrightarrow c}}(c_q,c_k) + {\mathcal{L}_{m \leftrightarrow m}}(m_q,m_k). Lconsame=Lc↔c(cq,ck)+Lm↔m(mq,mk).跨分支对比学习E:cE_:^cE:c能从场景中的任何区域提取局部特征。而聚合较大尺度场景内空间上下文的特性使得E:mE_:^mE:m能够专注于前景区域,从而学到对前景敏感的区域辨别表征。因此,跨分支对比学习被提出来充分挖掘这两种不同偏好表征之间的互信息,进一步提升模型学到的一致性。对于一个随机输入图像,可将EqcE_q^cEqc提取的cqc_qcq视为“查询向量”,EkmE_k^mEkm编码的数据增强视图的mk+m_{k^+}mk+作为cqc_qcq的正样本,来自其他图像的表征作为cqc_qcq的负样本mk−m_{k^-}mk−。同样,当mqm_qmq作为“查询向量”时,用于构造正负样本对的样本都来自EkcE_k^cEkc。投影头和预测头确保了所有分支提取的特征向量维度相同。通过跨分支的构建正负样本对,本章最小化如式~\ref{mgc-eq2}所定义的infoNCE损失。因此,跨分支对比学习的完整损失函数可以写为:Lconcross=Lc↔m(cq,mk)+Lm↔c(mq,ck).\mathcal{L}_{con}^{\rm{cross}} = {\mathcal{L}_{{\rm{c}} \leftrightarrow m}}(c_q,m_k) + {\mathcal{L}_{m \leftrightarrow c}}(m_q,c_k). Lconcross=Lc↔m(cq,mk)+Lm↔c(mq,ck).正样本对引导策略一般的,典型对比范式通常设置较大的动量更新系数α\alphaα来保证两个编码器的网络参数近似。动量编码器kkk提取的特征中包含的判别信息在每次迭代中都得到了充分保留,这使得特征具有很高的稳定性。因此当对比一个由“查询向量”cqc_qcq 和稳定特征ck+c_{k^+}ck+构建的正样本对时,模型就会全神贯注的探索一致性。否则,模型可能会在cqc_qcq和不稳定的ck+c_{k^+}ck+之间学习到一些噪声。因此,基于动量更新机制带来的优势,设计了一种正样本对引导策略,以增强同分支对比学习的效果。如图~\ref{mgc-fig2}(d)所示,对于E:cE_:^cE:c,最小化cqc_qcq和ck+c_{k^+}ck+分布之间的KL散度:Lk+→qc(cq,ck+)=−ck+logck+cq,\mathcal{L}_{k^{+} \rightarrow q}^c\left(c_q, c_{k^{+}}\right)=-c_{k^{+}} \log \frac{c_{k^{+}}}{c_q}, Lk+→qc(cq,ck+)=−ck+logcqck+,上式迫使ck+c_{k^+}ck+和cqc_qcq特征分布一致,进一步促进了同一类型分支内的对比学习。随着动量更新的进行,EkcE_k^cEkc会逐渐具备相同的特征提取能力。在E:mE_:^mE:m中,同样的策略应用于从E:mE_:^mE:m提取的mqm_qmq和mk+m_{k^+}mk+,完整的正样本对引导策略的损失函数可定义为:LklPG=Lk+→qc(cq,ck+)+Lk+→qm(mq,mk+).\mathcal{L}_{kl}^{{\rm{PG}}} = \mathcal{L}_{{k^ + } \to q}^c(c_q,c_{k^+}) + \mathcal{L}_{{k^ + } \to q}^m(m_q,m_{k^ + }). LklPG=Lk+→qc(cq,ck+)+Lk+→qm(mq,mk+).注意力引导策略CNN中浅层的局部性问题导致E:cE_:^cE:c不可避免关注到冗余的背景信息,并忽略部分前景区域。与此相反,E:mE_:^mE:m从不同区域聚合空间上下文信息,驱使注意力覆盖正确的前景区域,这使得E:mE_:^mE:m挖掘的表征在前景目标或区域的位置上有着足够的判别性。基于上述发现,提出注意力引导策略帮助CNN分支关注正确前景区域,这通过最小化mqm_qmq和cqc_qcq的分布之间的KL散度来实现的。Lm→cq(cq,mq)=−mqlogmqcq,\mathcal{L}_{m \rightarrow c}^q\left(c_q, m_q\right)=-m_q \log \frac{m_q}{c_q}, Lm→cq(cq,mq)=−mqlogcqmq,其中,区域判别表征mqm_qmq将作为监督信号,迫使EqcE_q^cEqc关注相同场景中的前景区域。同时,EkcE_k^cEkc也被引导在另一视图中定位相同的前景。最终的损失函数可以写为:LklAG=Lm→cq(cq,mq)+Lm→ck+(ck+,mk+).\mathcal{L}_{k l}^{\mathrm{AG}}=\mathcal{L}_{m \rightarrow c}^q\left(c_q, m_q\right)+\mathcal{L}_{m \rightarrow c}^{k^{+}}\left(c_{k^{+}}, m_{k^{+}}\right) . LklAG=Lm→cq(cq,mq)+Lm→ck+(ck+,mk+).在图1中,CNN分支的注意力覆盖了正确的前景区域,证明了注意力引导策略的有效性。LossMGC通过联合优化EqcE_q^cEqc, EqmE_q^mEqm, EkcE_k^cEkc和EkmE_k^mEkm来进行高质量的表征学习,即:Ltotal =Lcon same +λC⋅Lcon cross +λP⋅LklPG+λA⋅LklAG,\mathcal{L}_{\text {total }}=\mathcal{L}_{\text {con }}^{\text {same }}+\lambda_C \cdot \mathcal{L}_{\text {con }}^{\text {cross }}+\lambda_P \cdot \mathcal{L}_{k l}^{\mathrm{PG}}+\lambda_A \cdot \mathcal{L}_{k l}^{\mathrm{AG}}, Ltotal =Lcon same +λC⋅Lcon cross +λP⋅LklPG+λA⋅LklAG,其中权重λC\lambda_CλC平衡模型优化期间的跨分支对比学习,合适的正样本对引导损失的权重λP\lambda_PλP能促进同分支对比学习的质量,改变权重λA\lambda_AλA能控制MLP分支E:mE_:^mE:m引导CNN分支E:cE_:^cE:c注意力的强度。实验篇幅所限,请读者移步MGC:面向遥感场景的MLP引导CNN预训练的对比学习(二)
-
引言遥感图像场景分类作为遥感技术中一种基础的应用手段,在现代化的地质勘探、道路规划、精准农业、灾害监测、病媒传播监测和应对气候变化等涉及国防和民生的领域中起着举足轻重的作用。传统分类模型通常采用在ImageNet等通用自然图像数据集上预训练的权重进行初始化。然而,自然图像与遥感图像在数据类型、成像机制及空间特征等方面存在显著差异,导致此类预训练模型在遥感场景下泛化能力受限,难以充分发挥性能潜力。近年来,遥感技术迅猛发展,推动了空间分辨率与光谱分辨率更高、图像质量更优的遥感数据的持续产出。然而,对这些高分辨率图像进行精细化标注,往往依赖专家经验或昂贵的地面传感器,成本高昂且效率低下。与此同时,随着在轨观测卫星数量的激增,每日产生的遥感图像数据量呈指数级增长。在这一背景下,如何高效、智能地解析和理解海量遥感数据,已成为民用与军事应用领域共同面临的紧迫挑战。因此,发展高效、鲁棒的自监督表征学习方法,实现对海量未标注遥感数据的自动表征提取与语义理解,正日益成为推动遥感智能分析迈向新阶段的核心技术路径。对比学习对比学习作为自监督表征学习中的主流范式之一,通过将嵌入空间中正样本对(即同一图像的不同视图)的表征拉近,同时推远负样本对(即不同图像的视图),能从无标注图像中学习充分的一致性视觉表征。我们借助图1简要介绍对比学习的学习过程:图1. 对比学习范式每张无标签图像xxx经两种独立的数据增强操作创建出两个不同的视图,即查询视图vqv_qvq和键视图vkv_kvk。之后,它们分别输入到具有相同结构的孪生编码器中提取特征。经编码器提取的查询向量为qqq,存储在记忆库中的一组已编码的键向量为{k0,k1,k2,...}\{k^0, k^1, k^2, ...\}{k0,k1,k2,...},这其中一定存在一个唯一的正键向量k+k_+k+与查询向量qqq匹配,因为该正键向量和查询向量来自同一图像的不同视图。因此,qqq和k+k_+k+构成正样本对,对比学习往往采用典型的infoNCE损失函数来拉近正样本对,同时增加查询与所有其他负键向量k−k_-k−之间的距离,其公式如下:Lc(q,k)=−logexp(q⋅k+/τ)exp(q⋅k+/τ)+∑k−exp(q⋅k−/τ),{{\cal L}_c}(q,k){\rm{ = }} - \log \frac{{\exp (q \cdot {k_ + }/\tau )}}{{\exp (q \cdot {k_ + }/\tau ) + \sum\nolimits_{{k_ - }} {\exp (q \cdot {k_ - }/\tau )} }}, Lc(q,k)=−logexp(q⋅k+/τ)+∑k−exp(q⋅k−/τ)exp(q⋅k+/τ),其中τ\tauτ为用于控制特征分布平缓程度的温度系数。基于多尺度难特征的对比学习与自然图像相比,遥感图像涵盖的场景中背景复杂,其中作为判别依据的前景目标的尺度和分布不均匀,且不同卫星的成像质量差异也造成了视觉模糊和图像畸变等负面因素,因此,我们提出了一种基于多尺度难特征的对比学习方法(Multi-scale Hard Contrastive Learning, MHCL)。MHCL利用我们设计的难特征转换方法从小规模遥感图像数据中创建更判别的多尺度难特征,从而鼓励模型从复杂遥感场景中学习丰富的一致性视觉表征,其结构如图2所示。图2. MHCL架构我们以经典方法MoCo v2作为baseline,收集编码器ResNet-50的layer2layer2layer2、layer3layer3layer3、layer4layer4layer4和layer5layer5layer5输出的浅层纹理特征和深层语义特征,分别送入四个具有不同输入维度的投影头来生成简单的多层级特征和对应的记忆队列。难特征转换所有提取的特征kik^iki和qiq^iqi在L2归一化后,都会映射到一个统一的单位球面空间中。为充分挖掘和利用每张遥感图像所含场景信息,我们对每一组特征向量均采用难特征转换方法HFT,包括难正特征离心化和难负特征向心化操作。通过HFT,直接编码得到的简单查询向量和简单键向量彼此融合,从而转换为难样本。这些生成的难特征所包含的合成场景信息会突破数据集中固有场景的限制,帮助模型探索更判别的一致性信息从而提升表征学习的质量。图3. 难特征转换难正特征离心化从最大化利用图像信息的角度出发,最直接的思路是挖掘更多包含场景语义的特征。通常,在标准单位球面空间中,从球心指向球面的两个归一化特征之间的夹角越大,它们的相似性就越低,即夹角较大的两个特征可被视为彼此的难样本。因此,通过离心化操作来增大每对查询特征向量与其正键特征向量之间的夹角来获取难正特征。具体而言,如图3(a)所示,使用加权减法运算外推qiq^iqi来生成离心的难特征。同理也可以得到k+ik_+^ik+i的难样本,该过程可以表示为:{q^i=(1+λ)⋅qi−λ⋅k+ik^+i=(1+λ)⋅k+i−λ⋅qi,\left\{ \begin{array}{l} {{\hat q}^i} = (1 + \lambda ) \cdot {q^i} - \lambda \cdot k_ + ^i\\ \hat k_ + ^i = (1 + \lambda ) \cdot k_ + ^i - \lambda \cdot {q^i} \end{array} \right., {q^i=(1+λ)⋅qi−λ⋅k+ik^+i=(1+λ)⋅k+i−λ⋅qi,其中,权重λ\lambdaλ服从Beta分布,即λ∼Beta(α,β)\lambda \sim Beta(\alpha, \beta)λ∼Beta(α,β),且λ∈(0,1)\lambda \in (0,1)λ∈(0,1)。更小的λ\lambdaλ能生成更难的样本。由于场景分类数据集的规模远小于ImageNet等大型自然图像基准,过难的特征可能会破坏图像中的独特场景,不利于模型的学习和训练的收敛。因此,我们一般选择较大的λ\lambdaλ以避免生成的难正特征过度偏离原始场景。难负特征向心化在模型迭代训练时,baseline模型的记忆队列仅更新最前面一个batchsizebatchsizebatchsize大小的负键向量,这会导致模型反复计算那些没有得到及时更新的剩余负样本的损失。因此,增加不同负特征之间的相似性来生成更多样化的难负样本,能帮助MHCL降低重复计算的代价。具体的,每一组相同尺度的负键向量都存储在一个单独的记忆队列中,即{k−i}={k1,k2,...,kQ}−i\{k_-^i\} = {\{k_1},{k_2},...,{k_Q}\}_-^i{k−i}={k1,k2,...,kQ}−i,其中QQQ是每个队列的大小,定义{k−i}rand\{k_-^i\}_{rand}{k−i}rand为队列{k−i}\{k_-^i\}{k−i}的随机重排列版本。如图3(b)所示,难负特征向心化操作通过使用加权加法来减少{k−i}\{k_-^i\}{k−i}中的负样本与{k−i}rand\{k_-^i\}_{rand}{k−i}rand中的随机排列的负样本之间的角度,即:{k^−i}=λ⋅{k−i}+(1−λ)⋅{k−i}rand,\{\hat k_-^i\} = \lambda \cdot \{k_-^i\} + (1 - \lambda) \cdot {\{k_-^i\}_{rand}}, {k^−i}=λ⋅{k−i}+(1−λ)⋅{k−i}rand,其中,λ\lambdaλ与难正特征离心化中的λ\lambdaλ作用一致。本章同样赋予λ\lambdaλ一个较大的值,以避免生成如上述描述的造成信息崩塌的难负样本。向心化的队列{k^−i}\{\hat k_-^i\}{k^−i}可以提供多样化的负样本特征,从而进一步促进多层级中间特征对比学习。最终Loss在离心化简单正特征生成难正特征q^i\hat q^iq^i和k^+i\hat k_+^ik^+i,并创建包含难负特征的记忆队列{k^−i}\{\hat k_-^i\}{k^−i}之后,MHCL利用多尺度难特征联合对比损失函数,在每个尺度上推远难负样本对并拉近难正样本对,从而引导模型学习更具一致性的判别表征,即:Lmhc(q,k)=Lmlc(qi,ki)+ωh⋅Lmlc(q^i,k^i),{{\cal L}_{mhc}}(q,k) = {{\cal L}_{mlc}}({q^i},{k^i}) + {\omega _h} \cdot {{\cal L}_{mlc}}({\hat q^i},{\hat k^i}), Lmhc(q,k)=Lmlc(qi,ki)+ωh⋅Lmlc(q^i,k^i),其中,ωh\omega_hωh是一个超参数,控制难特征参与模型优化的强度。在将模型迁移到下游场景分类任务时,转换的难特征包含的部分合成场景信息会在一定程度上混淆模型的判别能力。这种情况在小规模数据集上尤为明显。因此,不同规模的数据集设置不同的ωh\omega_hωh,从而在最大化利用这些难特征挖掘模型潜能的同时降低错误预测的风险。实验数据集MHCL的一系列实验均在三个常见的遥感图像场景分类数据集UC Merced、NWPU-RESISC45和MLRSNet上进行:UC Merced包含21个土地利用类别,每个类别有100张尺寸为256×256256 \times 256256×256像素的图像,这2,100张RGB图像收集自美国地质调查局(USGS)发布的国家地图集。NWPU-RESISC45是由西北工业大学从Google Earth收集的一个常用遥感图像场景分类基准数据集。它包含31,500张RGB彩色空间的图像,平均分为45类,每类包括700张图像。这些图像的空间分辨率范围从0.2米到30米不等,所有图像的大小均为256×256256 \times 256256×256像素。MLRSNet是一个大规模的多标签遥感图像数据集,包含109,161张从 Google Earth收集的图像。这些图像的空间分辨率范围为0.1米到10米,图像大小为256×256256 \times 256256×256像素。所有图像被分配到46个大类,每个大类包含1,500到3,000张图像不等。同时,每张图像都有着从1到13个数量不等的子标签。全部实验仅使用大类标签。在实验中,所有数据集中每个类别的图像都被随机分成两部分。一部分用于训练,包括自监督预训练和在场景分类任务上微调;另一部分用于测试模型性能。UC Merced(UCM)数据集被随机划分为60%的训练集和40%的测试集。对于NWPU-RESISC45数据集,随机选择20%和80%的图像用于训练,其余20%和80%的图像用于测试。这两个划分的数据集分别称为NU45 2-8和NU45 8-2。同样,MLRSNet数据集将40%作为训练集,60%作为测试集,并且在测试阶段仅使用广义类别标签。主要结果表1. 主要结果对比我们选取自然图像领域的11种优秀的对比学习方法进行比较,在表1可以看到,MHCL在三个数据集上均取得了卓越的性能,尤其是在小规模的UCM上。除了BYOL之外,所有对比方法均在MLRSNet上取得最佳结果,这表明数据集中包含的场景信息越丰富,由对比机制引导的模型所学习的一致性表征就越具判别力。然而,这些方法在其他三个小型和中型数据集上的Top-1准确率表现均不理想,只有MHCL在所有数据集上均保持了全面的竞争力。尽管训练样本有限,但通过利用主干网络中间层的多尺度难特征挖掘一致性视觉表征,MHCL仍然能为场景分类任务提供有效的预训练模型。表2. 不同预训练方法对比许多对比学习方法都是基于自然图像数据集(如包含约128万张图像的 ImageNet-1k)逐步发展而来的。这些方法在自监督生成的预训练模型在许多下游任务中表现出良好的微调性能。为了探究所提出的MHCL方法在遥感图像数据集上的优势,我们进行了以下实验:不加载任何预训练权重,从头开始训练一个ResNet-50网络用作分类。表2第一行的分类结果表明,随机初始化对分类任务产生了不利影响。直接将传统ImageNet-1k预训练模型迁移到场景分类任务。表2第二行的结果显示,仅使用简单的微调策略即可取得良好性能,并在NU45 2-8和UCM数据集上实现最佳分类结果,相比之下MHCL略显逊色。然而,在规模相对较大的NU45 8-2和MLRSNet数据集上,ImageNet预训练模型的准确率低于MHCL方法。尽管自然图像与遥感图像之间存在明显差异,但ImageNet-1k大量的图像数据仍然能够提供丰富的判别信息。采用标准的监督预训练方式,在每个场景分类数据集上训练一个监督预训练模型,并将其迁移到场景分类任务。实验结果如表2第三行所示,在相同数量级的训练图像基础上,MHCL通常明显优于监督预训练方法,尤其是在较小的NU45 2-8和UCM数据集上。小结MHCL仅通过有限的遥感图像数据就能学习到丰富的一致性视觉表征,我们希望MHCL能够加速遥感社区的预训练算法研究。本文已发表在2023年的IEEE Transactions on Geoscience and Remote Sensing(TGRS)期刊上。在下一节中,将继续探索对比学习在遥感领域中的应用潜力,届时不仅仅局限于场景分类任务,还将为其他重要的遥感图像任务,如旋转目标检测、变化检测和语义分割,贡献一种更通用的上游预训练模型。
-
赋能校园开发者:连接湖北工业大学与华为开发者空间作为华为开发者空间在校园的积极推广者,我始终致力于将前沿的技术工具与鲜活的学习实践相结合。近期,我们在湖北工业大学成功举办了一系列活动,真正让华为开发者空间成为同学们触手可及的创新平台。现在,就让我以亲历者的视角,回顾这段充满技术热情与探索精神的旅程。始于招新:点燃校园技术热情一切始于热闹的“百团大战”社团招新日。那天,我们精心布置的展架成为现场焦点。 “华为开发者空间”的蓝色标识格外醒目,清晰展示了其核心价值:汇聚鸿蒙等前沿技术,提供免费的云上AI开发工具和实战案例,让同学们能“一键开通”云端AI环境,无需复杂配置即可投身开发。我们热情地向往来同学介绍,华为开发者空间如何让一台普通笔记本也能媲美专业计算资源,轻松调用大模型能力。现场扫码加入社群的同学络绎不绝,为后续活动奠定了坚实的基础。深入讲解:揭开低门槛开发的神秘面纱招新后,我们迅速在计算机教室组织了首场深度培训。当我站在讲台旁,看到教室里坐满了充满求知欲的同学时,内心充满激动。投影幕布上打出“华为开发者空间,让开发者低门槛体验华为工具和资源”的醒目标题。我为大家详细讲解了开发者空间的架构、智能网关平台以及如何利用它进行高效的CI/CD流水线开发。同学们专注的神情和不时记录的动作,让我感受到技术分享带来的价值。紧接着的versatile agent培训,我们聚焦于具体的需求挖掘与开发实践,引导大家思考如何将华为利用华为的智能云平台快速部署应用真实项目场景,为后续的动手实操做好理论铺垫。动手实践:在云端环境中真操实练理论知识的价值在于应用。随后的三次活动,我们完全进入了实战阶段。在宽敞的机房内,同学们人手一机,直接登录华为开发者空间的云环境。我清晰地记得那个场景:同学们紧盯屏幕,跟随指导一步步操作。当我走到一位同学身边,看到他成功在云端启动了一个模型环境的训练时,他脸上露出的惊喜笑容让我印象深刻。在培训中,我通过将社团举办的“华为云杯”比赛与开发者空间结合,对同学们进行真实的案例演示,通过投影共享屏幕,演示如何利用华为的云服务器快速部署模型。教室里回响着键盘的敲击声,同学们或独立探索,或通过QQ即时交流协作,真正体验了“云上开发”的高效与便捷。活动亮点与效果:技术普惠的生动体现回顾整个过程,最大的亮点在于 “无缝衔接的理论与实践” 和 “极低的技术入门门槛”。华为开发者空间提供的云端资源,让同学们摆脱了本地环境配置的困扰,能将精力完全集中于逻辑实现与创新思考。从招新时对概念的初步了解,到培训中的深入认知,再到机房里的亲手实践,我们形成了一个完美的学习闭环。活动效果显著。不仅社团规模迅速扩大,更重要的是,许多同学反馈“第一次感觉自己离企业级开发如此之近”。他们成功利用所学,开始尝试构建自己的智能应用项目,技术自信与实践能力得到了实质性的提升。结语通过这一系列围绕华为开发者空间的活动,我深切体会到,将优质技术资源以易懂、易用的方式引入校园,是激发学生创新潜能的关键。我们不仅仅是组织了几场活动,更是播下了一颗颗技术的种子。未来,我们将继续深耕,让华为开发者空间成为更多校园开发者梦想起航的地方。
-
1. 下载模型权重 安装python环境 conda create -n qwq_model python==3.13.6 conda activate qwq_model pip install modelscope 通过 modelscope SDK下载模型(https://www.modelscope.cn/models/Qwen/QwQ-32B)到制定目录 mkdir -p /usr/local/data/model_list/model/QwQ-32B modelscope download --model Qwen/QwQ-32B --local_dir /usr/local/data/model_list/model/QwQ-32B 2. 部署模型 vim /etc/sysctl.conf 设置 net.ipv4.ip_forward的值为1 source /etc/sysctl.conf docker pull swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_ascend:pytorch_2.5.1-cann_8.2.rc1-py_3.11-hce_2.0.2503-aarch64-snt9b-20250729103313-3a25129 启动容器 docker run -itd \--device=/dev/davinci0 \--device=/dev/davinci1 \--device=/dev/davinci2 \--device=/dev/davinci3 \-v /etc/localtime:/etc/localtime \-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \-v /etc/ascend_install.info:/etc/ascend_install.info \--device=/dev/davinci_manager \--device=/dev/devmm_svm \--device=/dev/hisi_hdc \-v /var/log/npu/:/usr/slog \-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \-v /sys/fs/cgroup:/sys/fs/cgroup:ro \-v /usr/local/data/model_list/model:/usr/local/data/model_list/model \--net=host \--name vllm-qwen \91c374f329e4 \/bin/bash 来到容器环境 docker exec -it -u ma-user ${container_name} /bin/bashdocker exec -it -u ma-user vllm-qwen /bin/bash设置容器里的参数export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 export VLLM_PLUGINS=ascend # VPC网段# 需用户手动修改,修改方式见下方注意事项VPC_CIDR="192.168.0.0/16" VPC_PREFIX=$(echo "$VPC_CIDR" | cut -d'/' -f1 | cut -d'.' -f1-2)POD_INET_IP=$(ifconfig | grep -oP "(?<=inet\s)$VPC_PREFIX\.\d+\.\d+" | head -n 1)POD_NETWORK_IFNAME=$(ifconfig | grep -B 1 "$POD_INET_IP" | head -n 1 | awk '{print $1}' | sed 's/://')echo "POD_INET_IP: $POD_INET_IP"echo "POD_NETWORK_IFNAME: $POD_NETWORK_IFNAME" # 指定通信网卡export GLOO_SOCKET_IFNAME=$POD_NETWORK_IFNAMEexport TP_SOCKET_IFNAME=$POD_NETWORK_IFNAMEexport HCCL_SOCKET_IFNAME=$POD_NETWORK_IFNAME# 多机场景下配置export RAY_EXPERIMENTAL_NOSET_ASCEND_RT_VISIBLE_DEVICES=1 # 开启显存优化export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True# 配置通信算法的编排展开位置在Device侧的AI Vector Core计算单元export HCCL_OP_EXPANSION_MODE=AIV# 指定可使用的卡,按需指定export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7# 指定绑核,按需指定export CPU_AFFINITY_CONF=1export LD_PRELOAD=/usr/local/lib/libjemalloc.so.2:${LD_PRELOAD}# 默认启用 ascend-turbo-graph模式,指定启动插件export VLLM_PLUGINS=ascend_vllm# 如果使用 acl-graph 或者 eager 模式,指定启动插件 # export VLLM_PLUGINS=ascend# 指定vllm后端 v1export VLLM_USE_V1=1# 指定vllm版本export VLLM_VERSION=0.9.0 export USE_MM_ALL_REDUCE_OP=1export MM_ALL_REDUCE_OP_THRESHOLD=256 # 不需要设置以下环境变量unset ENABLE_QWEN_HYPERDRIVE_OPTunset ENABLE_QWEN_MICROBATCHunset ENABLE_PHASE_AWARE_QKVO_QUANTunset DISABLE_QWEN_DP_PROJ source /home/ma-user/AscendCloud/AscendTurbo/set_env.bash 运行API服务 nohup python -m vllm.entrypoints.openai.api_server \--model /usr/local/data/model_list/model/QwQ-32B \--max-num-seqs=256 \--max-model-len=512 \--max-num-batched-tokens=512 \--tensor-parallel-size=4 \--block-size=128 \--host=192.168.0.127 \--port=18186 \--gpu-memory-utilization=0.95 \--trust-remote-code \--no-enable-prefix-caching \--additional-config='{"ascend_turbo_graph_config": {"enabled": true}, "ascend_scheduler_config": {"enabled": true}}' > QwQ-32B.log 2>&1 & port端口号可以自定义,勿与已经使用的端口号冲突 3. 验证API服务 验证服务 curl http://192.168.0.127:18186/v1/completions \-H "Content-Type: application/json" \-d '{ "model": "/usr/local/data/model_list/model/QwQ-32B", "prompt": "What is moon","max_tokens": 64,"temperature": 0.5 }'
-
昇腾平台文生文大模型安装技术洞察 1. 检查环境 1.1 确保NPU设备无异常 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数,用来确认对应卡数已经挂载npu-smi info -t board -i 1 | egrep -i "software|firmware" #查看驱动和固件版本1.2 确保docker无异常 docker -v #检查docker是否安装yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch641.3配置IP转发 vim /etc/sysctl.conf 设置 net.ipv4.ip_forward=1source /etc/sysctl.conf 2. 制作容器2.1 获取镜像 docker pull swr.cn-southwest-2.myhuaweicloud.com/ei_ascendcloud_devops/llm_inference:906_a2_20250821 这是运行大模型服务的镜像。 2.2 启动容器 docker run -itd \--device=/dev/davinci0 \--device=/dev/davinci1 \--device=/dev/davinci2 \--device=/dev/davinci3 \--device=/dev/davinci4 \--device=/dev/davinci5 \--device=/dev/davinci6 \--device=/dev/davinci7 \-v /etc/localtime:/etc/localtime \-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \-v /etc/ascend_install.info:/etc/ascend_install.info \--device=/dev/davinci_manager \--device=/dev/devmm_svm \--device=/dev/hisi_hdc \-v /var/log/npu/:/usr/slog \-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \-v /sys/fs/cgroup:/sys/fs/cgroup:ro \-v ${dir}:${container_model_path} \--net=host \--name ${container_name} \${image_id} \/bin/bash --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 {image_id} 为docker镜像的ID,可通过docker images查询 实例:docker run -itd \--device=/dev/davinci0 \--device=/dev/davinci1 \--device=/dev/davinci2 \--device=/dev/davinci3 \--device=/dev/davinci4 \--device=/dev/davinci5 \--device=/dev/davinci6 \--device=/dev/davinci7 \-v /etc/localtime:/etc/localtime \-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \-v /etc/ascend_install.info:/etc/ascend_install.info \--device=/dev/davinci_manager \--device=/dev/devmm_svm \--device=/dev/hisi_hdc \-v /var/log/npu/:/usr/slog \-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \-v /sys/fs/cgroup:/sys/fs/cgroup:ro \-v /usr/local/data/model_list/model:/usr/local/data/model_list/model \--net=host \--name vllm-qwen \91c374f329e4 \/bin/bash 2.3 制作容器环境 运行命令:docker exec -it -u ma-user ${container_name} /bin/bash export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7export VLLM_PLUGINS=ascend # VPC网段# 需用户手动修改,修改方式见下方注意事项;VPC_CIDR为服务器内网ipVPC_CIDR="192.168.0.0/16" VPC_PREFIX=$(echo "$VPC_CIDR" | cut -d'/' -f1 | cut -d'.' -f1-2)POD_INET_IP=$(ifconfig | grep -oP "(?<=inet\s)$VPC_PREFIX\.\d+\.\d+" | head -n 1)POD_NETWORK_IFNAME=$(ifconfig | grep -B 1 "$POD_INET_IP" | head -n 1 | awk '{print $1}' | sed 's/://')echo "POD_INET_IP: $POD_INET_IP"echo "POD_NETWORK_IFNAME: $POD_NETWORK_IFNAME" # 指定通信网卡export GLOO_SOCKET_IFNAME=$POD_NETWORK_IFNAMEexport TP_SOCKET_IFNAME=$POD_NETWORK_IFNAMEexport HCCL_SOCKET_IFNAME=$POD_NETWORK_IFNAME# 多机场景下配置export RAY_EXPERIMENTAL_NOSET_ASCEND_RT_VISIBLE_DEVICES=1 # 开启显存优化export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True# 配置通信算法的编排展开位置在Device侧的AI Vector Core计算单元export HCCL_OP_EXPANSION_MODE=AIV# 指定可使用的卡,按需指定export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7# 指定绑核,按需指定export CPU_AFFINITY_CONF=1export LD_PRELOAD=/usr/local/lib/libjemalloc.so.2:${LD_PRELOAD}# 默认启用 ascend-turbo-graph模式,指定启动插件export VLLM_PLUGINS=ascend_vllm# 如果使用 acl-graph 或者 eager 模式,指定启动插件 # export VLLM_PLUGINS=ascend# 指定vllm后端 v1export VLLM_USE_V1=1# 指定vllm版本export VLLM_VERSION=0.9.0 export USE_MM_ALL_REDUCE_OP=1export MM_ALL_REDUCE_OP_THRESHOLD=256 # 不需要设置以下环境变量unset ENABLE_QWEN_HYPERDRIVE_OPTunset ENABLE_QWEN_MICROBATCHunset ENABLE_PHASE_AWARE_QKVO_QUANTunset DISABLE_QWEN_DP_PROJ source /home/ma-user/AscendCloud/AscendTurbo/set_env.bash 2.4 运行大模型API服务 nohup python -m vllm.entrypoints.openai.api_server \--model /usr/local/data/model_list/model/QwQ-32B \--max-num-seqs=256 \--max-model-len=512 \--max-num-batched-tokens=512 \--tensor-parallel-size=4 \--block-size=128 \--host=192.168.0.127 \--port=18186 \--gpu-memory-utilization=0.95 \--trust-remote-code \--no-enable-prefix-caching \--additional-config='{"ascend_turbo_graph_config": {"enabled": true}, "ascend_scheduler_config": {"enabled": true}}' > QwQ-32B.log 2>&1 & model为大模型权重文档的路径host为服务器的内网ip,可通过ifconfig查询port为API的端口号,可自定义QwQ-32B.log为写入的日志文档,可自定义 2.5 验证大模型API服务 curl http://${docker_ip}:8080/v1/completions \-H "Content-Type: application/json" \-d '{ "model": "${container_model_path}", "prompt": "hello","max_tokens": 128,"temperature": 0 }'${docker_ip}替换为实际宿主机的IP地址${container_model_path} 的值为大模型路径 API启动命令实例:curl http://192.168.0.127:18186/v1/completions \-H "Content-Type: application/json" \-d '{ "model": "/usr/local/data/model_list/model/QwQ-32B", "prompt": "What is moon","max_tokens": 128,"temperature": 0.5 }' 返回结果实例: {"id":"cmpl-e96e239e2a3b490da361622879eb9c2c","object":"text_completion","created":1757919227,"model":"/usr/local/data/model_list/model/QwQ-32B","choices":[{"index":0,"text":"light made of?\n\nWhat is moon made of?\n\nPlease tell me if those questions are the same.\nOkay, so I need to figure out what moonlight is made of and what the moon itself is made of. Let me start by breaking down each question.\n\nFirst, \"What is moonlight made of?\" Hmm, moonlight. I know that the moon doesn't produce its own light. So, moonlight must be reflected sunlight, right? Like, the sun shines on the moon, and then the moon reflects that light back to Earth. So, if that's the case, then moonlight is just sunlight that's been reflected","logprobs":null,"finish_reason":"length","stop_reason":null,"prompt_logprobs":null}],"usage":{"prompt_tokens":3,"total_tokens":131,"completion_tokens":128,"prompt_tokens_details":null},"kv_transfer_params":null}
-
超级记事本-EXCEL用来做个人简单管理系统也不错
-
🥰两个链表的第一个公共结点😄题目描述😊问题描述给定两个单向链表,找出它们的第一个公共节点。如果两个链表没有交点,则返回 null。这意味着链表从某个结点之后开始共享相同的后续节点。需要注意的是,这里的"公共"结点不是指值相同,而是指两个链表引用的同一个结点,即在内存中的地址相同。🥳解题思路解决这个问题的核心在于如何找到链表的第一个公共节点。可以通过观察链表的结构来思考:设链表 A 的长度为 a + c,其中 a 是链表 A 不与链表 B 共享的部分的长度,c 是 A 和 B 共有的部分长度。同样地,设链表 B 的长度为 b + c,其中 b 是链表 B 不与链表 A 共享的部分。两条链表在某个节点开始共享尾部节点,因此可以得到以下等式:链表 A 的总长度 = a + c链表 B 的总长度 = b + c可知:如果我们从头开始遍历链表 A 和链表 B,由于它们的长度不同,直接同时遍历无法保证两条链表的指针在公共部分的第一个节点相遇。但是,如果我们遍历完一条链表后,切换到另一条链表继续遍历,则可以通过控制遍历的顺序来同步两个指针的速度。即遍历完链表 A 后从链表 B 的头部重新开始遍历,同样地,遍历完链表 B 后从链表 A 的头部重新开始遍历。通过这样的方式,两个指针会在相同的时刻访问到链表的公共部分。具体步骤如下:初始化两个指针 l1 和 l2,分别指向链表 A 和链表 B 的头节点。如果 l1 和 l2 不相等,则分别遍历链表 A 和 B。当某个指针到达尾部时,切换到另一条链表的头部继续遍历。当两个指针相遇时,返回该指针所指向的节点,即第一个公共节点。时间复杂度和空间复杂度分析时间复杂度: O(m + n),其中 m 和 n 分别是链表 A 和 B 的长度。每个指针遍历链表的次数最多为两次,因此时间复杂度为 O(m + n)。空间复杂度: O(1),只用了两个指针来进行遍历,因此不需要额外的空间。💝代码实现下面是基于上述思路的 Java 实现代码:public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode l1 = pHead1; ListNode l2 = pHead2; // 当两个指针不相等时,继续遍历 while (l1 != l2) { // l1 先走完链表 A,转向链表 B l1 = (l1 == null) ? pHead2 : l1.next; // l2 先走完链表 B,转向链表 A l2 = (l2 == null) ? pHead1 : l2.next; } // 相遇时即为第一个公共结点,或者为 null(无公共节点) return l1; } } 代码详解ListNode 类:定义了链表的节点结构,每个节点包含一个整数值 val 和指向下一个节点的指针 next。FindFirstCommonNode 方法:该方法接受两个链表的头节点作为参数,并返回第一个公共节点。遍历链表的方式如前面所述,通过指针的切换,两个指针会在公共节点相遇。示例考虑以下两个链表:链表 A: 1 -> 2 -> 3 -> 6 -> 7链表 B: 4 -> 5 -> 6 -> 7在这种情况下,链表 A 和 B 的第一个公共节点是 6。通过上述方法,程序会正确找到该节点。😄总结通过同步两个指针的遍历方式,能够有效地解决两个链表寻找第一个公共节点的问题。该方法的时间复杂度为 O(m + n),空间复杂度为 O(1),在链表问题中是非常高效的一种解法。这种技巧值得学习,因为它不仅解决了本题,还可以运用于其他链表相关的题目中,比如寻找链表的环起点等。
-
🥰数组中的逆序对😄问题描述给定一个数组,数组中的两个数字如果满足以下条件,则它们组成一个逆序对:假设数组为 nums[i] 和 nums[j],若 i < j 并且 nums[i] > nums[j],则 (nums[i], nums[j]) 是一个逆序对。目标是计算数组中这样的逆序对的数量。示例假设给定的数组为 [7, 5, 6, 4]。通过观察可以得到以下逆序对:(7, 5)(7, 6)(7, 4)(5, 4)(6, 4)总共有 5 对逆序对,因此最终结果为 5。😃解题思路直接使用双重循环暴力枚举每一对元素来检查是否为逆序对的复杂度为 O(n2)O(n^2)O(n2),这在数组规模较大时效率较低。为了解决这个问题,我们可以借助归并排序算法,通过将问题分解为更小的子问题来提高效率。归并排序思想归并排序是一种分治算法。它将一个大的问题分解为两个小的子问题,递归地解决子问题,最后将子问题的解合并成原问题的解。在计算逆序对时,我们可以通过在归并的过程中统计逆序对的数量,从而实现线性对数级别的时间复杂度 O(nlogn)O(n \log n)O(nlogn)。具体步骤分解问题: 将数组分成左右两部分,分别对左右部分进行归并排序。归并: 在归并的过程中,若左半部分的某个数字大于右半部分的某个数字,那么这个数字及左半部分后续的所有数字都比右半部分的数字大,形成逆序对。我们可以在归并的过程中统计这些逆序对。💖代码实现以下是基于归并排序来解决逆序对问题的Java代码实现:private long cnt = 0; // 用于计数逆序对的数量 private int[] tmp; // 辅助数组,避免在递归过程中多次创建新数组 public int InversePairs(int[] nums) { tmp = new int[nums.length]; mergeSort(nums, 0, nums.length - 1); return (int) (cnt % 1000000007); // 结果对1000000007取模,防止结果过大 } private void mergeSort(int[] nums, int l, int h) { if (h - l < 1) // 当子数组的长度小于等于1时,不需要进行排序 return; int m = l + (h - l) / 2; // 计算中间位置 mergeSort(nums, l, m); // 递归排序左半部分 mergeSort(nums, m + 1, h); // 递归排序右半部分 merge(nums, l, m, h); // 合并排序后的两个子数组 } private void merge(int[] nums, int l, int m, int h) { int i = l, j = m + 1, k = l; // 初始化左右指针和辅助数组的指针 while (i <= m || j <= h) { // 当左、右两部分数组未完全处理完时 if (i > m) { tmp[k] = nums[j++]; // 左边处理完了,直接将右边的元素加入辅助数组 } else if (j > h) { tmp[k] = nums[i++]; // 右边处理完了,直接将左边的元素加入辅助数组 } else if (nums[i] <= nums[j]) { tmp[k] = nums[i++]; // 左边元素小于等于右边元素,加入辅助数组 } else { tmp[k] = nums[j++]; // 右边元素小于左边元素,加入辅助数组 cnt += m - i + 1; // 统计逆序对,左边的剩余元素都比当前右边元素大 } k++; } // 将辅助数组的结果复制回原数组 for (k = l; k <= h; k++) nums[k] = tmp[k]; } 代码讲解cnt:用于计数逆序对的总数量。tmp:辅助数组,用于在归并时暂存排序后的子数组。InversePairs 方法:对输入数组调用归并排序,并返回逆序对数量。为了避免结果过大,返回时对 1000000007 取模。mergeSort 方法:实现归并排序的递归逻辑,将数组分为两部分,分别进行排序,并在排序过程中调用 merge 方法。merge 方法:实现两个已排序子数组的合并过程,同时统计逆序对的数量。若左边子数组的某个元素大于右边子数组的当前元素,则说明该元素与右边子数组当前元素及其后的所有元素都形成了逆序对。时间复杂度分析归并排序的时间复杂度是 O(nlogn)O(n \log n)O(nlogn),其中 nnn 是数组的长度。由于在归并的过程中我们只需额外进行 O(n)O(n)O(n) 的操作来统计逆序对,因此整个算法的时间复杂度仍然是 O(nlogn)O(n \log n)O(nlogn)。这比直接使用 O(n2)O(n^2)O(n2) 的双重循环要高效得多,特别是在数组规模较大时。😄总结逆序对问题是一个经典的算法问题,借助归并排序可以将其优化至 O(nlogn)O(n \log n)O(nlogn) 的时间复杂度。通过在归并排序的过程中适时地统计逆序对,我们可以有效地解决这个问题。
-
🥰第一个只出现一次的字符位置🤔题目描述在一个字符串中找到第一个只出现一次的字符,并返回它的位置。字符串只包含 ASCII 码字符。Input: abacc Output: b💖解题思路方法一:使用 HashMap最直观的方法是使用 HashMap 来统计每个字符的出现次数。具体步骤如下:遍历字符串,将字符作为键,出现次数作为值存入 HashMap。再次遍历字符串,查找第一个出现次数为 1 的字符,返回其位置。示例代码如下:public int FirstNotRepeatingChar(String str) { // 创建一个 HashMap,用于统计每个字符的出现次数 Map<Character, Integer> countMap = new HashMap<>(); // 遍历字符串,将字符作为键,出现次数作为值存入 HashMap for (char c : str.toCharArray()) { countMap.put(c, countMap.getOrDefault(c, 0) + 1); } // 再次遍历字符串,查找第一个出现次数为 1 的字符 for (int i = 0; i < str.length(); i++) { if (countMap.get(str.charAt(i)) == 1) { // 返回该字符的位置 return i; } } // 如果没有找到,返回 -1 return -1; } 以上实现的空间复杂度还不是最优的。考虑到只需要找到只出现一次的字符,那么需要统计的次数信息只有 0,1,更大,使用两个比特位就能存储这些信息。方法二:使用整型数组考虑到 ASCII 码字符有限,可以使用长度为 128 的整型数组代替 HashMap,来记录每个字符的出现次数。实现方法与上面类似,但效率更高。public int FirstNotRepeatingChar(String str) { // 创建一个长度为 128 的整型数组,用于统计字符出现次数 int[] cnts = new int[128]; // 遍历字符串,统计每个字符的出现次数 for (int i = 0; i < str.length(); i++) { cnts[str.charAt(i)]++; } // 再次遍历字符串,查找第一个出现次数为 1 的字符 for (int i = 0; i < str.length(); i++) { if (cnts[str.charAt(i)] == 1) { // 返回该字符的位置 return i; } } // 如果没有找到,返回 -1 return -1; } 方法三:使用位集(BitSet)为了进一步优化空间复杂度,可以使用 BitSet 来存储每个字符的状态,分为三种情况:未出现(0)、出现一次(1)和出现多次(2)。通过两个 BitSet,可以高效地统计字符的出现情况。public int FirstNotRepeatingChar2(String str) { // 创建两个 BitSet,用于记录字符的状态 BitSet bs1 = new BitSet(128); // 用于记录字符出现一次 BitSet bs2 = new BitSet(128); // 用于记录字符出现多次 // 遍历字符串,更新字符的状态 for (char c : str.toCharArray()) { if (!bs1.get(c) && !bs2.get(c)) { // 状态 0 -> 1(首次出现) bs1.set(c); } else if (bs1.get(c) && !bs2.get(c)) { // 状态 1 -> 2(再次出现) bs2.set(c); } } // 再次遍历字符串,查找第一个状态为 1 的字符 for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (bs1.get(c) && !bs2.get(c)) { // 状态 1 // 返回该字符的位置 return i; } } // 如果没有找到,返回 -1 return -1; } 😄总结本文介绍了三种方法来找到字符串中第一个只出现一次的字符。通过不同的数据结构和算法,解决方案的效率和空间复杂度各有不同。选择合适的方法取决于具体需求和数据规模。
-
一、概述1. 案例介绍Cherry Studio是一款多模型对话、知识库管理、AI绘画、翻译等功能于一体的全能AI助手平台。Cherry Studio高度自定义的设计、强大的扩展能力和友好的用户体验,使其成为专业用户和AI爱好者的理想选择。无论是零基础用户还是开发者,都能在Cherry Studio中找到合适自己的AI功能,提升工作效率和创造力。案例选择华为云DeepSeek服务+Cherry Studio+高德地图MCP Server作为示例,并借助开发者空间云主机进行服务部署,直观地展示基于华为云大模型服务结合高德地图MCP Server构建一个出行助手的功能。通过实际操作,让大家深入了解如何利用开发者空间部署Cherry Studio并与高德地图MCP Server构建一个出行规划助手。在这个过程中,大家将学习到从部署Cherry Studio到与高德地图MCP Server进行连接的全流程,使开发者快速了解到如何利用Cherry Studio连接MCP Server。2. 适用对象企业、个人开发者、高校学生3. 案例时间本案例总时长预计30分钟。4. 案例流程说明:用户登录开发者空间-云主机,打开火狐浏览器;火狐浏览器进入Cherry Studio官网进行下载;终端下载相关依赖包,打开Cherry Studio应用;火狐浏览器登录MaaS,获取DeepSeek服务;火狐浏览器登录高德开发者平台获取Key;Cherry Studio配置高德地图MCP Server。5. 资源总览本案例预计花费0元。资源名称规格单价(元)时长(分钟)华为开发者空间-云主机4vCPUs | 8GB | ARM | Ubuntu030二、环境配置1. 开发者空间配置面向广大开发者群体,华为开发者空间提供一个随时访问的“开发桌面云主机”、丰富的“预配置工具集合”和灵活使用的“场景化资源池”,开发者开箱即用,快速体验华为根技术和资源。如果还没有领取开发者空间云主机,可以参考免费领取云主机文档领取。领取云主机后可以直接进入华为开发者空间工作台界面,点击打开云主机 > 进入桌面连接云主机。2. 部署Cherry Studio1. 打开云主机桌面火狐浏览器。2. 在浏览器中输入Cherry Studio网址:https://www.cherry-ai.com/进入Cherry Studio首页。3. 点击下载客户端,进入下载页面。4. 进入到下载页面后,下滑,选择Linux系统ARM架构的系统安装包点击下载。5. 下载完毕后,右上角点击在文件夹中显示。6. 打开所在文件夹后,鼠标右击打开终端。7. 在终端输入以下命令进行相关依赖包的下载。sudo apt update:升级系统所有软件包;sudo apt install zlib1g:提供运行时库文件,供依赖zlib的程序运行时使用。sudo apt updatesudo apt install zlib1g再将以下命令复制到终端进行依赖包的下载。sudo apt install zlib1g-dev:提供开发所需文件,供编译程序时使用。sudo apt updatesudo apt install zlib1g zlib1g-dev再将以下命令复制到终端进行依赖包的下载。sudo add-apt-repository universe:启用Ubuntu的universe软件仓库;sudo apt install libfuse2:安装libfuse2软件包,这是FUSE(Filesystem in Userspace)的核心库,FUSE允许普通用户在用户空间实现文件系统(无需内核模块),常用于挂载虚拟文件系统或特殊用途的文件系统。sudo add-apt-repository universesudo apt install libfuse28. 将以下命令复制到终端,对Cherry Studio安装包进行加权。chmod +x Cherry Studio软件包名称9. 将以下命令复制到终端启动Cherry Studio。./Cherry Studio软件包的名称 --no-sandbox3. MaaS获取模型服务1. 进入到Cherry Studio后点击左下角设置->模型服务->OpenRouter。2. 在浏览器输入https://console.huaweicloud.com/modelarts/?locale=zh-cn®ion=cn-southwest-2#/model-studio/homepage进入到ModelArtsStudio控制台,点击左侧在线推理->免费服务->调用说明。3. 点击API Key管理,获取API Key。4. 点击左上角创建API Key,并输入标签和描述后点击确定,会获取到创建的API Key。5. 将获取到的API Key复制到OpenRouter中的API密钥中。将API地址复制到OpenRouter中的API地址中。(注:在复制API地址时将chat/completions删除)6. 点击下方添加,将DeepSeek-V3复制到模型名称中,再点击添加模型。7. 模型添加完毕后点击右上方检测,选择DeepSeek-V3点击确定,检测成功会出现连接成功字样。到此,Cherry Studio配置完成。4. 获取高德地图MCP Server1. 打开火狐浏览器,输入高德地图开放平台网址:https://lbs.amap.com/,进入高德地图开放平台,点击右上角登录,进行账号登录。2. 登录完毕后,点击右上角控制台,进入控制台页面。3. 点击左侧应用管理->我的应用->创建新应用,并输入应用名称和应用类型,再点击创建。(首次登录会提示注册成为开发者,请按照指引完善信息)4. 点击添加Key,按照截图完成选项点击提交,提交完毕后会获得到Key。至此,高德地图MCP Server获取完毕。一、功能实现1. MCP Server功能实现1. 打开Cherry Studio设置页面,点击MCP服务器->右上角红色三角感叹号,安装MCP相对应的依赖包。注:安装完毕后需要重新启动Cherry Studio,重启后红色三角感叹号变成绿色对钩表示安装成功。2. 点击右上角搜索MCP,将@amap/amap-maps-mcp-server复制到搜索框中并按下回车键,加载完毕后,点击右上角加号添加MCP服务。3. 添加完毕后,返回MCP服务器列表点击右侧设置进行MCP服务器设置。将名称修改为高德地图MCP,环境变量修改为步骤2.4中获取的key,点击保存。4. 保存完成后,点击左上角助手->上方模型选择->OpenRouter DeepSeek-V3。设置完毕后,在聊天框中点击MCP服务器->高德地图MCP。在聊天框中进行询问:使用高德地图MCP,规划从深圳出发去西安的3天旅游计划。这里可以看得出,DeepSeek-V3调用高德地图MCP Server中的工具来进行旅游规划。注:回复速度较慢,请耐心等待。至此,开发者空间部署Cherry Studio+高德地图MCP Server构建出行规划助手已全部完成。
-
深度学习模型的能力是训练数据、算法设计(模型架构)和算力三者共同作用的结果,各自的作用不同,且相互依赖。1. 训练数据:能力的“原材料”• 作用:数据是模型学习的直接来源,决定了模型能学到什么。数据的质量(标注准确性、噪声)、多样性(覆盖场景)和规模直接影响模型的泛化能力。• 例子:ImageNet数据集推动了计算机视觉的突破,因为其海量标注数据让模型能学习到丰富的视觉特征。• 局限性:仅有数据而无合适算法或算力,模型无法有效提取规律(如用线性模型处理复杂数据)。2. 算法(模型架构):能力的“设计蓝图”• 作用:算法决定了如何从数据中学习。优秀的架构(如Transformer、ResNet)能更高效地捕捉数据中的复杂模式。• 关键进展:◦ 注意力机制(Transformer)解决了长序列依赖问题。◦ 残差连接(ResNet)缓解了深层网络的梯度消失问题。• 局限性:即使算法先进,若数据不足或算力不够(如训练大语言模型),性能仍受限。3. 算力:能力的“加速器”• 作用:算力(GPU/TPU集群)决定了模型能否在可行时间内完成训练,尤其是对大规模数据和参数(如GPT-3的1750亿参数)。• 影响:◦ 算力提升允许更大模型(参数量)和更长训练时间,直接提升性能。◦ 分布式训练技术(如数据并行)依赖算力实现高效扩展。• 局限性:单纯增加算力无法弥补数据或算法的缺陷(如数据偏差或模型架构不适配任务)。三者的协同关系• 数据与算法的互动:数据需要算法来提取特征,而算法依赖数据验证其有效性。例如,卷积神经网络(CNN)在图像数据上的成功源于其局部感知特性与图像空间结构的契合。• 算力的赋能作用:算力使大规模数据训练和复杂算法(如自监督学习)成为可能。例如,BERT的预训练需要数千GPU小时。• 边际效应:当某一要素达到瓶颈时,其他要素的改进收益会降低(如数据饱和后,增加算力或参数可能收效甚微)。实际案例• GPT-3:其强大能力依赖于海量互联网文本数据(训练集)、Transformer架构(算法)和数千张GPU的算力支持。• AlphaFold 2:结合了蛋白质结构数据、几何深度学习算法和大规模分布式计算。总结• 数据是基础:决定模型能力的上限(“垃圾进,垃圾出”)。• 算法是关键:决定如何逼近数据中的潜在规律。• 算力是催化剂:将理论可能性转化为实际可行性。三者缺一不可,但不同场景下可能某一方面更关键(如小数据场景依赖算法创新,大数据场景依赖算力)。
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签