RepViT:当MobileNet遇到ViT

paper:https://arxiv.org/abs/2307.09283

code:https://github.com/THU-MIG/RepViT

目录

0. 摘要

1. 引言

2. 相关工作

3. 方法

 3.1. 准备工作

3.2. block设计

3.3. 宏观设计

3.4. 微观设计

3.5. 网络结构

4. 实验

4.1. Image Classification

4.2. RepViT meets SAM 

 4.3. Downstream Tasks

4.4. Model Analyses

5.结论


0. 摘要

        近期,在资源受限的的移动设备上,轻量ViTs表现出了比CNNs更好的性能和更低的延迟。研究人员发现了轻量级vit和轻量级cnn之间的许多结构联系。然而,尚未充分检查它们之间的块结构、宏观和微观设计的显着架构差异。在这项研究中,我们从 ViT 的角度重新审视轻量级 CNN 的有效设计,并强调它们对移动设备的前景。具体来说,我们通过集成轻量级 ViT 的有效架构设计,逐步增强标准轻量级 CNN(即 MobileNetV3)的移动友好性。这最终得到了一系列新的纯轻量级cnn,即RepViT。大量的实验表明,RepViT优于现有的最先进的轻量级vit,并在各种视觉任务中表现出良好的延迟。值得注意的是,在 ImageNet 上,RepViT 在 iPhone 12 上以 1.0 ms 的延迟实现了超过 80% 的 top-1 准确率,据我们所知,这是轻量级模型第一次。此外,当RepViT满足SAM时,我们的RepViT-SAM比先进的MobileSAM实现了近10倍的推理速度。

1. 引言

         在计算机视觉领域,设计轻量级模型一直是以降低计算成本实现卓越模型性能的主要焦点。这对于资源受限的移动设备来说尤其重要,以便能够在边缘部署视觉模型。在过去的十年中,研究人员主要关注轻量级卷积神经网络 (CNN),并取得了重大进展。已经提出来了许多高效的设计准则,包括可分离卷积[27]、倒置残差瓶颈[53]、通道混洗[44,75]和结构重新参数化[13,14]等。这些设计原则导致了诸如MobileNets[26,27,53]、ShuffleNets[44,75]和RepVGG[14]等代表性模型的发展。

        近年来,视觉Transformer(ViTs)[18]已经成为cnn学习视觉表示的一种有前途的替代方案。在各种视觉任务(如图像分类[39,63]、语义分割[6,66]和目标检测[4,34])上,与cnn相比,它们表现出了优越的性能。然而,增加 ViT 中参数数量以提高模型大小和低延迟的性能趋势 [11, 40],这使得它们不适合资源受限的移动设备 [36, 46]。虽然可以直接减小ViT模型的模型大小以匹配移动设备的约束,但它们的性能往往不如轻量级cnn[5]。因此,研究人员开始探索轻量级ViTs的设计,旨在超越轻量级 CNN。

        已经提出了许多有效的设计原则来提高VITS在移动设备上的计算效率[5,35,46,49]。一些方法提出了将卷积层与 ViT 相结合的创新架构,从而产生混合网络 [5, 46]。此外,引入了具有线性复杂度[47]和维度一致设计原则[35,36]的新型自我注意操作来提高效率。这些研究表明,轻量级 ViT [35, 47, 49] 可以在移动设备上实现更低的延迟,同时优于轻量级 CNN [26, 53, 60],如图 1 所示。

        尽管轻量级vit取得了成功,但由于硬件和计算库支持不足,它们继续面临实际挑战[60]。此外,vit容易受到高分辨率输入的影响,导致延迟很高[3]。相比之下,CNN 利用相对于输入的线性复杂度高度优化的卷积操作,这使得它们有利于边缘设备上的部署 [54, 73]。因此,设计高性能轻量级 CNN 变得至关重要,引人注目的是我们仔细比较现有的轻量级 ViT 和 CNN。

        轻量级vit和轻量级cnn表现出一定的结构相似性。例如,它们都使用卷积神经网络模块来学习空间局部表示[46,47,49,61]。为了学习全局表示,轻量级CNN通常会扩大卷积的核大小[73],而轻量级VITS通常采用多头自我注意模块[46,47]。然而,尽管这些结构连接,但它们之间的块结构、宏观/微观设计存在显着差异,尚未得到足够的研究。例如,轻量级 ViT 通常采用 MetaFormer 块结构 [69],而轻量级 CNN 有利于倒置的残差瓶颈 [53]。这自然引出了一个问题:轻量级 ViT 的架构设计能否用于提高轻量级 CNN 的性能。为了回答这个问题,本研究从ViT的角度重新审视了轻量级cnn的设计。我们的研究旨在弥合轻量级 CNN 和轻量级 ViT 之间的差距,并强调了前者在移动设备上部署的前景后者相比更好。

        为了实现这个目标,按照[41]的做法,我们从标准的轻量级 CNN 开始,即 MobileNetV3-L [26]。我们通过结合轻量级vit的高效架构设计来逐渐“现代化”其架构[35,36,38,46]。最后,对于资源受限的移动设备,我们获得了一组新的轻量级 CNN,即 RepViT,它完全由类似 ViT 的 MetaFormer 结构中的重新参数化卷积组成 [36, 69, 70]。作为纯轻量级 CNN,RepViT 相比于现有的SOTA轻量级vit[35,49]表现出卓越的性能和效率,涉及到各种计算机视觉任务,包括ImageNet[12]上的图像分类、COCO-2017[37]上的目标检测和实例分割以及ADE20k[78]上的语义分割。值得注意的是,RepViT 在 ImageNet 上达到超过 80% 的 top-1 准确率,iPhone 12 上的延迟为 1.0 ms,据我们所知,这是轻量级模型首次达到这么快。我们最大的模型 RepViT-M2.3,在只有 2.3 毫秒的延迟的情况下获得了 83.7% 的准确率。在将RepViT与SAM[33]结合后,我们的RepViT-SAM可以获得比最先进的MobileSAM[71]快近10倍的推理速度,同时具有更好的零镜头传输能力。我们希望 RepViT 可以作为强大的基线,并激发对边缘部署的轻量级模型的进一步研究。

2. 相关工作

        在过去的十年中,卷积神经网络 (CNN) 因其自然的归纳偏置和平移不变性而成为计算机视觉任务的主要方法 [16, 23, 24, 43, 62, 67]。然而,标准 CNN 的广泛计算使它们不适合部署在资源受限的移动设备上。为了克服这一挑战,已经提出了许多技术来使 CNN 更加轻量级和移动友好,包括可分离卷积 [27]、倒置残差瓶颈 [53]、通道混洗 [44, 75] 和结构重新参数化 [14] 等。这些方法为开发几种广泛使用的轻量级 CNN 铺平了道路,例如 MobileNets [26,27, 53]、ShuffleNets [44, 75] 和 RepVGG [14]。

        随后,引入了视觉Transformer (ViT) [18],它采用 Transformer 架构在大规模图像识别任务上实现最先进的性能,超过了 CNN [18, 58]。基于vit的竞争性能,后续工作试图结合空间归纳偏置来提高其稳定性和性能[10,22],设计更有效的自注意力操作[17,79],并使vit适应各种计算机视觉任务[19,74]。

        尽管 ViT 在各种视觉任务中表现出比 CNN 更好的性能,但它们中的大多数都是参数量很多的,需要大量的计算和内存占用 [39, 58]。这使得它们不适合资源有限的移动设备[46,49]。因此,研究人员致力于探索各种技术,使vit更轻量级,对移动设备更友好[47,59]。例如,MobileViT[46]采用混合架构,结合轻量级MobileNet块和多头自注意(MHSA)块。EfficientFormer[36]提出了一种维度一致的设计范式来增强延迟性能边界。这些轻量级vit已经证明了新的SOTA和移动设备上的延迟权衡,优于以前的轻量级 CNN [53, 60]。

        轻量级vit的成功通常归功于具有学习全局表示能力的多头自注意模块。然而,轻量级 CNN 和轻量级 ViT 之间的显着架构区别,包括它们的块结构,以及宏观和微观元素,通常被忽略。因此,与现有工作不同,我们的主要目标是通过整合轻量级 ViT 的架构设计来重新审视轻量级 CNN 的设计。我们的目标是弥合轻量级 CNN 和轻量级 ViT 之间的差距,并保持前者的移动设备友好性。

3. 方法

        在本节中,我们从标准的轻量级 CNN 开始,即 MobileNetV3-L,然后通过结合轻量级 ViT 的架构设计逐渐从各种粒度对其进行现代化。我们首先引入度量来衡量移动设备上的延迟,然后在3.1节中将训练配方与现有的轻量级vit对齐。基于一致的训练设置,我们在第3.2节中探讨了最优块设计。我们在第3.3节中从宏观架构元素(即茎、下采样层、分类器和整体阶段比)进一步优化MobileNetV3-L在移动设备上的性能。然后,我们在第3.4节中通过分层微设计调整轻量级CNN。图2显示了我们在每个步骤中实现的整个过程和结果。最后,我们在第 3.5 节中获得了为移动设备设计的一类新的纯轻量级 CNN,即 RepViT。所有模型都在 ImageNet-1K 上进行训练和评估。

 3.1. 准备工作

        延迟度量:以前的工作 [5, 57] 基于浮点运算 (FLOP) 或模型大小等指标优化模型的推理速度。然而,这些指标在移动应用程序[36]中与现实世界的延迟没有很好的相关性。因此,按照 [35, 36, 46, 60]的做法,我们测量实际的设备上延迟作为基准指标。这样的策略可以为现实世界移动设备上的不同模型提供更准确的性能评估和公平的比较。在实践中,我们利用iPhone 12作为测试设备,Core ML Tools[1]作为编译器,如[35,36,60]。此外,为了避免使用 Core ML 工具不支持的功能,我们在 [36, 60] 之后在 MobileNetV3-L 模型中采用 GeLU 激活。我们测量 MobileNetV3-L 的延迟为 1.01 ms。

        训练方案对齐:最近的轻量级vit[35,36,46,49]通常采用DeiT[58]的训练方案方。具体来说,他们使用AdamW优化器[42]和余弦学习率调度器,从头开始 300 个 epoch来训练模型,并使用使用RegNetY16GF[51]作为老师进行蒸馏。此外,他们采用Mixup[72]、自动增强[8]和随机擦除[77]进行数据增强。标签平滑[56]也被用作正则化方案。为了公平比较,我们将 MobileNetV3-L 的训练方案与现有的轻量级 ViT 对齐,不过排除了知识蒸馏。因此,MobileNetV3-L 获得了 71.5% 的 top-1 准确率。现在,我们默认使用此训练方案。

3.2. block设计

        Separate token mixer and channel mixer:相关轻量级vit[35,36,47]研究所提出的块结构包含了一个重要的设计特征,即单独的令牌混合器(token mixer)和通道混合器(channel mixer)[70]。根据最近的研究[69],vit的有效性主要源于它们的一般令牌混合器和通道混合器架构,即MetaFormer架构,而不是配备的特定令牌混合器。鉴于这一发现,我们的目标是通过在MobileNetV3-L中拆分令牌混合器和通道混合器来模拟现有的轻量级vit。

        具体来说,如图 3(a) 所示,原始 MobileNetV3 块采用 1×1 扩展卷积和一个1 × 1 投影层来实现通道之间的交互(即通道混合器)。在1×1展开卷积之后配置3×3深度(DW)卷积,用于空间信息(即令牌混合器)的融合。这样的设计使得令牌混合器和通道混合器耦合在了一起。为了分离它们,我们首先向上移动 DW 卷积。可选的挤压激励 (SE) 层也移到 DW 之后,因为它取决于空间信息交互。因此,我们可以在MobileNetV3块中成功分离令牌混合器和通道混合器。我们进一步对 DW 层采用了广泛使用的结构重新参数化技术 [7, 14] 来增强训练期间的模型学习。由于结构重新参数化技术,我们可以在推理过程中消除与跳跃连接相关的计算和内存成本,这对于移动设备尤其有利。我们将此块命名为 RepViT 块(图 3.(b)),它将 MobileNetV3-L 的延迟降低到 0.81 ms,以及临时性能下降到 68.3%。

PS:对图3(b),token mixer 和 channel mixer是分别被不同的卷积层来表示的,token mixer是3*3DW+SE,channel mixer是1*1+1*1。这一点可以从源码中找到对应关系:

class RepViTBlock(nn.Module):
    def __init__(self, inp, hidden_dim, oup, kernel_size, stride, use_se, use_hs):
        super(RepViTBlock, self).__init__()
        assert stride in [1, 2]

        self.identity = stride == 1 and inp == oup
        assert(hidden_dim == 2 * inp)

        if stride == 2:
            self.token_mixer = nn.Sequential(
                Conv2d_BN(inp, inp, kernel_size, stride, (kernel_size - 1) // 2, groups=inp),
                SqueezeExcite(inp, 0.25) if use_se else nn.Identity(),
                Conv2d_BN(inp, oup, ks=1, stride=1, pad=0)
            )
            self.channel_mixer = Residual(nn.Sequential(
                    # pw
                    Conv2d_BN(oup, 2 * oup, 1, 1, 0),
                    nn.GELU() if use_hs else nn.GELU(),
                    # pw-linear
                    Conv2d_BN(2 * oup, oup, 1, 1, 0, bn_weight_init=0),
                ))
        else:
            assert(self.identity)
            self.token_mixer = nn.Sequential(
                RepVGGDW(inp),
                SqueezeExcite(inp, 0.25) if use_se else nn.Identity(),
            )
            self.channel_mixer = Residual(nn.Sequential(
                    # pw
                    Conv2d_BN(inp, hidden_dim, 1, 1, 0),
                    nn.GELU() if use_hs else nn.GELU(),
                    # pw-linear
                    Conv2d_BN(hidden_dim, oup, 1, 1, 0, bn_weight_init=0),
                ))

    def forward(self, x):
        return self.channel_mixer(self.token_mixer(x))

          减少膨胀比并增加宽度:在 vanilla ViT 中,通道混合器中的扩展率通常设置为 4,使得前馈网络 (FFN) 模块的隐藏维数比输入维度宽 4 倍。因此,它消耗的计算资源的很大一部分,从而对整体推理时间有很大贡献[76]。为了缓解这一瓶颈,最近的工作[21,30]采用了更窄的FFN。例如,LV-ViT [30] 在 FFN 中采用 3 的扩展比。LeViT[21]将扩展比设置为2。此外,Yang等人[68]指出FFN中存在大量的信道冗余。因此,使用较小的扩展比是合理的。

        在 MobileNetV3-L 中,扩展比范围从 2.3 到 6,最后两个阶段的浓度为 6,通道数较多。对于我们的 RepViT 块,我们在通道混合器中为所有阶段设置扩展比为 2,遵循 [21, 30, 38]。这导致延迟减少到 0.65 毫秒。因此,随着扩展比较小,我们可以增加网络宽度来弥补大量参数的减少。我们在每个阶段之后对通道进行双重处理,每个阶段最终得到48,96,192和384个通道。这些修改可以将 top-1 准确率提高到 73.5%,延迟为 0.89 ms。请注意,通过直接调整原始 MobileNetV3 块上的扩展率和网络宽度,我们在 0.91 ms 的类似延迟下获得了 73.0% 的 top-1 准确率的较差性能。因此,默认情况下,对于块设计,我们使用带有 RepViT 块的新扩展率和网络宽度。

3.3. 宏观设计

        在这一部分中,我们对移动设备的宏观架构进行了优化,包括从网络前端到网络后端的所有环节。

        Early convolutions for stem:ViT通常使用补丁操作作为stem,将输入图像划分为不重叠的补丁[18]。这个简单的stem对应于具有大内核大小(例如,内核大小 = 16)和大步幅(例如,步幅 = 16)的非重叠卷积。分层 ViT [39, 63] 采用相同的补丁操作,但补丁大小为 4。然而,最近的工作 [65] 表明,这种补丁操作很容易导致 ViT 的训练方案的非标准优化能力和敏感性。为了缓解这些问题,他们建议使用少量堆叠的 步长为2的 3×3 卷积作为stem的替代方案,称为早期卷积,提高了优化稳定性和性能,这也是其广泛应用于轻量级 ViT [35, 36]的原因。

        相比之下,MobileNetV3-L 采用复杂的stem,涉及 3 × 3 卷积、深度可分离卷积和倒置瓶颈,如图 4(a) 所示。由于主干模块以最高分辨率处理输入图像,因此复杂的架构可能会受到移动设备上严重的延迟瓶颈的影响。因此,作为权衡,MobileNetV3-L 将过滤器的初始数量减少到 16,这反过来又限制了词干的表示能力。为了解决这些问题,在 [35, 36, 38, 65] 之后,我们采用早期卷积的方法 [65],简单地装备两个步长为 = 2 的 3 × 3 卷积作为词干。如图 4(b) 所示,第一个卷积中的过滤器数设置为 24,第二个卷积中的过滤器数设置为 48。整体延迟降低到 0.86 ms。同时,top-1 准确率提高到 73.9%。我们现在将使用早期卷积作为stem。

        Deeper downsampling layers: 在vit中,空间下采样通常是通过一个单独的补丁合并层来实现的。如[41]所示,这种基于分离的下采样层促进了网络深度的增加,减少了分辨率降低造成的信息丢失。因此,EfficientViT [38] 采用sandwich布局来加深下采样层,实现高效有效的下采样。相比之下,MobileNetV3-L 仅通过步长为 = 2 的 DW 卷积的反向瓶颈块实现下采样,如图 4.(c) 所示。这种设计可能缺乏足够的网络深度,导致信息丢失和对模型性能的负面影响。因此,为了实现单独和更深的下采样层,我们首先使用stride = 2和pointwise 1 × 1卷积的DW卷积分别进行空间下采样和调制通道维度,如图4(d)所示。此外,我们在RepViT块前面加上一个RepViT块来进一步加深下采样层。在 1×1 卷积之后放置一个 FFN 模块来记忆更多的潜在信息。因此,这种更深的下采样层将 top-1 准确率提高到 75.4%,延迟为 0.96 ms。我们现在将利用更深的下采样层。

       Simple classifier:在轻量级 ViT [21, 36, 46] 中,分类器通常由全局平均池化层和一个线性层组成。因此,这种简单的分类器对延迟很友好,尤其是对于移动设备。相比之下,MobileNetV3-L 采用复杂的分类器,其中包括一个额外的 1×1 卷积和一个额外的线性层来将特征扩展到高维空间 [9],如图 4.(e) 所示。这样的设计对于MobileNetV3-L生成丰富的预测特征[26]至关重要,特别是在最后阶段给出小输出通道。然而,这反过来又给移动设备上的延迟带来了沉重的负担。考虑到最后阶段现在在第 3.2 节中的块设计之后有更多的通道,因此我们将其替换为一个简单的分类器,即全局平均池化层和线性层,如图 4.(f) 所示。此步骤导致精度下降 0.6%,但延迟降低到 0.77 ms。我们现在将使用简单的分类器。

        Overall stage ratio:阶段比表示不同阶段的块数之比,从而表示跨阶段计算的分布。以前的工作[50,51]表明,利用第三阶段更多的块在精度和速度之间取得了很好的平衡。因此,现有的轻量级vit在这个阶段通常应用更多的块。例如,EfficientFormer-L2 [36] 采用 1:1:3:1.5 的阶段比率。同时,Conv2Former [25] 表明,更极端的阶段比率和更深的布局对于小型模型表现更好。因此,他们分别采用 Conv2Former-T 和 Conv2FormerS 的 1:1:4:1 和 1:1:8:1 的阶段比率。在这里,我们对网络采用 1:1:7:1 的阶段比率。然后,我们将网络深度增加到 2:14:2,实现更深的布局。此步骤将 top-1 准确率提高到 76.9%,延迟为 0.91 ms。我们将使用这个阶段比率。

3.4. 微观设计

        在本节中,我们关注轻量级 CNN 的微架构,包括内核大小选择和SE层的放置。

        Kernel size selection:CNN 的性能和延迟经常受到卷积核大小的影响。例如,为了捕获 MHSA 等长期依赖关系,ConvNeXt [41] 采用大型内核大小的卷积,表现出性能提升。同样,RepLKNet [15] 展示了一种强大的范式,它利用 CNN 中的超大卷积核。然而,由于其计算复杂度和内存访问成本,大型内核化卷积对移动设备并不友好。此外,与 3 × 3 卷积相比,更大的卷积核通常不会通过编译器和计算库 [14] 进行优化。MobileNetV3-L 主要利用 3 × 3 卷积,在某些块中使用了少量 5 × 5 卷积。为了确保移动设备上的推理效率,我们在所有模块中优先考虑简单的 3 × 3 卷积。这种替换可以保持 76.9% 的top-1 准确率,同时延迟降低到 0.89 ms。我们现在将使用 3 × 3 卷积。

        SE层的放置:与卷积相比,自注意力模块的一个优点是能够根据输入调整权重,称为数据驱动属性 [29, 64]。作为通道明智的注意模块,SE 层 [28] 可以弥补卷积缺乏数据驱动属性的局限性,带来更好的性能 [73]。MobileNetV3-L 在某些块中包含 SE 层,主要关注后两个阶段。然而,如[52]所示,与分辨率较高的特征图阶段相比,低分辨率特征图的相位获得了更小的精度优势。同时,随着性能提升,SE 层还引入了不可忽略的计算成本。因此,我们设计了一种以跨块方式利用 SE 层的策略,即在每个阶段的第 1、3、5 ...块中采用 SE 层,以达到以最小的延迟增量最大化准确性优势的目的。此步骤将 top-1 准确率提高到 77.4%,延迟为 0.87 ms。我们现在将使用这个跨块 SE 层放置。这带来了我们的最终模型,即 RepViT。

3.5. 网络结构

在[36,46]之后,我们开发了多个RepViT变体,包括RepViT-M0.9/M1.0/M1.1/M1.5/M2.3。后缀“-MX”表示对应模型的延迟在移动设备上为X ms,即iOS 16的iPhone 12。变体的区别在于通道的数量以及每个阶段的块数。有关详细信息,请参阅补充材料。

4. 实验

4.1. Image Classification

4.2. RepViT meets SAM 

 4.3. Downstream Tasks

4.4. Model Analyses

5.结论

        在本文中,我们通过结合轻量级 ViT 的架构设计重新审视轻量级 CNN 的有效设计。我们最终得到了 RepViT,这是一种用于资源受限的移动设备的新型轻量级 CNN 系列。RepViT在各种视觉任务中优于现有的最先进的轻量级vit和cnn,显示出良好的性能和延迟。它突出了纯轻量级cnn在移动设备上的前景。我们希望 RepViT 可以作为强大的基线,并激发对轻量级模型的进一步研究。

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

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

相关文章

Day:动态规划 LeedCode 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

123. 买卖股票的最佳时机 III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票&a…

系统架构设计精华知识

数据流风格:适合于分阶段做数据处理,交互性差,包括:批处理序列、管理过滤器。调用/返回风格:一般系统都要用到,包括:主程序/子程序,面向对象,层次结构(分层越…

Rootkit介绍

一、定义 Rootkit是一种恶意软件,旨在让黑客访问和控制目标设备。虽然大多数Rootkit 会影响软件和操作系统,但有些还会感染计算机的硬件和固件。Rootkit善于隐藏自己,担当它们保持隐藏时,其实处于活跃状态。 一旦未经授权获得对计…

让更多的人能使用AI才能提升国内AI竞争力

随着人工智能技术的快速发展,AI正在深入影响我们的生活和工作。然而,目前AI技术的使用和应用主要集中在少数大型科技公司和研究机构,普通大众对AI技术的接触和使用还相对有限。如何让更多的人能够便捷地使用AI,从而带动整个国内AI产业的发展,已成为当前亟需解决的问题。 首先…

SQLAIchemy 异步DBManager封装-03得心应手

前言 SQLAIchemy 异步DBManager封装-01入门理解SQLAIchemy 异步DBManager封装-02熟悉掌握 在前两篇文章中,我们详细介绍了SQLAlchemy异步DBManager的封装过程。第一篇文章帮助我们入门理解了整体的封装结构和思路,第二篇文章则帮助我们更加熟悉和掌握了这…

Github进行fork后如何与原仓库同步

前言 fork了一个仓库以后怎么同步源仓库的代码? 步骤 1、执行命令 git remote -v 查看你的远程仓库的路径。 以一个实际例子说明, 来源仓库: TheFirstLineOfCode/basaltgit remote -v得到: origin https://github.com/ghmi…

“亚马逊依赖”之下,傲基科技的品牌势能如何提升?

受益于出口政策红利、低人工成本、完善的供应链以及成熟的生产工艺优势,近年来我国家具出口行业迅速发展。 数据显示,我国家具出口规模1995年仅为11.06亿美元,至2023年增至641.96亿美元。随着出口规模持续扩大,相关企业积极走入公…

Java高级阶段面试题库(Redis数据库、MQ消息队列、kafka、SpringBoot + SpringCloud、MySQL、JVMJUC、其它)

文章目录 1. Redis数据库篇(忽略)1.1 简单介绍一下redis1.2 单线程的redis为什么读写速度快?1.3 redis为什么是单线程的?1.4 redis服务器的的内存是多大?1.5 为什么Redis的操作是原子性的,怎么保证原子性的?1.6 你还用过其他的缓存吗?这些…

基于深度学习的车牌识别

如果你认为车牌只是车子的‘名字’,那么是时候让你见识一下,当科技赋予它‘超能力’时会发生什么? 上效果图; 这就是车牌识别的力量,下面是主函数代码: # -*- coding: UTF-8 -*- import argparse import …

使用d3.js画一个BoxPlot

Box Plot 在画Box Plot之前,先来了解下Box Plot是什么? 箱线图(Box Plot)也称盒须图、盒式图或箱型图,是一种用于展示数据分布特征的统计图表。 它由以下几个部分组成: 箱子:表示数据的四分…

阶段性学习汇报 4月19日

目录 一、毕业设计和毕业论文 二、学习python和vue 三、阅读知识图谱 四、下周规划 一、毕业设计和毕业论文 毕业设计后端功能基本实现,但是还有些具体的细节需要优化。前端小程序部分只有个前端页面以及部分交互逻辑,还需进一步完善。在疾病预测这里本…

3d模型合并怎么样不丢材质?---模大狮模型网

在3D设计中,合并模型是常见的操作,它可以帮助设计师将多个单独的模型组合成一个,从而简化场景并提高渲染效率。然而,合并模型时常常会面临一个棘手的问题:如何确保合并后的模型不丢失原有的材质?本文将探讨如何在合并…

电力调度自动化系统由什么构成?

电力调度自动化系统由什么构成? 电力调度自动化系统通过数据采集与传输、数据处理与存储、监视与控制、优化与决策、通信网络和系统应用软件等构成,实现对电力系统的监控、控制和优化。 电力调度自动化系统是一种集成了计算机技术、通信技术、自动化技术…

推荐5款我每次系统重装必装的软件

​ 你电脑中用的最久的软件是哪些?以下是否有你曾经使用过的软件呢?工欲善其事,必先利其器,今天继续分享五款实用的办公软件。 1.素材管理——Billfish ​ Billfish是一款专业的素材管理工具,适用于设计师、摄影师等…

2023中国便利店TOP100公示

转载来源:中国连锁经营协会

unity 录制360全景渲染图

1.打开pakcageManager ,选择packages为 unityRegisty,找到unityRecorder插件下载,点击右下角instant安装,如果插件列表为空,检查是否连接网络,重启Unity 2.打开录制面板 3.add recorder 选择ImageSequence …

风险防不胜防?看YashanDB如何守护你的数据库安全(上篇)

数据库作为信息系统的核心,不仅承载着海量的关键数据,还负责向各类用户提供高效、可靠的信息服务,数据库的安全性显得尤为关键,已成为信息安全体系的重中之重。 什么是数据库安全? 数据库安全是数据安全的一个子集&a…

制造业小企业内部小程序简单设计

也没什么需求,就是看企业内部外来单位就餐还需要打印客饭单拿去食堂给打饭师傅,出门单还需要打印纸质版,车间PDA扫码出问题需要人手动处理,会议室需要OA申请,但是申请前不知道哪些会议室事空的(因为不是每个人都下载OA…

毫米波雷达模块用于海洋生态环境监测的技术方案研究

海洋生态环境是地球上重要的自然资源之一,对其进行监测和保护具有重要意义。毫米波雷达技术作为一种先进的感知技术,在海洋生态环境监测中具有广阔的应用前景。本文将探讨毫米波雷达模块用于海洋生态环境监测的技术方案,包括其原理、应用场景…

el-select下拉框远程搜索且多选时,编辑需要回显的一个简单案例

前端业务开发中不管使用vue2~3,还是react,angular各种前端技术栈,经常会遇到这种业务。一个下拉框Select中,不仅需要需要支持远程模糊搜索,还需要支持多选。并且在编辑时,还能正常把已经多选好的内容回显到…