当前位置: 首页 > news >正文

【计算机图形学】NAP: Neural 3D Articulation Prior

文章目录

  • 1. 这篇论文做了什么事,有什么贡献?
  • 2. Related Work
    • 铰接物体建模
    • 3D中的Diffusion model扩散模型
  • 3. Pipeline
    • 铰接树参数化
    • 基于Diffusion的铰接树生成
    • 去噪网络
  • 4. 实验
    • 评价铰接物体生成——以往做法与本文提出的新指标
    • NAP捕捉到的铰接物体分布质量
    • NAP是否足够高效?——消融实验
    • NAP可以做一些什么应用?
  • 5. 总结
  • 6. 其他补充
    • SE(3) transformation
    • Positional Encoding位置编码

1. 这篇论文做了什么事,有什么贡献?

本篇论文研究铰接物体的生成模型。目前已经有大量工作研究3D物体的生成、组合的生成、场景的生成,但是对于人类和机器人日常交互对象——铰接物体的生成则很少有人focus。
生成铰接物体不仅包括生成几何的分布和位置(铰接物体是由rigid part组成的,要生成这些几何分布及其所在的位置),还需要生成两个rigid part之间的相对运动(比如运动结构,铰接链等信息)。

困难(Challenge)在于:现有的铰接物体数据集中存在的铰接物体,存在着许多不同,如他们在rigid part的数量(比如门是两个rigid part,然后眼镜这些是三个rigid part)上不同,且存在着多样化的连接拓扑(不同铰接物体连接的方式可能有差异)和不同的关节运动类型(有prismatic,如抽屉那种,还有revolute,门和眼镜那种)

为了解决这些困难和挑战,本文做出了以下的贡献:

  1. 针对于铰接物体之间存在的如rigid part数量不同、连接拓扑和关节运动类型不同等这种种差异,论文提出了一种统一的parameterization方式来表示铰接物体,论文称这种表达方式为铰接树
  2. 在这种参数化后的物体上,运用最近比较火的diffusion去噪概率模型来建模铰接物体的不规则分布
  3. 通过一个图注意力机制去噪网络,来逐步交换这种参数化后的铰接物体图之间的边与节点之间的信息
  4. 引入了一个新的度量指标来评估这个新的任务

2. Related Work

铰接物体建模

这方面的工作主要分成几个部分:铰接物体类别估计、铰接物体重建、铰接物体模拟、铰接物体生成。
类别估计方面的工作主要是从传感器观察中预测铰接关节状态(铰接角度和)和铰接参数(铰接类型、axis的位置和朝向信息、限制),使用的方法主要是概率模型、交互感知的方式、基于学习的推理。
重建方面就是重建物体的铰接属性和几何属性,使用的技术主要包括运动、基于学习的方法和隐式神经表示。这些方法主要是做表面重建,关节状态预测

本文主要是建立一个铰接物体的生成先验

3D中的Diffusion model扩散模型

作者聚焦于那些3D shape和运动的生成。
Shape:目前Diffusion models在生成点云、mesh、隐式表面、nerf和4D非网格shape上做的很好。但是Diffusion models生成shape的工作主要是focus在单一物体的level上,没有focus在具有运动结构的物体上。
Motion:最近有很多在铰接物体运动生成方面的运用。类似的工作还有基于text生成人体运动、音频驱动、场景感知、多人或动画领域等。Diffusion models for motion还被运用于策略规划,视觉电机控制,重新排列任务等。这些将Diffusion model运用在运动方面的工作大部分都基于已知的几何和已知的运动结构。我们与之不同,我们共同建模几何和运动结构先验来建立铰接物体。

3. Pipeline

铰接树参数化

要想使用diffusion model来进行铰接物体的处理,首先就应该将铰接物体以某种方式实现参数化。首先引入铰接树参数化法,这也是本文的一个contribution:每一个物体都被定义成一个图,并同时做出两个假设:

  1. 树assumption:假设图是一个无环连接图(每两个节点间最多只有一条边连接),且能够通过边走完整个图
  2. Screw关节:假设边是连接用的螺丝,最多只具有prismatic平移和revolute旋转中的一种性质,以此覆盖了大部分真实世界中的铰接物体

在这里插入图片描述
Node
如图所示,每一个rigid part在图中都会被表示为一个Node,每一个joint都有其初始的pose,对应于0°或者未展开的状态。

给定其中第 i i i个part,首先获得从局部坐标 y i y_i yi经过SE(3)变换得到的全局坐标 y g = T g i y i y_g=T_{gi}y_i yg=Tgiyi T g i ∈ R 6 T_{gi}∈R^6 TgiR6
每一个part的几何通过一个bounding box b i ∈ R 3 b_i∈R^3 biR3进行表示,以及适配于bounding box大小的一个神经隐式表面
预训练了一个occupancy shape autoencoder,将每个part shape转换成一个latent code s i ∈ R F s_i∈R^F siRF
最后,为了建模结构有差异的多种物体,这里最多允许表示具有K个parts的物体,并使用二进制占用符 o i ∈ { 0 , 1 } o_i∈\{0,1\} oi{0,1}来表示每个part是否存在

故综合以上内容,Node被表示为 v i = [ o i , T g i , b i , f i ] ∈ R D v v_i=[o_i,T_{gi},b_i,f_i]∈R^{D_v} vi=[oi,Tgi,bi,fi]RDv,且 D v = 1 + 6 + 3 + F D_v=1+6+3+F Dv=1+6+3+F,因为最多可以表示K个parts的物体,所以这部分的维度就是 K × D v K×D_v K×Dv

Edges
根据Chasles的理论,SE(3) transformation可以表示为沿着轴的2D旋转和1D平移,且可以通过单位Plücker坐标来定义这样一个轴。这里使用具有单位方向 l l l和垂直于 l l l的动量 m m m的Plücker坐标来统一表示prismatic和revolute joints( l ∈ S 2 , m ∈ R 3 l∈S^2, m∈R^3 lS2,mR3)。在全局坐标系下定义Plücker坐标 p ( i , j ) p_{(i,j)} p(i,j),以避免两个parts的父子顺序发生翻转时引起的局部坐标变化。
我理解这里所谓的 l ∈ S 2 l∈S^2 lS2,应该指的是方位角和俯仰角,通过方位角和俯仰角来定义单位球面上的一个方向向量,然后 m m m表示的是轴的旋转或平移动量(虽然我还不太理解这一点)

为了完整地定义关节运动,还使用 r ( i , j ) ∈ R 2 × 2 r_{(i,j)}∈R^{2×2} r(i,j)R2×2来表示关节的运动范围。如果关节是一个纯粹的prismatic关节,其旋转的范围就会被定义为 [ 0 , 0 ] [0,0] [0,0],反之亦然。两个part之间的相对变换使用 T ( θ , d ) T(θ,d) T(θ,d)来表示,实际上这里 θ θ θ就是一个旋转角度,然后 d d d是一个移动范围。通过 T ( θ , d ) T(θ,d) T(θ,d)和全局坐标 ( l g , m g ) (l_g,m_g) (lg,mg)计算局部坐标:
( l i , m i ) = ( R i g l g , R i g m g + t i g × ( R i g l g ) ) (l_i,m_i)=(R_{ig}l_g,R_{ig}m_g+t_{ig}×(R_{ig}l_g)) (li,mi)=(Riglg,Rigmg+tig×(Riglg))
接着根据局部坐标计算旋转和平移:
R = R ( θ , l i ) , t = ( I − R ( θ , l i ) ) ( l i × m i ) + d l i R=R(θ,l_i),t=(I-R(θ,l_i))(l_i×m_i)+dl_i R=R(θ,li)t=(IR(θ,li))(li×mi)+dli

同时,还定义一个手性指示符 c i , j ∈ { − 1 , 0 , + 1 } c_{i,j}∈\{-1,0,+1\} ci,j{1,0,+1},0表示边不存在,+1和-1表示的手性(我认为就是表示的父子关系,parent-child)。

综合以上内容,Edge被表示为 e ( i , j ) = [ c i , j , p ( i , j ) , r ( i , j ) ] ∈ R D e e_{(i,j)}=[c_{i,j}, p_{(i,j)}, r_{(i,j)}]∈R^{D_e} e(i,j)=[ci,j,p(i,j),r(i,j)]RDe,且 D e = 1 + 6 + 4 D_e=1+6+4 De=1+6+4,因为最多有K个Node,所以无向边的数量最多是 K ( K − 1 ) / 2 K(K-1)/2 K(K1)/2,所以这部分的维度就是 K ( K − 1 ) / 2 × D e K(K-1)/2×D_e K(K1)/2×De


这种图的表示最终会使用最小生成树来进行后处理,每个图都对应一棵唯一的树,也就是唯一的articulated object。

基于Diffusion的铰接树生成

正向过程
在这里插入图片描述

正向就和传统的Diffusion一样是一个简单的扩散过程。首先定义完整的铰接图 x = ( v i , e ( i , j ) ) ∈ R K D v + K ( K − 1 ) D e / 2 x=({v_i},{e_{(i,j)}})∈R^{KD_v+K(K-1)D_e/2} x=(vi,e(i,j))RKDv+K(K1)De/2
从物体的分布 q ( x 0 ) q(x_0) q(x0)中采样了铰接图 x 0 x_0 x0,逐渐在 x 0 x_0 x0上加上随时间变化的噪声 β 1 − β T β_1-β_T β1βT,进而获得了 x 1 − x T x_1-x_T x1xT,最终 x T x_T xT是以高斯分布为结尾的 p ( x T ) = N ( x T ; 0 , I ) p(x_T)=N(x_T;0,I) p(xT)=N(xT;0,I),这个过程可以被如下表示:
q ( x 1 : T ∣ x 0 ) : = ∏ t = 1 T q ( x t ∣ x t − 1 ) , q ( x t ∣ x t − 1 ) : = N ( 1 − β t x t − 1 , β t I ) q(x_{1:T}|x_0):=\prod_{t=1}^{T}q(x_t|x_{t-1}),q(x_{t}|x_{t-1}):=N(\sqrt{1-β_t}x_{t-1},β_tI) q(x1:Tx0):=t=1Tq(xtxt1)q(xtxt1):=N(1βt xt1,βtI)
由于Diffusion自身特有的特性,我们也可以直接从 x 0 x_0 x0来表示 x t x_t xt
q ( x t ∣ x 0 ) : = N ( α ‾ t x 0 , ( 1 − α ‾ t ) I ) , α t : = 1 − β t , α ‾ t : = ∏ s = 1 t α s q(x_{t}|x_{0}):=N(\sqrt{\overline{α}_t}x_{0},(1-\overline{α}_t)I),α_t:=1-β_t,\overline{α}_t:=\prod^t_{s=1}α_s q(xtx0):=N(αt x0,(1αt)I)αt:=1βtαt:=s=1tαs

逆向过程
在这里插入图片描述

逆向过程从标准的高斯分布开始,通过一个带有可学习参数 θ θ θ的神经网络来学习如何移除噪声,逆向过程表示为:
p ( x 0 : T ) : = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) , p θ ( x t − 1 ∣ x t ) : = N ( μ θ ( x t , t ) , ∑ θ ( x t , t ) ) p(x_{0:T}):=p(x_T)\prod_{t=1}^{T}p_θ(x_{t-1}|x_t),p_θ(x_{t-1}|x_{t}):=N(μ_θ(x_t,t),\sum_{θ}(x_t,t)) p(x0:T):=p(xT)t=1Tpθ(xt1xt)pθ(xt1xt):=N(μθ(xt,t),θ(xt,t))
Follow之前的工作,设定 ∑ θ ( x t , t ) = σ t 2 I \sum_{θ}(x_t,t)=\sigma^2_tI θ(xt,t)=σt2I,并根据Langevin dynamics来建模逆向过程(直观地理解来说,就是给定 x t x_t xt及当前时间步t,通过网络来推断当前时间步下的噪声, x t x_t xt减去这个噪声后得到的就是未加上该步噪声的结果 x t − 1 x_{t-1} xt1):
x t − 1 = 1 α t ( x t − 1 − α t 1 − α ‾ t ϵ θ ( x t , t ) ) + σ t z , z 来自正态分布 x_{t-1}=\frac{1}{\sqrt{α_t}}(x_t-\frac{1-α_t}{\sqrt{1-\overline{α}_t}}\epsilon_θ(x_t,t))+\sigma_tz,z来自正态分布 xt1=αt 1(xt1αt 1αtϵθ(xt,t))+σtzz来自正态分布
ϵ θ ( x t , t ) \epsilon_θ(x_t,t) ϵθ(xt,t)是通过不断优化每一步的的 x t x_t xt来学习的网络参数

训练目标
总的来讲,Diffusion的训练目标就是使得正向和逆向的分布尽可能一致,通过使它们的负对数尽可能接近于0,使Forward和Reverse的两个分布尽量接近:
在这里插入图片描述

简化后的训练目标很简单,就是使得网络预测出来的噪声和加进去的噪声尽可能地一致:
在这里插入图片描述
输出提取
在获得了输出的参数化结果后,通过后处理步骤来获得最终的铰接物体。大致过程如下:
首先,通过生成的节点指示符 o o o来定义存在的这些节点,同时需要确保最少有两个节点。
接着,根据预测的边的手性 ∣ c ∣ |c| c来找到生成图的最小生成树,得到树的拓扑。
最后,预测的joint坐标将会从 R 6 R^6 R6投影到Plücker坐标( l ∈ S 2 , m ∈ R 3 l∈S^2, m∈R^3 lS2,mR3)中。
每个part的shape code将会被通过一个decoder解码成SDF的形式,并通过marching cube获得对应的mesh。

有条件的生成
Diffusion model最讨喜的一个性质是如果想要做基于条件的diffusion,可以直接通过贝叶斯论将条件直接加入到推理过程中,而不需要对训练过程中做任何修改。这里的条件可以是part、joint等等

在这里,作者通过fix x x x已知的part执行条件生成,像图像重绘和形状补全一样,对于 x x x,通过mask将输入分为已知部分和未知部分: x = m ⊙ x k n o w + ( 1 − m ) ⊙ x u n k n o w x=m\odot x^{know}+(1-m)\odot x^{unknow} x=mxknow+(1m)xunknow。对于已知部分的输入,可以直接从 q ( x 0 ) q(x_0) q(x0)中进行采样,通过给已知部分 x k n o w x^{know} xknow加上高斯噪声,就可以在反向过程中通过diffusion来补全未知部分 x u n k n o w n x^{unknown} xunknown

去噪网络

网络结构
在这里插入图片描述

利用了一个图注意力机制来做去噪网络,网络的输入是带有噪声的铰接图 x x x,输出是和输入 x x x shape相同的噪声,网络结构中的权重,在去噪的全过程中都是权重共享的。
开始,分别将节点和边输入到各自的网络中获得Node features { f i } \{f_i\} {fi}和Edge features { g ( i , j ) } \{g_{(i,j)}\} {g(i,j)}
接着,这两组节点会被通过Graph layer进行更新,以实现特征之间的交换和融合
最后,所有的隐藏特征,包括输入的特征,当前时间步t,都将会被输出头进行解码
类似于近期的一些场景图生成工作,这里还会将部件实例id的位置编码(positional encoding)联合结点特征作为输入,以在早期部件的pose信息具有二义性的时候,提供更强的引导

Graph layer
在这里插入图片描述
edge特征首先通过一个edge MLP,混合输入的edge特征 g ( i , j ) g_{(i,j)} g(i,j)和相邻Node i , j i,j i,j的特征进行更新: g ( i , j ) ′ = M L P ( f i , f j , g ( i , j ) ) g^{'}_{(i,j)}=MLP(f_i,f_j,g_{(i,j)}) g(i,j)=MLP(fi,fj,g(i,j))
接着将更新后的edge特征通过注意力权重反向更新结点Node(这个权重可以衡量Edge对Node的影响)
这里的权重计算方法为:通过两个MLP从输入的Node中计算Query Q ( f i ) Q(f_i) Q(fi)和Key K ( f j ) K(f_j) K(fj),并使用二者的内积作为注意力权重,节点Node i i i的权重计算方式为:在这里插入图片描述
最后还使用了类似于PointNet中的全局池化来捕捉全局信息

4. 实验

在实验中阐述了4个问题,分别对应于实验的4个小节:

  • 如何评估铰接物体生成?
  • NAP捕捉到的铰接物体分布质量如何?
  • NAP是否足够高效?
  • NAP可以做一些什么应用?

评价铰接物体生成——以往做法与本文提出的新指标

以往做法中,评价铰接物体生成大部分是通过COV来评价生成样例的多样性,或者通过Jenson-Shannon divergence (JSD)来计算生成样例和参考样例之间的相似性等。

在这里本文提出了新的评价指标。作者说在现有的评价指标中,不分开对shape geometry和kinematic structure的评价,大部分多是fix geometry评价kinematic structure,或者反过来fix kinematic structure而评价geometry,对于一些图生成工作,只评价其结构而不评价其几何。这里就提出了一种新的距离指标——Instantiation Distance(ID)来测量两个铰接物体之间的距离,同时考虑了部件几何和运动结构。

将铰接物体 O O O作为一个模板,给定合理关节范围内的所有关节状态 q ∈ Q O q∈Q_O qQO,将会得到一组铰接mesh M ( q ) M(q) M(q)和一组部件姿态 T ( q ) = T p a r t ∈ S E ( 3 ) T(q)={T_{part}∈SE(3)} T(q)=TpartSE(3),通过计算两个铰接物体不同关节状态下的距离通过:
在这里插入图片描述
其中, T I − 1 M 1 ( q 1 ) T_I^{-1}M_1(q_1) TI1M1(q1)意味着在第 i i i个部件姿态下的canonicalizing mesh, D D D则表示一个标准的Chamfer Distance用于测量两个静态mesh之间的距离。其实也就是说,这个指标也就是让两个铰接物体分别获得其所有姿态下的mesh,通过逐一衡量不同铰接物体两两姿态mesh之间的距离,求得一个最小值,感觉看到这里,会认为这并不算一种特别聪明的办法,就是一种暴力破解法。两个铰接物体之间的Instantiation distance被定义为:
在这里插入图片描述
q ∈ Q O q∈Q_{O} qQO意味着在关节范围内采样所有可能的joint pose以获得可能的kinematic structure。这个Instantiation distance实例化地测量了在所有可能的joint pose下,到另一个articulated object的最小期望距离。但这种做法在实践中是不可行的,因为有太多的计算消耗,每一个实例的articulated mesh都得计算出来,所以这里采用近似的办法,均匀地sample了M个关节状态 Q 1 = { q k ∣ q k ∈ U ( Q O 1 ) , k = 1 , . . . , M } Q_1=\{q_k|q_k∈U(Q_{O_1}),k=1,...,M\} Q1={qkqkU(QO1),k=1,...,M},并通过下式完成近似:
在这里插入图片描述
作者在论文中的所有评价均采用 M = 10 M=10 M=10。同时采样了其他3个常见的指标:Minimum matching distance(MMD)用以匹配生成质量,coverage(COV)用于测试参考集被覆盖的多少,1-nearest neighbor accuracy(1-NNA)通过1-nn分类精度来衡量两个分布之间的距离。

NAP捕捉到的铰接物体分布质量

这就是通过文章的方法来进行铰接物体的生成,并进一步使用评价指标来进行评估。
这里的baseline是在一些基于部件语义生成shape、基于场景图合成室内场景的一些方法上,equip with different generative method,例如auto-Decoding、VAE、Auto regressive、Latent Diffusion等。
在这里插入图片描述
Auto-Decoding:这种方法是直接将latent code通过一组MLP解码成一组Node features和一组Edge features,将这些feature通过论文里提出的Graph Attention Layers恢复出铰接图。
VAE:输入铰接图通过Graph Attention layers处理成一个latent code,再通过解码器解码出铰接图。就是一个encoder-decoder的形式。
Autoregressive(AR):这个方法是由3D室内场景合成得到的启发,在这种室内场景合成中,在迭代中不断生成场景中的物体。这里不再使用图的表达方式,而是使用如图所示的一种表达方式,其中的每一个slots由节点本身及指向其父亲的有向边组成,根节点则指向一个虚拟边。这个ATSS transformer的目标是预测给定的生成节点和生成边的混合分布,在每一次迭代的过程中预测出append到树的slot(包含节点和边的信息)。树的增长停止也由一个indicator进行指示。
Latent Diffusion(LD):这个方法是受到3D生成中广泛运用的latent space diffusion的启发,使用类似的方法进行baseline的构建。这里的Auto-Decoder部分和上面的Auto-Decoder是一样的,这种方法和论文的方法不同之处在于网络使用了一个带有跳跃连接的巨大的MLP在紧凑的latent space空间中进行预测和操作。我认为这种方法和文章的区别就是,这个latent code表示的是global object的信息,而文章中是对一个global object中的每一个part进行latent code的预测。
在这里插入图片描述
在这里插入图片描述

NAP是否足够高效?——消融实验

消融就是分别去除Positional Encoding位置编码、去除边注意力权重(就是去掉这种权重的计算方式)、去除Graph layer。
位置编码的重要性在于:在先前一些阶段,reverse diffusion还不能够分清楚nodes的时候,Positional Encoding位置编码能够提供帮助
边注意力权重的重要性:如果只使用平均池化的方法来作为权重,可能会导致不能够正确的聚集neighborhood的nodes信息,从而导致表现能力降低
Graph-layer的重要性:消融实验的时候使用PointNet中的全局池化层来替代,替代后,图的连接会被完全忽视,信息交换是通过全局池化进行的。

在这里插入图片描述

NAP可以做一些什么应用?

在这里插入图片描述
在这里插入图片描述
Part2Motion:证明了在已知静态部件的情况下, 使用NAP来生成kinematic structure。如Figure 5,可以生成不同的运动结构
PartNet Imagination:感觉像是对一些static object产生一些articulated的幻觉
Motion2Part:类似Part2Motion,这里是给定kinematic structure来生成static part(Node)
GAPart2Object:混合了一些Node和Edge的信息,来进一步生成其他part的一些信息,对于Edge好像是指定了axis的位置但不指定动量m,网络根据这个axis的位置生成任意的运动都是有可能的

5. 总结

Conclusion,通过几个关键字总结这篇文章:
做的事情:generation
手段:diffusion model
创新:articulation graph(一种参数化articulated object的方法),graph attention-denoising(这个不清楚是不是创新,但是是通过图注意力机制进行去噪的),Instantiation Distance(用于衡量两个铰接物体之间的Distance,一种新的度量)

限制和未来工作:

  1. 数据集里大部分都是具有较少parts的物体(很少有较多parts的物体),这导致生成模型偏向在一些较小的图上生成表现较好,较大的图中表现较差。进一步探索多parts的物体是有趣的研究方向
  2. 更加结构化的Diffusion(这个其实没太理解):diffusion可以通过引入离散化进行改进。作者提出了一些未来可行的方向:在中间步骤上应用MST,将diffusion约束到Plücker manifold下(?)
  3. 更强的joint condition:目前的方法里,node geometry属性会对网络有更强的影响。未来可以进一步探索加强joint condition的方法
  4. 进行物理合理的生成:有一些生成结果可能会违反物理规律,保证生成的结果在物理上合理也是很重要的

6. 其他补充

SE(3) transformation

这里问了一下GPT关于SE(3) transformation的信息,GPT解释如下:

SE(3) 转换是指特殊欧几里得群(Special Euclidean group)的三维版本。SE(3) 转换包括平移和旋转两个元素,用于描述三维空间中物体的位置和姿态变换。
在三维空间中,SE(3) 转换可以表示为一个 4x4 的矩阵,其中前三行前三列是旋转矩阵,表示物体的姿态变换,最后一列是平移矩阵,表示物体的位置变换。SE(3) 转换可以将一个点从一个坐标系转换到另一个坐标系,同时保持距离、角度等几何属性不变。
SE(3) 转换在计算机图形学、机器人学、计算机视觉等领域中广泛应用,用于表示物体的位姿、相机的位姿、坐标系的变换等。

Positional Encoding位置编码

参考了:【Transformer系列】深入浅出理解Positional Encoding位置编码
在这篇文章中,位置编码的运用是在网络输入的时候,通过位置编码在网络开始学习的时候为网络提供引导,我理解这里也就是通过位置编码进一步表示part和part之间的一种位置的关系,以帮助网络去理解这个铰接物体(图)

相关文章:

【计算机图形学】NAP: Neural 3D Articulation Prior

文章目录 1. 这篇论文做了什么事,有什么贡献?2. Related Work铰接物体建模3D中的Diffusion model扩散模型 3. Pipeline铰接树参数化基于Diffusion的铰接树生成去噪网络 4. 实验评价铰接物体生成——以往做法与本文提出的新指标NAP捕捉到的铰接物体分布质…...

知识付费平台搭建?找明理信息科技,专业且高效

明理信息科技知识付费saas租户平台 在当今数字化时代,知识付费已经成为一种趋势,越来越多的人愿意为有价值的知识付费。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。同时,开发和…...

CentOS7部署Kafka

CentOS7部署Kafka 一、部署1、前置条件2、下载与解压3、修改配置4、启动kafka二、使用详解1、创建一个主题2、展示所有主题3、启动消费端接收消息4、生产端发送消息三、代码集成pom.xmlapplication.propertiesKafkaConfiguration.javaKafkaConsumer.javaKafkaProducer.javaVehi…...

JS的防抖和节流

目录 防抖 搜索框带来的问题 实现的思路 案例 封装防抖函数 节流 滚动条加载带来的问题 实现的思路 案例 封装节流函数 防抖 搜索框带来的问题 需求&#xff1a;根据输入框内容来请求数据 <!DOCTYPE html> <html lang"en"> <head><…...

互联网加竞赛 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…...

pip安装报错SSL

confirming the ssl certificate: HTTPSConnectionPool(hostmirrors.cloud.tencent.com, port443) 错误代码如上 偶然搜索&#xff1a;ubuntu pip出错 confirming the ssl certificate: HTTPSConnectionPool(host‘mirrors.cloud.tencent.com’, port443) 看到这个回答 【日常踩…...

手机视频监控客户端APP如何实现跨安卓、苹果和windows平台,并满足不同人的使用习惯

目 录 一、手机视频监控客户端的应用和发展 二、手机视频监控客户端存在的问题 三、HTML5视频监控客户端在手机上实现的方案 &#xff08;一&#xff09;HTML5及其优点 &#xff08;二&#xff09;HTML5在手机上实现视频应用功能的优势 四、手机HTML5…...

从写下第1个脚本到年薪40W,我的自动化测试心路历程

我希望我的故事能够激励现在的软件测试人&#xff0c;尤其是还坚持在做“点点点”的测试人。 你可能会有疑问&#xff1a;“我也能做到这一点的可能性有多大&#xff1f;”因此&#xff0c;我会尽量把自己做决定和思考的过程讲得更具体一些&#xff0c;并尽量体现更多细节。 …...

Vue CLI组件通信

目录 一、组件通信简介1.什么是组件通信&#xff1f;2.组件之间如何通信3.组件关系分类4.通信解决方案5.父子通信流程6.父向子通信代码示例7.子向父通信代码示例8.总结 二、props1.Props 定义2.Props 作用3.特点4.代码演示 三、props校验1.思考2.作用3.语法4.代码演示 四、prop…...

C语言编译器(C语言编程软件)完全攻略(第九部分:VS2019使用教程(使用VS2019编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 九、VS2019使用教程&#xff08;使用VS2019编写C语言程序&#xff09; 继《八、VS2019下载地址和安装教程&#xff08;图解&#xff09;》之后&#xff0c;本节给大家讲解如何用 VS2019 编写并运行 C 语言程序。 例如&#xff0c;在…...

走向云原生 破局数字化

近年来&#xff0c;随着云计算概念和技术的普及&#xff0c;云原生一词也越来越热门&#xff0c;云原生成为云计算领域的新变量。行业内&#xff0c;华为、阿里巴巴、字节跳动等各个大厂都在“抢滩”云原生市场。行业外&#xff0c;云原生也逐渐出圈&#xff0c;出现在大众视野…...

spring常用注解(三)springbean类

一、Service用于标注业务层组件、 二、Repository用于标注数据访问组件&#xff0c;即DAO组件。 三、Component泛指组件&#xff0c;当组件不好归类的时候&#xff0c;我们可以使用这个注解进行标注。&#xff08;pojo&#xff09; 四、Scope用于指定scope作用域的&#xff…...

qiankun微服务

官网 &#x1f4e6; 基于 single-spa 封装&#xff0c;提供了更加开箱即用的 API。 &#x1f4f1; 技术栈无关&#xff0c;任意技术栈的应用均可 使用/接入&#xff0c;不论是 React/Vue/Angular/JQuery 还是其他等框架。 &#x1f4aa; HTML Entry 接入方式&#xff0c;让你接…...

文件夹重命名方法:提高效率减少错误,中英文批量翻译文件夹名称

在日常生活和工作中&#xff0c;经常要处理大量的文件夹&#xff0c;无论是整理电脑上的文件&#xff0c;还是为项目分类。如何快速、准确地重命名这些文件夹&#xff0c;对于提高工作效率和减少错误至关重要。现在来看下云炫文件管理器一些实用的文件夹重命名方法&#xff0c;…...

【PHP】where和whereOr一起复杂查询示例

在ThinkPHP 5 中&#xff0c;where 和 whereOr 方法可以一起使用以实现复杂的查询条件。以下是一个示例&#xff1a; // 接收的参数 $param $this->request->param();// 实例化 $query new UserModel();// 关联表 $query->with([collect > function($collect_qu…...

Mysql 动态链接库配置步骤+ 完成封装init和close接口

1、创建新项目 动态链接库dll 2、将附带的文件都删除&#xff0c;创建LXMysql.cpp 3、项目设置 3.1、预编译头&#xff0c;不使用预编译头 3.2、添加头文件 3.3、添加类 3.4、写初始化函数 4、项目配置 4.1、右键解决方案-属性-常规-输出目录 ..\..\bin 4.2、生成lib文件 右…...

哈希一致性算法

一致性哈希是什么&#xff0c;使用场景&#xff0c;解决了什么问题&#xff1f; #网站分配请求问题&#xff1f; 大多数网站背后肯定不是只有一台服务器提供服务&#xff0c;因为单机的并发量和数据量都是有限的&#xff0c;所以都会用多台服务器构成集群来对外提供服务。 但…...

基于SpringBoot的在线考试系统绿色

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的在线考试系统绿色,java…...

设计模式:原型模式

原型模式 定义代码实现使用场景 定义 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许通过复制现有的对象来创建新对象&#xff0c;而无需从头开始编写代码。在这个模式中&#xff0c;我们可以使用已经存在的对象作为“原型”&…...

Qt5+VS2013兼容XP方法

用Qt5VS2013编译程序默认配置会在XP运行时报"不是有效的Win32程序" 工作需要必须要XP运行 pro文件中加一句: QMAKE_LFLAGS_WINDOWS /SUBSYSTEM:WINDOWS,5.01 ------------------------------------------------------- qtbase\mkspecs\common\msvc-desktop.conf …...

GitHub Copilot 最佳免费平替:阿里通义灵码

之前分享了不少关于 GitHub Copilot 的文章&#xff0c;不少粉丝都评论让我试试阿里的通义灵码&#xff0c;这让我对通义灵码有了不少的兴趣。 今天&#xff0c;阿七就带大家了解一下阿里的通义灵码&#xff0c;我们按照之前 GitHub Copilot 的顺序分享通义灵码在相同场景下的…...

体系化的进阶学习内容

UWA学堂&#xff1a;传播游戏行业的体系化的进阶学习内容。UWA学堂作为面向开发者的在线学习平台&#xff0c;目前已经上线272门课程&#xff0c;涵盖了3D引擎渲染、UI、逻辑代码等多个模块&#xff0c;拥有完整的学习体系&#xff0c;一直致力于为广大的开发者提供更丰富、更优…...

SpringBoot解决前后端分离跨域问题:状态码403拒绝访问

最近在写和同学一起做一个前后端分离的项目&#xff0c;今日开始对接口准备进行 登录注册 的时候发现前端在发起请求后&#xff0c;抓包发现后端返回了一个403的错误&#xff0c;解决了很久发现是【跨域问题】&#xff0c;第一次遇到&#xff0c;便作此记录✍ 异常描述 在后端…...

【linux】更改infiniband卡在Debian系统的网络接口名

在Debian或任何其他基于Linux的系统中&#xff0c;网络接口的名称由udev系统管理。通过创建udev规则&#xff0c;可以修改网络接口名称。以下是更改InfiniBand卡接口名称的一般步骤&#xff1a; 1. 找到网络接口的属性&#xff0c;以编写匹配的udev规则 可以使用udevadm命令查…...

SPRING BOOT发送邮件验证码(Gmail邮箱)

SPRING BOOT邮件发送验证码 一、Gmail邮箱配置 1、进入Gmail(https://mail.google.com) 2、打开谷歌右上角设置 3、启用POP/IMP 4、启用两步验证(https://myaccount.google.com/security) 5、建立应用程式密码 6、复制保存应用程式密码 二、代码 1、引入依赖 <d…...

Liunx安装FTP和SFTP

ftp端口&#xff1a;20/21 sftp端口&#xff1a;22 一、ftp 1、安装ftp yum install vsftpd #安装ftp 服务 &#xff08;1&#xff09;查看ftp服务的状态 命令&#xff1a;service vsftpd status PS&#xff1a;提示vsftpd: command not found&#xff0c;修改PATH的环境…...

【Mars3d】new mars3d.layer.GeoJsonLayer({不规则polygon加载label不在正中间的解决方案

问题&#xff1a; 1.new mars3d.layer.GeoJsonLayer({type: "polygon",在styleOptions里配置label的时候&#xff0c;发现这个 不规则polygon加载的时候&#xff0c;会出现label不在中心位置。 graphicLayer new mars3d.layer.GeoJsonLayer({ name: "全国省界…...

怎么快速修复mfc140.dll文件?解决mfc140.dll缺失的方法

面对计算机报告的 ​mfc140.dll​ 文件遗失错误&#xff0c;这通常表明系统中缺少一个关键的动态链接库文件&#xff0c;该文件对于运行以 Microsoft Foundation Class (MFC) 库编写的程序十分重要&#xff0c;尤其是那些需要图形界面的应用程序和一些游戏。若没有这个文件&…...

安全防御之入侵检测与防范技术

安全防御中的入侵检测与防范技术主要涉及到入侵检测系统&#xff08;IDS&#xff09;和入侵防御技术&#xff08;IPS&#xff09;。 入侵检测系统&#xff08;IDS&#xff09;是一种对入侵行为自动进行检测、监控和分析的软件与硬件的组合系统。IDS通过从计算机网络或系统中的若…...

Leetcode2807. 在链表中插入最大公约数

Problem: 2807. 在链表中插入最大公约数 文章目录 题目思路注意点Code 题目思路 模拟插入流程&#xff1a; 检测当前节点是否有后置结点&#xff1b;将当前结点与后置结点的值做最大公约数处理得到新结点的值&#xff0c;然后插入到当前结点之后&#xff1b;再将检测结点向后…...

帝国cms建设 政府网站/搜索引擎网站排名优化方案

一、引言 Mybatis可以直接传入一个集合&#xff0c;通过标签将集合中的数据遍历出来实现批量新增 不同的数据库批量新增有区别&#xff0c;如下实现两种方式的批量新增 二、实现 2.1映射文件 <!--单条插入 --><insert id"insertOne" parameterType"…...

mac 网站开发软件有哪些/无锡谷歌推广

走出软件作坊&#xff1a;三五个人十来条枪 如何成为开发正规军&#xff08;一&#xff09; 走出软件作坊&#xff1a;三五个人十来条枪 如何成为开发正规军&#xff08;二&#xff09;走出软件作坊&#xff1a;三五个人十来条枪 如何成为开发正规军&#xff08;三&#xff09;…...

腾宁科技做网站399元全包/如何做seo搜索引擎优化

Java 设计模式 Prototype 原型 模式 Prototype 模式用于不能根据类来来生产实例时&#xff0c;而根据现有的实例来生成新的实例。 原型&#xff1a;负责定义用于复制现有实例来生成新实例的方法。具体的原型&#xff1a;负责实现复制现有实例并生成新实例的方法。使用者&#x…...

重庆公司网站建设价格/邀请推广app

Fornite for Android is here, but for now it only works on certain devices. Here’s the list—is your phone on it? Android版Fornite在这里&#xff0c;但目前仅适用于某些设备。 这是清单-您的手机在上面吗&#xff1f; We’ve outlined how to install Fornite for …...

建立个人网站的目的/网络推广入门教程

8.0很讨厌 https://answers.launchpad.net/fuel/question/287809 意思是&#xff0c;公钥不影响...

贷款网站模板/西安百度推广客服电话多少

JAVA中字符串函数subString的用法小结 作者&#xff1a; 字体&#xff1a;[增加 减小] 类型&#xff1a;转载 时间&#xff1a;2014-02-11 我要评论 本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍&#xff0c;需要的朋友可以过来参考下&#xff0c;希望对大…...