COD论文笔记 Deep Gradient Learning for Efficient Camouflaged 2022

动机

这篇论文的动机在于解决伪装目标检测(COD)中的一个关键问题:在复杂背景下,伪装目标与背景的边界模糊,使得检测变得极其困难。现有的方法,如基于边界或不确定性的模型,通常仅响应于伪装目标的稀疏边缘,导致在复杂场景中引入噪声特征。为了克服这些挑战,该论文提出了一种新的深度学习框架,利用对象梯度监督来提高伪装目标检测的精度和效率。

贡献

  1. 提出DGNet框架:引入了一种新的基于深度梯度的框架,名为DGNet,专门用于伪装目标检测。这个框架将任务解耦为两个互相关联的分支,即上下文编码器和纹理编码器。

  2. 设计梯度诱导过渡模块:提出了一种梯度诱导过渡模块(GIT),该模块自动根据软分组策略对来自上下文和纹理分支的特征进行分组。

  3. 高效模型DGNet-S:实现了一个高效版本DGNet-S,在保持高检测精度的同时,仅使用了6.82%的参数,并且达到了实时运行速度(80 fps)。

  4. 多种应用场景:在多种任务中展示了出色的性能,包括息肉分割、缺陷检测和透明物体分割。

创新点

  1. 对象梯度监督:不同于以往仅关注边界或不确定区域的模型,DGNet通过对象梯度监督来挖掘伪装目标内部的判别性模式,减少了噪声特征的引入。

  2. 任务解耦:将任务解耦为上下文和纹理两个分支,有助于缓解从单一分支提取的高层次和低层次特征之间的歧义。

  3. 梯度诱导过渡模块:设计了一种灵活的即插即用模块,通过组内和组间的特征聚合来增强多源特征空间的表示能力。

  4. 高效的计算和参数利用:DGNet-S在保持高性能的同时,显著减少了模型参数和计算开销,使其能够在实际应用中表现优异。

这些动机、贡献和创新点共同构成了该论文的核心内容,并展示了DGNet在伪装目标检测任务中的显著优势。

3.1 Context Encoder

输入和编码器选择

  • 输入图像 I ∈ R 3 × H × W I \in \mathbb{R}^{3 \times H \times W} IR3×H×W
  • 使用EfficientNet作为上下文编码器来获取金字塔特征 { X i } i = 1 5 \{X_i\}_{i=1}^{5} {Xi}i=15

特征降维

  • 为了在解码阶段实现高效的逐元素操作,采用以下两个步骤:
    1. 选择特征层:仅选择前三级特征(即当 i = 3 , 4 , 5 i = 3, 4, 5 i=3,4,5),这些特征保留了视觉场景的丰富语义信息。
    2. 卷积层降维:使用两个堆叠的ConvBR层,卷积核大小为 C i × 3 × 3 C_i \times 3 \times 3 Ci×3×3,将每个候选特征的维度减少到 C i C_i Ci,以减轻后续操作的计算负担。

最终输出

  • 上述步骤后的最终输出是三个上下文特征 { X R i } i = 3 5 ∈ R C i × H i × W i \{X_{R_i}\}_{i=3}^{5} \in \mathbb{R}^{C_i \times H_i \times W_i} {XRi}i=35RCi×Hi×Wi,其中 C i C_i Ci H i = H 2 i H_i = \frac{H}{2^i} Hi=2iH W i = W 2 i W_i = \frac{W}{2^i} Wi=2iW 分别表示特征图的通道数、高度和宽度。

核心点

  • EfficientNet作为编码器:选择EfficientNet的原因在于其高效性和强大的特征提取能力。
  • 特征降维策略:通过选择和降维步骤,确保在保持特征表达能力的同时,减轻计算负担。

总结,这部分详细介绍了如何利用EfficientNet对输入图像进行编码,并通过选择和降维策略获取上下文特征,为后续的解码过程提供高效且富有语义的信息。

3.2 Texture Encoder

引入纹理分支

  • 引入一个专门的纹理分支,通过对象级梯度图进行监督,以补偿上下文特征在几何纹理表示上的不足。

对象梯度生成

  • 梯度定义:图像梯度描述了图像强度或颜色在相邻位置之间的方向变化,常用于边缘检测和超分辨率。
  • 生成步骤
    1. 原始图像梯度:通过计算原始图像 I I I 的梯度生成图像梯度图,但包含了不相关的背景噪声。
    2. 对象级梯度图:为解决背景噪声问题,引入对象级梯度图 Z G Z_G ZG,该图同时包含对象边界和内部区域的梯度信息。
    3. 公式
      Z G = F E ( I ( x , y ) ) ⋅ Z C Z_G = F_E(I(x, y)) \cdot Z_C ZG=FE(I(x,y))ZC
      其中, F E F_E FE 表示标准的 Canny 边缘检测器, ⋅ \cdot 表示元素逐次相乘。

纹理编码器设计

  • 由于高分辨率的低层特征会引入计算负担,设计了一个轻量级的编码器,而不是使用现成的骨干网络。
  • 层次结构
    1. 卷积层和ReLU激活:使用卷积层和ReLU激活函数的组合(ConvBR)对输入进行处理。
    2. 层次细节
    • Layer #01: 卷积核大小为7,输出通道数为64,步幅为2,零填充为3。
    • Layer #02: 卷积核大小为3,输出通道数为64,步幅为2,零填充为1。
    • Layer #03: 卷积核大小为3,输出通道数为 C g C_g Cg,步幅为2,零填充为1。
    • Layer #04: 卷积核大小为1,输出通道数为1,步幅为1,无填充。
  • 生成纹理特征:从 Layer #03 提取纹理特征 X G ∈ R C g × H g × W g X_G \in \mathbb{R}^{C_g \times H_g \times W_g} XGRCg×Hg×Wg,并通过 Layer #04 用对象级梯度图 Z G Z_G ZG 进行监督。

高分辨率保持

  • 保持较大的分辨率(即 H g = H 8 H_g = \frac{H}{8} Hg=8H W g = W 8 W_g = \frac{W}{8} Wg=8W),因为较小分辨率的特征会丢失大部分几何细节。

总结,纹理编码器通过对象级梯度图进行监督,生成高分辨率的纹理特征,补偿上下文特征在几何纹理表示上的不足,从而增强模型对伪装目标的检测能力。

3.3 Gradient-Induced Transition

设计背景

  • 为了实现上下文特征和纹理特征的自适应融合,而不是采用简单的连接或加法操作,设计了一种灵活的即插即用梯度诱导过渡(GIT)模块。

模块组成

  • GIT模块包含三个主要步骤:梯度诱导分组学习、软分组策略和并行残差学习。

梯度诱导分组学习

  • 特征分组:采用梯度诱导分组策略,将三个上下文特征 { X R i } i = 3 5 \{X_{R_i}\}_{i=3}^{5} {XRi}i=35 和一个纹理特征 X G X_G XG 沿通道维度分割为固定的组。
    • 分组公式:
      { X R i , m } m = 1 M ∈ R K i × H i × W i ← X R i ∈ R C i × H i × W i \{X_{R_i,m}\}_{m=1}^{M} \in \mathbb{R}^{K_i \times H_i \times W_i} \leftarrow X_{R_i} \in \mathbb{R}^{C_i \times H_i \times W_i} {XRi,m}m=1MRKi×Hi×WiXRiRCi×Hi×Wi { X G m } m = 1 M ∈ R K g × H g × W g ← X G ∈ R C g × H g × W g \{X_{G_m}\}_{m=1}^{M} \in \mathbb{R}^{K_g \times H_g \times W_g} \leftarrow X_G \in \mathbb{R}^{C_g \times H_g \times W_g} {XGm}m=1MRKg×Hg×WgXGRCg×Hg×Wg其中, ← \leftarrow 表示特征分组操作, K i = C i M K_i = \frac{C_i}{M} Ki=MCi K g = C g M K_g = \frac{C_g}{M} Kg=MCg 分别表示每个特征组的通道数, M M M 是相应的组数。
  • 特征重组:将上下文和纹理特征组定期排列生成重组特征 Q i Q_i Qi
    Q i ∈ R ( C i + C g ) × H i × W i = ⟨ Y 1 i ; … ; Y m i ; … ; Y M i ⟩ Q_i \in \mathbb{R}^{(C_i+C_g) \times H_i \times W_i} = \langle Y_{1_i}; \dots; Y_{m_i}; \dots; Y_{M_i} \rangle QiR(Ci+Cg)×Hi×Wi=Y1i;;Ymi;;YMi
    其中 ⟨ ⋅ ; ⋅ ⟩ \langle \cdot; \cdot \rangle ; 表示通道维度的特征连接, Y m i Y_{m_i} Ymi 由以下公式得出:
    Y m i ∈ R ( K i + K g ) × H i × W i = ⟨ F ↓ ( X G m ) ; X R i , m ⟩ Y_{m_i} \in \mathbb{R}^{(K_i+K_g) \times H_i \times W_i} = \langle F_\downarrow(X_{G_m}); X_{R_i,m} \rangle YmiR(Ki+Kg)×Hi×Wi=F(XGm);XRi,m
    F ↓ ( ⋅ ) F_\downarrow(·) F() 是下采样操作,用于确保 X G m X_{G_m} XGm 的空间分辨率与 X R i , m X_{R_i,m} XRi,m 匹配。

软分组策略

  • 多尺度非线性投影:启发自并行设计,设置三个并行子分支(即 { N 1 , N 2 , N 3 } \{N_1, N_2, N_3\} {N1,N2,N3})进行软分组。
    • 投影公式:
      A N i = ⟨ F N 1 ( Q i 1 ) ; … ; F N n ( Q i n ) … F N N ( Q i N ) ⟩ A_{N_i} = \langle F^1_N(Q^1_i); \dots; F^n_N(Q^n_i) \dots F^N_N(Q^N_i) \rangle ANi=FN1(Qi1);;FNn(Qin)FNN(QiN)⟩其中, F N n ( Q i n ) ∈ R C i N × H i × W i = f n ( Q i n , ω n ) F^n_N(Q^n_i) \in \mathbb{R}^{\frac{C_i}{N} \times H_i \times W_i} = f_n(Q^n_i, \omega_n) FNn(Qin)RNCi×Hi×Wi=fn(Qin,ωn) 引入了软非线性,投影函数 f n f_n fn 由具有 C i C_i Ci 个形状为 ( C i + C g ) N × 1 × 1 \frac{(C_i+C_g)}{N} \times 1 \times 1 N(Ci+Cg)×1×1 的卷积层实现,由可学习的权重 ω n \omega_n ωn 参数化。

并行残差学习

  • 残差连接:在不同的分组感知尺度上引入残差学习。
    • GIT函数 T i ( ⋅ , ⋅ ) T_i(\cdot, \cdot) Ti(,) 定义如下: Z i T = T i ( X R i , X G ) = X R i ⊕ ∑ N A N i Z^T_i = T_i(X_{R_i}, X_G) = X_{R_i} \oplus \sum_N A_{N_i} ZiT=Ti(XRi,XG)=XRiNANi其中, N ∈ { N 1 , N 2 , N 3 } N \in \{N_1, N_2, N_3\} N{N1,N2,N3} 表示不同组的缩放因子集, ⊕ \oplus 表示元素逐次相加, ∑ \sum 表示多个项的和。最终输出为 { Z i T } i = 3 5 ∈ R C i × H i × W i \{Z^T_i\}_{i=3}^{5} \in \mathbb{R}^{C_i \times H_i \times W_i} {ZiT}i=35RCi×Hi×Wi

关键点总结

  • 特征分组与重组:通过分组和重组策略,将上下文和纹理特征有效结合。
  • 软分组策略:通过多尺度的非线性投影,增强特征表示能力。
  • 并行残差学习:在不同尺度上进行残差学习,进一步提升特征融合效果。

综上所述,梯度诱导过渡模块(GIT)通过灵活的特征分组、软分组策略和并行残差学习,实现了上下文特征和纹理特征的高效融合,从而提高了伪装目标检测的性能。

3.4 Learning Details

解码器

  • 给定上下文特征 { X R i } i = 3 5 \{X_{R_i}\}_{i=3}^{5} {XRi}i=35,首先应用梯度诱导过渡(GIT)函数 T i ( ⋅ , ⋅ ) T_i(\cdot, \cdot) Ti(,) 得到输出特征 { Z i T } i = 3 5 \{Z^T_i\}_{i=3}^{5} {ZiT}i=35
  • 为了高效地利用上述梯度诱导特征 Z i T Z^T_i ZiT,采用邻居连接解码器(NCD)生成最终预测 P C P_C PC
    P C ∈ R 1 × H × W = NCD ( Z 3 T , Z 4 T , Z 5 T ) P_C \in \mathbb{R}^{1 \times H \times W} = \text{NCD}(Z^T_3, Z^T_4, Z^T_5) PCR1×H×W=NCD(Z3T,Z4T,Z5T)

损失函数

  • 整体优化目标定义为:
    L = L C ( P C , Z C ) + L G ( P G , Z G ) L = L_C(P_C, Z_C) + L_G(P_G, Z_G) L=LC(PC,ZC)+LG(PG,ZG)
    其中, L C L_C LC L G L_G LG 分别代表分割损失和对象梯度损失函数。
  • 分割损失 L C L_C LC:由加权交并比损失 L wIoU L_{\text{wIoU}} LwIoU 和加权二值交叉熵损失 L wBCE L_{\text{wBCE}} LwBCE 组成。它们根据像素的难度分配自适应权重,以关注全局结构和难度较大的像素。
  • 对象梯度损失 L G L_G LG:采用标准的均方误差损失函数。

训练设置

  • 模型在PyTorch/Jittor工具箱中实现,并在单个NVIDIA RTX TITAN GPU上进行训练和推理。
  • 初始化:模型参数初始化采用 [50] 的策略,骨干网络使用在ImageNet上预训练的权重进行初始化,以防止过拟合。
  • 骨干网络特征提取:从EfficientNet骨干网络的前三个侧输出(包括stage-4 (X_3),stage-6 (X_4),和stage-8 (X_5))提取特征,舍弃最后的Conv1×1、池化和全连接层。
  • 变体实例:考虑性能与效率的权衡,实例化了两个变体以适应不同的计算开销需求(见表2)。

训练过程

  • 优化器:使用Adam优化器,学习率调整采用SGDR策略的余弦退火部分,最小/最大学习率设置为 (10{-5}/10{-4}),最大调整迭代次数为20。
  • 批量大小:设置为12,最大训练轮数为100。
  • 数据增强:在训练过程中,每张图像调整为352×352,并使用四种数据增强技术:颜色增强、随机翻转、随机裁剪和随机旋转。
  • 训练时间:DGNet和DGNet-S分别需要8.8和7.9小时达到网络收敛。

测试设置

  • 输入调整:将输入图像调整为352×352,并在三个未见测试数据集上测试DGNet-S和DGNet。
  • 预测输出:取最终输出 P C P_C PC 作为预测图,不使用任何启发式后处理技术,如DenseCRF。

关键点总结

  • 解码器设计:通过NCD解码器实现上下文特征的有效利用,生成高质量的分割预测。
  • 损失函数:组合加权交并比损失和加权二值交叉熵损失,增强模型对全局结构和难度较大像素的关注;采用均方误差损失进行对象梯度监督。
  • 训练与优化:采用有效的初始化和优化策略,结合数据增强技术,确保模型的收敛和泛化性能。
  • 测试流程:调整输入图像尺寸并直接使用预测输出,不进行额外的后处理,简化推理过程。

综上所述,这部分详细描述了DGNet的学习过程,包括解码器设计、损失函数定义、训练设置和测试流程,确保了模型的高效训练和精确推理。

在这里插入图片描述

图3的详细解释

图3展示了所提出的DGNet的整体流程。该网络由两个相互关联的学习分支组成,即上下文编码器和纹理编码器。以下是图中各部分的详细说明:

  1. 输入图像 (a) Image

    • 输入图像 I I I 进入上下文编码器和纹理编码器。
  2. 上下文编码器 (Context Encoder)

    • 该编码器从输入图像中提取上下文特征 { X i R } i = 3 5 \{X^R_i\}_{i=3}^{5} {XiR}i=35
    • 上下文编码器的输出特征 X 3 R , X 4 R , X 5 R X^R_3, X^R_4, X^R_5 X3R,X4R,X5R 进入梯度诱导过渡模块(GIT)。
  3. 纹理编码器 (Texture Encoder)

    • 纹理编码器从输入图像中提取纹理特征 X G X^G XG
    • 纹理编码器的输出特征 X G X^G XG 也进入梯度诱导过渡模块(GIT)。
  4. 梯度诱导过渡模块 (Gradient-Induced Transition, GIT)

    • GIT模块将上下文特征和纹理特征进行融合,生成过渡特征 { Z i T } i = 3 5 \{Z^T_i\}_{i=3}^{5} {ZiT}i=35
    • GIT模块包括三个子模块 T 3 , T 4 , T 5 T_3, T_4, T_5 T3,T4,T5,分别对 X 3 R , X 4 R , X 5 R X^R_3, X^R_4, X^R_5 X3R,X4R,X5R X G X^G XG 进行处理和融合。
  5. 邻居连接解码器 (Neighbor Connected Decoder, NCD)

    • GIT的输出特征 { Z i T } i = 3 5 \{Z^T_i\}_{i=3}^{5} {ZiT}i=35 通过NCD解码器生成最终的预测图 P C P^C PC
    • 解码器将多层特征进行整合,生成伪装目标的分割结果。
  6. 监督信号 (Supervision Signals)

    • Ground-Truth (b):真实的分割标签 Z C Z^C ZC,用于计算分割损失 L C L_C LC
    • Object Boundary ©:对象边界,作为对比,说明了仅使用边界监督时的不足。
    • Image Gradient (e):图像梯度,通过计算原始图像的梯度生成,但包含了不相关的背景噪声。
    • Object Gradient (d):对象梯度图 Z G Z^G ZG,通过对原始图像 I I I 和真实标签 Z C Z^C ZC 进行元素逐次相乘生成,包含了对象边界和内部区域的梯度信息,作为纹理编码器的监督信号,用于计算梯度损失 L G L_G LG

关键流程总结

  • 输入图像 I I I 被并行输入到上下文编码器和纹理编码器中。
  • 上下文编码器提取高层次的语义特征 X i R X^R_i XiR(如 X 3 R , X 4 R , X 5 R X^R_3, X^R_4, X^R_5 X3R,X4R,X5R)。
  • 纹理编码器提取对象内部的几何纹理特征 X G X^G XG
  • GIT模块将这些上下文特征和纹理特征进行融合,生成更具判别力的过渡特征 Z i T Z^T_i ZiT
  • 最终,NCD解码器对融合后的特征进行解码,生成分割预测 P C P^C PC
  • 使用真实标签 Z C Z^C ZC 和对象梯度图 Z G Z^G ZG 作为监督信号,分别计算分割损失 L C L_C LC 和梯度损失 L G L_G LG

通过这种设计,DGNet能够在复杂背景中有效地检测和分割伪装目标。

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

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

相关文章

最新Qt6的下载与成功安装详细介绍

引言 Qt6 是一款强大的跨平台应用程序开发框架,支持多种编程语言,最常用的是C。Qt6带来了许多改进和新功能,包括对C17的支持、增强的QML和UI技术、新的图形架构,以及构建系统方面的革新。本文将指导你如何在Windows平台上下载和安…

使用小波分析实现文字种类自动识别

文章目录 数据简介开始实验小波分解得出结果结果分析误差分析 数据简介 各找一篇中文,日文,韩文,英文,俄文较长的学术论文。将论文转化为JPG格式。拆分每张JPG生成更多小的JPG。最终获得很多5个不同语言的JPG并且自带标签。数据链…

VPN以及GRE和MGRE

VPN VPN — 是虚拟专用网络 通俗地说,就是通过虚拟的手段,将两个独立的网络,穿越一个公共网络进行连接,实现点到点专线的效果(可以理解为:一个分公司通过公网和总公司建立点到点的专线连接) 现…

Jupyter notebook如何快速的插入一张图片?如何控制插入图片的缩放、靠左展示(ChatGPT)

在Jupyter Notebook中,你可以使用Markdown语法快速插入图片,并且可以通过HTML标签来控制图片的展示方式和缩放。 注意:以下所有操作都有一个前提,即选择Cell-CellType-Markdown 1. 快速插入图片 要在Jupyter Notebook中插入图…

docker安装好了,但是启动失败

新项目要用docker部署,但是docker安装完后,启动失败,服务器用的是国产化的(之前的服务器非国产化,之前也没任何问题),国产化的使用起来问题一大堆,还是bclinux 安装好后重启一直显示 使用journalctl -xe也没任何报错 使用systemctl status docker查看docker状态是灰…

白话大模型微调(Fine-tune)

吾名爱妃,性好静亦好动。好编程,常沉浸于代码之世界,思维纵横,力求逻辑之严密,算法之精妙。亦爱篮球,驰骋球场,尽享挥洒汗水之乐。且喜跑步,尤钟马拉松,长途奔袭&#xf…

专业学习|系统建模与仿真的基础概念知识合集

学习笔记来源:http://tup.tsinghua.edu.cn/upload/books/yz/086457-01.pdf 一、系统 系统按照事物发展的连续性又可分为连续系统和离散系统。连续系统是指状态变量随 时间连续变化的系统,如图1-1所示;离散系统则是指状态变量只是在某个离散的时间点集合上发生变化…

Problems retrieving the embeddings data form OpenAI API Batch embedding job

题意:从OpenAI API批量嵌入作业中检索嵌入数据时遇到问题 问题背景: I have to embed over 300,000 products description for a multi-classification project. I split the descriptions onto chunks of 34,337 descriptions to be under the Batch e…

Linux--线程互斥(加锁)

目录 0.对原生线程封装的代码 1.为什么需要线程互斥 2.加锁 2.1.认识加锁和它的接口 2.2用一下接口 2.2.1 解决抢票问题 2.2.2设置局部锁 2.3从原理角度理解锁 2.4锁是如何实现的**** 0.对原生线程封装的代码 方便后续对锁的理解:Thread.hpp 详情请看&#…

mybatis-plus LambdaQueryWrapper条件构造器使用apply查询含有逗号‘,‘分隔的字段

mybatis-plus LambdaQueryWrapper apply自定义SQL条件使用 真实业务开发使用场景 数据库:postgreSQL 开发场景:SpringBoot2.5.7 数据库中数据如下 需求 查找, bingBdNumber字段为422875,要求数据库中bind_bd_number这一栏中只要有422875的就返回. 根据上图查422875需要返回…

【python】导入serial模块,读写串口数据(嵌入式软件自动化测试)

目录 环境准备安装pyserial硬件连接 基本函数使用获取串口设备列表初始化串口对象发送数据读取数据 环境准备 安装pyserial 1、python 3.6.7 2、pyserial模块封装了python对串口的访问 pip install serialpip install pyserial如果代码报错卸载掉serial 硬件连接 1、将串口…

Android 10.0 SystemUI下拉状态栏固定展开QsPanel不收缩功能实现

1. 前言 在10.0的系统ROM产品定制化开发中,在systemUi的原生下拉状态栏中,首次下拉展开quickQsPanel,第二次展开就显示 QsPanel,在产品开发中,需要下拉状态栏固定展开QsPanel,不需要二次展开,接下来分析下相关功能的实现,如图: 2.SystemUI下拉状态栏固定展开QsPanel不收…

Python和C++行人轨迹预推算和空间机器人多传感融合双图算法模型

🎯要点 🎯双图神经网络模型:最大后验推理和线性纠错码解码器 | 🎯重复结构和过约束问题超图推理模型 | 🎯无向图模型变量概率计算、和积消息传播图结构计算、隐马尔可夫模型图结构计算、矩阵图结构计算、图结构学习 |…

基于Java技术的致远汽车租赁系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:B/S模式、Java技术 工具:Visual Studio、MySQL数据库开发工具 系统展示 首页 用户注册…

现场可重构CPLD芯片应用案例—蓝牙音箱

我司英尚微提供的高性能数模混合现场可重构IC、通用可配置的模数混合芯片内部集成丰富的模拟资源和数字资源,可轻松替代电路中的各种标准器件,并按照客户要求组合成最优小型ASIC,缩短开发周期,降低成本。下面介绍LS98002现场可重构…

object-C 解答算法:移动零(leetCode-283)

移动零(leetCode-283) 题目如下图:(也可以到leetCode上看完整题目,题号283) 解题思路: 本质就是把非0的元素往前移动,接下来要考虑的是怎么移动,每次移动多少? 这里需要用到双指针,i 记录每次遍历的元素值, j 记录“非0元素值”需要移动到的位置; 当所有“非0元素值”都移…

链表面试练习习题(Java)

1. 思路: 创建两个链表,一个用来记录小于x的结点,一个用来记录大于等于x的结点,然后遍历完原链表后,将小于x的链表和大于等于x的链表进行拼接即可 public class Partition { public ListNode partition(ListNode pH…

如何将PDF转换成可以直接编辑的CAD图纸?

PDF图纸是为了让用户更好的阅览CAD文件,但是,当我们想要对其进行编辑的时候,PDF图纸就是一个麻烦了。那么PDF转换成CAD后可以编辑吗?如何将PDF转换成可以直接编辑的CAD图纸呢?本篇给你答案。 1、启动迅捷CAD编辑器&…

linux进行redis的安装并使用RDB进行数据迁移

现在有两台电脑,分别是A,B,现在我要把A电脑上的redis的数据迁移到B电脑上,B电脑上是没有安装redis的 1.找到A电脑的redis的版本 1.先启动A电脑的redis,一般来说,都是直接在linux的控制台输入:re…

Spring Cloud Loadbalancer 的使用

一、默认负载均衡策略 Spring Cloud LoadBalancer 默认的负载均衡策略是轮询。 轮询效果示例 我们需要示例一个请求分发到不同的模块上,所以我们需要创建多模块项目。 新建 Spring Boot (3.0.2)的 Maven 项目(JDK 17&#xff09…