【YOLO系列】YOLOv7论文超详细解读(翻译 +学习笔记)

news2024/11/16 6:30:08

前言

终于读到传说中的YOLOv7了~≖‿≖✧

这篇是在美团的v6出来不到一个月就高调登场,作者还是我们熟悉的AB大神(对,就是v4那个),读起来又是“熟悉”的感觉(贯穿了我的整个五一假期(╯-_-)╯╧╧)。

其实关于YOLOv7的网络结构还有很多细节值得深入研究,以及代码我在后续也会像v5那样出个详解系列(后台收到太多私信让我出v7的代码,桥豆麻袋!等俺研究明白了就出!(ง •̀_•́)ง)

好了,这篇就让我们先学习一下论文部分吧!

学习资料:

论文:YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors

开源代码:mirrors / WongKinYiu / yolov7 · GitCode


YOLO论文系列前期回顾: 

【YOLO系列】YOLOv6论文超详细解读(翻译 +学习笔记)

【YOLO系列】YOLOv5超详细解读(网络详解)

【YOLO系列】YOLOv4论文超详细解读2(网络详解)

【YOLO系列】YOLOv4论文超详细解读1(翻译 +学习笔记)

【YOLO系列】YOLOv3论文超详细解读(翻译 +学习笔记)

【YOLO系列】YOLOv2论文超详细解读(翻译 +学习笔记)

【YOLO系列】YOLOv1论文超详细解读(翻译 +学习笔记)


目录

前言

Abstract—摘要

一、  Introduction—简介

二、Related work—相关工作

2.1 Real-time object detectors—实时物体检测器

2.2 Model re-parameterization—模型重新参数化

2.3 Model scaling—模型缩放

三、Architecture—网络结构

3.1 Extended efficient layer aggregation networks—扩展的高效层聚合网络

3.2 Model scaling for concatenation-based models— 基于连接的模型的模型缩放

四、Trainable bag-of-freebies—可训练的bag-of-freebies

4.1 Planned re-parameterized convolution—卷积重参化

4.2 Coarse for auxiliary and fine for lead loss—辅助训练模块

4.2.1 Deep supervision—深度监督

4.2.2 Label assigner— 标签分配器

4.2.3 Lead head guided label assigner— 先导头导向标签分配器

4.2.4 Coarse-to-fine lead head guided label assigner— 由粗到精的 lead head 指导标签分配器

4.3 Other trainable bag-of-freebies—其他的可训练“工具”

五、Experiments—实验

5.1 Experimental setup—实验步骤

5.2 Baselines—基线网络

5.3 Comparison with state-of-the-arts—与其他流行网络的对比

5.4 Ablation study—消融研究

5.4.1 Proposed compound scaling method—提出的复合 scaling 方法

5.4.2 Proposed planned re-parameterized model—提出的 planned re-parameterized 模型

5.4.3 Proposed assistant loss for auxiliary head—提出的 auxiliary head 的 assistant loss

六、Conclusions—结论

Abstract—摘要

翻译

YOLOv7在5FPS到 160 FPS 范围内的速度和准确度都超过了所有已知的物体检测器,YOLOv7 在 5 FPS 到 160 FPS 范围内的速度和准确度都超过了所有已知的目标检测器,并且在 GPU V100 上 30 FPS 或更高的所有已知实时目标检测器中具有最高的准确度 56.8% AP。YOLOv7-E6 目标检测器(56 FPS V100,55.9% AP)比基于transformer-based的检测器 SWINL Cascade-Mask R-CNN(9.2 FPS A100,53.9% AP)的速度和准确度分别高出 509% 和 2%,以及基于卷积的检测器 ConvNeXt-XL Cascade-Mask R-CNN (8.6 FPS A100, 55.2% AP) 速度提高 551%,准确率提高 0.7%,以及 YOLOv7 的表现优于:YOLOR、YOLOX、Scaled-YOLOv4、YOLOv5、DETR、Deformable DETR  , DINO-5scale-R50, ViT-Adapter-B 和许多其他物体探测器在速度和准确度上。 此外,我们只在 MS COCO 数据集上从头开始训练 YOLOv7,而不使用任何其他数据集或预训练的权重。  源码发布在: GitHub - WongKinYiu/yolov7: Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors


精读

YOLOv7的成就

5FPS160FPS的范围内,在速度和精度上都超过了所有已知的物体检测器,在GPU V100上以30 FPS或更高的速度在所有已知 的实时物体检测器中具有最高的精度56.8%AP

YOLOv7-E6在速度和精度上优于

  • 基于transformer的检测器SWINL Cascade-Mask R-CNN
  • 基于卷积的检测器ConvNeXt XL级联掩码R-CNN

YOLOv7优于

YOLORYOLOXScaled-YOLOv4YOLOv5DETR、可变形DETRDINO-5scale-R50ViT-Adapter-B和许多其他物体检 器的速度和精度。

训练方面:作者只在COCO数据集上从0开始训练YOLOv7,而不使用任何其他数据集或预先训练的权重。


一、  Introduction—简介

翻译

    实时对象检测是计算机视觉中非常重要的主题,因为它通常是计算机视觉系统中的必要组件。 例如,多目标跟踪[94, 93],自动驾驶[40, 18],机器人[35, 58],医学图像分析[34, 46]等。执行实时目标检测的计算设备通常是一些移动CPU或GPU,以及各大厂商开发的各种神经处理单元(NPU)。 比如苹果神经引擎(Apple)、神经计算棒(Intel)、Jetson AI边缘设备(Nvidia)、边缘TPU(谷歌)、神经处理引擎(Qualcomm)、AI处理单元(MediaTek)、 和 AI SoC(Kneron)都是 NPU。 上面提到的一些边缘设备专注于加速不同的操作,例如普通卷积、深度卷积或 MLP 操作。 在本文中,我们提出的实时目标检测器主要希望它能够同时支持移动 GPU 和从边缘到云端的 GPU 设备。

    近年来,实时目标检测器仍在针对不同的边缘设备进行开发。例如,开发MCUNet [49, 48] 和 NanoDet [54] 的运营专注于生产低功耗单芯片并提高边缘 CPU 的推理速度。 至于 YOLOX [21] 和 YOLOR [81] 等方法,他们专注于提高各种 GPU 的推理速度。 最近,实时目标检测器的发展集中在高效架构的设计上。 至于可以在 CPU [54, 88, 84, 83] 上使用的实时目标检测器,他们的设计主要基于 MobileNet [28, 66, 27]、ShuffleNet [92, 55] 或 GhostNet [25]  . 另一个主流的实时目标检测器是为 GPU [81, 21, 97] 开发的,它们大多使用 ResNet [26]、DarkNet [63] 或 DLA [87],然后使用 CSPNet [80] 策略来优化架构。 本文提出的方法的发展方向与当前主流的实时目标检测器不同。 除了架构优化之外,我们提出的方法将专注于训练过程的优化。 我们的重点将放在一些优化的模块和优化方法上,它们可能会增加训练成本以提高目标检测的准确性,但不会增加推理成本。我们将提出的模块和优化方法称为可训练的bag-of-freebies。

    最近,模型重新参数化[13,12,29]和动态标签分配[20,17,42]已成为网络训练和目标检测的重要课题。 主要是在上述新概念提出之后,物​​体检测器的训练演变出了很多新的问题。 在本文中,我们将介绍我们发现的一些新问题,并设计解决这些问题的有效方法。对于模型重参数化,我们用梯度传播路径的概念分析了适用于不同网络层的模型重参数化策略,并提出了有计划的重参数化模型。 此外,当我们发现使用动态标签分配技术时,具有多个输出层的模型的训练会产生新的问题。即:“如何为不同分支的输出分配动态目标?” 针对这个问题,我们提出了一种新的标签分配方法,称为coarse-to-fine引导式标签分配

    本文的贡献总结如下:(1)我们设计了几种可训练的bag-of-freebies方法,使得实时目标检测可以在不增加推理成本的情况下大大提高检测精度;(2) 对于目标检测方法的演进,我们发现了两个新问题,即重新参数化的模块如何替换原始模块,以及动态标签分配策略如何处理分配给不同输出层的问题。 此外,我们还提出了解决这些问题所带来的困难的方法;(3) 我们提出了实时目标检测器的“扩展”和“复合缩放”方法,可以有效地利用参数和计算;  (4) 我们提出的方法可以有效减少最先进实时目标检测器约40%的参数和50%的计算量,并具有更快的推理速度和更高的检测精度。


精读

本文主要工作

  • 提出了一个实时对象检测器,主要是希望它能够从边缘到云端同时支持移动GPUGPU设备
  • 优化了架构,专注于优化训练过程。重点放在优化模块优化方法上,称为可训练的 “Bag of freebies”

其实关于Bag of freebiesBag of specials我们在YOLOv4就见过,现在来回顾一下:

  • Bag of freebies字面意思就是免费赠品。在这里就是指用一些比较有用的训练技巧来训练模型,  只会改变训练策略或只会增加训练成本(不增加推理成本)的方法。从而使得模型获得更好的准确率但不增加模型的复杂度,也就不会增加推理的计算量
  • Bag of specials指一些插件模块(plugin modules)和后处理方法(post-processing methods),  它们只稍微增加了推本,但可以极大的提高目标检测的准确度。  一般来说,这些插件用来提高一个模型中的特定属性。比如增加感受野( SPP、  ASPP   RFB),引入注意力机制(spatial attentionchannel attention),提高特征整合的能力(FPNASFFBiFPN)。
  • 对于模型重参数化问题,本文使用梯度传播路径的概念分析了适用于不同网络中的层的模型重参数化策略,并提出了有计划的重参数化模型
  • 对于动态标签分配问题,本文提出了一种新的标签分配方法,称为由粗到细引导标签分配

本文主要贡献

(1)提出了几种可用于训练的方法,这些方法仅仅会增加训练上的负担用于提升model性能,而不会增加推理负担

(2)对于目标检测方法的发展,作者发现了两个新问题: ​​​​

  • 重参数化模块如何替换原始模块
  • ②动态标签分配策略如何处理对不同输出层的

不过本文提出了解决这俩问题的方法

(3)作者针对目标检测可以更有效的利用参数和计算问题,提出了"扩展"(extend)复合缩放”(compound scaling)

(4)提出的方法可以有效的减少40%参数量50%计算量,高精度高速度


二、Related work—相关工作

2.1 Real-time object detectors—实时物体检测器

翻译

    目前最先进的实时目标检测器主要基于 YOLO [61, 62, 63] 和 FCOS [76, 77],分别是 [3, 79, 81, 21, 54, 85, 23]  . 能够成为最先进的实时目标检测器通常需要以下特性:(1)更快更强的网络架构;  (2) 更有效的特征整合方法[22, 97, 37, 74, 59, 30, 9, 45]; (3) 更准确的检测方法 [76, 77, 69];  (4) 更稳健的损失函数 [96, 64, 6, 56, 95, 57];  (5) 一种更有效的标签分配方法 [99, 20, 17, 82, 42];  (6) 更有效的训练方法。 在本文中,我们不打算探索需要额外数据或大型模型的自我监督学习或知识蒸馏方法。 相反,我们将针对与上述 (4)、(5) 和 (6) 相关的最先进方法衍生的问题设计新的可训练bag-of-freebies方法。


精读

先进的网应该具有以下特性:

     (1)更快更有效的

     (2)更有效的特征集成方法

     (3)更准确的检测方

     (4)更有鲁棒性的损失函数

     (5)更有效的标签匹配方法

     (6)更有效的训练方

文中主要针对(4)、( 5)、( 6)。


2.2 Model re-parameterization—模型重新参数化

翻译

    模型重新参数化技术 [71、31、75、19、33、11、4、24、13、12、10、29、14、78] 在推理阶段将多个计算模块合并为一个。 模型重参数化技术可以看作是一种集成技术,我们可以将其分为两类,即模块级集成和模型级集成。 模型级别的重新参数化有两种常见的做法来获得最终的推理模型。 一种是用不同的训练数据训练多个相同的模型,然后对多个训练模型的权重进行平均。 另一种是对不同迭代次数的模型权重进行加权平均。 模块级重新参数化是最近比较热门的研究问题。这种方法在训练时将一个模块拆分为多个相同或不同的模块分支,在推理时将多个分支模块整合为一个完全等效的模块。然而,并非所有提出的重新参数化模块都可以完美地应用于不同的架构。 考虑到这一点,我们开发了新的重新参数化模块,并为各种架构设计了相关的应用策略。


精读

模型重新参数化的介绍

训练将一个模块拆分为多个相同或不同的模块分支推理将多个分支模块整合为一个完全等效的模块。   

有两种方法:即块级集成模型级集成

获得最终推理模型的两种方法

     (1)不同的训练数据训练多个相同的模型,然后对多个训练模型的权重进行平均

     (2)对不同迭代次数的模型权重进行加权平均

优点

  • 训练时,采用多分支的网络使模型获取更好的特征表达
  • 推理时,将并行融合成串行,从而降低计算量和参数量,提升速度(融合后理论上和融合前识别效果一样,实际基本都是稍微降低一点点)

不足

   并不是所有提出的重新参数化模块都可以完美地应用于不同的架构。


2.3 Model scaling—模型缩放

翻译

   模型缩放 [72, 60, 74, 73, 15, 16, 2, 51] 是一种放大或缩小已设计模型并使其适合不同计算设备的方法。 模型缩放方法通常使用不同的缩放因子,例如分辨率(输入图像的大小)、深度(层数)、宽度(通道数)和阶段(特征金字塔的数量),以实现良好的权衡 -off 表示网络参数的数量、计算量、推理速度和准确性。 网络架构搜索(NAS)是常用的模型缩放方法之一。  NAS 可以自动从搜索空间中搜索到合适的缩放因子,而无需定义过于复杂的规则。  NAS 的缺点是需要非常昂贵的计算来完成对模型缩放因子的搜索。 在[15]中,研究人员分析了缩放因子与参数数量和操作量之间的关系,试图直接估计一些规则,从而获得模型缩放所需的缩放因子。 查阅文献,我们发现几乎所有模型缩放方法都独立分析单个缩放因子,甚至复合缩放类别中的方法也独立优化缩放因子。 这样做的原因是因为大多数流行的 NAS 架构处理的比例因子不是很相关。 我们观察到,所有基于连接的模型,例如 DenseNet [32] 或 VoVNet [39],都会在缩放此类模型的深度时改变某些层的输入宽度。 由于提出的架构是基于串联的我们必须为此模型设计一种新的复合缩放方法。


精读

常采用的缩放因子

  • 分辨率(输入图像的大小)
  • 深度(层数)
  • 宽度(通道数)
  • 阶段(特征金字塔的数量)

 常用方法:NAS 

   介绍:NAS即模型搜索,其主要思路就是不需要人为去设计特定的网络,而是让模型自己去选择

   注意问题:    

             (1)怎么定义候选空间

             (2)加速训   

   不足:消耗大量的时间和资源


三、Architecture—网络结构

3.1 Extended efficient layer aggregation networks—扩展的高效层聚合网络

翻译

在大多数关于设计高效架构的文献中,主要考虑因素不超过参数的数量、计算量和计算密度。Ma 等人还从内存访问成本的特点出发,分析了输入/输出通道比、架构的分支数量以及 element-wise 操作对网络推理速度的影响。多尔阿尔等人在执行模型缩放时还考虑了激活,即更多地考虑卷积层输出张量中的元素数量。 图 2(b)中 CSPVoVNet [79] 的设计是 VoVNet [39] 的变体。 除了考虑上述基本设计问题外,CSPVoVNet [79] 的架构还分析了梯度路径,以使不同层的权重能够学习更多不同的特征。上述梯度分析方法使推理更快、更准确。 图 2 (c) 中的 ELAN [1] 考虑了以下设计策略——“如何设计一个高效的网络?”。 他们得出了一个结论:通过控制最短最长的梯度路径,更深的网络可以有效地学习和收敛。 在本文中,我们提出了基于 ELAN 的扩展 ELAN(E-ELAN),其主要架构如图 2(d)所示。

     无论梯度路径长度和大规模 ELAN 中计算块的堆叠数量如何,它都达到了稳定状态。 如果无限堆叠更多的计算块,可能会破坏这种稳定状态,参数利用率会降低。 提出的E-ELAN使用expand、shuffle、merge cardinality来实现在不破坏原有梯度路径的情况下不断增强网络学习能力的能力。在架构方面,E-ELAN 只改变了计算块的架构,而过渡层的架构完全没有改变。 我们的策略是使用组卷积来扩展计算块的通道和基数。 我们将对计算层的所有计算块应用相同的组参数和通道乘数。 然后,每个计算块计算出的特征图会根据设置的组参数g被打乱成g个组,然后将它们连接在一起。 此时,每组特征图的通道数将与原始架构中的通道数相同。 最后,我们添加 g 组特征图来执行合并基数。 除了保持原有的 ELAN 设计架构,E-ELAN 还可以引导不同组的计算块学习更多样化的特征。


精读

(a)VoVNet

VoVNet是一个基于连接的模型,由OSA组成,将 DenseNet 改进的更高效,区别于常见的plain结构和残差结构。

这种结构不仅继承了 DenseNet 的多感受野表示多种特征的优点,也解决了密集连接效率低下的问题。

关于VoVNet详解可以参考:VoVNet:实时目标检测 backbone网络_目标检测backbone_AI视觉网奇的博客-CSDN博客


 (b)CSPVoVNet 

(b)(a)CSP变体CSPVoVNet除了考虑到参数量、计算量、计算密度、ShuffleNet v2提出的内存访问成本(输入输出通道比,架构分支数量,element-wise等),还分析了梯度路径可以让不同层的权重学习到更具有区分性的特征。


(c)  ELAN

(c)就如何设计一个高效的网络得出结论:通过控制最短最长的梯度路径,更深的网络可以更有效地学习和收敛。

度路径设计的优点与缺点

   梯度路径设计策略总共有3个优点

  •  1.  可以有效地使用网络参数 ,在这一部分中提出通过调整梯度传播路径,不同计算单元的权重可以学习各种信息,从而实现更高的参数利用效率
  •  2.  具有稳定的模型学习能力,由于梯度路径设计策略直接确定并传播信息以更新权重到每个计算单元,因此所设计的架构可以避免训练期间的退化
  •   3.  具有高效的推理速度,梯度路径设计策略使得参数利用非常有效,因此网络可以在不增加额外复杂架构的情况下更高的精度。

由于上述原因,所设计的网络在架构上可以更轻、更简单。


   梯度路径设计策略有1个缺点

  • 1.  当梯度更新路径不是网络的简单反向前馈路径时,编程的难度将大大增加。

关于ELAN 详解可以参考:【网络结构设计】11、E-LAN | 通过梯度传输路径来设计网络结构_呆呆的猫的博客-CSDN博客


(d)  E-ELAN

(d)是者提出的 Extended-ELAN (E-ELAN) E-ELAN 使用了 expandshufflemerge cardinality来实现对 ELAN 网络的增强。

在架构方面,E-ELAN 只改变了计算块(computation blocks)的架构,而过渡层(transition layer)的架构完全没有改变。 

YOLOv7 的策略是使用组卷积来扩展计算块的通道和基数

实现方法

  • 首先,使用组卷积来增大通道计算块的基数  (所有计算块使用的组参数及通道乘数都相同)
  • 接着,将计算块得到的特征图 shuffle g 个组,然后 concat,这样一来每个组中的特征图通道数和初始结构的通道数是相同的
  • 最后,将 g 个组的特征都相加

3.2 Model scaling for concatenation-based models— 基于连接的模型的模型缩放

翻译

模型缩放的主要目的是调整模型的一些属性,生成不同尺度的模型,以满足不同推理速度的需求。 例如,EfficientNet [72] 的缩放模型考虑了宽度、深度和分辨率。至于 scaled-YOLOv4 [79],其缩放模型是调整阶段数。 在 [15] 中,Dollar等人。分析了香草卷积和组卷积在进行宽度和深度缩放时对参数量和计算量的影响,并以此设计了相应的模型缩放方法。

    以上方法主要用在PlainNet或ResNet等架构中。 这些架构在进行扩容或缩容时,每一层的入度和出度都不会发生变化,因此我们可以独立分析每个缩放因子对参数量和计算量的影响。 然而,如果将这些方法应用于基于连接的架构,我们会发现当对深度进行放大或缩小时,紧接在基于连接的计算块之后的平移层的入度将减小或 增加,如图3(a)和(b)所示。

    从上述现象可以推断,对于基于串联的模型,我们不能单独分析不同的缩放因子,而必须一起考虑。 以scaling-up depth为例,这样的动作会导致transition layer的输入通道和输出通道的比例发生变化,这可能会导致模型的硬件使用率下降。 因此,我们必须为基于级联的模型提出相应的复合模型缩放方法。 当我们缩放一个计算块的深度因子时,我们还必须计算该块的输出通道的变化。 然后,我们将对过渡层进行等量变化的宽度因子缩放,结果如图3(c)所示。 我们提出的复合缩放方法可以保持模型在初始设计时的特性并保持最佳结构。


精读

模型缩放的主要目的

模型缩放的主要目的是调整模型的某些属性并生成不同比例的模型,以满足不同推理速度的需要【像V5YOLOX

 问题引入 

每个比例因子的参数和计算是可以独立分析的。然而,如果将这些方法应用于基于连接的模型架构,我们会发现当对深度进行放大或缩小时,后续网络层的输入width发生变化,使后续层的输入channel和输出channelratio发生变化,紧接在基于连接的计算块之 后的转化层(translation layer)的入度减小或增加,从而导致模型的硬件使用率下降如图(a)->(b)的过程。

方法

作者对于连接模型,提出了一种复合模型方法,在考虑计算模块深度因子缩放的同时也考虑过渡层宽度因子做同等量的变化

当对连接结构的网络进行尺度缩放时,只缩放计算块的深度,转换层的其余部分只进行宽度的缩放


四、Trainable bag-of-freebies—可训练的bag-of-freebies

4.1 Planned re-parameterized convolution—卷积重参化

翻译

    虽然 RepConv [13] 在 VGG [68] 上取得了优异的性能,但当我们直接将其应用于 ResNet [26] 和 DenseNet [32] 等架构时,其准确率会显着降低。 我们使用梯度流传播路径来分析重新参数化的卷积应该如何与不同的网络相结合。我们还相应地设计了计划的重新参数化卷积。

   RepConv 实际上将 3×3 卷积、1×1 卷积和恒等连接组合在一个卷积层中。 在分析了 RepConv 和不同架构的组合和对应性能后,我们发现 RepConv 中的恒等连接破坏了 ResNet 中的残差和 DenseNet 中的连接,为不同的特征图提供了更多的梯度多样性。 基于以上原因,我们使用无身份连接的 RepConv (RepConvN) 来设计计划重参数化卷积的架构。 在我们的想法中,当一个带有残差或连接的卷积层被重新参数化的卷积代替时,应该没有恒等连接。 图 4 显示了我们设计的用于 PlainNet 和 ResNet 的“计划重新参数化卷积”的示例。 至于基于残差模型和基于连接模型的完整计划的重新参数化卷积实验,将在消融研究部分上进行介绍。


精读

回顾RepVGG

RepVGG是采用了VGG风格进行搭建的,采用了重参数化技术,因此叫RepVGG

(A)ResNet结构,最上面的部分的identity采用了1×1卷积,而RepVGG大体结构与ResNet相似

(B)图是RepVGG训练时结构,借鉴了ResNetresidual block的结构,具体包括3×31×1shortcut三个分支。

  • 当输入输出的维度不一致即stride=2时,则只有3×3、1×1两个分支
  • 当输入输出的维度一致时在后三层卷积中不仅有1×1的identity connection,还有一个无卷积的直接进行特征融合的identity connection

(C)图是RepVGG试时结构,会把这些连接全部去掉,就变成了一个单一的VGG结构,这种操作也被称为训练与预测的解耦合

 问题引入 

RepConv中带有的 identity connection破坏了ResNet中的残差和DenseNet中的concatenation,而我们知道残差和concatenation为不同的特征图提供了更多的梯度多样性,这样一来会导致精度下降。所以当一个带有残差或concatenation的卷积层被重参数的卷积所取代时,应该不存在 identity connection

方法

基于此,作者使用identity connectionRepConv  (RepConvN)来设计规划重参化卷积结构,如下图所示:


4.2 Coarse for auxiliary and fine for lead loss—辅助训练模块

(这个标题我真的是找了网上很多的翻译,结果要么是奇怪的直译要么是没翻译,总之理解它是辅助训练模块就行啦)

我的个人理解就是:

Lead head是负责最终输出head Auxiliary head是负责辅助训练head

那么这个标题就是在说负责辅助训练的head用粗标签,负责最终输出的head用细标签


4.2.1 Deep supervision—深度监督

翻译

   深度监督 [38] 是一种经常用于训练深度网络的技术。 它的主要概念是在网络的中间层添加额外的辅助头,以辅助损失为指导的浅层网络权重。 即使对于 ResNet [26] 和 DenseNet [32] 等通常收敛良好的架构,深度监督 [70, 98, 67, 47, 82, 65, 86, 50] 仍然可以显着提高模型在许多任务上的性能 . 图 5 (a) 和 (b) 分别显示了“没有”和“有”深度监督的目标检测器架构。 在本文中,我们将负责最终输出的head称为lead head,用于辅助训练的head称为辅助head。


精读

简介

   深度监督 是一种常用于训练深度网络的技术。其主要概念是在网络的中间层增加额外的Auxiliary head,以及Auxiliary损失为导向的浅层网络权值。

下图(A)是无深度监督,  (B)是有深度监督

本文方法

   将负责最终输出的headLead head,将用于辅助训练的head称为Auxiliary head


4.2.2 Label assigner— 标签分配器

翻译

    接下来我们要讨论标签分配的问题。 过去,在深度网络的训练中,标签分配通常直接指的是ground truth,并根据给定的规则生成hard  label。 然而,近年来,如果我们以物体检测为例,研究人员往往会利用网络预测输出的质量和分布,然后与ground truth一起考虑使用一些计算和优化方法来生成可靠的soft label [61、8、36、99、91、44、43、90、20、17、42]。例如,YOLO [61] 使用预测边界框回归和地面实况的 IoU 作为 objectness 的soft label。 在本文中,我们将网络预测结果与基本事实一起考虑,然后分配soft label的机制称为“标签分配器”。

    无论auxiliary head or lead head的情况如何,都需要对目标目标进行深度监督。 在soft label分配器相关技术的过程中,我们无意中发现了一个新的衍生问题,即“如何将soft label分配给auxiliary head and lead head?” 据我们所知,到目前为止,相关文献还没有探讨过这个问题。 目前最流行的方法的结果如图5(c)所示,就是将辅助head和lead head分离出来,然后利用各自的预测结果和ground truth进行标签分配。 本文提出的方法是一种新的标签分配方法,通过前导头预测来指导辅助头和前导头。换句话说,我们使用引导头预测作为指导来生成从coarse-to-fine的分层标签,这些标签分别用于辅助头部和引导头学习。 提出的两种深度监督标签分配策略分别如图 5 (d) 和 (e) 所示。


精读

以前方法

   过去,在深度网络的训练中,标签分配通常直接参考GT,并根据给定的规则hard label

本文方法

   作者提出一个“label assigner(标签分配器)” 机制,该机制将网络预测结果与GT一起考虑,然后分配soft label

   关于hard labelsoft label:

  • hard label:有些论文中也称为hard target ,其实这也是借鉴了知识蒸馏的思想,hard字面意思上就可以看出比较强硬,是就是,不是就是不是标签形式:(1,2,3...)或(0,1,0,0...)【举个栗子:要么是猫要么是狗】
  • soft label:soft是以概率的形式来表示。可理解为对标签的平滑也即软化,比如像[0.6,0.4],【举个栗子:有60%的概率是猫,  40%的概率是狗】,就好像不会给你非常明确的回答。

现在比较流行的结构中,经常会将网络输出的数据分布通过一定的优化方法等与GT进行匹配生成soft label(其实我们熟悉的经过softmax的或者sigmod输出就是一种soft label

问题引入   

如何为Auxiliary headLead headsoft label

目前方法

   如(c)所示,这是独立标签匹配结构,将Auxiliary head和Lead head分离,然后使用它们自己的预测结果和真实标签来进行标签分配。


4.2.3 Lead head guided label assigner— 先导头导向标签分配器

翻译

(Lead head guided label assigner) lead head导向标签分配器 主要基于lead head的预测结果和GT来计算,并通过优化过程生成soft标签。这组soft标签将用作辅助head和lead head的训练。这样做的原因是因为lead head具有相对较强的学习能力,因此由其生成的soft标签应更能代表源数据和目标之间的分布和相关性。此外,我们可以将这种学习视为一种广义残差学习。通过让较浅的辅助head直接学习lead head已经学习的信息,lead head将更能够专注于学习尚未学习的剩余(residual )信息。


精读

具体方法

   主要基于Lead head的预测结果和GT计算,并通过优化过程生成soft label 。这组soft label 将用作Auxiliary headLead head的训练。

原因

  • Lead head 的学习能力更强一些所以从它当中得到的soft label在数据集的数据概率中更具有代表性。    
  • Lead head 能够只学习 Auxiliary head 没有学习到的特征


4.2.4 Coarse-to-fine lead head guided label assigner— 由粗到精的 lead head 指导标签分配器

翻译

(Coarse-to-fine lead head guided label assigner)由粗至细的lead head引导标签分配器 ,也使用lead head的预测结果和GT生成soft标签。然而,在此过程中,生成了两组不同的soft标签,即粗标签和细标签,其中细标签与lead head引导标签分配器生成的soft标签相同,并且通过放松正样本分配过程的约束,允许更多grid被视为正目标来生成粗标签。其原因是辅助head的学习能力不如lead head强,为了避免丢失需要学习的信息,将重点优化目标检测任务中辅助head的召回。对于lead head的输出,可以从高召回率结果中过滤出高精度结果作为最终输出。但是必须注意,如果粗标签的附加权重与细标签很接近,它可能在最终预测时产生不良先验。因此为了使这些超粗正网格具有较小的影响,在解码器中设置了限制,使得超粗正grid不能完美地产生soft标签。上述机制允许在学习过程中动态调整细标签和粗标签的重要性,并且使细标签的优化上界总是高于粗标签。


精读

具体方法

在这个过程中生成了两组不同的soft label,即粗标签和细标签

  • 细标签Lead head 在标签分配器上生成的soft label相同
  • 粗标是通过放宽认定positive target的条件生成的,也就是允许更多的grids作为positive target

粗标签和细标签究竟是什么?

       首先是细标签,网络最终输出的三个headLead head,会将这部分的预测结果与ground truthsoft label,网络会觉得这个soft label得到是数据分布更接近真实的数据分布,训练得到的内容更加细致

       再来说说粗标签,Auxiliary head由于是从中间网络部分得到的,它的预测效果肯定是没有深层网络Lead head提取到的数据或者特征更细致,所以Auxiliary head部分的内容是比较粗糙的,在训练过程中,会将Lead headground truthsoft label当成一个全新的ground truth,然后与Auxiliary head之间建立损失函数,说白了,就是让辅助head的预测结果也近似Lead head

—————————以上引用@爱吃肉的鹏 的解读,感谢大佬!

原因

Auxiliary head 的学习能力没有Lead head 那么强大,为了避免信息丢失,需要接收更多的信息来学习,在目标检测任务中, Auxiliary head 要有很高的 recall

【注意】如果粗label非常接近与label,可能会产生不好的结果

【解决方法】 为了让超粗正grids(Auxiliary head 的正标签)影响小一些,在 decoder 中设置了限制条件,所以那些超粗正grids不能产生 soft label,这样就能在训练的过程中,让grids自动的调节粗标签和细标签的重要程度。


4.3 Other trainable bag-of-freebies—其他的可训练“工具”

翻译

本节中,我们将列出一些可训练的免费赠品包。 这些免费赠品是我们在训练中使用的一些技巧,但最初的概念并不是我们提出的。 这些freebies的训练细节将在附录中详细说明,包括(1)conv-bn-activation topology中的Batch normalization:这部分主要将batch normalization layer直接连接到convolutional layer。这样做的目的是在推理阶段将批归一化的均值和方差整合到卷积层的偏差和权重中。  (2) YOLOR[81]中的隐式知识与卷积特征图相结合的加法和乘法方式:YOLOR中的隐式知识可以在推理阶段通过预计算简化为向量。 该向量可以与前一个或后一个卷积层的偏差和权重相结合。  (3) EMA 模型:EMA 是一种在 mean teacher [75] 中使用的技术,在我们的系统中,我们使用 EMA 模型纯粹作为最终的推理模式


精读

(1)  conv-bn-activation 结构组合中的批量归一化

(2)   YOLOR中的隐式知识与卷积特征图以及加法和乘法方式相结合

(3)   EMA模型

这个详细解读大家看面翻译就好~


五、Experiments—实验

5.1 Experimental setup—实验步骤

翻译

 我们使用 Microsoft COCO 数据集进行实验并验证我们的对象检测方法。 我们所有的实验都没有使用预训练模型。 也就是说,所有模型都是从头开始训练的。 在开发过程中,我们使用train 2017 set进行训练,然后使用val 2017 set进行验证和选择超参数。 最后,我们展示了对象检测在 2017 年测试集上的性能,并将其与最先进的对象检测算法进行了比较。 详细的训练参数设置在附录中描述。

    我们设计了边缘 GPU、普通 GPU 和云 GPU 的基本模型,它们分别称为 YOLOv7tiny、YOLOv7 和 YOLOv7-W6。 同时,我们还针对不同的业务需求,使用基础模型进行模型缩放,得到不同类型的模型。 对于YOLOv7,我们对颈部进行stack scaling,并使用提出的复合缩放方法对整个模型的深度和宽度进行缩放,并以此获得YOLOv7-X。 对于 YOLOv7-W6,我们使用新提出的复合缩放方法得到 YOLOv7-E6 和 YOLOv7-D6。 此外,我们将提议的 EELAN 用于 YOLOv7-E6,从而完成了 YOLOv7E6E。 由于 YOLOv7-tiny 是一个面向边缘 GPU 的架构,它会使用leaky ReLU 作为激活函数。 至于其他模型,我们使用 SiLU 作为激活函数。 我们将在附录中详细描述每个模型的比例因子。


精读

  • 据集: COCO 数据集
  • 练模型: 无,从0开始训练
  • 不同GPU和对模型:

    • ​​​​​​​​​​​​​​边缘GPU:YOLOv7-tiny

    • 普通GPU:YOLOv7​​​​​​​

    • GPU基本模型: YOLOv7-W6

  • 活函数:
    • YOLOv7 tiny leaky ReLU

    • 其他模型:SiLU


5.2 Baselines—基线网络

翻译

我们选择以前版本的 YOLO [3, 79] 和最先进的目标检测器 YOLOR [81] 作为我们的基线。 表 1 显示了我们提出的 YOLOv7 模型与使用相同设置训练的基线的比较。

从结果我们看到,如果与 YOLOv4 相比,YOLOv7 的参数减少了 75%,计算量减少了 36%,AP 提高了 1.5%。 如果与 state-of-theart YOLOR-CSP 相比,YOLOv7 的参数减少了 43%,计算量减少了 15%,AP 提高了 0.4%。 在tiny模型的性能上,与YOLOv4-tiny-31相比,YOLOv7tiny参数数量减少了39%,计算量减少了49%,但AP保持不变。在云 GPU 模型上,我们的模型仍然可以有更高的 AP,同时减少 19% 的参数数量和 33% 的计算量。


精读

选择以前版本的YOLO[YOLOv4 Scaled-YOLOv4]和最先进的目标检测器YOLOR作为基线。表1展示了本文提出的YOLOv7模型与使 用相同设训练的基线模型的比较。

表1:基线目标探测器的比较

论:具体数值就不重复了,通过对比我们可以看出参数量和计算量都有减少,精确度提高了。


5.3 Comparison with state-of-the-arts—与其他流行网络的对比

翻译

我们将所提出的方法与用于通用 GPU 和移动 GPU 的最先进的目标检测器进行比较,结果如表 2 所示。从表 2 的结果中,我们知道所提出的方法具有最佳的速度-准确度权衡 - 全面关闭。 如果我们将 YOLOv7-tiny-SiLU 与 YOLOv5-N (r6.1) 进行比较,我们的方法在 AP 上的速度提高了 127 fps,准确率提高了 10.7%。 此外,YOLOv7 161 fps 的帧率有 51.4% AP,而相同 AP 的 PPYOLOE-L 只有 78 fps 的帧率。 在参数使用方面,YOLOv7 比 PPYOLOE-L 少 41%。 如果我们将推理速度为 114 fps 的 YOLOv7-X 与推理速度为 99 fps 的 YOLOv5-L (r6.1) 进行比较,YOLOv7-X 可以将 AP 提高 3.9%。 如果将 YOLOv7X 与类似规模的 YOLOv5-X (r6.1) 进行比较,YOLOv7-X 的推理速度快了 31 fps。 此外,在参数量和计算量方面,YOLOv7-X 相比 YOLOv5-X(r6.1)减少了 22% 的参数和 8% 的计算量,但 AP 提升了 2.2%。

如果我们使用输入分辨率 1280 比较 YOLOv7 和 YOLOR,YOLOv7-W6 的推理速度比 YOLOR-P6 快 8 fps,检测率也提高了 1% AP。 至于YOLOv7-E6和YOLOv5-X6(r6.1)的对比,前者AP增益比后者高0.9%,参数少45%,计算量少63%,推理速度提升47%。YOLOv7-D6 的推理速度与 YOLOR-E6 接近,但 AP 提高了 0.8%。  YOLOv7-E6E 的推理速度与 YOLOR-D6 接近,但 AP 提高了 0.3%。


精读

本文将提出的方法与通用GPU和移动GPU的最先进的对象检测器进行了比较,结果如表2所示:

表2:最先进的实时目标检测器的比较

论:反正是打败了它们,目前我们最牛就对咯


5.4 Ablation study—消融研究

5.4.1 Proposed compound scaling method—提出的复合 scaling 方法

翻译

显示了使用不同模型缩放策略进行缩放时获得的结果。 其中,我们提出的复合缩放方法是将计算块的深度放大1.5倍,将过渡块的宽度放大1.25倍。 如果我们的方法与仅按比例放大宽度的方法相比,我们的方法可以以更少的参数和计算量将 AP 提高 0.5%。 如果我们的方法与只放大深度的方法相比,我们的方法只需增加2.9%的参数数量和1.2%的计算量,就可以提高0.2%的AP。


精读

表3显示了使用不同模型缩放策略进行缩放时获得的结果:

表3:提出的模型 scaling下的消融研究

论:合缩放策略可以更有效地利用参数和计算。


5.4.2 Proposed planned re-parameterized model—提出的 planned re-parameterized 模型

翻译

为了验证我们提出的平面重参数化模型的普遍性,我们分别将其用于基于连接的模型和基于残差的模型进行验证。 我们选择用于验证的基于连接的模型和基于残差的模型分别是 3-stacked ELAN 和 CSPDarknet。

在基于 concatenation 的模型实验中,我们将 3-stacked ELAN 中不同位置的 3×3 卷积层替换为 RepConv,详细配置如图 6 所示。从表 4 所示的结果可以看出,所有更高 AP 值存在于我们提出的计划重新参数化模型中。

在处理基于残差的模型的实验中,由于原始dark block没有 3 × 3 con卷积块符合我们的设计策略,我们额外设计了一个反向dark block进行实验,其架构如图 7 所示。由于具有dark block和反向dark block的 CSPDarknet 具有完全相同的参数和操作量,所以它是 公平比较。 表 5 所示的实验结果充分证实了所提出的计划重新参数化模型在基于残差的模型上同样有效。 我们发现 RepCSPResNet [85] 的设计也符合我们的设计模式


精读

目的

为了验证提出的 planned re-parameterized 模型的通用性,将其分别用于基于连接的模型和基于残差的模型进行验证。

模型选择:  三层ELANCSPDarknet

3层堆叠ELAN中不同位置的3 × 3卷积层替换为RepConv,详细配置如下图所示:

图6:   Planned RepConv 3-stacked ELAN。蓝色圆圈是用 RepConv 替换Conv的位置

表4:Planned RepConcatenation 模型的消融研究。

论:从表4所示的结果中,看到所有较高的AP值都出现在提出的Planned RepConcatenation 模型上。

在处理基于残差模型的实验中,由于原始dark block没有3×3的卷积块,作者另外设计了一种反向dark block,其体系结构如图7示:

图7:反向 CSPDarknet。我们颠倒了dark block中1×1和3×3卷积层的位置,以符合我们 planned reparameterized 模型设计策略。

表5:   planned RepResidual 模型的消融研究

论:表5所示的实验结果证实了所提出的重参化策略对于residual的模型依旧有效。 RepCSPResNet的设计也符合本文的设计模式


5.4.3 Proposed assistant loss for auxiliary head—提出的 auxiliary head 的 assistant loss

翻译

在辅助头部实验的辅助损失中,我们比较了引导头部和辅助头部方法的一般独立标签分配,并且我们还比较了两种提出的引导引导标签分配方法。 我们在表 6 中展示了所有比较结果。从表 6 中列出的结果可以看出,任何增加辅助损失的模型都可以显着提高整体性能。 此外,我们提出的引导式标签分配策略比 AP、AP50 和 AP75 中的一般独立标签分配策略具有更好的性能。 至于我们提出的粗略辅助和精细引导标签分配策略,它在所有情况下都会产生最佳结果。 在图 8 中,我们展示了在辅助头和前导头上通过不同方法预测的对象图。 从图 8 中我们发现,如果辅助头部学习引导引导soft label,它确实会帮助引导头部从一致目标中提取残差信息。

   由于提出的 YOLOv7 使用多个金字塔来联合预测目标检测结果,我们可以直接将辅助头连接到中间层的金字塔进行训练。 这种训练可以弥补下一层金字塔预测中可能丢失的信息。由于上述原因,我们在提议的 E-ELAN 架构中设计了部分辅助头。 我们的方法是在合并基数之前在其中一组特征图之后连接辅助头,这种连接可以使新生成的一组特征图的权重不会被辅助损失直接更新。 我们的设计允许每个铅头金字塔仍然从不同大小的物体中获取信息。 表 8 显示了使用两种不同方法获得的结果,即粗到细导联方法和部分粗到细导联方法。 显然,部分由粗到细的导引法具有更好的辅助效果。


精读

作者比较了lead headauxiliary head的独立标签分配策略,同时也比较了所提出的引导型标签分配方法,在表6中显示了所有的较结果:

表6:提出的auxiliary head 的消融研究

论:从表6中列出的结果可以看出,任何增加辅助损失的模型都可以显著提高整体性能。

图8:在auxiliary head和lead head处通过不同方法预测的对象图

论:如果auxiliary head学习先导引导soft label,它确实会帮助lead head从一致目标中提取残差信息。

表7:约束 auxiliary head 的消融研究。
结论: 从表中的数字来看,通过距离目标中心的大小来约束目标的上界可以获得更好的性能。
方法: E-ELAN 架构中设计了 partial auxiliary head 。在合并基数( cardinality )之前,在一组特征图后连接 auxiliary head ,这种连接可以使新生成的特征图集的权值不直接通过辅助损失来更新
表8: partial auxiliary head 的消融研究
结论: partial auxiliary head方法具有更好的辅助效果。

六、Conclusions—结论

翻译

在本文中,我们提出了一种新的实时目标检测器架构和相应的模型缩放方法。 此外,我们发现目标检测方法的发展过程产生了新的研究课题。 在研究过程中,我们发现了重新参数化模块的替换问题和动态标签分配的分配问题。 为了解决这个问题,我们提出了可训练的bag-of-freebies方法来提高目标检测的准确性。 基于上述,我们开发了 YOLOv7 系列目标检测系统,该系统获得了 state-of-the-art 的结果。


精读

本文提出了一种新的实时检测器,解决了重参化模块的替换问题和动态标签的分配问题。
主要工作:
1 )高效聚合网络架构: YOLOV7 ELAN 进行扩展,提出的一个新的网络架构 E-ELAN ,以高效为主
2 )重参数化卷积: YOLOV7 将模型重参数化引入到网络架构中,重参数化这一思想最早出现于 REPVGG
3 )辅助头检测: YOLOv7 中将 head 部分的浅层特征提取出来作为 Auxiliary head ,深层特征也就是网络的最终输出作为 Lead head
4 )基于连接的模型缩放: 作者对于连接模型提出了一种复合模型方法,当对连接结构的网络进行尺度缩放时,只缩放计算块的深度,转换层的其余部分只进行宽度的缩放
5 )动态标签分配策略: Lead head 导向标签分配方法和由粗到精的 lead head 指导标签分配方法

本文参考:

CSDN:

YOLOv7论文部分解读【含自己的理解】

【目标检测】54、YOLO v7 | 又是 Alexey AB 大神!专为实时目标检测设计_

b站:【强推!YOLOv7论文创新点,网络结构,官方源码,全详解,手把手带你逐行解读YOLOV7代码!】
 

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

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

相关文章

Vue组件设计-多列表拖拽交换排序

在前端开发中,拖拽排序是一种提升用户体验非常好的方式,常见的场景有单列表拖拽排序,多列表拖拽交换排序,比如以下这种效果: 下面将以这种效果为例,设计一个组件。 1. 安装所需依赖 npm install vuedragg…

多模态的过渡态——latent modal

背景: 随着大模型的推进,单模态的大模型已经无法很好的满足现实工作的需要。很多科研团队和机构开始多模态的研究,多模态的几种机构在前面的文章已经介绍过,这部分不做过多介绍。最理想的多模态应该就是没有模态,单一…

持续集成/持续交付——JenkinsFile详细使用教程

JenkinsFile详细使用教程 一、BlueOcean1、BlueOcean 概念2、BlueOcean 特性3、BlueOcean 安装 二、Pipeline 简介1、Jenkins Pipeline 概念2、Jenkinsfile 语法类型:3、采用Jenkins 任务页面输入a. Jenkins中创建一个 pipeline 任务b. Definition 中选择 Pipeline …

电脑提示msvcp140.dll丢失的解决方法,msvcp140.dll丢失修复教程

msvcp140.dll是Microsoft Visual C Redistributable所需的一个动态链接库文件,它包含了Visual C运行库中的一些函数和类库。这个文件通常出现在Windows操作系统中,用于支持使用Visual C编写的程序的正常运行。如果系统缺少或损坏了这个文件,可…

计算机组成原理 4.2.1存储芯片连接

连接原理 主存储器 通过数据总线、地址总线和控制总线和CPU相连数据总线的位数正比于数据传输率地址总线的位数决定可寻址的最大地址空间控制总线(读/写)指出总线周期的类型和本次输入/输出完成的时刻 但是实际中存储芯片往往很小难以满足地址和数据的位数需求,此…

如何在云服务器上搭建ChatGLM

摘录:ChatGPT重新点燃了AI,然后OpenAI却没有向我们开放ChatGPT,虽然有些人通过了一下手段注册了账号,但是不久就被OpenAI拉入了黑名单。3月份我国的百度也推出了和ChatGPT对标的文言一心,随后阿里也推出了自己的文本对…

李雨浛:在数据、网络与民意之间——用计算社会科学方法探讨数字媒体与可持续未来 | 提升之路系列(八)...

导读 为了发挥清华大学多学科优势,搭建跨学科交叉融合平台,创新跨学科交叉培养模式,培养具有大数据思维和应用创新的“π”型人才,由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

创建并使用shell脚本

1,查询 bash解释器 所在位置 创建前,我们需要先知道 bash 解释器所在的位置,以方便在头部写声明。一般位置是在 /bin/bash 但是有的是在 /usr/bin/bash ,所以需要查找一下。 文件位置查找命令:whereis xxx rootarmb…

Probabilistic and Geometric Depth: Detecting Objects in Perspective 论文学习

论文地址:Probabilistic and Geometric Depth: Detecting Objects in Perspective Github 地址:Probabilistic and Geometric Depth: Detecting Objects in Perspective 1. 解决了什么问题? 3D 目标检测在许多应用中发挥着重要作用&#xf…

分析的四个维度

我们都听过这句格言“数据是新石油”——一种宝贵、丰富的资源,只有提炼后才有用。然而,最引人注目但又令人望而生畏的比较之一是将船只送入海洋进行石油勘探。有些会失败,有些会有重大发现。 深海勘探和钻探取决于精确测绘和对海底的清晰认…

【计算机网络】图解内容分发网络 CDN

【计算机网络】图解内容分发网络 CDN 参考资料: 用了CDN就一定比不用更快吗? 什么是内容分发网络 高性能利器:CDN我建议你好好学一下! 文章目录 【计算机网络】图解内容分发网络 CDN一、CDN 概述1.1、什么是 CDN1.2、为什么需要 …

数字化转型导师坚鹏:数字化转型背景下的企业人力资源管理

企业数字化转型背景下的企业人力资源管理 课程背景: 很多企业存在以下问题: 不清楚企业数字化转型目前的发展阶段与重要应用? 不知道企业数字化转型给企业人力资源管理带来哪些机遇与挑战? 不知道企业数字化转型背景下如何…

SpringBoot 项目如何实现动态配置多数据源?

简介: dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。 其支持 Jdk 1.7, SpringBoot 1.4.x 1.5.x 2.x.x。 特性: 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。支持…

认识JavaBean

什么是JavaBean? JavaBean是指符合特定规范以及定义的Java类,通常用于封装数据,提供访问数据的方法和属性,并且可以被其他程序重用。它具有以下特点: 遵循特定编程规范:JavaBean必须要遵循JavaBean编程规范&#xff…

分层领域模型相关总结(DO/PO/VO/BO/DTO/Query等概念)

分层领域模型(DO/PO/VO/BO/DTO/Query等概念) 1. 为什么会有这么多O的概念? 各种分层概念的提出都是为了解耦,增加逻辑/代码的复用,便于后期维护/开发,提高团队开发效率;but,过多的细分也会使得开发过程相对…

Chrome 113 发布,默认启用 WebGPU

经过四周时间开发,Chrome 113 稳定版正式推出,新版本包括用于视频电话会议的 AV1 视频编码、WebGPU,以及其他增强功能。 默认启用 WebGPU WebGPU 是用于 Web 的新 API,它使用了现代的硬件功能,允许在 GPU 上进行渲染和…

Unable to import maven project: See logs for details错误的多种解决方法

文章目录 1. 复现错误2. 分析错误3. 解决问题3.1 解决方法一3.2 解决方法二 4. 补充说明 1. 复现错误 今天从gitlab上下载完项目后,无法启动项目,留意到右下角的Evnet Log,点开如下图所示: 即Unable to import maven project: See…

vue-element-admin快速搭建后台模板

快速搭建后台模板 环境以及会出现的问题安装目录结构基本配置路由配置 环境以及会出现的问题 node版本17.0.0 python版本2.7.10(node-sass依赖) 运行项目报错Error: error:0308010C:digital envelope routines::unsupport 请看这篇文章 https://blog.cs…

FM33A048B I2C

I2C 模块实现MCU 与外部I2C 接口器件之间的同步通信,硬件实现串并转换。支持I2C 的主机模式,不支持从机模式和多主机模式。 特点: ⚫ 只支持I2C 主机模式, 不支持从机模式和多主机模式 ⚫ 支持7 位或10 位从机地址 ⚫ 传输速度支持标准模式(1…

Java面试题总结 | Java面试题总结10- Feign和设计模式模块(持续更新)

文章目录 Feign项目中如何进行通信Feign原理简述 设计模式spring用到的设计模式项目的场景中运用了哪些设计模式写单例的时候需要注意什么工厂模式的理解设计模式了解么工厂设计模式单例设计模式代理设计模式策略模式**模板方法模式**观察者模式**适配器模式**观察者模式**适配…