Monocular 3D Object Detection with Depth from Motion 论文学习

论文链接:Monocular 3D Object Detection with Depth from Motion

1. 解决了什么问题?

从单目输入感知 3D 目标对于自动驾驶非常重要,因为单目 3D 的成本要比多传感器的方案低许多。但单目方法很难取得令人满意的效果,因为单张图像并没有提供任何关于深度的信息,该方案实现起来非常困难。

Two view 场景有两个问题:

  • 多项预测的错误累积起来,使直接的深度预测变得非常困难;
  • 静止状态的相机和运动状态下匹配的模糊性。

2. 提出了什么方法?

受到 3D 目标检测双目方案的启发,本文利用了相机帧间运动(ego-motion)提供的强几何结构关系,进行准确的目标深度估计和检测。其基本原则与双目方法中的深度估计类似。在双目方法中,两个相机被严格约束在同一个平面上,它们之间的距离固定,这个距离就是 baseline。目前的立体 3D 检测方法将该 baseline 作为重要线索,将深度估计问题转换成较容易解决的视差估计问题。类似地,时序上相邻的两帧画面也具有立体匹配关系,但它们的 baseline 是不固定的,依赖于相机的帧间运动。
作者通过具有几何关系的 cost volume 构建立体匹配,作为深度估计的替代方案,用单目理解做进一步的补充,以解决第二个问题。本文提出的 Depth from Motion 使用几何关系将 2D 图像特征提升为 3D 特征, 然后再检测 3D 目标。我们先将复杂的几何关系包含在 cost volume 里面,进行立体估计。为了保证它对任意增广的输入都合理,作者设计了一套流程,在标准空间(即 canonical space)内做姿态变换。此外,作者使用另一个单目 pathway 做补充,用可学习的权重将它们融合起来。

2.1 理论分析

分析了通用的立体深度估计方法。

2.1.1 Object Depth from Binocular Systems

双目方法明确要求两个相机处于同一平面。如下图(a)所示,两个相机的焦距和它们之间的距离(即 baseline)是固定的。根据相机小孔成像模型和相似三角形定理,我们有
d f = b D ⇒ D = f b d \frac{d}{f}=\frac{b}{D}\Rightarrow D=f\frac{b}{d} fd=DbD=fdb
在这里插入图片描述

其中 d d d是两张图像之间在水平方向的视差, f f f是相机的焦距, D D D是目标的深度, b b b是 baseline。根据上式,目标深度估计可以变换为一个容易解决的视差估计问题。

2.1.2 Object Depth from General Two-View Systems

用双目方法来估计目标的深度,依赖于 two-view 立体几何关系。视频里相邻的两帧也具有类似的立体匹配关系。那么我们能否使用 two-view 几何信息来预测目标的深度?

作者将双目方法的几何关系一步步地扩展到通用的 two-view 场景。假设相机在 t 1 t_1 t1 t 2 t_2 t2时刻的位置不相同,而且我们知道相机在每个位置的参数。

首先,我们先假设所有的物体是静止的,后面再考虑物体运动的状况。如上图(b)所示,假设相机运动只涉及平移。从相机姿态的变换中可以得到 Δ x \Delta{x} Δx Δ D \Delta{D} ΔD,在这个平行的例子中,two-view 几何关系满足:

u 1 − c u f = x 1 D 1 , u 2 − c u f = x 2 D 2 , Δ x = x 1 − x 2 , Δ D = D 1 − D 2 \frac{u_1-c_u}{f}=\frac{x_1}{D_1},\quad\quad \frac{u_2-c_u}{f}=\frac{x_2}{D_2},\quad\quad \Delta{x}=x_1-x_2,\quad\quad \Delta{D}=D_1-D_2 fu1cu=D1x1,fu2cu=D2x2,Δx=x1x2,ΔD=D1D2

( u 1 , v 1 ) (u_1,v_1) (u1,v1) ( u 2 , v 2 ) (u_2,v_2) (u2,v2)是两张图像中两个对应的点, D 1 , D 2 D_1,D_2 D1,D2是它们的深度值, x 1 , x 2 x_1,x_2 x1,x2是它们在 3D 空间 x x x轴的位置。于是推导得到:

D 1 = f ( Δ x − u 2 − c u f Δ D ) u 1 − u 2 = Δ D = 0 f Δ x u 1 − u 2 D_1=\frac{f(\Delta{x}-\frac{u_2-c_u}{f}\Delta{D})}{u_1-u_2}\overset{\Delta{D}=0}{\xlongequal{\quad\quad}} \frac{f\Delta{x}}{u_1-u_2} D1=u1u2f(Δxfu2cuΔD) ΔD=0u1u2fΔx

双目方法中的几何关系就是其特殊情况,即 Δ D = 0 \Delta{D}=0 ΔD=0

如上式所示,与双目方法不同,这里的 baseline 不再是固定的,而是依赖于相机的自身运动 Δ x , Δ D \Delta{x}, \Delta{D} Δx,ΔD以及目标的绝对位置 u 2 u_2 u2。因此,目标的深度估计除了依赖于视差 u 1 − u 2 u_1-u_2 u1u2,也依赖于这些因素。

为了更好地理解,作者在 KITTI 基准上以双目方法举例,进行定量比较。一个合理的 baseline 不应过大或过小。Baseline 过大会造成两张图像重叠区域很小;baseline 过小会造成视差非常小,深度估计错误就会增大。所以作者以双目 baseline (KITTI 中是 0.54 m 0.54m 0.54m)为例,用 Δ x − u 2 − c u f Δ D \Delta{x}-\frac{u_2-c_u}{f}\Delta{D} Δxfu2cuΔD得到。因为水平平移距离 Δ x \Delta{x} Δx通常要远远小于 0.54 m 0.54m 0.54m,我们就需要沿着深度方向 ( Δ D ) (\Delta{D}) (ΔD)平移较大的距离,并与 2D 相机中心点保持较远的水平距离 ( u 2 − c u ) (u_2-c_u) (u2cu),从而使 baseline 足够大,适合做立体匹配。例如,为了得到一个 0.54 m 0.54m 0.54m的 baseline,当 Δ D = 5.4 m , f = 700 \Delta{D}=5.4m, f=700 ΔD=5.4m,f=700像素时,我们需要 u 2 − c u = 70 u_2-c_u=70 u2cu=70
Δ D = 2.7 m \Delta{D}=2.7m ΔD=2.7m时,我们需要 u 2 − c u = 140 u_2-c_u=140 u2cu=140。这就是说,对于远离中线的物体,估计会更加准确,不然就可能会遇到问题。

有了这些基础,上图 c 在视差计算中,引入了与目标绝对位置有关的旋转系数,而上图(d) 则引入了相对平移和旋转系数。绝对位置和运动估计的误差越多,深度估计就越发困难。

2.1.3 Achilles Heel of Depth from Motion

依据上面的分析,在 two-view 方法中,直接推导深度信息会牵扯到多项估计,如目标的绝对位置和运动,这些错误累积起来会非常棘手。此外,有多个场景是基于立体的方法无法解决的,比如静态相机没有 baseline,匹配低纹理区域存在的模糊性问题。

因此,受到双目方法的启发,作者将复杂的几何关系包含在一个 plane-sweep cost volume 里面,作为立体匹配的替代方案:考虑到我们无法直接从视差估计深度,于是为每个像素点提供候选的深度值,将这些 2.5 D 2.5D 2.5D点反投到另一帧,再根据像素特征的相似度,学习哪一个深度值是最可能的。此外,为了解决第二个问题,作者引入了用于单目理解的 path,弥补立体估计的缺陷。

2.2 方法

3D 目标检测流程通常包含三个阶段:从输入图像提取特征、将特征上升到 3D 空间、最后检测 3D 目标。下图展示了本文的整体架构,提出了两个关键设计:含有几何信息的 cost volume 和用于立体估计的单目补偿。
在这里插入图片描述

2.2.1 Overview

2D Feature Extraction

受到双目方法启发,给定两张输入图像 ( I t , I t − δ t ) (I_t,I_{t-\delta{t}}) (It,Itδt),首先使用 2D 主干网络提取特征 ( F t , F t − δ t ) (\mathcal{F}_t,\mathcal{F}_{t-\delta{t}}) (Ft,Ftδt)

2D 主干网络使用的是带空间金字塔池化及特征上采样的 ResNet-34。其上面接着一个小型的 U-Net,将 SPP 特征图上采样至全分辨率。使用两种 necks,一个输出几何特征 F t F_t Ft做立体匹配,一个输出语义特征 F s e m F_{sem} Fsem。为保证 F s e m F_{sem} Fsem能得到正确的监督信号, F s e m F_{sem} Fsem也用于辅助的 2D 检测。

Stereo Matching and View Transformation

用预定义的离散深度层级提升 F t \mathcal{F}_t Ft,得到立体空间的 F m o n o s t \mathcal{F}_{mono}^{st} Fmonost,用于后续的单目理解。
得到 ( F t , F t − δ t ) (\mathcal{F}_t,\mathcal{F}_{t-\delta{t}}) (Ft,Ftδt)之后,我们通过它们之间的姿态变换构建出 stereo cost volume F s t e r e o s t \mathcal{F}_{stereo}^{st} Fstereost。用一个 dual-path 3D 聚合网络对这两个 volumes 做过滤,估计深度分布 volume D P D_P DP D P ( u , v , : ) D_P(u,v,:) DP(u,v,:)代表了像素 ( u , v ) (u,v) (u,v)在所有深度层级的分布。使用投影的 LiDAR 点云来监督该深度的预测。

然后用 D P D_P DP来提升语义特征 F s e m \mathcal{F}_{sem} Fsem。再将其和几何立体特征 P f u s e P_{fuse} Pfuse结合,即最终的立体特征,再从其中采样体素特征。如上图所示,这个过程将立体空间的特征变换到体素空间,体素空间结构规整,更适合做目标检测。

Voxel-Based 3D Detection

融合通道维度和高度维度,将 3D 特征 V 3 D V^{3D} V3D变换到 BEV 空间,使用 2D hourglass 网络聚合 BEV 特征。最终,用一个轻量的 head 预测 3D 框和类别。训练损失包括两个部分:深度回归损失、2D/3D 检测损失。

2.2.2 Geometry-Aware Stereo Cost Volume Construction

立体匹配的关键部分就是 cost volume。与双目场景不同,两帧之间的姿态变换是刚性的,由平移和旋转组成。这个差异影响了其构建 cost volume,很难对输入数据做增广。

对于立体 volume 的每个位置 x = ( u , v , w ) \mathbf{x}=(u,v,w) x=(u,v,w),我们可以推导出反投影矩阵 W \mathcal{W} W,将 F t − δ t \mathcal{F}_{t-\delta{t}} Ftδt变形(warp)至第 t t t帧,然后与相应的特征 concat:

F s t e r e o s t ( u t , v t , w t ) = concat [ F t ( u t , v t ) , F t − δ t ( u t − δ t , v t − δ t ) ] \mathcal{F}_{stereo}^{st}(u_t,v_t,w_t)=\text{concat}\left[\mathcal{F}_t(u_t,v_t), \mathcal{F}_{t-\delta{t}}(u_t-\delta{t},v_t-\delta{t})\right] Fstereost(ut,vt,wt)=concat[Ft(ut,vt),Ftδt(utδt,vtδt)]

( u t − δ t , v t − δ t , d ( w t − δ t ) ) T = W ( u t , v t , d ( w t ) ) T , W = K T K − 1 (u_{t-\delta{t}},v_{t-\delta{t}}, d(w_t-\delta{t}))^T=\mathcal{W}(u_t,v_t,d(w_t))^T,\quad\quad \mathcal{W}=KTK^{-1} (utδt,vtδt,d(wtδt))T=W(ut,vt,d(wt))T,W=KTK1

这里 ( u t , v t , w t ) (u_t,v_t,w_t) (ut,vt,wt) ( u t − δ t , v t − δ t , w t − δ t ) (u_{t-\delta{t}}, v_{t-\delta{t}},w_{t-\delta{t}}) (utδt,vtδt,wtδt)代表两帧的立体空间的像素坐标。计算相应深度的式子是 d ( w ) = w ⋅ Δ d + d m i n d(w)=w\cdot \Delta{d}+d_{min} d(w)=wΔd+dmin Δ d \Delta{d} Δd是划分的深度间隔, d m i n d_{min} dmin是检测范围内的最小深度值。 W \mathcal{W} W是反投影矩阵,将内参矩阵 K K K、自车运动(刚性变换) T T T K − 1 K^{-1} K1相乘得到,这里假定两帧的内参矩阵相同。作者发现,任意的数据增广,如图像缩放和翻转,都能影响反投矩阵 W \mathcal{W} W的合理性。从增广图像构建 geometry-aware stereo cost volume 并不简单。

因此,作者设计了一个方法来解决该问题。如下图(a),需要在两个增广的图像特征 ( F t , F t − δ t ) (\mathcal{F}_t, \mathcal{F}_{t-\delta{t}}) (Ft,Ftδt)中找到对应的特征。核心思想就是保证 warp 变换是在 3D 真实世界(即标准空间)中进行。例如,如果我们对输入的两张图片进行翻转、缩放和裁剪操作,首先要将预先定义的深度层级附加到 F t \mathcal{F}_t Ft里每个 2D 网格坐标的后面,将每个 2.5 D 2.5D 2.5D坐标提升为 3 D 3D 3D。变换时,通过修改内参矩阵 K K K(缩放和裁剪操作等比例对应着相机的焦距和中心点坐标),可以抵消缩放和裁剪造成的影响。然后,翻转立体网格 G ~ t s t \tilde{G}_t^{st} G~tst,得到标准空间的 G t s t G_t^{st} Gtst。对新网格做姿态变换,得到 G t − δ t s t G_{t-\delta{t}}^{st} Gtδtst,将它投影到 2 D 2D 2D平面,得到若干个 G ~ t − δ t \tilde{G}_{t-\delta{t}} G~tδt网格图。最后,再对 G ~ t − δ t \tilde{G}_{t-\delta{t}} G~tδt做一遍图像增广,就可以采样相应的特征了。

这样,我们就能对输入图像做任意的增强,而不会影响到 ego-motion 变换的内在合理性。
在这里插入图片描述

2.2.3 Monocular Compensation

立体深度估计和单目深度估计的底层逻辑是不同的:立体估计依赖于匹配,而单目估计则依赖于数据驱动的先验信息,和对一张图像的语义与几何信息的理解。如上所述,有一些场景是立体估计也无法处理的。因此,作者加入了单目上下文的先验,以补充立体深度估计的缺陷。

如上图(b) 所示,使用了两个 3D hourglass 网络,分别聚合单目和立体特征。这两个 path 的网络有着相同的结构,但 F m o n o s t \mathcal{F}_{mono}^{st} Fmonost的输入通道数是 F s t e r e o s t \mathcal{F}_{stereo}^{st} Fstereost的一半。这样在立体空间,我们就有了两个形状一样的特征 volumes P m o n o P_{mono} Pmono P s t e r e o P_{stereo} Pstereo。为了聚合这俩特征,作者设计了一个简单而有效的机制。首先,将 P m o n o P_{mono} Pmono P s t e r e o P_{stereo} Pstereo concat 起来,输入进一个简单的 2D 1 × 1 1\times 1 1×1卷积网络,沿着深度通道聚合,将通道从 2 D 2D 2D压缩为 D D D。然后将该特征输入 sigmoid 函数,得到权重 ω f u s e \mathcal{\omega}_{fuse} ωfuse,它指导如何融合 P m o n o P_{mono} Pmono P s t e r e o P_{stereo} Pstereo。卷积网络记做 ϕ \phi ϕ,计算过程如下:

ω f u s e = σ ( ϕ ( P m o n o , P s t e r e o ) ) , P f u s e = ω f u s e ∘ P s t e r e o + ( 1 − ω f u s e ) ∘ P m o n o \mathcal{\omega}_{fuse}=\sigma(\phi(P_{mono},P_{stereo})),\quad\quad P_{fuse}=\omega_{fuse}\circ P_{stereo}+(1-\omega_{fuse})\circ P_{mono} ωfuse=σ(ϕ(Pmono,Pstereo)),Pfuse=ωfusePstereo+(1ωfuse)Pmono

这里 σ \sigma σ表示 sigmoid 函数, ∘ \circ 表示逐元素相乘。将立体特征 P f u s e P_{fuse} Pfuse输入 softmax 函数,然后直接用于预测深度分布,再输入进后续网络做 3D 检测。

这个设计简洁、高效。图像上每个位置的权重分布都由单目和立体的深度分布得到。可以通过可视化 ω f u s e \omega_{fuse} ωfuse权重,来验证本方法的有效性。

2.2.4 Pose-Free Depth from Motion

这样我们就有了一个统一的架构,从连续帧进行深度估计并检测 3D 物体了。在双目场景中,自车姿态(如 baseline)是一个重要信息。给定姿态变换,我们就能估计出深度信息。尽管在实际使用时很容易获取姿态,作者仍提供了一个无需姿态的方案。这对移动设备很重要。

学习姿态的关键在于目标的表达形式。任意刚性姿态变换都可解耦成平移和旋转,各自有三个自由度。以前的工作通常是回归三维平移量和三个欧拉角。回归平移量 t t t很直接。对于旋转角度的回归,则使用了一个单位四元组 q \mathbf{q} q来表示旋转角度目标。

姿态解码器网络的输出是一个七维向量,包括三维平移量和四维未归一化的四元组。解码器包括一个 bottleneck 层和三个卷积层。基线模型用 L1 损失进一步监督输出:

L t = ∥ t − t ^ ∥ 1 , L r = ∥ q − q ^ ∥ q ^ ∥ ∥ 1 , L p o s e = L t + λ r L r \mathcal{L}_{t}=\left\|\mathbf{t-\hat{t}}\right\|_1,\quad\quad \mathcal{L}_r=\left\|\mathbf{q-\frac{\hat{q}}{\left\|\hat{q}\right\|}}\right\|_1,\quad\quad \mathcal{L}_{pose}=\mathcal{L}_t+\lambda_r \mathcal{L}_r Lt= tt^ 1,Lr= qq^q^ 1,Lpose=Lt+λrLr
这个损失有多个问题:

  • 需要对不同的场景调整权重 λ r \lambda_r λr,代价比较高;
  • 用两张图片直接回归 3D eog-motion 有域差异问题;
  • 训练时仍然需要姿态标注信息,并非完全不需要姿态信息。

因此,作者使用了一个自监督损失。该损失包括一个外观匹配损失 L p \mathcal{L}_p Lp和深度平滑损失 L s \mathcal{L}_s Ls
L p o s e ( I t , I t − δ t ) = L p ( I t , I t − δ t → t ) + λ s L s \mathcal{L}_{pose}(I_t,I_{t-\delta{t}})=\mathcal{L}_p(I_t, I_{t-\delta{t}\rightarrow t})+\lambda_s \mathcal{L}_s Lpose(It,Itδt)=Lp(It,Itδtt)+λsLs

这里 I t − δ t → t I_{t-\delta{t}\rightarrow t} Itδtt表示第 t t t帧合成了第 t − δ t t-\delta{t} tδt帧的图像、深度和预测的姿态。 L p , L s \mathcal{L}_p, \mathcal{L}_s Lp,Ls定义如下:

L p ( I t , I t − δ t → t ) = α 2 ( 1 − SSIM ( I t , I t − δ t → t ) ) + ( 1 − α ) ∥ I t − I t − δ t → t ∥ \mathcal{L}_p(I_t, I_{t-\delta{t}\rightarrow t})=\frac{\alpha}{2}(1-\text{SSIM}(I_t, I_{t-\delta{t}\rightarrow t}))+(1-\alpha)\left\|I_t-I_{t-\delta{t}\rightarrow t}\right\| Lp(It,Itδtt)=2α(1SSIM(It,Itδtt))+(1α)ItItδtt
L s ( D ^ t ) = ∣ δ x D ^ t ∣ e − ∣ δ x I t ∣ + ∣ δ y D ^ t ∣ e − ∣ δ y I t ∣ \mathcal{L}_s(\hat{D}_t)=|\delta_x \hat{D}_t|e^{-|\delta_x I_t|}+|\delta_y \hat{D}_t|e^{-|\delta_y I_t|} Ls(D^t)=δxD^teδxIt+δyD^teδyIt

L p \mathcal{L}_p Lp是用 Structural Similarity (SSIM) 项和 L1 损失项构成。 L s \mathcal{L}_s Ls在低纹理梯度区域( δ x , δ y \delta_x,\delta_y δx,δy值较小),用于正则化预测深度图 D ^ t \hat{D}_t D^t。作者使用了激光雷达信号来监督深度值的学习,而只用了自监督损失来学习姿态。由于是用绝对深度值来监督学习深度信息,我们就能够得到姿态信息,即便没有姿态的标注。

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

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

相关文章

NAT技术是什么?谈谈它的实现方式、优缺点以及作用

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 前言 随着网络的不断发展,网络的应用也越来越多,有限的IPV4地址就显得不怎么够用,所以出现了NAT技术&…

Rust 数据类型 之 结构体(Struct)

目录 结构体(Struct) 定义与声明 结构体定义 结构体实例 结构体分类 单元结构体(Unit Struct) 元组结构体(Tuple Struct) 具名结构体(Named Struct) 结构体嵌套 结构体方法…

jenkins war包 centos启动安装指导

文章目录 步骤1:进入官网,下载到Jenkins的war包1.1 放置在指定位置1.2 放置安装包和创建文件放置路径1.3 检查环境1.4 配置启动命令和结束命令 步骤2: 启动后进入到Jenkins页面2.1 安装插件,例如流水线2.2 依然出现安装插件失败的…

疑问:为什么我的手机不能同时放两张电信卡呢?联通移动可以

很多后台的小伙伴私信我:“为什么我的双卡双待手机不能用两张电信卡呢?”其实我一直在认真的去查证这个问题,因为现在普遍网上的大流量手机卡套餐,电信是主力,如果第一张卡是电信,第二张卡不能使用电信了&a…

公网访问的Linux CentOS本地Web站点搭建指南

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道,指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…

ES6基础知识一:说说var、let、const之间的区别

一、var 在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量 注意:顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象 var a 10; console.log(window.…

uview2.0使用u-calendar 的formatter属性,在formatter方法里无法访问this的bug,解决办法!!!!

uview 版本2.0.36 文档 使用该文档的案例,在 formatter打印this也会是undefined。 自己写了个demo 父给子传值v-bind传一个函数,然后在这个函数里面打印this,this是子组件的实例,但是不知道为什么formatter里会打印undefined。希…

微服务 云原生:搭建 K8S 集群

为节约时间和成本,仅供学习使用,直接在两台虚拟机上模拟 K8S 集群搭建 踩坑之旅 系统环境:CentOS-7-x86_64-Minimal-2009 镜像,为方便起见,直接在 root 账户下操作,现实情况最好不要这样做。 基础准备 关…

IntelliJ IDEA Copyright添加

IDEA代码文件的版权(copyright)信息配置 1. 快速创建Copyright 版权配置文件 1.1 创建copyright文件 依次点击 File > Settings… > Editor > Copyright > 点击 “” 号或 “Add profile”***,弹出创建 Copyright Profile 操作窗口,在***文…

低代码如何帮助企业数字化转型?

在数字化时代背景下,企业都面临着巨大的数字化转型挑战。为了迎接这一挑战,企业软件开发工具和平台都在不断地创新和进化。其中,低代码开发平台应运而生,并成为了众多企业转型的首选方案。企业为什么都选择低代码开发平台&#xf…

【基于CentOS 7 的NFS服务】

目录 一、概述 二、应用场景 三、安装 四、启动服务 五、目录结构 1.nfs的主配置文件 2.存储配置文件 六、命令解析 1.共享存储管理命令 2.共享目录查看 七、配置 八、客户端访问 1.查看nfs服务器的共享目录 2.挂载 九、实际案例 一、概述 network filesystemt…

【GitOps系列】使用Kustomize和Helm定义应用配置

文章目录 使用 Kustomize 定义应用改造示例应用1.创建基准和多环境目录2.环境差异分析3.为 Base 目录创建通用 Manifest4.为开发环境目录创建差异 Manifest5.为预发布环境创建差异 Manifest6.为生产环境创建差异 Manifest 部署 Kustomize 应用部署到开发环境部署到生产环境 使用…

Flink笔记

Flink笔记 2.Flink学习笔记2.1流式处理对比2.2 Flink核心概念2.2.1并行度2.2.2算子链2.2.3任务槽 2.3 DataStream2.3.2 读取数据源-源算子(Source)2.3.3 转换算子(Transformation) 2.Flink学习笔记 2.1流式处理对比 学习Spark S…

ubuntu22.04上如何创建有privilege权限,有固定自定义IP的空容器

需求背景: 我想用docker来隔离自己的主机环境,来创建一个隔离的空白全新的开发环境,并且使之有固定的IP,在里面可以自由更新下载各种编译依赖,具有privileged权限的容器,以下是操作实现的具体步骤 查看do…

1.12 springboot 整合log4j打印日志

1.除去springboot自带的日志 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><!-- 除去springboot自带的日志 --><exclusion><groupId>org.sprin…

在vscode中运行Hbuilder创建的项目

想必习惯使用vscode的人突然使用HBuilder很不习惯吧&#xff0c;但是HBuilder创建的项目本身没有调试功能。当你有一个app项目但又不想使用HBuilder编写&#xff0c;需要浏览器调试的时候&#xff0c;你这时就需要一个插件了&#xff1a;uni run 插件 基于HBuilderX的采用unia…

JVM运行时区域——对象创建内存分配过程

新创建的对象&#xff0c;都存放在伊甸园区域&#xff0c;当垃圾回收时&#xff0c;将伊甸园区域的垃圾数据销毁&#xff0c;然后将存活的对象转移到幸存者0区域&#xff0c;之后创建的新的对象还是存放在伊甸园区域&#xff0c;等到再次垃圾回收后&#xff0c;将伊甸园区域和幸…

Aurix TC3xx系列MCU ADC采集时间计算方法(四)

文章目录 1 前言2 各阶段时间的计算方法2.1 计算公式2.2 采样阶段2.3 转换阶段2.4 降噪阶段2.5 校准阶段3 采集时间示例>>返回总目录<< 1 前言 在项目开发前期评估阶段,会比较关注ADC的采集时间,我们可以给出一个大概的采样的时间0.5us~1.2us左右,但是对于精确…

SpringCloud nacos 集成 feign 实例

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

创建型设计模式-4.原型设计模式

创建型设计模式-4.原型设计模式 原型设计模式&#xff08;Prototype Design Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在通过复制现有对象来创建新对象&#xff0c;而不是通过使用构造函数进行创建。它允许我们通过克隆&#xff08;复制&#xff09;现有对象的实…