基于投票策略的室内家具检测:VoteNet、BRNet 最全总结

news2024/10/5 13:36:31

文章目录

    • 一、基本概述
    • 二、VoteNet
    • 三、BRNet
    • 四、最新研究成果

一、基本概述

  最近几年,基于点云的3D目标检测是自动驾驶场景研究的热点。但是,自动驾驶主要聚焦于室外场景。本文,我们主要介绍两篇文章(VoteNet,BRNet),重点解决室内场景下,基于点云的3D家具检测。这两项工作目前均已开源,有兴趣的同学可以研究、学习,

论文链接:
  VoteNet :https://arxiv.org/abs/1904.09664v2
  BRNet :https://arxiv.org/pdf/2104.06114.pdf
开源工程:
  VoteNet:https://github.com/facebookresearch/votenet
  BRNet:https://github.com/cheng052/BRNet

二、VoteNet

  VoteNet 的论文翻译:VoteNet 中英文对照翻译。

  1. 提出背景

    目前,基于点云的3D目标检测算法受2D检测类算法影响较大。为了利用2D检测器的网络结构,常把3D点云转化为规律的网格(比如,体素网格,或者鸟瞰图像,或者多视角图像),或者基于2D图像的检测结果来得到3D预测边框。很少有工作直接在点云中检测目标。在本文工作中,我们回归第一性准则,直接建立基于点云的3D目标检测流程,并尽可能通用。

  2. 论文的贡献

    (1)首次将传统霍夫投票算法融入深度神经网络,提出端到端可微的神经网络,构建了一个通用的室内家具3D检测框架。
    (2)本篇论文是室内3D家具检测的开创性论文,开创了一个新的研究思路。
    (3)相较于之前的算法,VoteNet 在精度上提升巨大。
    (4)论文结构清晰,每一个结构细节阐述清晰,易于理解,代码可阅读质量高。

  3. 一些新的名词

    种子点:seed point,可以认为是点云的特征点,位于点云表面,是投票算法的基础特征,类似于图像中主干网络提取的特征。
    投票点:vote point,基于种子点,通过学习生成(是点云的子集),通常位于点云目标的点云中心位置,是虚拟的点。

  4. 传统霍夫投票的流程
    下图借鉴博客的图片:https://blog.csdn.net/weixin_39373480/article/details/103583523,该文章写的很不错,可以参考

    这里是引用
    离线训练:主要是为了建立【Code Book】,记录图像块与目标中心的偏移关系。
    Online的流程如下:
     (1)通过sift,surf等经典的特征提取算子得到一系列特征点。
     (2)在特征点的周围可以生成一系列的图像块。
     (3)借助训练好的【Code Book】,生成图像块相对于目标中心的偏移量(offset)。
     (4)通过聚合算法,就可以得到图像中目标的中心。
     (5)借助分类器或者回归器,得到目标的类别和边框。

  5. 论文是如何将传统的霍夫投票算法融入端到端的深度神经网络?

    Interest point:兴趣点也就是种子点,不是由手工设计的算子提取,而是由神经网络提取。
    vote point :投票点的生成也是由神经网络完成,而不是依赖于提前建立的密码本。借助较大的感受野,降低了投票点生成的随意性,同时更加高效。此外,一个投票点包含一个固定长度的特征向量表达,更加有利于特征的聚合。
    Vote Aggregation:投票点聚合也是由神经网络生成,利用投票点特征聚合,更加便于生成高质量的候选框。
    Object Proposal:根据聚合的投票特征,可以直接生成候选框的位置,维度,方向和语义类别信息,避免了需要回溯投票点的起源。

  6. 算法的整体框架

    在这里插入图片描述
    基本流程如下:
      (1) N × 3 N\times3 N×3:输入点云数量为N,仅仅包含(x,y,z)坐标,维度为3,表示3个通道。
      (2)BackBone:借助【PointNet++】提取点云的特征,得到M个特征点(seed point),以及 C C C维特征向量。
      (3)Voting Module:一系列【MLP】模块,生成投票点以及投票点特征,与种子点数量一致。
      (4)Vote clusters:将投票点进行均匀采样、分组(Sampling、Grouping),得到K个类簇( n 1 , n 2 , . . . , n K n_1,n_2,...,n_K n1,n2,...,nK)。
      (5)Proposal Module:根据重新聚合的特征,预测得到候选框( K × C o u t K\times C_{out} K×Cout)。
      (6)3D NMS:非极大值抑制,得到最终的3D Box( K ′ K' K)。
    BackBone 模块的结构
    在这里插入图片描述
    Voting Module
      共享的多层感知机网络(MLP,包含全连接层,ReLU层,BN层),将每个种子点独立转为投票点。输入的是种子点的特征向量,输出为欧式空间下的偏移量 Δ x i \Delta x_i Δxi Δ f i \Delta f_i Δfi,种子点加上偏移量就得到投票点。3D 偏移量 Δ x i \Delta x_i Δxi使用回归损失监督,具体如下:
    L v o t e − r e g = 1 M p o s ∑ i ∣ ∣ Δ x i − Δ x i ∗ ∣ ∣ i f [ s i ∈ o b j e c t ] (1) L_{vote-reg}=\frac{1}{M_{pos}}\sum_i||\Delta x_i-\Delta x_i^*||if[s_i \in object] \tag {1} Lvotereg=Mpos1i∣∣ΔxiΔxi∣∣if[siobject](1)
    其中, s i s_i si 需在目标的表面, M p o s M_{pos} Mpos是种子点在目标表面的数量, Δ x i ∗ \Delta x_i^* Δxi 是种子点到当前目标中心的距离。所以该模块是根据目标表面的种子点得到靠近目标中心的投票点,用于后续候选框的生成
    Proposal Module
      在执行该模块之前,需要对投票点进行采样(最远点采样的方式)、分组、聚类等操作,将投票点划分为K个点簇。给定一个投票点簇(a vote cluster) C = w i , i = 1 , 2 , 3 , . . . , n C={w_i},i=1,2,3,...,n C=wii=1,2,3,...,n,点簇中心为 w j w_j wj,其中每一个投票点记为 w i = [ z i ; h i ] w_i=[z_i;h_i] wi=[zi;hi] z i , h i z_i,h_i zi,hi分别为投票点的坐标和特征向量。为了提取局部的几何结构,将投票点坐标转换为局部坐标系下的值, z i ′ = ( z i − z j ) / r z_i'=(z_i-z_j)/r zi=(zizj)/r。那么,根据这个点簇预测的候选框表达如下,
    p ( C ) = M L P 2 { max ⁡ i = 1 , . . . , n M L P 1 ( [ z i ′ ; h i ] ) (2) p(C)=MLP_2\lbrace\max\limits_{i=1,...,n}{MLP_1([z_i';h_i])} \tag{2} p(C)=MLP2{i=1,...,nmaxMLP1([zi;hi])(2)
    其中,每一个投票点独立输入到 M L P 1 MLP_1 MLP1,然后经过 M L P 2 MLP_2 MLP2进行特征融合。特征向量 p p p 包含 objectness score,bounding box parameters(center,heading,size),以及 semantic classification scores.

  7. 网络的输入输出

    输入: N × 3 N\times3 N×3,N表示输入点云的数量,3表示每个点的位置坐标(x,y,z)。
    输出:Proposal Module 的输出为 5+ 2NH + 4NS +NC channels,
      5:前2个为分类个数,剩余3个表示中心的回归(relative to the vote cluster center);
      2NH:NH表示360度的方向被划分的数量,每一个划分(heading bin)预测一个分类分数,回归一个偏移量(relative to bin center)。
      4NS:4表示每一类尺寸预测【1】个分数和【3】个偏移量(scale regression offsets for height, width and length),NS表示 有多少种尺寸(size template),多少种家具也就对应多少种尺寸模板。
      NC:表示数据集分类数量。

  8. 损失函数

    损失函数包括三大部分:objectness loss,bounding box estimation loss,semantic classification losses,也是目标检测中常规的损失设计。objectness scores:以vote点距离真实框中心的距离(d)为标准,由该投票点(d<0.3)生成的 proposals 为正样本,(d>0.6)的投票点生成的proposals 为负样本,(0.3<d<0.6)是忽略样本,不参与惩罚。objectness的损失函数为交叉熵。对于正样本,进一步监督边框和类别的预测,并且将边框损失解耦为:中心回归(center regress),方向估计(heading estimation),尺寸估计(box size estimation),所有的回归损失使用 Huber Loss。
    具体公式表达如下:
    L v o t e N e t = L v o t e − r e g + λ 1 L o b j − c l s + λ 2 L b o x + λ 3 L s e m − c l s (3) L_{voteNet}=L_{vote-reg}+\lambda_1L_{obj-cls}+\lambda_2L_{box}+\lambda_3L_{sem-cls} \tag{3} LvoteNet=Lvotereg+λ1Lobjcls+λ2Lbox+λ3Lsemcls(3)
    其中, λ 1 = 0.5 , λ 2 = 1 , λ 3 = 0.1 \lambda_1=0.5,\lambda_2=1,\lambda_3=0.1 λ1=0.5,λ2=1,λ3=0.1
    objectness loss:交叉熵损失(cross-entropy),2个类别,有目标或者没有目标。
    semantic loss:交叉熵损失(cross-entropy),NC个类别(数据集待分类数量)。
    box loss:解耦为三大部分,公式如下,
    L b o x = L c e n t e r − r e g + 0.1 L a n g l e − c l s + L a n g l e − r e g + 0.1 L s i z e − c l s + L s i z e − r e g (4) L_{box}=L_{center-reg}+0.1L_{angle-cls}+L_{angle-reg}+0.1L_{size-cls}+L_{size-reg}\tag{4} Lbox=Lcenterreg+0.1Langlecls+Langlereg+0.1Lsizecls+Lsizereg(4)

  9. 实验评估

    量化结果如下图所示,
    在这里插入图片描述
    在这里插入图片描述
    运行速度如下图所示,
    在这里插入图片描述
    可视化效果如下图所示,
    在这里插入图片描述

三、BRNet

  该篇论文基于VoteNet的策略进行优化改进,效果更优。

  1. 提出背景?

    (1)作者认为 VoteNet 以及其它的变种论文生成的种子点、投票点包含很多外点(背景上的点,如下图b中标记的点)。这样噪声点没有位于目标的表面,严重偏离目标,进而对 Proposals 的生成影响较大。如下图所示,
    在这里插入图片描述
    (2)传统霍夫投票策略中的回溯策略(back-tracing)仅仅识别目标的边界信息,这对于局部视角的家具是很不可信的。
    (3)基于(1)(2)的问题,作者提出新的回溯策略(为了端到端训练,回溯策略在VoteNet是没有的)。

  2. 作者提出的解决方案是什么?

    (1)改进传统霍夫投票中的回溯策略,使其能够融合入神经网络进行端到端的训练。
    (2)受启发于传统霍夫投票算法中的 back-tracing 策略,本文提出新的网络:Back-tracing Representative Points Network(BRNet)。通过在投票中心(vote centers)周围生成新的表达点(representative point),并在其周围重新审核种子点(seed points)的合理性。更加准确的种子点,使得获取局部目标结构的特征更加可信。这种回溯策略,保证了预测的投票点中心和原始目标点云表面点的相互一致性。在该策略下,也就获得更加可信的预测结果。这个修正过程如下图所示,
    在这里插入图片描述

  3. 新的名词

    representative point:表达点,根据投票点生成的新的虚拟点,位于三维空间的【6】个方向,每个方向【2】个点,总共12个点。
    class-specfic:也称为class-aware,如果输入一张图片,网络会返回一系列 bounding boxes,每一个boxes都有具体的类别信息。简单说,就是当检测器完成时,除了得到bounding box,还可以直接知道是什么类别。
    class-agnostic:只回归2类bounding box,前景和背景,结合每个box在分类网络中的得分,得到最终的分类结果。这种方式会出现同一个前景目标有多个类别的框。检测器通常返回一系列 bounding box,这些box包含了所有类别的目标,但是不知道每个框是什么类别,此时还需要分类器辅助判别。

  4. 整体结构

    在这里插入图片描述
    基本流程如下:
     (1) N × 3 N\times 3 N×3:输入点云。
     (2)按照 VoteNet的方式生成 votes,并将votes分组为M个点簇。
     (3)对于每一个点簇,以学习的方式生成 K 个表达点(表示目标区域)。
     (4)根据K个表达点,修正种子点(seed point),然后将种子点和投票点特征融合。
     (5)基于上述融合特征,得到一系列候选框。
     (6)3D NMS 得到最终的3D Boxes。
    重要的网络模块:
     (1)Vote Generation & Clustering:相当于VoteNet的BackBone模块+Voting Module,生成种子点和投票点,最后对种子点进行分组,形成K个点簇。
     (2) Generating Back-traced Representative Points:基于votes,作者提出 RPG 模块,用于生成虚拟的表达点,它们应该均匀分布于目标区域;那么是如何生成呢?RPG 模块同时预测目标的潜在方向( θ i ∈ [ 0 , 2 π ] \theta_i\in[0,2\pi] θi[0,2π])和回归vote点簇中心到目标【6】个方向(前后,左右,上下)表面的偏移量 x i ∈ R 6 x_i\in R^6 xiR6,然后在每个方向的偏移量范围内均匀采样2个点,总共12个表达点。RPG模块的输入为 投票中心 v i v_i vi及其特征 f i f_i fi,输出为 { x i , θ i } \lbrace x_i,\theta_i \rbrace {xi,θi}。该模块的监督训练如下,
    L r e p − o f f = 1 M p o s ∑ i = 1 M ∣ ∣ x i − x i ∗ ∣ ∣ ρ ⋅ [ v i   i s   p o s i t i v e ] (1) L_{rep-off}=\frac{1}{M_{pos}}\sum_{i=1}^M||x_i-x_i^*||_\rho \cdot[v_i ~is~positive ]\tag{1} Lrepoff=Mpos1i=1M∣∣xixiρ[vi is positive](1)
    其中, v i   i s   p o s i t i v e v_i~is~positive vi is positive 表示投票中心是否在 GT 中心附近(小于0.3m), M o p s M_{ops} Mops 是正的投票中心, x ∗ x^* x 表示GT中心距离3D Box 6个面的距离。目标的方向也需要加入监督训练,方向的监督与VoteNet一致,方向的损失为 L r e p − a n g L_{rep-ang} Lrepang,因此,RPG模块的最终目标函数如下,
    L r e p = λ L r e p − o f f + L r e p − a n g (2) L_{rep}= \lambda L_{rep-off} + L_{rep-ang}\tag{2} Lrep=λLrepoff+Lrepang(2)
    其中, λ = 20 \lambda=20 λ=20.
     (3)Revisiting Seed Points:经过RPG模块的处理,得到了粗略的3D Box的中心以及大小,还需要结合种子点来得到更加可信的Proposals,进而生成更加准确的大小,位置和类别。那么如何修正种子点呢?Representative point 0.2m范围内的点是可信点,其它是外点,并使用PointNet-like的模块重新修正种子点的特征向量,最终将每一个表达点的特征向量进一步连接为128维的特征向量。到这里,就完成了种子点的修正。
     (4)Proposal Refinement and Classification:将修正的种子点特征和投票点中心的特征向量融合,修正proposals,同时进行类别预测。

  5. 损失函数

    整个模型的损失函数,具体公式如下,
    L = L v o t e − r e g + λ o b j − c l s L o b j − c l s + λ s e m − c l s L s e m − c l s + λ r e p L r e p + λ r e f i n e L r e f i n e (3) L=L_{vote-reg}+\lambda_{obj-cls}L_{obj-cls}+\lambda_{sem-cls}L_{sem-cls}+\lambda_{rep}L_{rep}+\lambda_{refine}L_{refine}\tag{3} L=Lvotereg+λobjclsLobjcls+λsemclsLsemcls+λrepLrep+λrefineLrefine(3)
    其中, L v o t e − r e g L_{vote-reg} Lvotereg:每个投票点的损失, L o b j − c l s L_{obj-cls} Lobjcls:objectness loss, L s e m − c l s L_{sem-cls} Lsemcls:语义类别损失, L r e p L_{rep} Lrep:表达点损失,L_{refine}:用于监督初始表达点到修正表达点的过程,公式如下,
    L r e f i n e = 1 M o p s ∑ i = 1 M ( λ ∣ ∣ x i + Δ x i − x i ∗ ∣ ∣ ρ ) + ∣ ∣ ( θ i + Δ θ i − θ i ∗ ) ∣ ∣ ρ ⋅ [ v i   i s   p o s i t i v e ] (4) L_{refine}=\frac{1}{M_{ops}}\sum_{i=1}^M(\lambda||x_i+\Delta x_i-x_i^*||_\rho)+||(\theta_i+\Delta\theta_i-\theta_i^*)||_\rho \cdot[v_i ~is~positive]\tag{4} Lrefine=Mops1i=1M(λ∣∣xi+Δxixiρ)+∣∣(θi+Δθiθi)ρ[vi is positive](4)
    其中, θ ∗ \theta^* θ表示GT Box的方向, L r e f i n e L_{refine} Lrefine仅仅在 positive vote clusters 上计算,权重分别为 λ o b j − c l s = 1 , λ s e m − c l s = 0.1 , λ r e p = 1 , λ r e f i n e = 1 , λ = 20 \lambda_{obj-cls}=1,\lambda_{sem-cls}=0.1,\lambda_{rep}=1,\lambda_{refine}=1,\lambda=20 λobjcls=1,λsemcls=0.1,λrep=1,λrefine=1,λ=20.

  6. 实验评估

    量化结果分析如下,
    在这里插入图片描述
    预测结果如下,
    在这里插入图片描述
    推理时间如下图,
    在这里插入图片描述

四、最新研究成果

  截止到2023.02.14,基于点云的室内3D家具检测的最新研究论文以及开源情况:3D Object Detection on SUN-RGBD val Indoor.

在这里插入图片描述

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

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

相关文章

HTML第一章总结

<h1~h6>标题标签 <br />换行标签&#xff08;单&#xff09; <p>分段标签 <strong>加粗标签 <em>倾斜标签 <del>删除线标签 <ins>下划线标签 <div>独占一行的布局标签 <span>进行分割的布局标签 <img>图片标签&a…

Go-micro[windows]安装以及踩坑

一.首先安装protochttps://github.com/protocolbuffers/protobuf/releases进入网址&#xff0c;点击tag&#xff0c;然后选择v3版本进入之后找到随后下载安装然后将protoc解压缩到任意目录&#xff08;自己选&#xff09;再将protoc/bin的路径放置环境变量中二.获取protoc-gen-…

RK3568 UBOOT的问题解决案例

一、UBOOT下的波特率 原始的波特率为1500000,串口工具虽然可以设置任意波特率&#xff0c;但工作时不正常。 输入不了。本文描述如何修改成115200。 二、确认UBOOT的配置 ./build.sh uboot processing option: uboot Start building uboot TARGET_UBOOT_CONFIGrk3568## make …

【C++】二叉树之力扣经典题目1——详解二叉树的递归遍历,二叉树的层次遍历

如有错误&#xff0c;欢迎指正。 如有不理解的地方&#xff0c;可以私信问我。 文章目录题目1&#xff1a;根据二叉树创建字符串题目实例思路与解析代码实现题目2&#xff1a;二叉树的层序遍历题目思路与解析代码实现题目1&#xff1a;根据二叉树创建字符串 点击进入题目链接—…

C++——多态|虚函数|重写|虚表

文章目录1. 多态的概念1.1 概念2. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3虚函数的重写虚函数重写的三个例外&#xff1a;2.4 普通调用和多态调用&#xff1a;2.5 C11 override 和 final2.6 重载、虚函数的覆盖(重写)、隐藏(重定义)的对比3. 抽象类(有关纯虚函数)3.1 …

互联网新时代要到来了(一)什么是Web3.0?

什么是Web3.0? tips&#xff1a;内容来自百度百科、知乎、搜狐新闻、李留白公众号、CSDN「Meta.Qing」博客等网页 什么是Web3.0?1.什么是Web3.0&#xff08;概念介绍&#xff09;&#xff1f;2.Web3.0简单理解3.Web3.0的技术特点4.Web3.0项目1.什么是Web3.0&#xff08;概念…

greenDao的使用文档

介绍&#xff1a;greenDAO 是一款轻量级的 Android ORM 框架&#xff0c;将 Java 对象映射到 SQLite 数据库中&#xff0c;我们操作数据库的时候&#xff0c;不在需要编写复杂的 SQL语句&#xff0c; 在性能方面&#xff0c;greenDAO 针对 Android 进行了高度优化&#xff0c; …

Ubuntu 20中安装snaphu

Ubuntu 20中安装snaphu0 前言1 snaphu安装步骤1.1 在控制台用命令行安装1.2 在官网下载安装包0 前言 snaphu是一个解缠软件。基于欧空局的SNAP snaphu的官网&#xff1a;https://web.stanford.edu/group/radar/softwareandlinks/sw/snaphu/ 1 snaphu安装步骤 大致有两种 在…

微软支持的ChatGPT激增,但不要低估苹果和谷歌

微软和 OpenAI 可能在 AI 聊天机器人爆炸式增长的市场中具有先发优势&#xff0c;但不要排除其他一些可以访问大量 AI 训练数据的科技巨头&#xff0c;例如 Apple 和 Google。 通过其对 ChatGPT 开发商 OpenAI 的早期和持续支持&#xff0c;微软在AI 军备竞赛中目前处于领先地…

鲸探玩家狂收往期数藏,2023年数藏二级市场的紧箍咒可能松动了?

图片来源&#xff1a;由无界AI绘画工具生成2月初&#xff0c;数藏发行平台鲸探更新了用户服务协议&#xff0c;更新最受关注的点在于&#xff1a;首次转赠期限从180天调整为90天。此外&#xff0c;有媒体披露&#xff0c;鲸探客服回答用户提问称&#xff0c;非首次转赠也从720天…

ITSS认证分为几个级别,哪个级别最高

​一、什么是ITSS ITSS( 信息技术服务标准&#xff0c;简称ITSS)是国内第一套成体系和综合配套的信息技术服务标准库&#xff0c;全面规范了IT服务产品及其组成要素&#xff0c;用于指导实施标准化和可信赖的IT服务。 ITSS是在工业和信息化部、国家标准化管理委员会的联合指导下…

Python 之 NumPy 统计函数、数据类型和文件操作

文章目录一、统计函数1. 求平均值 mean()2. 中位数 np.median3. 标准差 ndarray.std4. 方差 ndarray.var()5. 最大值 ndarray.max()6. 最小值 ndarray.min()7. 求和 ndarray.sum()8. 加权平均值 numpy.average()二、数据类型1. 数据存储2. 定义结构化数据3. 结构化数据操作三、…

儿童及婴幼儿产品出口美国CPC和欧洲CE认证测试标准总结

消费者越来越关注他们选购的产品安全性和质量&#xff0c;尤其是儿童和婴幼儿产品。若产品不符合安全标准和法规要求&#xff0c;可能对婴儿、幼儿和儿童造成威胁。儿童和婴幼儿产品的制造商及零售商必须严格遵守当地市场法规&#xff0c;证明其产品的安全性和质量可以满足消费…

为什么重写equals还要重写hashcode方法

目录equals方法hashCode方法为什么要一起重写&#xff1f;总结面试如何回答重写 equals 时为什么一定要重写 hashCode&#xff1f;要想了解这个问题的根本原因&#xff0c;我们还得先从这两个方法开始说起。 以下是关于hashcode的一些规定&#xff1a; 两个对象相等&#xff0…

文心ERNIE 3.0 Tiny新升级!端侧压缩部署“小” “快” “灵”!

大家好&#xff0c;今天带来的是有关文心ERNIE 3.0 Tiny新升级内容的文章。 近年来&#xff0c;随着深度学习技术的迅速发展&#xff0c;大规模预训练范式通过一次又一次刷新各种评测基线证明了其卓越的学习与迁移能力。在这个过程中&#xff0c;研究者们发现通过不断地扩大模型…

第七章:Linux最小化搭建环境解说2

配置IP地址&#xff1a;我们先要到网卡配置文件夹里&#xff0c;路径是/etc/sysconfig/network-scripts/&#xff0c;有点长&#xff0c;不过没事&#xff0c;我们要学会习惯&#xff0c;这还是经常用的。然后就是用ls命令查看下面有什么&#xff0c;只有一个文件ifcfg-ens160&…

【位运算问题】Leetcode 136、137、260问题详解及代码实现

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

sql数据库高级编程总结(一)

1、数学函数&#xff1a;操作一个数据&#xff0c;返回一个结果 &#xff08;1&#xff09;取上限 ceiling 如果有一个小数就取大于它的一个最小整数 列如9.5 就会取到 10 select code,name,ceiling(price) from car &#xff08;2&#xff09;取下限 floor 如果有一个小数就…

Hudi-数据湖

数据湖 数据仓库 数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;,是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;分析结果为企业提供决策支持&#xff08;Decision Support&am…

Windows 安装Ubuntu18.04虚拟机

在Windows电脑上安装有VMware虚拟机。 Ubuntu下载 下载地址 https://releases.ubuntu.com/?_ga2.112562948.1436579420.1676293914-109238742.1676124458 笔者这边下载的是Ubuntu 18.04版本。 创建虚拟机 打开VMware&#xff0c;文件>新建虚拟机 选择自定义&#xff0…