【计算机图形学】Where2Act: From Pixels to Actions for Articulated 3D Objects

文章目录

  • 1.论文做了件什么事儿
  • 2. 论文为什么要做这件事
  • 3. 介绍Introduction
  • 4. 相关工作
    • 预测语义表达
    • 推理几何和物体属性
    • 从被动观察中学习Affordance
    • 从交互中学习感知
  • 5. 问题陈述
  • 6. 方法
    • 6.1 网络模块
      • 主干特征提取器
      • 可运动性评分模块
      • 运动建议模块
      • 运动评分模块
    • 6.2 训练数据收集
      • 离线随机数据采样
      • 在线适应性数据采样
    • 6.3 训练与损失
      • 运动评分损失
      • 运动策略模块
      • 可运动性损失
  • 7. 实验
    • 7.1 实验设定
    • 7.2 指标和基线
    • 7.3 结果和分析
  • 8. 总结与限制
  • 9. 补充
    • 召回率与F-score

1.论文做了件什么事儿

论文处理的任务是:预测给定的六种原子动作的affordances,这种affordances可以被用于更丰富的交互,同时学习能够引起期望改变的low-level的动作。具体地展开说,比如我指定向左拉的动作,对于一个推拉门,理想的affordance应该预测出最大的操作可能性在推拉门的把手上,抓住推拉门把手的某个点,把它向左拉开。

输入是image和depth data

输出

  1. image每个pixel上可能的动作集合

  2. 在力的驱动下那些可能移动的铰接物体部件

同时提出了从交互中学习的框架,搜集策略并训练网络

2. 论文为什么要做这件事

从人类的视角看来,当我们看到一个铰接物体时候,我们可以毫不费力地知道这个铰接对象可以做什么,我们需要在哪个位置完成交互,以及我们如何完成交互,例如,我们可以抓住把手拉开从而打开抽屉,推动门的任意一个位置使其观赏,旋转按钮来把灯打开,或者是按下按钮来启动烤箱。我们不仅知道怎样的动作可以完成一个任务,我们还可以知道什么事情是不应该做的,比如我们不应该把遥控器上的按钮拔出来。

在这篇工作中,目标就是建立一个感知系统,能够理解通用物体。当给定一个新的物体时,作者希望系统能够推理出在铰接物体上无数种可能的交互,

3. 介绍Introduction

预测物体可能的交互在机器人领域和计算机视觉领域方面是十分重要的。在机器人领域,预测可行的动作(如抽屉可以被拉开)有助于帮助动作规划、高效探索和交互学习(使得采样成功率更高)。在另一方面,计算机视觉领域主要聚焦于从视觉输入中推理语义标签(如部件分割和关键点估计),但是这种被动学习的表示仅能够提供有限的理解。被动学习受到智能体执行动作的能力、学习到的预测模型、很多案例下的语义(类别通常定义了功能本身)的限制。文章的目标是建立一个多物体适用的通用感知系统,同时对什么交互动作能够使得动作成功的问题进行自监督学习。

第一个问题是如何参数化动作预测空间。任何长时间的动作都可以被分解成原子动作。因此本文将问题限定于“在给定物体当前状态的情况下,能够执行哪些短期交互”。每个原子交互被进一步分解成“在哪里做”和“怎么做”两个部分,比如机器人可以与橱柜的哪个部分交互(如抽屉的把手或抽屉的表面)、机器人应该如何执行动作(如平移或垂直拉动把手)。这些观察将文章的任务定义为 “密集视觉预测”,给定物体的深度图和RGB图,尝试去推理,在每一个像素/点上是否能够执行原子动作,如果能够执行,又应该如何去执行。

我们学习一个预测网络,给定一个原子动作类型的条件,可以预测逐像素的如下信息:一个“运动能力”分数、动作策略、成功概率。

我们的方法让智能体和多个物体进行简单地交互来学习、记录动作的输出,并标记那些朝着理想状态改变的动作。我们意识到可以让智能体学习随机的交互采样,但这并不是一个高效率的探索策略,因此我们提出一个基于策略的数据采样方法来减轻这个问题——通过将采样偏置向那些智能体认为可能成功的动作来实现(就是通过让网络学习一些可能成功的动作,在这些成功率高的位置多做采样)。

论文贡献如下:

  1. 论文作者将任务定义为通过推理逐像素的动作分数和动作建议来得到可操纵3D铰接物体的Affordance;

  2. 提出了从交互中学习的方法,同时使用适应性采样来获得更多有价值的采样;

  3. 我们的网络能够学习到动作的视觉表达,并能够泛化到新的shape甚至是未见过的物体类别上。

4. 相关工作

预测语义表达

为了成功与3D物体交互,智能体需要去“理解”给定的感知输入。计算机视觉领域的很多方法都追求以多种语义标签的形式来表达这种“理解”。如预测类别标签、或者更细力度的语义特征点或部件分割等任何能够更具有运动解释性的表达。考虑如何推理出“把手”或“按钮”的位置等。然而,仅获得这些语义标签是不足够的,智能体必须理解需要做些什么(如在把手上能够通过“拉”的动作打开门)、以及如何运动来完成这个动作(在特定物体上执行“拉开”这个动作需要怎样精确的运动)。

推理几何和物体属性

为了得到能够直接用于如何操纵相关的信息,一些方法利用经典的机器人技术实现。给定shape的表达,以及刚性物体姿态、铰接物体姿态,在机器人领域可以利用离线planner或预测系统来获得动作策略。另外,推理物理属性如材质,mass的能力可以进一步提升精确性。

然而,这种两个阶段的动作执行过程,包括预测物体状态的感知系统对于出现预测误差的情况并不鲁棒,同时也会让感知系统产生比我们所需更丰富的输出,例如我们不需要预测完整的物体状态来判断如何拉出抽屉。另外,当这一类方法让智能体更精确地产生一个动作时,这些方法首先回避了需要/可以执行什么动作的问题,如,智能体如何理解一个按钮可以被按下?

(第二段可能稍微有点绕,我理解的意思是传统的机器人planner方法是通过以物体初态为输入,预测物体的终态后再获得执行的动作,但是这就导致了冗余。同时这一类方法一开始就回避了在物体上哪些地方可以做一些动作/操作的问题,故并不理想)

从被动观察中学习Affordance

让智能体学习在给定上下文中可以执行什么动作的方法通常是利用一些被动的观察——比如看一个其他智能体和物体/场景交互的视频,并学习可能可以做一些什么。这种技术被用于成功地学习场景的affordance(坐下/站立),可能的触摸位置,交互热点,甚至是抓取方式。

但是从被动观察中学习是具有挑战性的,例如学习的智能体在解剖结构上有所不同,就需要适当的重新定位来解决这一点。一个更加常见的问题是在模仿学习中的分布转移问题,当智能体看到可以做一件事的例子时,它可能没有见过足够的负例或足够多的正例。

从交互中学习感知

与我们工作最相关的工作是通过他们生成的数据(与真实世界交互来尝试可能的动作)来预测affordances。大部分工作被应用与如物体分割,planar pushing,或者non-planar grasp,但这些系统都受限于他们建模动作的复杂性。大部分方法都执着于去学习一些复杂的affordances,而没有尝试去建模一些所需low-level的动作,而是去将任务定性为使用oracle manipulators进行的分类任务(我大概理解的是,就是哪些动作在当前条件下可以执行,哪些动作在当前操作下不能执行)。在本文的工作中,作者处理了affordances的预测任务,这种affordances可以被用于更夫妇的交互,同时学习哪些能够引起想要改变的low-level的动作。

5. 问题陈述

在这里插入图片描述

我们将问题定义为一个新的挑战性问题Where2Act——推理用于操纵3D铰接物体的逐像素的“可操纵性信息”。如图所示,给定一个具有铰接部件的3D shape S S S,我们对每一个像素进行预测,预测出(a)哪些位置可以进行交互,(b)如何进行交互,©在不同交互动作下的交互的输出是什么。

输入的shape可以以2D RGB图像或者3D部分点云扫描来表示。同时参数化了6种类型的短期原子动作,即gripper pose在SE(3)空间下的推和拉等动作。如果和预期接触点进行交互并使得交互的部件产生了较大的运动(即运动比较明显),则认为交互成功。

在3D shape的铰接部件的每一个像素/点 p p p上预测如下的信息:

  • (a) 运动性分数 a p a_p ap用于衡量 p p p有多大的可能是可操作的;

  • (b) 一组和点 p p p进行的交互建议 { R z ∣ p ∈ S O ( 3 ) } \{R_{z|p}∈SO(3)\} {RzpSO(3)},其中 z z z是从高斯分布中随机采样的;

  • (c) 每一个运动建议 R R R成功的概率 s R ∣ p s_{R|p} sRp

6. 方法

整个pipeline首先通过encoder-decoder(2D-UNet/3D-PointNet++)主干来提取per-pixel/per-point的特征,然后设计三个解码分支来预测“可运动性信息”,包括一个运动性分数模块、一个运动建议模块、一个运动评估模块。

为每一种运动训练一个独立的网络。共六个原子动作

6.1 网络模块

在这里插入图片描述

主干特征提取器

在铰接部件上提取密集的逐像素/点特征 { f p } p \{f_p\}_p {fp}p

对于2D的情况,使用UNet架构,其中编码器使用在ImageNet上预训练的ResNet-18,以及从头开始训练的对称解码器,其中在encoder和decoder之间有密集的跳跃连接。

对于3D的情况,使用PointNet++,包括4个set abstraction layers和single-scale grouping来作为编码器,4个特征传播层作为解码器将特征传播回每个点。

以上两种情况,均能够产生逐像素特征 f p ∈ R 128 f_p∈\mathbb{R}^{128} fpR128

可运动性评分模块

对于每一个像素/点 p p p,预测一个用于指示当前像素/点能否运动的分数 a p ∈ [ 0 , 1 ] a_p∈[0,1] ap[0,1]。这里的多层感知机 D a D_a Da由一个具有128层隐藏单元的MLP组成该模块。网络的输出在应用Sigmoid函数后是一个标量值 a p a_p ap,更高的分数意味着更高的交互成功的概率。即

a p = D a ( f p ) a_p=D_a(f_p) ap=Da(fp)

运动建议模块

运动建议模块被作为一个条件生成模型,用于提出交互参数 { R z ∣ p } \{R_{z|p}\} {Rzp}。这里应用另一个具有128个隐藏单元的多层感知机 D r D_r Dr来实现这个模块。

输入是当前像素/点的特征 f p f_p fp和一个随机采样的高斯噪声 z ∈ R 10 z∈\mathbb{R}^{10} zR10,网络预测gripper在SO(3)空间中的的end-effector 3-DoF orientation R z ∣ p R_{z|p} Rzp

R z ∣ p = D r ( f p , z ) R_{z|p}=D_r(f_p,z) Rzp=Dr(fp,z)

3-DoF夹持器的方向follow 6D旋转表示法,使用3×3旋转矩阵的前两个轴来表示。

运动评分模块

对于每一个像素/点 p p p的运动建议 R R R,我们为每一个交互方式 ( p , R ) ∈ S E ( 3 ) (p,R)∈SE(3) (p,R)SE(3)最终评估一个成功概率 s R ∣ p ∈ [ 0 , 1 ] s_{R|p}∈[0,1] sRp[0,1]。可以通过预测的评分来过滤掉低概率的运动建议,或者根据这个预测的评分来排序所有运动建议。这里的这个分数类似于目标检测相关文献中边界框的置信分数。

网络模块 D s D_s Ds仍然是一个含有128个隐藏单元的单隐层来实现的MLP,给定输入的元组 ( f p , R ) (f_p,R) (fp,R),产生运动评分 s R ∣ p ∈ [ 0 , 1 ] s_{R|p}∈[0,1] sRp[0,1],即:

s R ∣ p = D s ( f p , R ) s_{R|p}=D_s(f_p,R) sRp=Ds(fp,R)

在测试的时候,认为 s R ∣ p > 0.5 s_{R|p}>0.5 sRp>0.5表示策略 R R R是可用的。

6.2 训练数据收集

因为人为标注数据是很困难的,所以取而代之地使用智能体在模拟环境中和物体交互以获得数据。

在模拟环境中奖随机的3D铰接物体放置在场景的中心,一个flying gripper可以在物体几何表面的指定位置 p ∈ R 3 p∈\mathbb{R}^3 pR3使用末端夹持器方向 R ∈ S O ( 3 ) R∈SO(3) RSO(3)的方式进行交互。仅考虑如图(b)中所示的6中预定义的简单的交互策略。每一种都是由一开始的抓手姿态 ( p , R ) ∈ S E ( 3 ) (p,R)∈SE(3) (p,R)SE(3)定义的。

同时使用一种混合数据采样的方式。首先使用离线随机交互策略来提速学习,接着基于网络预测的数据点来进行交互以实现更高效的学习。

离线随机数据采样

通过在多CPU的环境下同步模拟可以采样很多训练数据。

对于数据点,在GT的铰接部件上随机采样一个位置 p p p进行交互。接着,从 p p p周围切平面的上半球随机抽取一个交互作用方向 R ∈ S O ( 3 ) R∈SO(3) RSO(3),方向始终朝向正法线方向,并尝试去查询参数化 ( p , R ) (p,R) (p,R)的交互结果。同时将来自另一个半球的方向 R s R_s Rs标记为负,因为抓手不能放在物体体积内部。

实验中,对于每一种原子运动类型,都采样足够的离线数据,给定粗略的一万个策略来提速训练。虽然可以实现大规模的数据收集,但这种随机的数据采样策略在查询兴趣交互区域以获得正数据点时候的效率非常低。实验统计证明,对于拉这个原子动作来说,只有1%的数据是正例。这也导致了训练过程中一个非常大的数据不平衡挑战,也暗示了可以拉动的区域可能仅占据一个非常小的部分,比如在拉动门把手或者拉动抽屉把手时候才能完成拉的动作。

在线适应性数据采样

为解决离线采样过程中数据采样不高效的问题,我们提出去构建一个在线适应性数据采样方法。对于我们正在学习的网络预测出极有可能成功的子区域做更多的采样。

在网络使用数据 ( p , R ) (p,R) (p,R)训练运动评分模块 D s D_s Ds时,能够推理出所有像素 { p i } i \{p_i\}_i {pi}i上的运动预测分数 { s R ∣ p i } i \{s_{R|p_i}\}_i {sRpi}i。接着,采样一个位置 p ∗ p* p来构建一个额外的交互尝试 ( p ∗ , R ) (p*,R) (p,R)。其中, p ∗ p* p是根据SoftMax所有可能的相互作用位置上归一化概率分布后确定的。(我的理解是,对一所有可能的相互作用位置,将所有位置的概率做一个归一化,然后取交互概率最大的位置进行采样)。

通过这种自适应的数据采样,正数据采样率得以提升,因为网络正在积极地在可能成功的子区域周围进行更多采样。此外,我们观察到在可能成功区域周围采样更多数据有利于网络更好地学习特征,以更好地区分小而关键的交互部分(如手柄、按钮和旋钮)。

虽然自适应在线数据采样是有益处的,但它也可能导致新区域中采样数据不够的问题。因此,在我们最后的在线数据采样过程中,我们有50%的数据来自随机数据采样,剩下50%来自基于预测的适应性数据采样。

6.3 训练与损失

经验性地发现最好的训练方式是首先训练运动评分模块 D s D_s Ds,接着联合训练三个解码器。在训练中维护一个单独的数据队列,在每个训练批中提供相同数量的正交互和负交互数据,以解决数据不平衡的问题,同时平等地从不同类别中采样shape。

运动评分损失

给定一个batch,其中含有 B B B个交互数据点 { ( S i , p i , R i , r i ) } i \{(S_i,p_i,R_i,r_i)\}_i {(Si,pi,Ri,ri)}i,其中 r i = 1 r_i=1 ri=1表示正例, r i = 0 r_i=0 ri=0表示负例,使用二分类交叉损失来训练运动评分模块:

L s = − 1 B ∑ i r i l o g ( D s ( f p i ∣ S i , R i ) ) + ( 1 − r i ) l o g ( 1 − D s ( f p i ∣ S i , R i ) ) L_s=-\frac{1}{B}\sum_ir_ilog(D_s(f_{p_i|S_i},R_i))+(1-r_i)log(1-D_s(f_{p_i|S_i},R_i)) Ls=B1irilog(Ds(fpiSi,Ri))+(1ri)log(1Ds(fpiSi,Ri))

运动策略模块

利用N个最小策略来训练运动策略模块 D r D_r Dr,本质上是一个条件生成模型,将像素 p p p map到交互策略分布 R z ∣ p R_{z|p} Rzp中。对于含有B个交互数据点的batch { ( S i , p i , R i , r i ) } i \{(S_i,p_i,R_i,r_i)\}_i {(Si,pi,Ri,ri)}i,其中 r i = 1 r_i=1 ri=1,Min-of-N损失被定义为:

L r = 1 B ∑ i min ⁡ j = 1 , . . . , 100 d i s t ( ( D r ( f p i ∣ S i ; z j ) ) , R i ) L_r=\frac1B\sum_i\min_{j=1,...,100}dist((D_r(f_{p_i|S_i};z_j)),R_i) Lr=B1iminj=1,...,100dist((Dr(fpiSi;zj)),Ri)

其中 z j z_j zj是随机采样的高斯向量, d i s t dist dist表示两个6D-rotation的距离。

可运动性损失

我们将“actionability”视作是一个像素/点上进行操纵预期成功率。

a ^ p i ∣ S i = 1 100 ∑ j = 1 , . . . , 100 D s ( f p i ∣ S i , D r ( f p i ∣ S i , z j ) ) \hat{a}_{p_i|S_i}=\frac{1}{100}\sum_{j=1,...,100}D_s(f_{p_i|S_i},D_r(f_{p_i|S_i},z_j)) a^piSi=1001j=1,...,100Ds(fpiSi,Dr(fpiSi,zj))

L a = 1 B ∑ i ( D a ( f p i ∣ S i ) − a ^ p i ∣ S i ) 2 L_a=\frac1B\sum_{i}(D_a(f_{p_i|S_i})-\hat{a}_{p_i|S_i})^2 La=B1i(Da(fpiSi)a^piSi)2

这个策略的计算是很高效的,因为我们使用了运动策略模块中的100个策略。由于 D r D_r Dr经过优化以后会覆盖所有成功的交互方向,因此当大多数建议成功时,估计的 a ^ p i ∣ S i \hat{a}_{p_i|S_i} a^piSi预计将接近1,而位置 p p p不可操作时, a ^ p i ∣ S i \hat{a}_{p_i|S_i} a^piSi将接近0(所有提案成功的可能性评分都非常低)

7. 实验

7.1 实验设定

这部分是一些训练集和测试集的划分,以及六个原子动作的定义、对交互成功的定义。

7.2 指标和基线

指标方面

  • 衡量 D s D_s Ds(运动策略评分模块)的指标是二分类精确性,主要评价召回率与F-score

  • 引入采样成功率指标ssr用于评价网络提出交互策略的成功概率

对于后面这个指标,评价过程如下:使用可运动性评分模块 D a D_a Da来采样交互的像素,接着应用运动策略提出模块 D r D_r Dr来生成多个交互策略,最后根据 D s D_s Ds对这些运动评分来采样出合适的交互策略。

关于交互策略的采样,是在所有像素的预测运动评分做一个归一化,然后采样那些绝对概率大于0.5的策略。对于策略采样步骤,是在每个像素上采样100个策略,这是通过从高斯分布中随机采样并输入到 D r D_r Dr中获得的。对于每一种交互策略,都应用模拟器来观察GT输出,故:

s s r = # s u c c e s s f u l _ p r o p o s a l s # t o t a l _ p r o p o s a l s ssr=\frac{\#successful\_proposals}{\#total\_proposals} ssr=#total_proposals#successful_proposals

基线方面

由于没有类似的任务,所以与三个相对简单的baseline比较,以及文章方法的消融版本比较。

  • B-Random:随机的智能体,总是给出随机的策略和分数

  • B-Normal:将2D-UNet和3D-PN++编码出的特征 f p f_p fp替换成3维的GT法线,使用相同的解码头、损失、训练框架

  • B-PCPNet:将上面提到的特征 f p f_p fp替换成使用PCPNet预测的法线和曲率,使用相同的解码头、损失和训练框架

  • Ours w/o OS:本文方法的消融实验,移除了适应性数据采样部分,仅使用随机探索来采样数据,为了保证公平,采样的数据量和文中离线+在线采样的数据量保持一致

其中,B-Random展示了测量指标的下界;B-Normal用于验证网络学习的特征提取器提取的特征是面向交互的特征,而不是如法线一样简单的几何特征;B-PCPNet进一步证明网络学习了比局部法线和曲率更多的几何特征;Ours w/o OS进一步证明在线适应性采样策略的改进。

7.3 结果和分析

定量实验:

在这里插入图片描述

上述表格展示了文中方法的优越性,优于其他所有基线,即使是使用2D版本,本文的方法也展示出了competitive的结果。

在这里插入图片描述

消融实验证明了在线采样策略的高效性。

定性实验:
在这里插入图片描述

其余见论文

8. 总结与限制

文章完成了一个挑战性任务:预测操纵3D物体的逐像素运动信息。对于一个物体铰接部件上的每一个像素,预测每个像素关于6个原子动作的运动概率,并提出候选交互参数。

限制:

  1. 网络使用单帧视角作为输入,如果铰接部件运动信息无法从单帧中进行确定,则容易引起解空间的二义性;

  2. 实验限制在6个类型的原子动作,每个动作策略都是硬编码的;

则可探索的方向就是实现free-form的交互。同时文章没有显式建模部件分割和部件的motion axis,这些信息在未来可以被进一步结合。

9. 补充

召回率与F-score

一种评价二分类任务的指标,详见:【机器学习笔记15】多分类混淆矩阵、F1-score指标详解与代码实现(含数据)-CSDN博客

将二分类分为TP(预测正确,为正类),FP(预测错误,为正类),FN(预测错误,为负类),TN(预测正确, 为负类);即TP为真阳性,FP为假阳性,FN为真阴性,FN为假阴性。

召回率是基于这些分类进行计算的。召回率 R c = T P T P + F N R_c=\frac{TP}{TP+FN} Rc=TP+FNTP,也就是真实类别为正类的所有结果中,模型预测正确的比重。

F-score用于综合考虑精确度和召回度指标,其公式在上面的文章中有写明

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

路由器端口映射如何配置?

在网络通信中,路由器是一个重要的设备,它负责将数据包从一个网络传输到另一个网络。路由器的端口映射配置是一种重要的设置,可以使外部网络中的计算机通过访问路由器上的特定端口与内部网络中的计算机进行通信。本文将介绍什么是路由器端口映…

k8s pv与pvc理解与实践

参考文章: https://blog.csdn.net/qq_41337034/article/details/117220475 一、 pv/pvc简述 Pv是指PersistentVolume,中文含义是持久化存储卷是对底层的共享存储的一种抽象,Pv由管理员进行配置和创建,只要包含存储能力&#xff…

【DL】深度学习之语音识别

目录 1 核心概念 2 安装依赖库 3 实践 语音信号处理(Speech Signal Processing)简称语音处理。 语音识别(ASR)和自然语言处理(NLP):语音识别就是将语音信号转化成文字文本,简单实…

Redis 服务集群、哨兵、缓存及持久化的实现原理和应用场景

Redis 是一种高性能的键值存储系统,已经成为了许多企业和互联网公司的核心技术之一。本文将介绍 Redis 的服务集群、哨兵以及缓存实现原理和应用场景,以帮助读者更好地理解和使用 Redis。 引言: 随着互联网应用规模不断扩大,Redi…

Laravel04 eloquent

eloquent 1. eloquent2. 创建eloquent model 以及 取数据 1. eloquent 文档地址: https://learnku.com/docs/laravel/8.x/eloquent/9406 下面是我们,通过laravel的DB类从数据库中获取了post记录,那么有没有可能我们直接获取一个post对象&am…

[算法沉淀记录]排序算法 —— 快速排序

排序算法 —— 快速排序介绍 基本概念 快速排序(Quicksort)是一种排序算法,最早由东尼霍尔提出。在平均状况下,排序 n 个项目要 Ο(n log n) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上&…

Arduino单片机基础介绍

(本文为简单介绍,内容源于网络和AI) Arduino单片机,自2005年诞生以来,已经成为全球爱好者和专业工程师们快速实现创意原型的重要工具。Arduino的普及不仅因其强大的功能和简易的操作,还在于其背后强大的社…

【数据结构】队列OJ题《用队列实现栈》(题库+解析+代码)

1.前言 通过前面队列的实现和详解大家对队列应该有一定熟悉了,现在上强度开始做题吧 队列详解:http://t.csdnimg.cn/dvTsW 2.OJ题目训练225. 用队列实现栈 题目分析 请你仅使用两个队列实现一个后入先出(LIFO)的栈&#xff0…

亿道丨三防平板丨手持平板丨加固平板丨助力地震救援

自土耳其发生7.8级大地震以来,一直都牵动着世人的心。2023年2月10日,据法新社最新消息,强震已造成土耳其和叙利亚两国超2万人遇难。报道称,相关官员和医护人员表示,地震造成土耳其17674人死亡,叙利亚则有33…

洛谷C++简单题小练习day22—小鱼记忆小程序!一题五解,高效学习

day22--小鱼记忆--2.26 习题概述 题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 ai​(长度不一定,以 0 结束),记住了然后反着念出来(表示结束的数字 0 就不要念出来了)。…

iOS App 上架指南及关键

引言 上架App Store是将iOS应用提交申请并上线的过程,旨在让应用在App Store上展示,吸引用户并获取流量。本文将介绍iOS上架的整体流程,并提供一些建议和注意事项。 一、iOS上架的整体流程 1. 申请开发者账号 首先,需要申请苹…

08_css

文章目录 CSS概念在HTML中引入CSS的三种方式CSS的选择器标签选择器类选择器id选择器后代选择器子类选择器并集选择器伪类选择器伪元素选择器属性选择器选择器的优先顺序 盒子模型边框的写法内外边距的写法外边距合并 标签的分类块级元素行级元素行内块 浮动 CSS 概念 css是层…

共同学习|Spring Cloud Alibaba一一服务网关Gateway

目录 服务网关-Gateway 环境搭建 负载均衡 Gateway Predicates Path After Before Cookie Header Weight GatewayFilter Factories StripPrefix AddResponseHeader 自定义全局Filter 网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连&…

北斗卫星赋能,宠物定位新篇章—追踪宠物,不再是难题

北斗卫星赋能,宠物定位新篇章—追踪宠物,不再是难题 随着社会的快速发展与科技的不断进步,人们的生活方式也在不断改变。宠物已经成为越来越多家庭的重要成员,在这个宠爱宠物的时代,如何确保宠物的安全,特…

js之继承

js之继承 1、原型 prototype 和 __proto__2、原型链3、继承4、hasOwnProperty 1、原型 prototype 和 proto 每个对象都有一个__proto__属性,并且指向它的prototype原型对象每个构造函数都有一个prototype原型对象prototype原型对象里的constructor指向构造函数本身…

淘金优化算法GRO求解不闭合SD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)

一、淘金优化算法GRO 淘金优化算法(Gold rush optimizer,GRO)由Kamran Zolf于2023年提出,其灵感来自淘金热,模拟淘金者进行黄金勘探行为。淘金优化算法(Gold rush optimizer,GRO)提…

vscode与vue/react环境配置

一、下载并安装VScode 安装VScode 官网下载 二、配置node.js环境 安装node.js 官网下载 会自动配置环境变量和安装npm包(npm的作用就是对Node.js依赖的包进行管理),此时可以执行 node -v 和 npm -v 分别查看node和npm的版本号: 配置系统变量 因为在执…

Cloudera虚拟机配置(虚拟机环境自带Hadoop、Impala等大数据处理应用)

上学期的大数据处理课程,笔者被分配到Impala的汇报主题。然而汇报内容如果单纯只介绍Impala的理论知识,实在是有些太过肤浅,最起码得有一些实际操作来展示一下Impala的功能。但是Impala的配置实在是有些困难与繁琐,于是笔者通过各…

VSCode设置成中文语言环境

1,打开VSCode软件,按快捷键【CtrlShiftP】 2,在弹出的搜索框中输入configure language,然后选择Configure Display Language 3,在选择框中选择zh-cn 4,确认重启VSCode就可以了

【基础知识】MPP架构和hadoop架构比对

架构比对 简单一句描述。 mpp架构,就是找一群和自己能力差不多的任一起做事,每个人做的事情是一致的。 hadoop架构,就是找一群能力差一些的人,但只需要他们每个人只做一部分工作。 举例说明 一个特色小饭店如何成为连锁餐饮巨…