Yolo11改进策略:上采样改进|CARAFE,轻量级上采样|即插即用|附改进方法+代码

news2024/11/25 4:43:24

论文介绍

  • CARAFE模块概述:本文介绍了一种名为CARAFE(Content-Aware ReAssembly of FEatures)的模块,它是一种用于特征上采样的新方法。
  • 应用场景:CARAFE模块旨在改进图像处理和计算机视觉任务中的上采样过程,特别适用于目标检测、实例分割、语义分割和图像修复等任务。
  • 目标:通过引入内容感知的重新组装机制,CARAFE旨在提高上采样过程的准确性和效率。

创新点

  • 内容感知上采样:与传统的上采样方法(如双线性插值、转置卷积等)相比,CARAFE引入了内容感知机制,能够根据输入特征的内容动态地调整上采样过程。
  • 动态重新组装:CARAFE通过预测每个位置的重新组装核(reassembly kernel),实现了对输入特征的局部区域进行重新组装,从而生成更准确的上采样结果。
  • 高效性:尽管CARAFE引入了额外的计算步骤,但其计算开销相对较小,且能够显著提高上采样后的特征质量。

方法

  • CARAFE框架:CARAFE模块主要由两个关键组件组成:核预测模块(Kernel Prediction Module)和内容感知重新组装子模块(Content-Aware Reassembly Submodule)。
    • 核预测模块:负责根据输入特征的局部区域预测重新组装核。该模块由通道压缩器、内容编码器和核归一化器三个子模块组成。
    • 内容感知重新组装子模块:利用预测的重新组装核对输入特征的局部区域进行重新组装,以生成上采样后的特征。
  • 上采样过程:对于每个输入特征位置,CARAFE首先使用核预测模块预测一个重新组装核,然后利用该核对局部区域进行加权求和,从而得到上采样后的特征值。

模块作用

  • 提高特征质量:通过内容感知的重新组装机制,CARAFE能够生成更准确的上采样特征,这些特征在后续的任务(如目标检测、语义分割等)中能够提供更好的性能。
  • 增强模型泛化能力:由于CARAFE能够动态地调整上采样过程以适应不同的输入特征,因此它有助于提高模型的泛化能力,使其能够更好地处理复杂和多样化的图像数据。
  • 减少计算开销:与传统上采样方法相比,CARAFE在计算开销方面更具优势。尽管它引入了额外的计算步骤,但这些步骤的复杂度相对较低,因此不会对整体计算性能造成显著影响。

改进的效果

  • 目标检测:在Faster R-CNN和Mask R-CNN等目标检测框架中,使用CARAFE替代传统的上采样方法后,模型的性能得到了显著提升。具体来说,在ADE20k数据集上的mIoU指标提高了约1.8%。
  • 语义分割:在语义分割任务中,使用CARAFE的UperNet模型在ADE20k数据集上的mIoU指标也实现了显著提升,从40.44%提高到42.23%。
  • 图像修复:在图像修复任务中,使用CARAFE的Global&Local和Partial Conv模型在Places数据集上的PSNR指标也实现了提高,分别提高了1.1dB和更多。
  • 高效性:尽管CARAFE引入了额外的计算步骤,但由于其计算开销相对较小,因此在实际应用中不会显著影响模型的训练和推理速度。

论文翻译:《CARAFE:基于内容感知的特征(FEatures)重新组装》

https://arxiv.org/pdf/1905.02188
特征上采样是许多现代卷积网络架构(例如特征金字塔)中的关键操作。其设计对于诸如目标检测和语义/实例分割等密集预测任务至关重要。在本文中,我们提出了内容感知特征重组(CARAFE),这是一种通用、轻量级且高度有效的算子,以实现这一目标。CARAFE具有几个吸引人的特性:(1)大视野。与仅利用子像素邻域的前期工作(例如双线性插值)不同,CARAFE可以在大感受野内聚合上下文信息。(2)内容感知处理。与对所有样本使用固定核(例如反卷积)不同,CARAFE支持针对实例的内容感知处理,可以即时生成自适应核。(3)轻量级且计算速度快。CARAFE引入的计算开销很小,并且可以轻松集成到现代网络架构中。我们在目标检测、实例/语义分割和图像修复的标准基准上进行了综合评估。CARAFE在所有任务中都表现出一致且显著的增益(分别为 1.2 % A P 1.2\% AP 1.2%AP 1.3 % A P 1.3\% AP 1.3%AP 1.8 % m I o U 1.8\% mIoU 1.8%mIoU 1.1 d B 1.1 dB 1.1dB),且计算开销可忽略不计。它有望成为未来研究的强大构建块。代码和模型可在https://github.com/open-mmlab/mmdetection获取。

1. 引言

特征上采样是深度神经网络中最基本的操作之一。一方面,对于密集预测任务(例如超分辨率[7,20]、图像修复[13,32]和语义分割[43,5])中的解码器,高级/低分辨率特征图会上采样以匹配高分辨率监督。另一方面,特征上采样还涉及将高级/低分辨率特征图与低级/高分辨率特征图进行融合,这在许多最先进架构中被广泛采用,例如特征金字塔网络[21]、U-Net[34]和堆叠沙漏网络[29]。因此,设计有效的特征上采样算子成为一个关键问题。

最常用的特征上采样算子是最近邻和双线性插值,它们采用像素之间的空间距离来指导上采样过程。然而,最近邻和双线性插值仅考虑子像素邻域,无法捕获密集预测任务所需的丰富语义信息。另一种实现自适应上采样的方法是反卷积[30]。反卷积层作为卷积层的逆算子,学习一组与实例无关的上采样核。但是,它有两个主要缺点。首先,反卷积算子在整个图像上应用相同的核,而不考虑底层内容。这限制了其响应局部变化的能力。其次,当使用大核大小时,它带有大量参数和繁重的计算工作量。这使得其难以覆盖超出小邻域的更大区域,从而限制了其表达能力和性能。

在本文中,我们超越了这些限制,并寻求一种特征上采样算子,其能够1)在大感受野内聚合信息,2)即时适应特定实例的内容,以及3)保持计算效率。为此,我们提出了一种轻量级且高度有效的算子,称为内容感知特征重组(CARAFE)。具体而言,CARAFE通过加权组合,在每个位置为中心的预定区域内重新组合特征,其中权重以内容感知的方式生成。此外,对于每个位置,有多组这样的上采样权重。特征上采样通过将生成的特征重新排列为空间块来完成。
在这里插入图片描述

请注意,这些空间自适应权重不是作为网络参数学习的。相反,它们是使用具有softmax激活的轻量级全卷积模块即时预测的。图1揭示了CARAFE的工作机制。通过CARAFE上采样后,特征图可以更准确地表示对象的形状,从而使模型能够预测更好的实例分割结果。我们的CARAFE不仅在空间上对特征图进行上采样,还学习增强其判别能力。

为了证明CARAFE的普遍有效性,我们使用主流架构在广泛的密集预测任务上进行了全面评估,即目标检测、实例分割、语义分割和图像修复。在MS COCO 2018 test-dev数据集上,CARAFE可以使Faster RCNN[33]在目标检测上的性能提升 1.2 % A P 1.2\% \mathrm{AP} 1.2%AP,使Mask RCNN[9]在实例分割上的性能提升 1.3 % A P 1.3\% \mathrm{AP} 1.3%AP。在ADE20k[47, 48]验证集上的语义分割任务中,CARAFE使UperNet[38]的性能提升了 1.8 % m I o U 1.8\% \mathrm{mIoU} 1.8%mIoU,在Places[46]验证集上的图像修复任务中,使Global&Local[13]的PSNR提升了1.1 dB。当将具有256个通道的 H × W H \times W H×W特征图上采样两倍时,CARAFE引入的计算开销仅为 H ∗ W ∗ 199 k H * W * 199 k HW199k FLOPs,相比之下,反卷积的计算开销为 H ∗ W ∗ 1180 k H * W * 1180 k HW1180k FLOPs。在所有任务上取得的显著增益表明,CARAFE是一种有效且高效的特征上采样算子,未来有很大的潜力成为强有力的研究基石。

2. 相关工作

上采样算子。最常用的上采样方法是最近邻插值和双线性插值。这些插值方法利用距离来衡量像素之间的相关性,并使用手工设计的上采样核。在深度学习时代,提出了几种使用可学习算子对上采样特征图的方法。例如,反卷积[30]是卷积的逆算子,在这些可学习上采样器中最为著名。Pixel Shuffle[35]提出了一种不同的上采样器,它将通道空间上的深度重塑为空间上的宽度和高度。最近,[26]提出了引导上采样(GUM),通过采样具有可学习偏移量的像素来进行插值。然而,这些方法要么仅利用了小邻域内的上下文信息,要么需要昂贵的计算来进行自适应插值。在超分辨率和去噪领域,其他工作[27,16,11]也探索了在低级视觉任务中空间上使用可学习核。本着类似的设计精神,本文展示了内容感知特征重组在几个视觉感知任务中上采样的有效性和工作机制,并提供了一种轻量级解决方案。

密集预测任务。目标检测是定位带有边界框的物体的任务,实例分割进一步要求预测实例级掩码。Faster-RCNN[33]引入了区域提议网络(RPN)用于端到端训练,该网络通过引导锚定方案[37]得到了进一步改进。[21, 24, 17, 45, 31]利用多尺度特征金字塔来处理不同尺度的物体。通过添加额外的掩码预测分支,Mask-RCNN[9]及其变体[1, 12]获得了令人满意的像素级结果。语义分割[25, 19]要求对给定图像进行像素级语义预测。PSPNet[43]引入了多个网格尺度的空间池化,而UperNet[38]基于PSPNet设计了一个更通用的框架。图像或视频修复[42, 40, 39]是填充输入图像缺失区域的一个经典问题。U-net[34]在最近的工作中[13, 36]很受欢迎,并采用了多个上采样算子。Liu等人[23]引入了部分卷积层,以减轻缺失区域对卷积层的影响。我们的CARAFE在各种密集预测任务中展示了普遍的有效性。

3. 内容感知特征重组

特征上采样是许多现代卷积网络架构中的关键算子,这些架构是为包括目标检测、实例分割和场景解析在内的任务开发的。在这项工作中,我们提出了内容感知特征重组(CARAFE)来上采样特征图。在每个位置上,CARAFE可以利用底层内容信息来预测重组核,并在预定义的附近区域内重新组合特征。得益于内容信息,CARAFE可以在不同位置使用自适应和优化的重组核,并且比主流上采样算子(如插值或反卷积)实现更好的性能。

3.1. 公式化

CARAFE作为具有内容感知核的重组算子,包含两个步骤。第一步是根据内容为每个目标位置预测一个重组核,第二步是使用预测的核重新组合特征。给定大小为 C × H × W C \times H \times W C×H×W的特征图 X \mathcal{X} X和上采样比例 σ \sigma σ(假设 σ \sigma σ为整数),CARAFE将生成大小为 C × σ H × σ W C \times \sigma H \times \sigma W C×σH×σW的新特征图 X ′ \mathcal{X}^{\prime} X。对于输出 X ′ \mathcal{X}^{\prime} X上的任何目标位置 l ′ = ( i ′ , j ′ ) l^{\prime}=\left(i^{\prime}, j^{\prime}\right) l=(i,j),在输入 X \mathcal{X} X上都有一个对应的源位置 l = ( i , j ) l=(i, j) l=(i,j),其中 i = ⌊ i ′ / σ ⌋ , j = ⌊ j ′ / σ ⌋ i=\left\lfloor i^{\prime} / \sigma\right\rfloor, j=\left\lfloor j^{\prime} / \sigma\right\rfloor i=i/σ,j=j/σ。这里,我们将 N ( X l , k ) N\left(\mathcal{X}_{l}, k\right) N(Xl,k)表示为以位置 l l l为中心、大小为 k × k k \times k k×k X \mathcal{X} X的子区域,即 X l \mathcal{X}_{l} Xl的邻域。

在第一步中,核预测模块 ψ \psi ψ根据 X l \mathcal{X}_{l} Xl的邻域为每个位置 l ′ l^{\prime} l预测一个位置感知核 W l ′ \mathcal{W}_{l^{\prime}} Wl,如公式(1)所示。重组步骤如公式(2)所示,其中 ϕ \phi ϕ是内容感知重组模块,它使用核 W l ′ \mathcal{W}_{l^{\prime}} Wl重新组合 X l \mathcal{X}_{l} Xl的邻域:
W l ′ = ψ ( N ( X l , k encoder  ) ) X l ′ ′ = ϕ ( N ( X l , k u p ) , W l ′ ) \begin{aligned} \mathcal{W}_{l^{\prime}} & =\psi\left(N\left(\mathcal{X}_{l}, k_{\text {encoder }}\right)\right) \\ \mathcal{X}_{l^{\prime}}^{\prime} & =\phi\left(N\left(\mathcal{X}_{l}, k_{u p}\right), \mathcal{W}_{l^{\prime}}\right) \end{aligned} WlXl=ψ(N(Xl,kencoder ))=ϕ(N(Xl,kup),Wl)
在以下部分中,我们将详细说明 ψ \psi ψ ϕ \phi ϕ的细节。

3.2. 核预测模块

核预测模块负责以内容感知的方式生成重组核。在 X \mathcal{X} X上的每个源位置对应于 X ′ \mathcal{X}^{\prime} X上的 σ 2 \sigma^{2} σ2个目标位置。每个目标位置需要一个 k u p × k u p k_{up} \times k_{up} kup×kup的重组核,其中 k u p k_{up} kup是重组核的大小。因此,该模块将输出大小为 C u p × H × W C_{up} \times H \times W Cup×H×W的重组核,其中 C u p = σ 2 k u p 2 C_{up}=\sigma^{2} k_{up}^{2} Cup=σ2kup2
在这里插入图片描述

核预测模块由三个子模块组成,即通道压缩器、内容编码器和核归一化器,如图2所示。通道压缩器减少了输入特征图的通道数。然后,内容编码器将压缩后的特征图作为输入,对内容进行编码以生成重组核。最后,核归一化器对每个重组核应用softmax函数。以下是对这三个子模块的详细解释。

通道压缩器。我们采用一个 1 × 1 1 \times 1 1×1的卷积层来将输入特征通道从 C C C压缩到 C m C_{m} Cm。减少输入特征图的通道数可以减少后续步骤中的参数数量和计算成本,使CARAFE更高效。在相同的预算下,也可以使用更大的内核大小为内容编码器。实验结果表明,在可接受的范围内减少特征通道不会损害性能。

内容编码器。我们使用大小为 k encoder k_{\text {encoder}} kencoder的卷积层,根据输入特征的内容生成重组核。编码器的参数为 k encoder × k encoder × C m × C u p k_{\text {encoder}} \times k_{\text {encoder}} \times C_{m} \times C_{up} kencoder×kencoder×Cm×Cup。直观上,增加 k encoder k_{\text {encoder}} kencoder可以扩大编码器的感受野,并利用更大区域内的上下文信息,这对于预测重组核很重要。然而,计算复杂度随着内核大小的平方增长,而来自更大内核大小的收益则不会。通过我们在5.3节的研究,经验公式 k encoder = k u p − 2 k_{\text {encoder}}=k_{up}-2 kencoder=kup2在性能和效率之间取得了良好的平衡。

核归一化器。在应用于输入特征图之前,每个 k u p × k u p k_{up} \times k_{up} kup×kup的重组核都会通过softmax函数在空间上进行归一化。归一化步骤强制内核值的和为1,这是在局部区域内的软选择。由于核归一化器,CARAFE不会执行任何重新缩放并改变特征图的平均值,这就是为什么我们提出的算子被称为特征的重组。

3.3. 内容感知重组模块

使用每个重组核 W l ′ \mathcal{W}_{l^{\prime}} Wl,内容感知重组模块将通过函数 ϕ \phi ϕ重新组合局部区域内的特征。我们采用 ϕ \phi ϕ的简单形式,它只是一个加权和算子。对于目标位置 l ′ l^{\prime} l和以 l = ( i , j ) l=(i, j) l=(i,j)为中心的相应正方形区域 N ( X l , k u p ) N\left(\mathcal{X}_{l}, k_{up}\right) N(Xl,kup),重组如公式(3)所示,其中 r = ⌊ k u p / 2 ⌋ r=\left\lfloor k_{up} / 2\right\rfloor r=kup/2

X l ′ ′ = ∑ n = − r r ∑ m = − r r W l ′ ( n , m ) ⋅ X ( i + n , j + m ) \mathcal{X}_{l^{\prime}}^{\prime}=\sum_{n=-r}^{r} \sum_{m=-r}^{r} \mathcal{W}_{l^{\prime}(n, m)} \cdot \mathcal{X}_{(i+n, j+m)} Xl=n=rrm=rrWl(n,m)X(i+n,j+m)

使用重组核,区域 N ( X l , k u p ) N\left(\mathcal{X}_{l}, k_{up}\right) N(Xl,kup)中的每个像素都会基于特征的内容而不是位置的距离,对上采样像素 l ′ l^{\prime} l产生不同的贡献。由于局部区域内相关点的信息可以更多地被关注,因此重新组合后的特征图的语义可能比原始特征图更强。

3.4. 与先前算子的关系

在这里,我们讨论了CARAFE与动态滤波器[15]、空间注意力[3]、空间变换器[14]和可变形卷积[6]之间的关系,它们具有相似的设计理念但侧重点不同。

动态滤波器。动态滤波器根据网络的输入生成特定实例的卷积滤波器,然后将预测的滤波器应用于输入。动态滤波器和CARAFE都是内容感知算子,但它们之间的根本区别在于内核生成过程。具体来说,动态滤波器是一个两步卷积过程,其中额外的滤波器预测层和滤波层需要大量的计算。相反,CARAFE只是局部区域内特征的重新组合,而不学习跨通道的特征变换。假设输入特征图的通道数为 C C C,滤波器的内核大小为 K K K,则在动态滤波器中,每个位置预测的内核参数为 C × C × K × K C \times C \times K \times K C×C×K×K。对于CARAFE,内核参数仅为 K × K K \times K K×K。因此,它在内存和速度上更高效。

空间注意力。空间注意力预测一个与输入特征大小相同的注意力图,然后对每个位置的特征图进行重新缩放。我们的CARAFE通过加权和对局部区域内的特征进行重新组合。总之,空间注意力是一个具有逐点指导的重缩放算子,而CARAFE是一个具有局部区域指导的重新组合算子。空间注意力可以看作是CARAFE的一种特殊情况,其中重组核大小为1,不考虑核归一化器。

空间变换网络(STN)。STN根据输入特征图预测一个全局参数变换,并通过该变换对特征进行扭曲。然而,这个全局参数变换假设太强,无法表示复杂的空间变化;而且STN的训练很难。在这里,CARAFE使用位置特定的重组来处理空间关系,这能够实现更灵活的局部几何建模。

可变形卷积网络(DCN)。DCN也采用了学习几何变换的思想,并将其与常规卷积层相结合。它预测内核偏移量,而不是使用网格卷积内核。与动态滤波器类似,它也是一个重参数算子,计算成本比CARAFE高24倍。它也对参数初始化很敏感。

4. CARAFE的应用

CARAFE可以无缝集成到需要上采样算子的现有框架中。在这里,我们介绍一些在主流密集预测任务中的应用。CARAFE通过引入可忽略的额外参数,在高层次和低层次任务(如目标检测、实例分割、语义分割和图像修复)中均提升了最先进方法的性能。

4.1. 目标检测和实例分割

特征金字塔网络(FPN)是目标检测和实例分割领域的一种重要且有效的架构。它显著提高了Faster R-CNN和Mask R-CNN等流行框架的性能。FPN通过自顶向下的路径和横向连接构建具有强大语义的特征金字塔。在自顶向下的路径中,首先通过最近邻插值将低分辨率特征图上采样2倍,然后与高分辨率特征图进行融合,如图3所示。
在这里插入图片描述

我们提出在所有特征级别中用CARAFE替代最近邻插值。这一修改很平滑,无需额外更改。除了FPN结构外,Mask R-CNN在掩码头的末尾采用了一个反卷积层。它用于将预测的 14 × 14 14 \times 14 14×14数字上采样到 28 × 28 28 \times 28 28×28,以获得更精细的掩码预测。我们也可以使用CARAFE来替代反卷积层,从而进一步降低计算成本。

4.2. 语义分割

语义分割要求模型对整个图像输出逐像素级别的预测,因此通常更喜欢高分辨率特征图。在该任务中,上采样被广泛用于放大特征图并融合不同级别的语义信息。UperNet是语义分割的一个强大基线。它在以下三个组件中使用上采样,即PPM、FPN、FUSE。我们采用CARAFE替代它们原有的上采样器。

金字塔池化模块(PPM)。PPM是PSPNet中的关键组件,它分层地将输入特征图下采样到多个尺度 { 1 × 1 , 2 × 2 , 3 × 3 , 6 × 6 } \{1 \times 1,2 \times 2,3 \times 3,6 \times 6\} {1×1,2×2,3×3,6×6},然后通过双线性插值将它们上采样回原始尺寸。最后,通过拼接将这些特征与原始特征进行融合。由于上采样比例非常大,我们采用两步策略,使用CARAFE在性能和效率之间取得平衡。首先,我们使用双线性插值将 { 1 × 1 , 2 × 2 , 3 × 3 , 6 × 6 } \{1 \times 1,2 \times 2,3 \times 3,6 \times 6\} {1×1,2×2,3×3,6×6}特征上采样到原始特征图尺寸的一半,然后使用CARAFE进一步将其上采样2倍。

特征金字塔网络(FPN)。与检测模型类似,UperNet也采用FPN来丰富特征语义。它只有四个不同的特征级别 { P 2 , P 3 , P 4 , P 5 } \{\mathrm{P} 2, \mathrm{P} 3, \mathrm{P} 4, \mathrm{P}5\} {P2,P3,P4,P5},步长分别为 { 4 , 8 , 16 , 32 } \{4,8,16,32\} {4,8,16,32}。我们以与4.1节相同的方式替换上采样算子。

多级特征融合(FUSE)。UperNet在FPN之后提出了一个多级特征融合模块。它通过双线性插值将P3、P4、P5上采样到与P2相同的尺寸,然后通过拼接融合这些不同级别的特征。该过程相当于一个顺序上采样-拼接过程,即首先将P5上采样到P4的尺寸并进行拼接,然后将拼接后的特征图上采样到P3的尺寸,以此类推。我们在这里用CARAFE替换顺序双线性上采样。

4.3. 图像修复

U-net架构在最近提出的图像修复方法中很受欢迎,如Global&Local [13]和Partial Conv [23]。在网络的后半部分有两个上采样算子。我们简单地将这两个上采样层替换为CARAFE并评估性能。对于Partial Conv,我们可以通过使用我们的内容感知重组核更新掩码来方便地保持CARAFE中的掩码传播。

5. 实验

5.1. 实验设置

数据集与评估指标。我们在几个重要的密集预测基准上评估了CARAFE。默认情况下,我们使用训练集进行训练,并在验证集上评估这些数据集的性能。
目标检测和实例分割。我们在具有挑战性的MS COCO 2017数据集上进行了实验。结果采用标准的COCO评估指标,即IoU从0.5到0.95的平均精度(mAP)。
语义分割。我们采用ADE20k基准来评估我们的方法在语义分割任务中的表现。结果通过平均IoU(mIoU)和像素准确率(P.A.)来衡量,分别表示预测与真实掩码之间的平均IoU和每像素分类准确率。
图像修复。我们采用Places数据集进行图像修复。使用L1误差(越低越好)和PSNR(越高越好)作为评估指标。
实现细节。除非另有说明,否则CARAFE在实验中采用一组固定的超参数,其中通道压缩器的 C m C_{m} Cm为64,内容编码器的 k encoder = 3 k_{\text{encoder}}=3 kencoder=3 k u p = 5 k_{up}=5 kup=5。更多实现细节见补充材料。
目标检测和实例分割。我们在Faster RCNN和Mask RCNN上评估了CARAFE,主干网络为ResNet-50带FPN,并遵循Detectron [8]和MMDetection [2]的1x训练计划设置。语义分割。我们使用UperNet的官方实现 1 ^{1} 1,并采用相同的实验设置。
图像修复。我们采用Global&Local [13]和Partial Conv [23]作为基线方法来评估CARAFE。

5.2. 基准测试结果

目标检测与实例分割。我们首先通过将FPN中的最近邻插值替换为CARAFE(针对Faster RCNN和Mask RCNN),以及将Mask RCNN中掩码头的反卷积层替换为CARAFE来评估我们的方法。如表1所示,CARAFE使Faster RCNN的bbox AP提高了 1.2 % 1.2\% 1.2%,使Mask RCNN的掩码AP提高了 1.3 % 1.3\% 1.3% A P S \mathrm{AP}_{S} APS A P M \mathrm{AP}_{M} APM A P L \mathrm{AP}_{L} APL的提升均超过 1 % A P 1\% \mathrm{AP} 1%AP,这表明它对各种目标尺度都有益。

如图1所示的定性结果支持了我们令人鼓舞的性能。我们可视化了FPN自上而下路径中的特征图,并将CARAFE与基线(即最近邻插值)进行了比较。显然,通过内容感知重组,特征图更具判别性,并且预测出了更精确的目标掩码。在图4中,我们展示了一些实例分割结果的示例,比较了基线和CARAFE。
在这里插入图片描述

为了研究不同上采样算子的有效性,我们在Faster RCNN中使用了不同的算子在FPN中进行上采样,并进行了大量实验。结果如表2所示。对于“N.C.”和“B.C.”,分别表示“最近邻+卷积”和“双线性+卷积”,我们在相应的上采样后添加了一个额外的 3 × 3 3 \times 3 3×3卷积层。“Deconv”、“Pixel Shuffle”(表示为“P.S.”)、“GUM”是三种具有代表性的基于学习的上采样方法。我们还比较了这里的“空间注意力”(表示为“S.A.”)。CARAFE在这些上采样算子中取得了最高的AP,且FLOPs和参数相对较少,这证明了它既有效又高效。“最近邻+卷积”和“双线性+卷积”的结果表明,额外的参数并没有带来显著的增益。“Deconv”、“Pixel Shuffle”、“GUM”和“空间注意力”的性能均低于CARAFE,这表明设计有效的上采样算子至关重要。

除了FPN这种金字塔特征融合结构外,我们还探索了掩码头中的不同上采样算子。在典型的Mask R-CNN中,采用反卷积层将RoI特征上采样2倍。为了公平比较,我们没有对FPN进行任何修改,只将反卷积层替换不同的为算子。由于我们只修改了掩码预测分支,因此以掩码AP的形式报告性能,如表3所示。在这些方法中,CARAFE在实例分割方面取得了最佳性能。

在表4中,我们报告了在Mask RCNN的FPN和掩码头中分别采用CARAFE的目标检测和实例分割结果。这些实验均取得了一致的改进。
语义分割。我们将UperNet中的上采样器替换为CARAFE,并在ADE20k基准上评估结果。如表5所示,CARAFE将单尺度测试的mIoU从 40.44 % 40.44\% 40.44%大幅提升至 42.23 % 42.23\% 42.23%。值得注意的是,带有CARAFE的UperNet也取得了比最近的强大基线(如PSPNet [43]和PSANet [44])更好的性能。

我们按照4.2节所述,逐步研究了修改UperNet中不同组件的有效性。表6中的结果表明,CARAFE对所有三个组件都有帮助,且它们的组合带来了进一步的增益。
图像修复。我们证明了CARAFE在图像修复等低级任务中也是有效的。通过在两个强大的基线Global&Local [13]和Partial Conv [23]中将上采样算子替换为CARAFE,我们观察到这两种方法都有显著改进。如表7所示,我们的方法在PSNR指标上使两个基线分别提高了1.1 dB和0.2 dB。

5.3. 消融研究与进一步分析

模型设计与超参数。我们研究了模型设计中超参数的影响,即压缩通道 C m C_{m} Cm、编码器核大小 k encoder k_{\text{encoder}} kencoder和重组核大小 k u p k_{up} kup。我们还测试了核归一化器中不同的归一化方法。我们使用带有ResNet-50主干的Faster RCNN对设计和设置进行了消融研究,并在COCO 2017验证集上评估了结果。

为了实现高效设计,我们首先分析了由浮点运算数(FLOPs)衡量的计算复杂度。当以因子 σ \sigma σ对输入通道为 C i n C_{in} Cin的特征图进行上采样时,CARAFE的每像素FLOPs计算为 2 ( C in + 1 ) C m + 2 ( C m k encoder 2 + 1 ) σ 2 k u p 2 + 2 σ 2 k u p 2 C i n 2\left(C_{\text{in}}+1\right)C_{m}+2\left(C_{m}k_{\text{encoder}}^{2}+1\right)\sigma^{2}k_{up}^{2}+2\sigma^{2}k_{up}^{2}C_{in} 2(Cin+1)Cm+2(Cmkencoder2+1)σ2kup2+2σ2kup2Cin,参见[28]。

我们在通道压缩器中尝试了不同的 C m C_{m} Cm值。此外,我们还尝试移除通道压缩器模块,这意味着内容编码器直接使用输入特征来预测重组核。表8中的实验结果表明,将 C m C_{m} Cm压缩到64不会导致性能下降,反而更加高效。进一步减小 C m C_{m} Cm会导致性能略有下降。在没有通道压缩器的情况下,它可以达到相同的性能,这证明了通道压缩器可以在不损害性能的情况下加快核预测速度。基于以上结果,我们默认将 C m C_{m} Cm设置为64,以在性能和效率之间取得平衡。

然后,我们研究了 k encoder k_{\text{encoder}} kencoder k u p k_{up} kup的影响。直观上,增加 k u p k_{up} kup也需要更大的 k encoder k_{\text{encoder}} kencoder,因为内容编码器需要一个大的感受野来预测一个大的重组核。如表9所示,同时增加 k encoder k_{\text{encoder}} kencoder k u p k_{up} kup可以提高性能,而只增加其中一个则不会。我们总结了一个经验公式 k encoder = k u p − 2 k_{\text{encoder}}=k_{up}-2 kencoder=kup2,这是所有设置中的一个好选择。尽管采用更大的核大小是有帮助的,但我们默认设置 k u p = 5 k_{up}=5 kup=5 k encoder = 3 k_{\text{encoder}}=3 kencoder=3,以在性能和效率之间取得平衡。

除了softmax函数外,我们还测试了核归一化器中的其他替代方案,如sigmoid或带归一化的sigmoid。如表10所示,“Softmax”和“Sigmoid Normalized”具有相同的性能,并且优于“Sigmoid”,这表明将重组核归一化为和为1是至关重要的。
在这里插入图片描述

CARAFE的工作原理。我们进行了进一步的定性研究,以弄清楚CARAFE是如何工作的。我们使用训练好的采用CARAFE作为上采样算子的Mask RCNN模型,在图5中可视化了重组过程。在特征金字塔网络(FPN)结构中,低分辨率特征图将连续上采样几次以达到更高的分辨率,因此上采样特征图中的一个像素会从更大的区域重新组合信息。我们在高分辨率特征图中采样了一些像素,并查看它们是从哪些相邻像素重新组合而来的。绿色圆圈表示示例位置,红色点表示在重组过程中高度加权的源。从图中可以清楚地看出,CARAFE是内容感知的。它倾向于重新组合具有相似语义信息的点。人体上的一个位置更倾向于来自同一人体的其他点,而不是其他物体或附近的背景。对于具有较弱语义的背景区域中的位置,重组更加均匀或只是偏向于具有相似低级纹理特征的点。

6. 结论

我们提出了内容感知特征重组(CARAFE),这是一种通用、轻量级且高度有效的上采样算子。它在目标检测、实例/语义分割和图像修复的标准基准上分别一致地将性能提高了 1.2 % A P 1.2\% AP 1.2%AP 1.3 % A P 1.3\% AP 1.3%AP 1.8 % m I o U 1.8\% mIoU 1.8%mIoU 1.1 d B 1.1 dB 1.1dB。更重要的是,CARAFE引入的计算开销很小,并且可以轻松集成到现代网络架构中。未来的研究方向包括探索CARAFE在低级视觉任务(如图像恢复和超分辨率)中的适用性。

致谢。本工作部分得到了商汤科技集团(中大协议编号:TS1610626和TS1712093)、香港研究资助局(GRF)(编号:14236516和14203518)、新加坡教育部(MOE)AcRF一级(M4012082.020)、南洋理工大学(NTU)学生资助基金(SUG)和NTU NAP的联合研究资助。

附录

附录A. 详细实验设置

目标检测和实例分割。我们在以ResNet-50为主干网络的Faster RCNN[33]和Mask RCNN[9]上评估CARAFE。这些方法使用了FPN[21]。在训练和推理中,我们调整输入图像的大小,使其短边有800像素或长边有1333像素,同时保持其纵横比不变。我们采用同步SGD,初始学习率为0.02,动量为0.9,权重衰减为0.0001。我们在8个GPU上使用16的批量大小(每个GPU 2张图像)。遵循Detectron[8]和MMDetection[2]的1倍训练计划,我们总共训练12个周期,并在第8个和第11个周期将学习率降低0.1倍。

语义分割。我们使用以ResNet-50为主干网络的UperNet的官方实现{ }^{3} [38]。在训练期间,输入图像的短边大小随机从{300,375,450, 525,600}中选择。在推理中,为了公平比较,我们采用单尺度测试,并将图像的短边设置为450像素。在训练和推理中,图像长边的最大长度均设置为1200。我们采用同步SGD,初始学习率为0.02,动量为0.9,权重衰减为0.0001。我们在8个GPU上使用16的批量大小(每个GPU 2张图像),并采用同步批量归一化,这是语义分割中的常见做法。遵循[4],我们采用“poly”学习率策略,其中当前迭代的学习率等于初始学习率乘以KaTeX parse error: Expected 'EOF', got '_' at position 21: …ext { iter /max_̲iter })^{\text …。我们将power设置为0.9,并总共训练20个周期。

图像修复。我们采用Global&Local[13]中的生成器和判别器网络作为基线。我们的生成器以带有掩码区域 M M M 256 × 256 256 \times 256 256×256图像 x x x作为输入,并输出缺失区域的 256 × 256 256 \times 256 256×256预测 y ^ \hat{\mathbf{y}} y^。然后,我们通过 y = ( 1 − M ) ⊙ x + M ⊙ y ^ \mathbf{y}=(1-M) \odot \mathbf{x}+M \odot \hat{\mathbf{y}} y=(1M)x+My^将预测图像与输入图像结合。最后,将组合后的输出 y \mathbf{y} y输入到判别器中。我们对基线模型进行了简单修改,以获得更好的生成质量。与原始模型使用两个判别器相比,我们仅在修复区域使用一个PatchGAN风格的判别器[18]。这种修改可以获得更好的图像质量。

为了公平比较并考虑实际应用,我们使用[41]引入的自由形式掩码作为二进制掩码 M M M。对于Partial Conv[23],我们只需在生成器中将卷积层替换为官方的Partial Conv模块。在训练期间,我们采用Adam求解器,学习率为0.0001,其中 β 1 = 0.5 \beta_{1}=0.5 β1=0.5 β 2 = 0.9 \beta_{2}=0.9 β2=0.9。训练批量大小为32。输入和输出在范围 [ − 1 , 1 ] [-1,1] [1,1]内线性缩放。

附录B. CARAFE的可视化

在图6中,我们通过更多示例展示了CARAFE如何进行内容感知重组。在FPN结构的自上而下路径中,红色单元通过CARAFE重组为绿色中心单元。

附录C. 可视化结果比较
目标检测和实例分割。如图7所示,我们提供了Mask RCNN基线和带有CARAFE的Mask RCNN在COCO[22] 2017验证集上的更多目标检测和实例分割结果比较。

语义分割。我们在图8中比较了ADE20k[47]验证集上UperNet基线和带有CARAFE的UperNet的语义分割结果。

图像修复。在图9中,我们展示了Places[46]验证集上Global&Local基线和带有CARAFE的Global&Local的图像修复结果比较。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

代码

class CARAFE(nn.Module):
    def __init__(self, c, k_enc=3, k_up=5, c_mid=64, scale=2):
        """ The unofficial implementation of the CARAFE module.
        The details are in "https://arxiv.org/abs/1905.02188".
        Args:
            c: The channel number of the input and the output.
            c_mid: The channel number after compression.
            scale: The expected upsample scale.
            k_up: The size of the reassembly kernel.
            k_enc: The kernel size of the encoder.
        Returns:
            X: The upsampled feature map.
        """
        super(CARAFE, self).__init__()
        self.scale = scale

        self.comp = Conv(c, c_mid)
        self.enc = Conv(c_mid, (scale*k_up)**2, k=k_enc, act=False)
        self.pix_shf = nn.PixelShuffle(scale)

        self.upsmp = nn.Upsample(scale_factor=scale, mode='nearest')
        self.unfold = nn.Unfold(kernel_size=k_up, dilation=scale, 
                                padding=k_up//2*scale)

    def forward(self, X):
        b, c, h, w = X.size()
        h_, w_ = h * self.scale, w * self.scale
        
        W = self.comp(X)                                # b * m * h * w
        W = self.enc(W)                                 # b * 100 * h * w
        W = self.pix_shf(W)                             # b * 25 * h_ * w_
        W = torch.softmax(W, dim=1)                         # b * 25 * h_ * w_

        X = self.upsmp(X)                               # b * c * h_ * w_
        X = self.unfold(X)                              # b * 25c * h_ * w_
        X = X.view(b, c, -1, h_, w_)                    # b * 25 * c * h_ * w_

        X = torch.einsum('bkhw,bckhw->bchw', [W, X])    # b * c * h_ * w_
        return X

改进方法

将上面的代码复制到conv.py中,如下图:

在这里插入图片描述

在__init__.py中导入CARAFE,代码如下:
在这里插入图片描述
在这里插入图片描述
在task.py中导入CARAFE,如下图:
在这里插入图片描述
在task.py的parse_model函数中增加CARAFE,如下图
在这里插入图片描述
代码:

        elif m is CARAFE:
            c2 = ch[f]
            args = [c2, *args]

修改配置文件ultralytics/cfg/models/11/yolo11l.yaml,代码如下:

# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPs
  s: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPs
  m: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPs
  l: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPs
  x: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs

# YOLO11n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 2, C3k2, [256, False, 0.25]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 2, C3k2, [512, False, 0.25]]
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  - [-1, 2, C3k2, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  - [-1, 2, C3k2, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9
  - [-1, 2, C2PSA, [1024]] # 10

# YOLO11n head
head:
  - [-1, 1, CARAFE, []]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 2, C3k2, [512, False]] # 13

  - [-1, 1, CARAFE, []]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 13], 1, Concat, [1]] # cat head P4
  - [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]] # cat head P5
  - [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)

  - [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)

在项目的根目录添加train.py脚本,代码如下:

from ultralytics import YOLO
import os

if __name__ == '__main__':
    # 加载模型
    model = YOLO(model="ultralytics/cfg/models/11/yolo11l.yaml") # 从头开始构建新模型

    # Use the model
    results = model.train(data="VOC.yaml", epochs=300, device='0', batch=8, seed=42,)  # 训练模

训练完成后,就可以看到测试结果!

在项目的根目录添加val.py脚本,代码如下:


from ultralytics import YOLO


if __name__ == '__main__':
    # Load a model
    # model = YOLO('yolov8m.pt')  # load an official model
    model = YOLO('runs/detect/train/weights/best.pt')  # load a custom model


    # Validate the model
    metrics = model.val(split='val')  # no arguments needed, dataset and settings remembered

split='val’代表使用验证集做测试,如果改为split=‘test’,则使用测试集做测试!

在项目的根目录添加test.py脚本,代码如下:

from ultralytics import YOLO


if __name__ == '__main__':
    # Load a model
    # model = YOLO('yolov8m.pt')  # load an official model
    model = YOLO('runs/detect/train/weights/best.pt')  # load a custom model
    results = model.predict(source="ultralytics/assets", device='0',save=True)  # predict on an image
    print(results)

test脚本测试assets文件夹下面的图片,save设置为true,则保存图片的测试结果!

结构图

在这里插入图片描述

测试结果

Starting training for 2 epochs...

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
        1/2      12.8G      1.248      2.452       1.09         56        640: 100%|██████████| 259/259 [01:59<00:00,  2.16it/s]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 15/15 [00:06<00:00,  2.32it/s]
                   all        230       1412      0.621      0.504      0.528      0.373
  0%|          | 0/259 [00:00<?, ?it/s]
      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
        2/2      12.9G      1.083      1.192      1.017        109        640: 100%|██████████| 259/259 [02:20<00:00,  1.84it/s]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 15/15 [00:34<00:00,  2.28s/it]
                   all        230       1412      0.845      0.682      0.773      0.557

2 epochs completed in 0.086 hours.
Optimizer stripped from runs\detect\train3\weights\last.pt, 51.6MB
Optimizer stripped from runs\detect\train3\weights\best.pt, 51.6MB

Validating runs\detect\train3\weights\best.pt...
WARNING ⚠️ validating an untrained model YAML will result in 0 mAP.
Ultralytics 8.3.28 🚀 Python-3.12.4 torch-2.4.1 CUDA:0 (NVIDIA GeForce RTX 4090 Laptop GPU, 16376MiB)
YOLO11l summary (fused): 480 layers, 25,485,048 parameters, 0 gradients
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 15/15 [00:24<00:00,  1.66s/it]
                   all        230       1412      0.846      0.682      0.773      0.556
                   c17         40        131      0.864      0.947      0.966      0.742
                    c5         19         68      0.917       0.65      0.903      0.685
            helicopter         13         43      0.839      0.884      0.891       0.52
                  c130         20         85      0.952      0.937      0.965      0.622
                   f16         11         57      0.442      0.544       0.48      0.299
                    b2          2          2          1          0     0.0773     0.0459
                 other         13         86      0.916      0.631      0.819      0.458
                   b52         21         70      0.846        0.9      0.912      0.682
                  kc10         12         62      0.943      0.805      0.948      0.769
               command         12         40       0.66        0.7      0.722       0.52
                   f15         21        123      0.939      0.829      0.959      0.629
                 kc135         24         91      0.716       0.78      0.831      0.543
                   a10          4         27      0.211      0.037      0.121     0.0611
                    b1          5         20      0.837        0.8      0.877      0.655
                   aew          4         25      0.907          1       0.99      0.814
                   f22          3         17      0.372      0.706      0.697        0.5
                    p3          6        105      0.993       0.99      0.995      0.781
                    p8          1          1          1          0      0.995      0.697
                   f35          5         32      0.943      0.515      0.759      0.351
                   f18         13        125       0.74       0.92      0.952      0.778
                   v22          5         41          1      0.926      0.993       0.58
                 su-27          5         31      0.998      0.935      0.993      0.834
                 il-38         10         27      0.895          1      0.995        0.8
                tu-134          1          1          1          0     0.0498     0.0448
                 su-33          1          2          1          0          0          0
                 an-70          1          2      0.956          1      0.995      0.846
                 tu-22          8         98      0.954       0.99      0.987      0.759

总结

完整代码:

通过百度网盘分享的文件:YoloV11改进策略:上采样改进CARAFE,轻量级上采样即插即用附...
链接:https://pan.baidu.com/s/1-zPme_EW3xaJrdMYsrOP7A?pwd=ih5v 
提取码:ih5v

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

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

相关文章

常用的c++特性-->day02

c11新特性 可调用对象案例分析 可调用对象包装器语法案例可调用对象包装器作为函数参数补充&#xff1a;类型转换运算符案例 可调用对象绑定器语法格式绑定非类成员函数/变量案例1案例2案例3案例4 绑定类成员函数/变量 lambda表达式捕获列表案例1返回值案例2 --> 包装器绑定…

锐捷技能大赛—L2TP隧道与L2TP Over IPSec嵌套,并在隧道内运行OSPF

目录 总部与分支站点之间建立隧道 基础配置 配置L2TP VPN ​编辑配置L2TP Over IPSec L2TP Over IPSec隧道内运行OSPF协议 总部与分支站点之间建立隧道 拓扑如下 基础配置 R1 int g0/1 ip add 10.1.1.1 30 int g0/0 ip add 192.168.10.254 24 exit ip route 0.0.0.0 0.0…

python可视化将多张图整合到一起(画布)

这周有点事忙着&#xff0c;没时间重温刚结束的Mathurcup数学建模&#xff0c;这两天也是再看了下&#xff0c;论文还是赶紧挺烂的&#xff0c;但比国赛又有进步&#xff08;说起国赛又不得不抱怨了&#xff0c;基本其余省份都发了&#xff0c;但江西......哎&#xff09;。哎&…

网络编程、UDP、TCP、三次握手、四次挥手

一、初识网络编程 网络编程的概念&#xff1a;在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景&#xff1a;即时通信、网游对战、金融证券、国际贸易、邮件等等。 不管是什么场景&#xff0c;都是计算机和计算机之间通过网络进行…

在 Jupyter Notebook 中使用 Matplotlib 进行交互式可视化的教程

在 Jupyter Notebook 中使用 Matplotlib 进行交互式可视化的教程 引言 数据可视化是数据分析的重要组成部分&#xff0c;能够帮助我们更直观地理解数据。Matplotlib 是 Python 中最流行的绘图库之一&#xff0c;而 Jupyter Notebook 则是进行数据分析和可视化的理想环境。本文…

[单例模式]

[设计模式] 设计模式是软件工程中的一种常见做法, 它可以理解为"模板", 是针对一些常见的特定场景, 给出的一些比较好的固定的解决方案. 不同语言适用的设计模式是不一样的. 这里我们接下来要谈到的是java中典型的设计模式. 而且由于设计模式比较适合有一定编程经…

STM32软件开发 —— STM32CudeMX使用优点

目 录 STM32CudeMX使用思路步骤详细 STM32CudeMX 在图形化工具STM32CudeMX出现之前&#xff0c;开发者通常是参考库驱动文件中的例程来配置芯片的&#xff0c;进行拷贝和修改等&#xff0c;为了提高开发效率&#xff0c;ST公司开发了STM32CudeMX工具&#xff0c;通过它简化了芯…

江西省补贴性线上职业技能培训管理平台(刷课系统)

江西省补贴性线上职业技能培训管理平台(刷课系统) 目的是为了刷这个网课 此系统有两个版本一个是脚本运行&#xff0c;另外一个是可视化界面运行 可视化运行 技术栈:flask、vue3 原理: 通过分析网站接口&#xff0c;对某些接口加密的参数进行逆向破解&#xff0c;从而修改请求…

Golang | Leetcode Golang题解之第546题移除盒子

题目&#xff1a; 题解&#xff1a; func removeBoxes(boxes []int) int {dp : [100][100][100]int{}var calculatePoints func(boxes []int, l, r, k int) intcalculatePoints func(boxes []int, l, r, k int) int {if l > r {return 0}if dp[l][r][k] 0 {r1, k1 : r, k…

es自动补全(仅供自己参考)

elasticssearch提供了CompletionSuggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询效率&#xff0c;对于文档中字段的类型有一些约束&#xff1a; 查询类型必须是&#xff1a;completion 字段内容是多个补全词条形成的数组 P…

ANDROIDWORLD: A Dynamic Benchmarking Environment for Autonomous Agents论文学习

这个任务是基于androidenv的。这个环境之前学过&#xff0c;是一个用来进行强化学习的线上环境。而这篇文章的工作就是要给一些任务加上中间的奖励信号。这种训练环境的优点就是动态&#xff0c;与静态的数据集&#xff08;比如说我自己的工作&#xff09;不同&#xff0c;因此…

VBA10-处理Excel的动态数据区域

一、end获取数据边界 1、基本语法 1-1、示例&#xff1a; 2、配合row和column使用 2-1、示例1 2-2、示例2 此时&#xff0c;不管这个有数值的区域&#xff0c;怎么增加边界&#xff0c;对应的统计数据也会跟着变的&#xff01; 二、end的缺陷 若是数据区域不连贯&#xff0c;则…

【FFmpeg】FFmpeg 函数简介 ③ ( 编解码相关函数 | FFmpeg 源码地址 | FFmpeg 解码器相关 结构体 和 函数 )

文章目录 一、FFmpeg 解码器简介1、解码流程分析2、FFmpeg 编解码器 本质3、FFmpeg 编解码器 ID 和 名称 二、FFmpeg 解码器相关 结构体 / 函数1、AVFormatContext 结构体2、avcodec_find_decoder 函数 - 根据 ID 查找 解码器3、avcodec_find_decoder_by_name 函数 - 根据 名称…

Linux完结

学习视频笔记均来自B站UP主" 泷羽sec",如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 【linux基础之病毒编写&#xff08;完结&#xff09;】 https://www.bilibili.com/video…

分享三个python爬虫案例

一、爬取豆瓣电影排行榜Top250存储到Excel文件 近年来&#xff0c;Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程序&#xff0c;用于抓取豆瓣电影Top250的相关信息&#xff0c;并将其保存为Excel文件。 获取网页数据的函数&#xff0c;包括以…

【计网】数据链路层笔记

【计网】数据链路层 数据链路层概述 数据链路层在网络体系结构中所处的地位 链路、数据链路和帧 链路(Link)是指从一个节点到相邻节点的一段物理线路(有线或无线)&#xff0c;而中间没有任何其他的交换节点。 数据链路(Data Link)是基于链路的。当在一条链路上传送数据时&a…

docker 拉取MySQL8.0镜像以及安装

目录 一、docker安装MySQL镜像 搜索images 拉取MySQL镜像 二、数据挂载 在/root/mysql/conf中创建 *.cnf 文件 创建容器,将数据,日志,配置文件映射到本机 检查MySQL是否启动成功&#xff1a; 三、DBeaver数据库连接 问题一、Public Key Retrieval is not allowed 问题…

【c++篇】:栈、队列、优先队列:容器世界里的秩序魔法 - stack,queue与priority_queue探秘

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 前言一.容器stack1.介绍2.成员函数3.模拟实现4.注意事项 二.容器qu…

实现uniapp-微信小程序 搜索框+上拉加载+下拉刷新

pages.json 中的配置 { "path": "pages/message", "style": { "navigationBarTitleText": "消息", "enablePullDownRefresh": true, "onReachBottomDistance": 50 } }, <template><view class…

无人机培训机型有哪些?CAAC考证选3类还是4类

无人机培训是一个涵盖多个方面的综合性过程&#xff0c;旨在培养具备无人机操作技能和相关知识的人才。 无人机培训机型 无人机培训通常涵盖多种机型&#xff0c;以满足不同领域和应用场景的需求。常见的无人机培训机型包括&#xff1a; 1. 多旋翼无人机&#xff1a;也称为多…