论文笔记(五十六)VIPose: Real-time Visual-Inertial 6D Object Pose Tracking
VIPose: Real-time Visual-Inertial 6D Object Pose Tracking
- 文章概括
- 摘要
- I. INTRODACTION
- II. 相关工作
- III. APPROACH
- A. 姿态跟踪工作流程
- B. VIPose网络
文章概括
引用:
@inproceedings{ge2021vipose,title={Vipose: Real-time visual-inertial 6d object pose tracking},author={Ge, Rundong and Loianno, Giuseppe},booktitle={2021 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},pages={4597--4603},year={2021},organization={IEEE}
}
Ge, R. and Loianno, G., 2021, September. Vipose: Real-time visual-inertial 6d object pose tracking. In 2021 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS) (pp. 4597-4603). IEEE.
原文:https://ieeexplore.ieee.org/abstract/document/9636283
代码、数据和视频:https
系列文章:
请在 《 《 《文章 》 》 》 专栏中查找
摘要
估计物体的6D姿态对于运输、自动导航、操纵等机器人任务非常有益,同时在虚拟现实和增强现实等超越传统机器人的场景中也同样重要。相对于单张图片的姿态估计,姿态跟踪考虑了跨多个帧的时间信息,以克服可能的检测不一致并提高姿态估计的效率。在这项工作中,我们介绍了一种名为VIPose的新型深度神经网络(DNN),该网络结合惯性和摄像机数据来实时解决物体姿态跟踪问题。主要贡献是设计了一种新型的DNN架构,该架构融合视觉和惯性特征来预测连续图像帧之间物体的相对6D姿态。然后通过连续组合相对姿态来估计总体的6D姿态。我们的方法在处理由现有最先进解决方案难以处理的严重遮挡的物体时显示出了显著的姿态估计结果。所提出方法的有效性在一个新的数据集VIYCB上得到了验证,该数据集包括RGB图像、IMU数据和通过自动化标记技术创建的准确的6D姿态注释。这种方法展示了与最先进技术相当的准确性表现,但额外的好处是实时性。
I. INTRODACTION
从RGB图像序列跟踪物体的6D姿态(即,估计每一帧中物体相对于相机的3D平移和旋转),是各种机器人应用中的重要任务。这可以提高机器人在各种室外和室内环境中的导航性能,以解决复杂任务,如检查、制图和搜索救援。它还可以用于物体操纵任务的规划和抓取、空中电影摄影以跟踪移动目标,以及在虚拟现实(VR)和增强现实(AR)等超出机器人学的场景中使用。从单张RGB图像估计物体的6D姿态已经被广泛研究。传统方法通过图像和3D物体模型匹配物体的关键点[1]-[3]。最近基于深度学习的方法显著提高了姿态估计的准确性和鲁棒性[4]-[11]。一些单图像姿态估计方法是实时的(30 Hz),但准确性有限[5],[11]。此外,这些方法忽略了连续图像帧之间的时空信息,严格专注于单视图姿态估计。这可能导致连续帧之间的姿态估计不一致。
最近基于RGB的6D物体姿态跟踪方法取得了良好的跟踪性能[9],[12]。然而,这些方法对于严重遮挡不够鲁棒,这种情况需要每次重新初始化姿态跟踪过程。重新初始化通常由一个精确的6D姿态估计方法执行,这在计算上是昂贵的。因此,这些方法的速度相当有限,阻碍了它们在实时场景中的应用。为了克服上述缺点,我们提出了一种新的DNN架构,它结合了惯性测量单元(IMU)数据和相机图像。IMU在机器人领域已广泛用于定位和导航。最近的研究[13],[14]表明,可以通过训练有素的DNN处理IMU数据来预测速度,这可以用来解决相机定位问题。因此,IMU传感器可以提供关于相机运动的有用信息。在我们的案例中,我们利用这些信息实现在严重遮挡下也能准确的物体姿态跟踪。此外,对图像和IMU数据的联合学习过程导致了一种高效的表征,使得鲁棒的实时姿态跟踪成为可能。这项工作呈现了多个贡献。首先,我们提出了第一个融合相机和IMU数据的物体姿态跟踪方法,以应对复杂场景中包括物体遮挡的姿态跟踪挑战。其次,我们的方法通过利用IMU数据并通过传播和结合连续帧的相对姿态估计来加速姿态跟踪问题。最后,我们在收集的包括RGB图像和IMU数据的数据集上实验验证了我们的方法,这些数据通常在现有数据集中不可用。为了克服生成6D姿态注释的众所周知的困难任务,还引入了一种自动化标记技术来收集足够的训练和测试数据,从而显著减少了手工标记的努力。实验结果表明,提出的方法与现有最先进的解决方案相比取得了可比的结果,同时运行速度显著更快,达到了实时性能(即50.2 Hz)。论文的结构如下。第II部分,我们回顾了6D姿态估计和跟踪的相关工作,以及基于IMU数据的定位学习技术。第III部分介绍了提出的跟踪管道和VIPose网络。第IV部分展示了在我们的VIYCB数据集上的广泛实验结果。第V部分总结了工作并提出了未来的方向。
图1:视觉-惯性6D物体姿态跟踪(顶部)。在我们的VIYCB数据集上进行速度-准确性基准测试,与现有最先进解决方案进行比较(底部)。
II. 相关工作
6D姿态估计: 传统上,单张图像中物体的6D姿态是通过模板匹配方法估计的,该方法将图像中的特征点与相应的3D模型特征点匹配。然后,可以通过使用PnP算法[1]解决这些局部特征的2D-3D对应关系来估计6D物体姿态。最近,基于深度学习的方法日益流行。SSD-6D[4]扩展了SSD物体检测器到6D姿态估计,增加了一个视点分类分支。[5]采用YOLO网络来检测图像中物体的3D包围框角点,并通过再次解决PnP问题来恢复6D姿态。PoseCNN[8]提出了一个端到端的框架,用于执行语义分割并预测3D旋转和平移。相反,DeepIM[9]采用FlowNetSimple网络[15]来通过迭代预测从渲染的前一姿态到当前图像观察的相对姿态,直到迭代姿态增量足够小。一般来说,将6D姿态估计方法应用于视频的每一帧来估计6D姿态,忽略了可能有用的时间信息,这些信息可以提高姿态估计过程的速度和准确性,而无需在每一帧都进行估计。
6D姿态跟踪: 我们的工作与最近在基于RGB的6D物体姿态跟踪方面的进展密切相关。PWP3D[16]提出通过优化物体3D模型的投影轮廓来跟踪物体姿态。[17]进一步改进了[16],采用一种新颖的优化方案和GPU并行化。然后[18]提出使用时间局部颜色直方图来改进姿态跟踪。最近,[19]采用深度神经网络预测连续帧之间的姿态差异。PoseRBPF[12]提出了一个Rao-Blackwellized粒子滤波方法来跟踪6D姿态,该方法将3D旋转和3D平移解耦,并考虑不确定性和物体对称性,达到了YCB视频数据集上的最佳性能。DeepIM[9]也可以扩展到通过预测连续两帧之间的相对变换来执行姿态跟踪。然而,这些方法对严重遮挡仍然不够鲁棒,丢失跟踪时需要重新初始化。[20]提出了一种新的网络,用于RGB-D数据上的6D姿态跟踪。它解耦了特征编码,以减少仿真和现实之间的领域差距,并且仅使用合成数据进行训练。这种方法在RGB-D数据上表现良好,而在我们的工作中,我们专注于更具挑战性的情况,即只有RGB图像可用,没有深度信息。
数据驱动的IMU定位: 传统上,IMU数据可以通过一些基于滤波的方法来进行定位。近年来,深度学习方法已经被应用于直接从IMU数据回归定位信息。VINet[21]提出了第一个端到端的视觉-惯性测距系统,它采用一个LSTM[22]网络来处理跨图像帧的IMU输入,以及一个FlowNet网络来处理图像对。视觉-惯性融合是通过连接IMU和视觉特征向量实现的。IONet[23]提出了一个LSTM网络来预测2D中的相对位移,并将预测结果连接起来,仅依赖于IMU输入来推断位置。RoNIN[13]将IMU数据旋转到与重力对齐的框架中,并使用1D ResNet网络预测一系列IMU数据的平均2D速度。TLIO[14]同样采用1D ResNet网络,但用于回归3D位移及其对应的不确定性,并采用紧耦合的扩展卡尔曼滤波框架进行状态估计。我们的工作与上述关于使用1D ResNet处理IMU数据的工作密切相关,但我们专注于物体姿态和跟踪问题,而不是相机定位。
III. APPROACH
姿态跟踪问题的目标是估计给定时刻 t t t, t ∈ { 1 , 2 , … , N } t \in \{1, 2, \dots, N\} t∈{1,2,…,N}相对于相机框架的物体的6D姿态 ξ t ∈ SE ( 3 ) \xi_t \in \text{SE}(3) ξt∈SE(3),给定:
- 物体的3D CAD模型
- 物体的初始姿态 ξ 0 ∈ SE ( 3 ) \xi_0 \in \text{SE}(3) ξ0∈SE(3),可以通过任何6D姿态估计方法获得
- 一系列RGB图像 I j I_j Ij, j ∈ { 0 , 1 , … , N } j \in \{0, 1, \dots, N\} j∈{0,1,…,N}
- 一系列IMU数据 G k G_k Gk, k ∈ { 0 , 1 , … , M } k \in \{0, 1, \dots, M\} k∈{0,1,…,M},其中 G k G_k Gk是一个包含在IMU框架的三个笛卡尔轴上的加速度和角速度测量的6维向量
在本节中,我们首先提供姿态跟踪工作流的概述,包括在使用VIPose DNN之前对原始图像和IMU输入进行预处理的阶段。随后我们描述我们的新型VIPose DNN,它通过结合两个连续的图像和一系列IMU数据来推断连续帧之间的相对姿态。然后通过组合连续帧之间的相对变换来获得最终的物体姿态。
A. 姿态跟踪工作流程
我们流水线在时间 t t t的姿态工作流程如图2所示。相机提供图像观察 I t I_t It,IMU提供加速度和角速度。图像预处理包括三个主要步骤:渲染、裁剪和调整大小,随后是IMU的预处理步骤。
图2:姿态跟踪工作流程。在时间 t t t,相机提供图像观察 I t I_t It。使用物体的3D模型和上一次的姿态估计 ξ t − 1 \xi_{t-1} ξt−1来渲染 I t − 1 R I^R_{t-1} It−1R。 I t I_t It和 I t − 1 R I^R_{t-1} It−1R都通过一个放大的边界框(如图3所示)进行裁剪,并调整为原始分辨率的一半大小。IMU缓冲区提供最近的 K K K个IMU测量数据。预处理后的图像对和IMU序列被送入VIPose网络,以预测相对姿态 Δ ξ t \Delta\xi_t Δξt,该相对姿态与 ξ t − 1 \xi_{t-1} ξt−1结合,得到该帧的物体姿态估计 ξ t \xi_t ξt。
1)渲染:首先,我们使用物体的3D模型和上一帧的估计6D姿态 ξ t − 1 \xi_{t-1} ξt−1来渲染RGB图像 I t − 1 R I^R_{t-1} It−1R作为最后一帧的参考图像,以提供要跟踪的目标物体。渲染过程从杂乱的场景中提取物体信息。这是通过将物体的3D模型放置在带有黑色背景的场景中心,并在由姿态 ξ t − 1 \xi_{t-1} ξt−1定义的视点处投射RGB图像来执行的,如图3所示。
2)裁剪:由于原始图像中物体大小较小,提取用于跨帧匹配的有用特征可能很困难。受[9]启发,我们通过使用一个放大的边界框(白框),如图3所示,来裁剪渲染图像 I t − 1 R I^R_{t-1} It−1R和图像观察 I t I_t It来解决这个问题。为了获得这样的边界框,我们首先使用相应3D物体模型的8个角点的2D投影 p i p_i pi, i ∈ { 1 , 2 , … , 8 } i \in \{1, 2, \dots, 8\} i∈{1,2,…,8}(如图3中的黄色点所示)来估计渲染图像中物体的大小,
x size = max i ( p i x ) − min i ( p i x ) {x}_\text{size} = \max_i(p_{i_x}) - \min_i(p_{i_x}) xsize=imax(pix)−imin(pix)
y size = max i ( p i y ) − min i ( p i y ) {y}_\text{size} = \max_i(p_{i_y}) - \min_i(p_{i_y}) ysize=imax(piy)−imin(piy)
放大的边界框以3D模型中心的2D投影为中心(在图3中用绿点表示),并保持输入图像的相同宽高比。放大边界框的高度 h h h和宽度 w w w按照以下公式获得:
h = λ ⋅ max ( x size r y size ) , h = \lambda \cdot \max\left(\frac{{x}_\text{size}}{r}{y}_\text{size}\right), h=λ⋅max(rxsizeysize),
w = λ ⋅ max ( x size , y size ⋅ r ) w = \lambda \cdot \max({x}_\text{size}, {y}_\text{size}\cdot r) w=λ⋅max(xsize,ysize⋅r)
其中 r r r是原始图像的宽高比, λ \lambda λ表示扩展比例,以确保边界框在渲染图像和新图像中都包含物体。
图3:渲染和裁剪的可视化。物体使用3D模型和估计的6D姿态进行渲染。3D模型中心和8个角点的2D投影分别用绿点和黄点表示。红框定义了渲染物体的尺寸 x size {x}_\text{size} xsize和 y size {y}_\text{size} ysize。白框代表放大的边界框,以绿点为中心,宽度为 w w w,高度为 h h h。
3)调整大小:随后,我们调整裁剪后的图像对的大小以获取更多细节。裁剪后的图像对被调整为固定分辨率,这是原始图像大小的一半,以减少网络中的计算量。在训练阶段,这允许使用更大的批次大小以加快训练过程的收敛。在测试阶段,这显著减少了系统的运行时间,而不影响准确性。调整大小后的图像对被用作网络的视觉输入。
4)IMU预处理:在图像对预处理之后,我们还预处理IMU数据作为网络的惯性输入。设计了一个IMU缓冲区,作为一个队列,存储最近的 K K K个IMU测量数据。 K K K的选择可以根据IMU输入的频率和不同应用中相机的速度而变化。当新的图像观察到达时,IMU缓冲区中的全部数据被用作网络的输入,并以 K × 6 K \times 6 K×6的张量表示。根据类似[13]的方法,IMU序列从IMU框架旋转到一个朝向不明的坐标框架,使用来自设备的真实方向。朝向不明的坐标框架被定义为一个其Z轴与重力对齐并在整个序列中保持一致的坐标框架。
预处理后的图像对和IMU序列被输入VIPose网络,以预测图像 I t − 1 R I^R_{t-1} It−1R和 I t I_t It之间的相对物体姿态 Δ ξ t ∈ SE ( 3 ) \Delta \xi_t \in \text{SE}(3) Δξt∈SE(3)。然后,当前图像中的物体的6D姿态 ξ t \xi_t ξt可以通过 ξ t = Δ ξ t ⊗ ξ t − 1 \xi_t = \Delta \xi_t \otimes \xi_{t-1} ξt=Δξt⊗ξt−1得到,其中 ⊗ \otimes ⊗表示矩阵乘法操作。跟踪过程持续进行,直到获得最后一张图像的6D姿态。
一般来说,在时间 t t t,使用渲染图像 I t − 1 R I^R_{t-1} It−1R而不是图像观察 I t − 1 I_{t-1} It−1作为上一帧的参考图像进行姿态跟踪是有帮助的。为了进一步阐明这一点,如果估计的物体姿态 ξ t − 1 \xi_{t-1} ξt−1不准确,那么物体姿态 ξ t − 1 \xi_{t-1} ξt−1与图像 I t − 1 I_{t-1} It−1中的相应物体观察之间会有不匹配,因为姿态 ξ t − 1 \xi_{t-1} ξt−1受到估计漂移的影响。相反,渲染图像 I t − 1 R I^R_{t-1} It−1R是使用估计的物体姿态 ξ t − 1 \xi_{t-1} ξt−1生成的全新图像,它不受上述观察问题的影响。因此,估计 I t − 1 R I^R_{t-1} It−1R和 I t I_t It之间的相对姿态对姿态漂移不敏感,有助于减少全局物体姿态估计的漂移。
B. VIPose网络
所提出的网络架构如图4所示。该网络由一个视觉分支组成,输入处理后的图像对 I t − 1 R I^R_{t-1} It−1R和 I t I_t It,一个惯性分支从IMU序列中提取特征,以及一个输出分支预测相对姿态 Δ ξ t \Delta \xi_t Δξt。
图4:VIPose网络架构。蓝色块代表基于FlowNetC的视觉分支,用于产生视觉特征。绿色块代表基于1D ResNet的惯性分支,用于产生惯性特征。视觉和惯性特征通过连接两个特征向量融合,为相对姿态估计提供多模态特征。橙色块代表输出分支,直接回归两个连续帧之间的相对姿态。
视觉分支(图4中的蓝色块),基于FlowNet-C网络[15]从输入图像对中提取视觉特征,并且我们只采用原始FlowNet-C网络的卷积层。该网络预训练以预测一对图像之间的光流。光流的表示被认为对相对姿态估计有用,这在[9]中得到了证明。前三个卷积层分别从两个输入图像中提取低级特征,并为负责计算块间相似性的相关层生成两个特征图,因此找到图像对之间的对应关系。然后,最后六个卷积层提取高级特征并减小特征图的大小。最后一个卷积层的特征图输出被平展为视觉特征向量,以便后续特征融合。
惯性分支(图4中的绿色块)采用标准ResNet-18网络[24]的1D版本,并以IMU序列为输入,即先前指定的来自IMU缓冲区的 K × 6 K \times 6 K×6张量。受[13]的启发,我们采用了一个预训练的1D ResNet,用于预测给定IMU输入序列的平均2D速度。与其他网络架构(包括LSTM [22]和时间卷积网络[25])相比,这种方法表现出更好的性能。惯性分支使用[13]中的预训练权重初始化。同样,最后一个1D卷积层的输出被平展为惯性特征向量。
视觉特征和惯性特征通过连接两个特征向量融合,提供了一个多模态特征用于回归相对变换。当目标物体的视觉信息有限,如在严重遮挡情况下,惯性特征提供了有关相机运动的有用信息,用于推断相对姿态。
输出分支(图4中的橙色块)是一个多层感知机,它以融合的特征向量为输入,并输出两帧之间的相对姿态。它包含两个具有256维的全连接层,后面跟着两个分别用于预测旋转和平移的单独全连接层。相对姿态的表示对网络的性能至关重要。我们采用[20]中的 s e ( 3 ) se(3) se(3)表示,其中 v = [ t , w ] T ∈ s e ( 3 ) \text{v} = [\text{t}, \text{w}]^\text{T} \in se(3) v=[t,w]T∈se(3),使得其伪指数映射位于 S E ( 3 ) SE(3) SE(3)中,
Δ ξ = pseudo-exp ( v ) = [ R t 0 T 1 ] ∈ S E ( 3 ) , (1) \Delta \xi = \text{pseudo-exp}(v) = \begin{bmatrix} \text{R} & \text{t} \\ 0^\text{T} & 1 \end{bmatrix} \in SE(3), \tag{1} Δξ=pseudo-exp(v)=[R0Tt1]∈SE(3),(1)
其中
R = I 3 × 3 + [ w ] × ∣ w ∣ sin ( ∣ w ∣ ) + [ w ] × 2 ∣ w ∣ 2 ( 1 − cos ( ∣ w ∣ ) ) , \text{R} = \text{I}_{3 \times 3} + \frac{[\text{w}]_\times}{|\text{w}|} \sin(|\text{w}|) + \frac{[\text{w}]_\times^2}{|\text{w}|^2} (1 - \cos(|\text{w}|)), R=I3×3+∣w∣[w]×sin(∣w∣)+∣w∣2[w]×2(1−cos(∣w∣)),
并且 [ w ] × [\text{w}]_\times [w]×是斜对称矩阵。最后两个输出层用于直接回归 w \text{w} w和 t \text{t} t,然后使用该预测来计算相对姿态 Δ ξ \Delta \xi Δξ。网络采用端到端训练,考虑以下 L 2 L_2 L2损失
L = λ 1 ⋅ ∣ ∣ w − w g t ∣ ∣ 2 + λ 2 ⋅ ∣ ∣ t − t g t ∣ ∣ 2 , (2) \mathcal{L} = \lambda_1 \cdot ||\text{w} - \text{w}_{gt}||_2 + \lambda_2 \cdot ||\text{t} - \text{t}_{gt}||_2, \tag{2} L=λ1⋅∣∣w−wgt∣∣2+λ2⋅∣∣t−tgt∣∣2,(2)
其中 λ 1 , λ 2 \lambda_1, \lambda_2 λ1,λ2是旋转和平移的损失权重, w g t , t g t w_{gt}, t_{gt} wgt,tgt表示真实的相对姿态。
相关文章:
论文笔记(五十六)VIPose: Real-time Visual-Inertial 6D Object Pose Tracking
VIPose: Real-time Visual-Inertial 6D Object Pose Tracking 文章概括摘要I. INTRODACTIONII. 相关工作III. APPROACHA. 姿态跟踪工作流程B. VIPose网络 文章概括 引用: inproceedings{ge2021vipose,title{Vipose: Real-time visual-inertial 6d object pose tra…...
微服务治理详解
文章目录 什么是微服务架构为什么要使用微服务单体架构如何转向微服务架构服务治理服务治理治的是什么服务注册与发现服务熔断降级服务网关服务调用服务负载均衡服务配置中心 微服务解决方案SpringCloud体系EurekaHystrixGatewayOpenFeignRibbonConfig SpringCloud Alibaba体系…...
“南海明珠”-黄岩岛(民主礁)领海基线WebGIS绘制实战
目录 前言 一、关于岛屿的基点位置 1、领海基点 二、基点坐标的转换 1、最底层的左边转换 2、单个经纬度坐标点转换 3、完整的转换 三、基于天地图进行WebGIS展示 1、领海基点的可视化 2、重要城市距离计算 四、总结 前言 南海明珠黄岩岛,这座位于南海的…...
Oracle数据库 创建dblink的过程及其用法详解
前言 dblink是Oracle数据库中用于连接不同数据库实例的一种机制。通过dblink,用户可以在一个数据库实例中直接查询或操作另一个数据库实例中的表、视图或存储过程。 dblink的作用主要体现在以下几个方面: 跨数据库操作:允许用户…...
Linux从0——1之shell编程4
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
pycharm快速更换虚拟环境
目录 1. 选择Conda 虚拟环境2. 创建环境3. 直接选择现有虚拟环境 1. 选择Conda 虚拟环境 2. 创建环境 3. 直接选择现有虚拟环境...
MVVM框架
MVVM由以下三个内容构成: Model:数据模型View:界面ViewModel:作为桥梁负责沟通View和Model 在JQuery时期,如果需要刷新UI,需要先取到对应的 DOM 再更新 UI,这样数据和业务的逻辑就和⻚⾯有强耦合。 在 MVVM 中,UI 是…...
数据仓库在大数据处理中的作用
数据仓库(Data Warehouse,简称DW或DWH)是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。以下是对数据仓库及其在大数据处理中作用的详细解释: 一、数据仓库的定义 面向主题&#x…...
前端Javascript、Vue、CSS等场景面试题目(二)
前端面试场景题目(一)-CSDN博客 针对您提供的前端场景面试题目,以下是详细的回答: 1. 如何通过 CSS 实现美观的自定义复选框和单选按钮? 方法:使用 CSS 伪元素 ::before 和 ::after,以及隐藏…...
鸿蒙学习生态应用开发能力全景图-开发者支持平台(5)
鸿蒙相关平台作用: 开发者社区:开发者技术交流平台,帮助开发者探索开发实践、交流心得经验、获悉业界动态、答疑解惑。 开发者学堂:聚合官方鸿蒙生态课程,课程有慕课、微课、直播课、训练营等多种形式ÿ…...
计算机网络各层设备总结归纳(更新ing)
计算机网络按照OSI(开放式系统互联)模型分为七层,每一层都有其特定的功能和对应的网络设备。以下是各层对应的设备: 1. 物理层(Physical Layer) 设备:中继器(Repeater)、集线器…...
3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)
3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用) 文章目录 3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)前言1. Spring Cloud Eureka 的概述1.1 服务治理概述1.2 服务注册与发现 2. 实践:创建单机 Eureka Server 注册中心2.1 需求说明 图解…...
品牌如何利用大数据工具,进行消费者洞察分析?
存量竞争的时代, 消费者聆听是品牌持续增长的关键,借助大数据的消费者数据洞察,可以帮助品牌分析消费者的所思所想及行为特征,获取消费者对产品的需求痛点、使用感受,对品牌的评价口碑等,从而帮助品牌更好地…...
鸿蒙实现 web 传值
前言:安卓和 IOS 加载 H5 的时候,都有传值给到 H5 或者接收 H5 值,鸿蒙也可传值和接收 H5 的内容,以下是鸿蒙传值给 H5 端的具体操作 一: 定义好 H5 和鸿蒙传值的方法名,两端必须保持方法名一致 // xxx.ets import …...
uniapp vuex的使用
实现组件全局(数据)管理的一种机制,可以方便的实现组件之间共享数据,不同于上述三种传递值的方式。 可以把vuex当成一个store仓库,可以集中管理共享的数据,并且存储在vuex中的数据都是响应式的,…...
RabbitMQ实战启程:从原理到部署的全方位探索(上)
文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1 简单模式3.2 工作模式3.3 发布订阅3.4 路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1 单机部署5.1.1 安装erlang5.1.2 安装rabbitmq 5.2 集群部署(镜…...
【论文复现】轻松利用自适应特征融合实现去雾
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 智慧医疗 介绍创新点网络结构特征提取阶段自适应融合阶段图像重建阶段上下文增强模块CEM特征融合模块AFM 结果分析 提示 论文题目࿱…...
【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用
1. hbase-phoenix的应用 1.1 概述: 上面我们学会了hbase的操作和原理,以及外部集成的mr的计算方式,但是我们在使用hbase的时候,有的时候我们要直接操作hbase做部分数据的查询和插入,这种原生的方式操作在工作过程中还…...
高级java每日一道面试题-2024年11月09日-缓存中间件篇-Redis和Memecache有什么区别?
如果有遗漏,评论区告诉我进行补充 面试官: Redis和Memecache有什么区别? 我回答: 一、基础特性 数据类型支持 Redis: 支持多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合…...
vscode 关闭绑定元素 隐式具有“any”类型这类错误
在vue的项目里面,经常看到any类型的报错,真的很烦的 在tsconfig.json中配置以下参数 “noImplicitAny”: false 就可以了 出现类型“never”上不存在属性“userName”。ts-plugin(2339) 配置该参数 modeuleResolution : node "compilerOptions&qu…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
