【三维重建】Semantic Gaussians:开放词汇的3DGS场景理解

在这里插入图片描述


文章目录

  • 摘要
  • 一、引言
  • 二、主要方法
    • 1.3D Gaussian Splatting
    • 2.其他方法
      • 2.1 Gaussian Grouping(ECCV 2024)
      • 2.2 GARField
    • 3. 2D Versatile 投影
    • 4. 3D Semantic Network
    • 4. 推理
  • 四、实验
    • 1. 实验设置
    • 2.定量结果

论文:https://arxiv.org/pdf/2403.15624
来源:BIGAI和清华大学


摘要

  开放词汇的三维场景理解是计算机视觉中的一个重大挑战,在具体化代理和增强现实系统中有着广泛的应用。现有的方法采用神经渲染方法作为三维表示,联合优化颜色和语义特征,同时实现渲染和场景理解。本文介绍了一种基于三维高斯溅射的开放词汇场景理解方法语义高斯。我们的关键思想是 将知识从二维预训练模型提取为三维高斯模型 。与现有的方法不同,我们设计了一种通用的投影方法,将预先训练好的图像编码器映射到一个新的三维高斯的语义component ,这是基于空间关系,不需要额外的训练。我们 进一步建立了一个三维语义网络,直接从原始的三维高斯数据中预测语义成分 ,以进行快速推理。 实验在ScanNet segmentation和LERF目标定位上做了定量对比。此外还探索了语义高斯算法的一些应用,包括对象部分分割、实例分割、场景编辑和时空分割,在二维和三维基线上具有更好的定性结果

  

  


一、引言

  开放词汇表的三维场景理解是计算机视觉中的一项重要任务。给定一个3D场景,其目标是用自由形式的自然语言来理解和解释3D场景,也就是说,而不受限于一组预定义的对象类别。允许开放词汇表场景查询使机器能够更有效地与环境交互,促进诸如对象识别、语义场景重建和在复杂多样的环境中导航等任务。开放词汇3D场景理解在各种现实应用中具有重要意义,如机器人技术和增强现实。

  多视图图像是3D场景最直接的表示,但允许开放词汇理解通常涉及2D视觉语言模型,难以在不同视图的一致性,可能是由于缺乏视觉几何知识;点云很流行和研究,但点云固有的稀疏性限制了开放词汇场景理解在上的应用

  以往方法[4]、[5]、[8]-[16]的一个主要分支是采用NeRF或3DGS等神经渲染方法作为3D表示,共同优化颜色成分和语义特征,实现任意2D视图的高质量渲染和3D场景理解。语义知识通常是从开放词汇表的二维基础模型中提取出来的,如CLIP 或LSeg ,它们在训练视图上预测的输出在优化过程中充当了弱监督

  本文提出Semantic Gaussians,基于三维高斯溅射的优点的开放词汇表三维场景理解的方法。核心思想是将预先训练好的二维编码器中提取成三维高斯,从而为每个高斯点分配一个语义分量。为了实现这一点,我们建立了二维像素和三维高斯点之间的对应关系,并提出了一个通用的投影框架来将二维像素的语义特征映射到每个三维高斯点上,可以利用任意预先训练过的2D模型,如OpenSeg 、CLIP 、VLPart 等,在2D RGB图像上生成像素级的语义特征,不需要额外训练来将语义组件注入到三维高斯模型中,允许有效的开放词汇表场景查询。

  除了投影,还引入了一个三维语义网络MinkowskiNet[21,一个三维稀疏卷积网络],它直接从原始三维高斯中预测开放词汇语义成分。网络以原始的RGB高斯数据作为输入,并由上述投影方法得到的高斯数据的语义成分进行监督。因此,我们可以简单地运行这个网络来获得语义组件,从而实现更快的推理。该网络利用几何属性来理解看不见的场景,提高了我们的方法超越二维投影的通用性和鲁棒性。需要注意的是,三维语义网络的预测可以与投影特征相结合,进一步提高高斯中语义组件的质量和开放词汇表场景理解性能。

  

二、主要方法

1.3D Gaussian Splatting

  本文采用三维3D Gaussian Splatting作为三维场景的表示,其以可区分的方式从任意视点渲染图像,从而有效地利用各种二维基础模型的知识。具体来说,我们通过使用3DGS从指定的视点渲染二维语义图像,来实现场景理解

  3DGS由一组可学习的三维高斯点组成,其中每个点都有一个三维坐标µ表示其位置,一个协方差矩阵Σ表示其形状,球面谐波参数c代表其颜色,一个不透明度值α代表其透明度。3DGS可以由多视图图像构建,并可以利用来自运动结构(SfM)点云[48]的信息进行初始化,从而获得更好的渲染质量和几何结构。

  3DGS使用基于点的 α α α混合来计算2维图像上的像素值。每个像素C的值通过沿射线的体积渲染给出:

在这里插入图片描述
将三维高斯分布投影到某个二维平面上,从相机的角度计算协方差矩阵 Σ ′ Σ' Σ的方法为(W是world-to-camera变换矩阵,J是投影变换的仿射近似的雅可比矩阵):

在这里插入图片描述

其中。如果我们跳过 Σ ′ Σ' Σ的第三行和列,我们可以得到二维方差矩阵。为了保证正半定性,将协方差矩阵Σ分解为旋转矩阵 R R R和缩放矩阵 S S S

在这里插入图片描述

  3DGS可以看作是一个具有附加特性的特殊点云,因此具有点云的一些特性。一个直观的思想是将基于空间关系的语义信息投射到相应的高斯点上,而不是通过可微栅格化和渲染 在渲染语义映射时,如果不考虑复杂的光照条件,只考虑几何位置的对应关系就足够了 。在此基础上,我们提出了语义高斯算法来实现多功能场景理解。

2.其他方法

2.1 Gaussian Grouping(ECCV 2024)

  保留了高斯模型的所有属性(如它们的数量、颜色、不透明度和大小),同时添加了新的身份编码参数(类似于颜色,是一个长度为16的可学习的、紧凑的向量,足以以计算效率区分场景中的不同对象/部分),并使用了一个训练有素的zero-shot tracker 来传播和关联mask。使得每个高斯分布被分配给其在3D场景中所表示的实例或东西

在这里插入图片描述
  二维ID损失。为了优化ID编码,将ID 向量以可微的方式渲染为二维图像。从原始GS中提取可微的三维高斯渲染器,并将渲染过程类似于gs中的颜色(SH系数)优化。  GS采用神经点的 α ′ α' α 渲染[18,19],进行深度]排序和混合N个与像素重叠的有序点,计算所有高斯分布对单个位置像素的影响。将2D特性 E i d E_{id} Eid作为输入,使用一个线性层 f f f,将特征维数恢复到K+1,然后取 s o f t m a x softmax softmax( f f f( E i d E_{id} Eid))进行ID分类(K是3D场景中的mask总数),采用标准的交叉熵损失 L 2 d L_{2d} L2d进行K+1类别分类。

在这里插入图片描述

  2.三维正则化损失。除了间接的二维监督,还引入无监督的三维正则化损失来约束ID编码 e i e_i ei的学习:利用三维空间一致性,通过最近的 k个三维高斯分布的ID编码与其特征距离拉近。这允许3D对象内部的三维高斯分布,或在基于点的渲染期间被严重遮挡(在几乎所有的训练视图中都不可见)得到更充分的监督。公式3的 F F F表示为与线性层(在计算二维身份损失时共享)相结合的softmax操作。用m个采样点将KL散度损失形式化为:

在这里插入图片描述

  

2.2 GARField

在这里插入图片描述
   GARField以pose图像为输入,生成一个分层的三维场景分组,以及一个标准的三维体积辐射场和一个有尺度条件的亲和场。首先用SAM得到输入图像的候选mask。接下来,通过输入的三维位置和欧式尺度,优化一个体积辐射场和亲和场,并输出一个特征向量。亲和度是通过比较点对的特征向量来获得的。优化后,生成的亲和字段可以用于分解场景,通过以粗到细的方式递归地聚类三维特征嵌入,或者用于分割用户指定的查询。整个管道如图3所示。
在这里插入图片描述

  Scale-Conditioned Affinity Field(尺度条件亲和场) 。在尺度分割条件下,同一点的冲突掩模在训练过程中不再相互对抗,而是在不同的亲和尺度下在同一场景中共存。  我们在三维点 x 和欧氏尺度 s 上定义了尺度条件亲和场 Fg(x,s)→Rd,类似于LERF [13]。输出特性被限制在一个单位超球体内,在一个尺度上两点之间的亲和性由 A(x1,x2,s)= −||Fg(x1,s)−Fg(x2,s)||2 定义。这些特征可以使用基于NeRF密度的相同渲染权重,以加权平均值进行体渲染,以获得每条射线的值。

  对比监督。根据DrLIM [9],采用margin-based contrastive 对比目标进行监督。损失又两部分组成:给定的尺度下,同一组中的特征接近,不同组中的特征分开。  具体来说,从同一训练图像中采样掩模 MA、MB 的两条射线rA、rB,以及相应的尺度 sA和sB。我们可以沿每条射线,以体渲染方式得到尺度条件的亲和特征 FA和FB。如果MA=MB,特性将通过L2距离拉在一起: Lpull= ||FA−FB||;反之,特性将被分开: Lpush = ReLU(m−||FA−FB||),其中m是下界距离或边界。这种损失只适用于从同一图像中采样的射线,因为在不同视点上的掩模没有对应关系。

  

  

  

  

3. 2D Versatile 投影

  通用的特征投影方法:从一个二维预训练的模型中提取RGB图像的像素级语义映射,并将其投影到一个场景的三维高斯分布中。

   1) 语义映射提取:我们的方法从某一场景的三维高斯G开始。由于三维高斯溅射的逼真渲染性能,Semantic Gaussians可以在没有二维GroundTruth图像的情况下运行。给定形状为 H × W H×W H×W的RGB图像 I I I,Semantic Gaussians 的目的是从任意的二维视觉语言模型 ϵ 2 D \epsilon^{2D} ϵ2D 中得到由 s ∈ R H × W × C s∈R^{H×W×C} sRH×W×C表示的像素级语义映射。获得每像素语义映射的最直接的途径是利用像素级分割模型,如OpenSeg。然而,利用其他编码器,例如VLPart [20]可以帮助处理对象的组件(part)的语义(OpenSeg没这个功能)。此外,不同类型模型的特征可以集成,产生更准确的结果

  2) 统一SAM与各种2D特征:适应各种2D预训练特征是重要的,因为它们可以是像素级分割网络(如OpenSeg ,LSeg )、实例级识别网络(如DINO,VLPart)或图像级分类网络(如CLIP)。此外,Semantic Gaussians 能够利用 SAM来为每个模型生成精细的分割映射。对于像素级模型,SAM可以细化分割边界。给定一个RGB图像 I I I,使用SAM中的 everything prompt 来生成 N N N个二进制掩码 M 1 , ⋅ ⋅ ⋅ , M N M_1,···,M_N M1⋅⋅⋅MN。我们计算每个mask M i M_i Mi的embedding的平均池化,并将其分配为该mask中所有像素的embedding: s [ M i ] = A v g P o o l ( s [ M i ] ) s[M_i] = AvgPool(s[M_i]) s[Mi]=AvgPool(s[Mi])

  对于实例级模型,与Ground-SAM类似,使用预训练模型的预测结果作为SAM的方框提示符。在得到二进制mask后,将该实例的CLIP embedding分配给实例区域内的所有像素。对于图像级模型,SAM可以作为一个预处理模块来获取区域建议。我们使用SAM中的“everything” prompt 来获得不同的建议区域。每个区域都被填充、裁剪和调整到224×224,并输入图像级模型以获得语义embedding,并分配给每个proposal区域内的所有像素。

  3) 2D-3D Projection and Fusion. 获取逐像素语义映射后,语义高斯映射将其投影为三维高斯映射,得到语义成分。对于语义映射s中的每个像素 u = ( u , v ) u =(u,v) u=(u,v),语义高斯函数试图寻找空间中是否存在相应的三维高斯点 p = ( x , y , z ) p =(x,y,z) p=(x,y,z)。针孔相机模型下,利用内参矩阵 K K K和world-to-camera矩阵 E E E 投影可以表示为 u ~ = K ⋅ E ⋅ p ~ \tilde{u}=K·E·\tilde{p} u~=KEp~ ,其中~为齐次坐标。在这个投影之后,每个像素u将对应于三维空间中的一束射线,执行3DGS的深度渲染,来将二维语义投影到三维空间中的表面点。在体渲染过程中,不透明度从近到远累积。因此,我们设置了一个不透明度阈值 α d α_d αd,来判断光线被物体遮挡。我们不需要来自数据集的地面真实深度

  二维像素和三维高斯点配对时,假设三维空间中的某个高斯点 p p p具有一组来自 K K K个不同观点的二维语义, 可以通过平均池化融合: s p 2 D = A v g P o o l ( s 1 , ⋅ ⋅ ⋅ , s K ) s^{2D}_p= AvgP ool(s_1,···,s_K) sp2D=AvgPool(s1⋅⋅⋅sK)

4. 3D Semantic Network

  为了从原始三维高斯中预测语义成分,构建一个三维语义网络 f 3 D f^{3D} f3D 来实现这一点:给定三维高斯 G G G,预测point-wise的语义分量 s 3 D s^{3D} s3D,并使用融合特性 s 2 D s^{2D} s2D 来监督三维模型。损失函数为余弦相似度损失:

在这里插入图片描述

  使用MinkowskiNet作为我们的三维模型的主干(一种为点云设计的三维稀疏卷积网络)。将透明度、颜色和协方差设置为三维模型的输入特征,输出为每个高斯点的语义嵌入 s 3 D s^{3D} s3D。3D模型通过处理三维几何信息而不是多个二维视图来识别场景,使结果更加一致,且推理速度比二维投影要快得多

  

4. 推理

  语言驱动的开放词汇场景理解。给定一个自由形式的语言查询,使用CLIP文本编码器将提示编码到文本嵌入 t t t。我们计算文本嵌入与每个三维高斯点的语义分量之间的余弦相似度,匹配的高斯值将被视为与查询的对应。以语义分割和部分分割为例,对N个语义类的标签分别编码为 t 1 、 ⋅ ⋅ ⋅ 、 t N t_1、···、t_N t1⋅⋅⋅tN。计算了这些文本嵌入和三维高斯矩阵的语义嵌入之间的余弦相似度:

在这里插入图片描述

选择 c n 2 D c^{2D}_n cn2D c n 3 D c^{3D}_n cn3D中较大的值作为类 t n t_n tn的余弦相似度。softmax函数后的相似度{ c 1 , ⋅ ⋅ ⋅ ⋅ , c n c_1,····,c_n c1⋅⋅⋅⋅cn}是每个类的置信度分数,将其splat到2D视图上,就能得到一个二维语义分割图

四、实验

1. 实验设置

  数据集ScanNet是一个室内场景的大规模分割基准,具有校准的RGBD轨迹、3D点云和语义label。我们对所有1201个场景训练3D RGB高斯训练。验证集评估12个场景的性能。为了与闭集方法进行比较,将ScanNet-20类映射到来自COCO数据集中的21个类。

  对于三维对象定位任务,选择LERF [5]数据集作为我们的基准。LERF数据集提供了几个包含长尾对象和多尺度语义的3D场景。该数据集由iPhone应用程序Polycam捕获,以获得多视图图像和SfM点。

  对于定性评估,选择MVImgNet [23]数据集作为我们的部分分割数据集,而CMU全景[52]数据集作为时空跟踪数据集。MVImgNet是一个多视图的单对象数据集,包含238类对象的相机参数和稀疏点云。CMU全景数据集是一个用于多人参与社会活动的大规模数据集。对于语言引导的编辑,我们在Mip-NeRF 360 [53]数据集中选择了一些场景来显示我们的性能

  实现细节:NVIDIA RTX 4090 GPU上训练,RGB高斯网络训练10000次迭代,对三维语义网络训练100个时代。在场景级语义分割实验中,我们应用LSeg生成二维投影的像素级开放词汇表语义特征。对于3D语义网络,我们使用闵可夫斯基网34A[21]作为骨干。对于3D对象定位任务,我们都使用了带有SAM和LSeg的CLIP作为我们的2D预训练模型。

  对于零部件分割和时空跟踪,使用VLPart作为投影模型。为了评估我们在四维高斯上的语义高斯,我们遵循动态三维高斯[24]的工作,得到了具有时间信息的动态高斯。

2.定量结果

  我们从LSeg中提取语义特征来进行二维投影和三维网络训练。因此,本节中的结果将显示我们的方法将从二维视觉语言模型中改进多少

表1显示了不同方法的性能。可以观察到,我们的语义高斯方法超过了mIoU和mAcc中所有的开放词汇表方法,并且非常接近于最先进的闭集方法的性能
在这里插入图片描述

虽然我们的3D网络的mIou和mAcc低于二维投影,但2D和3D集成将进一步提高我们的性能。我们推测,某些场景中的某些物体由于其质量较低,无法在所有视图中都被二维模型正确识别,而三维网络可以利用几何细节来识别它们

在这里插入图片描述

  图3显示,LERF和LangSplat的分割精度较低。这主要是因为它们利用多尺度的CLIP特征来理解场景,而CLIP特征很难在像素级上与场景精确对齐,这使得它们不适合生成像素级的语义分割地图。另一方面,PVLFF、Fetatre3DGS和语义高斯都采用LSeg来实现开放词汇表场景理解。作为一种基于nerf的方法,PVLFF的性能相对较差,而且渲染速度也较慢。特征3DGS和我们的方法产生了非常相似的性能,特征3DGS甚至在某些视图中实现了更精确的分割。但是,Festagre3DGS需要对每个场景的语义3DGS进行再训练,其效率和灵活性较低

  

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


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

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

相关文章

centos7的maven配置

首先进入conf配置文件夹下的setting.xml 要改两个地方 第一&#xff1a;设置镜像源 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>c…

思考:linux Vi Vim 编辑器的简明原理,与快速用法之《 7 字真言 》@ “鱼爱返 说 温泉哦“ (**)

Linux vi/vim | 菜鸟教程 https://zhuanlan.zhihu.com/p/602675406 Linux Vim编辑器的基本使用_vim文本编辑器-CSDN博客 思考 1. 记忆公式&#xff1a; 按键操作的 7 字真言 1&#xff1a; "鱼爱返 说 温泉哦" v i Esc : wq ! ----------- 一般的简单…

Web服务nginx基本实验

安装软件&#xff1a; 启动服务&#xff1a; 查看Nginx服务器的网络连接信息&#xff0c;监听的端口&#xff1a; 查看默认目录&#xff1a; 用Windows访问服务端192.168.234.111的nginx服务&#xff1a;&#xff08;防火墙没有放行nginx服务&#xff0c;访问不了&#xff09; …

Ubuntu实现双击图标运行自己的应用软件

我们知道在Ubuntu上编写程序&#xff0c;最后编译得到的是一个可执行文件&#xff0c;大致如下 然后要运行的时候在终端里输入./hello即可 但是这样的话感觉很丑很不方便&#xff0c;下边描述一种可以类似Windows上那种双击运行的实现方式。 我们知道Ubuntu是有一些自带的程序…

x-cmd pkg | onefetch - 轻松获取 Git 仓库统计信息,打造个性化输出!

目录 简介首次用户功能特点常见用法类似或相关的工具进一步阅读 简介 onefetch 是由 Ossama Hjaji 用 Rust 编写的命令行 Git 信息工具&#xff0c;可将本地 Git 存储库的项目信息和代码统计信息直接显示到您的终端。该工具完全离线 - 不需要网络访问。 首次用户 本文的 dem…

基于IM场景下的Wasm初探:提升Web应用性能|得物技术

一、何为Wasm &#xff1f; Wasm&#xff0c;全称 WebAssembly&#xff0c;官网描述是一种用于基于堆栈的虚拟机的二进制指令格式。Wasm被设计为一个可移植的目标&#xff0c;用于编译C/C/Rust等高级语言&#xff0c;支持在Web上部署客户端和服务器应用程序。 Wasm 的开发者参…

现场工程师日记-MSYS2迅速部署PostgreSQL主从备份数据库

文章目录 一、概要二、整体架构流程1. 安装 MSYS2 环境2. 安装postgresql 三、技术名词解释1.MSYS22.postgresql 四、技术细节1. 创建主数据库2.添加从数据库复制权限3. 按需修改参数&#xff08;1&#xff09;WAL保留空间&#xff08;2&#xff09;监听地址 4. 启动主服务器5.…

【CSS】标准怪异盒模型

概念 CSS 盒模型本质上是一个盒子&#xff0c;盒子包裹着HTML 元素&#xff0c;盒子由四个属性组成&#xff0c;从内到外分别是&#xff1a;content 内容、padding 内填充、border 边框、外边距 margin 盒模型的分类 W3C 盒子模型(标准盒模型) IE 盒子模型(怪异盒模型) 两种…

Android中桌面小部件framework层使用到的设计模式

在Android中&#xff0c;桌面小部件&#xff08;App Widget&#xff09;的Framework层采用了多种设计模式&#xff0c;以实现模块化、可维护性和高效的交互。 以下是Android桌面小部件Framework层中常用的设计模式及其具体应用&#xff1a; 1. 观察者模式&#xff08;Observe…

半波正弦信号的FFT变换

目录 Hello&#xff0c; 大家好&#xff0c;这一期我们谈谈半波正弦信号的FFT变化长什么样子。本文硬件使用GFARM02硬件模块[1]&#xff0c;文章最后有其淘宝链接。核心器件为STM32F103RCT6&#xff0c;为Cortex-M3核&#xff0c;采用的CMSIS版本为CMSIS_5-5.6.0。 如图1所示&…

基于SpringBoot和Vue的公司文档管理系统设计与开发(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Linux服务器或Linux计算机设置不记录历史命令

1.设置环境变量 打开命令终端&#xff0c;编辑.bashrc文件中&#xff0c;修改HISTSIZE和HISTFILESIZE都为0 sudo nano ~/.bashrcfor setting history length see HISTSIZE and HISTFILESIZE in bash(1) HISTSIZE0 HISTFILESIZE0 2.生效 source ~/.bashrc 3.验证 cat ./b…

接口测试用例设计的关键步骤与技巧解析!

简介 接口测试在需求分析完成之后&#xff0c;即可设计对应的接口测试用例&#xff0c;然后根据用例进行接口测试。接口测试用例的设计也需要用到黑盒测试用例设计方法&#xff0c;和测试流程与理论章节的功能测试用例设计的方法类似&#xff0c;设计过程中还需要增加与接口特…

【数据集】【YOLO】【目标检测】树木倒塌识别数据集 9957 张,YOLO道路树木断裂识别算法实战训练教程!

一、数据集介绍 【数据集】树木倒塌识别数据集 9957 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。 数据集中包含1种分类&#xff1a;{0: fallen_tree}&#xff0c;代表倒塌或者断裂的树木。 数据集来自国内外图片网站和视频截图&#xff1b; 可用于无人机树木…

[极客大挑战 2019]PHP 1

[极客大挑战 2019]PHP 1 审题 猜测备份在www.zip中&#xff0c;输入下载文件。 知识点 反序列化 解题 查看代码 看到index.php中包含了class.php,直接看class.php中的代码 查看条件 当usernameadmin&#xff0c;password100时输出flag 构造反序列化 输入select中&#…

网络层5——IPV6

目录 一、IPv6 vs IPv4 1、对IPv6主要变化 2、IPv4 vs IPv6 二、IPv6基本首部 1、版本——4位 2、通信量类——8位 3、流标号——20位 4、有效载荷长度——16位 5、下一个首部——8位 6、跳数限制——8位 7、源 、 目的地址——128位 8、扩展首部 三、IPv6地址 1…

第八篇: 通过使用Google BigQuery进行数据批量和自动化处理

使用Python进行Google BigQuery数据批量和自动化处理 在大数据分析的日常工作中&#xff0c;定期更新、查询和处理数据是一项必不可少的任务。Google BigQuery结合Python脚本&#xff0c;可大幅简化这一过程。本文将介绍如何通过Python自动查询和更新BigQuery中的降水量数据&a…

WPF+MVVM案例实战与特效(二十八)- 自定义WPF ComboBox样式:打造个性化下拉菜单

文章目录 1. 引言案例效果3. ComboBox 基础4. 自定义 ComboBox 样式4.1 定义 ComboBox 样式4.2 定义 ComboBoxItem 样式4.3 定义 ToggleButton 样式4.4 定义 Popup 样式5. 示例代码6. 结论1. 引言 在WPF应用程序中,ComboBox控件是一个常用的输入控件,用于从多个选项中选择一…

7.《双指针篇》---⑦三数之和(中等偏难)

题目传送门 方法一&#xff1a;双指针 1.新建一个顺序表用来返回结果。并排序数组。 2.for循环 i 从第一个数组元素遍历到倒数第三个数。 3.如果遍历过程中有值大于0的则break&#xff1b; 4.定义左右指针,以及target。int left i 1, right n - 1; int target -nums[i];…

k8s 处理namespace删除一直处于Terminating —— 筑梦之路

问题现象 k8s集群要清理某个名空间&#xff0c;把该名空间下的资源全部删除后&#xff0c;删除名空间&#xff0c;一直处于Terminating状态&#xff0c;无法完全清理掉。 如何处理 为什么要记录下这个处理的步骤&#xff0c;经过查询资料&#xff0c;网上也有各种各样的方法&…