当前位置: 首页 > news >正文

《RT-DETR》论文笔记

原文出处

[2304.08069] DETRs Beat YOLOs on Real-time Object Detection (arxiv.org)icon-default.png?t=N7T8https://arxiv.org/abs/2304.08069

原文笔记

What

DETRs Beat YOLOs on Real-time Object Detection

1、设计了一种高效混合编码器,通过解耦尺度内交互和跨尺度融合来提高速度来快速处理多尺度特征。(并且高速)

2、通过解耦尺度内交互和跨尺度融合来提高速度来快速处理多尺度特征。然后,我们提出了不确定性最小查询选择来为解码器提供高质量的初始查询,从而提高准确性。

3、此外,RT-DETR 通过调整解码器层的数量来适应各种场景而无需重新训练来支持灵活的速度调整。

主要贡献总结如下:(i)。我们提出了第一个称为 RTDETR 的实时端到端对象检测器,它不仅在速度和准确性上都优于之前先进的 YOLO 检测器,而且还消除了 NMS 后处理对实时对象检测的负面影响; (ii)。我们定量分析 NMS 对 YOLO 检测器速度和准确性的影响,并建立端到端速度基准来测试实时检测器的端到端推理速度; (iii)。所提出的 RT-DETR 通过调整解码器层的数量来支持灵活的速度调整,以适应各种场景而无需重新训练。

Why

YOLO系列因其速度和准确性之间的合理权衡而成为实时目标检测最流行的框架。然而,我们观察到 YOLO 的速度和准确性受到 NMS 的负面影响。(这不仅会减慢推理速度,而且还引入了导致速度和准确性不稳定的超参数。(NMS对超参数非常敏感,详见3.1)此外,考虑到不同的场景对召回率和准确率有不同的重视,有必要仔细选择适当的NMS阈值,这阻碍了实时检测器的发展。)

最近,端到端基于变压器的检测器 (DETR) 提供了一种消除 NMS 的替代方案。然而,高计算成本限制了它们的实用性(虽然带有多尺度特征的deformable DETR降低计算成本,但是序列长度急剧增加仍然导致编码器成为计算瓶颈。),阻碍了它们充分利用排除NMS的优势。因此无 NMS 的架构没有表现出推理速度优势。

再者,作者也对多尺度融合的有效性和计算冗余性提出了质疑,并做了一系列消融实验,具体见4.2节

(端到端对象检测器以其精简的流程而闻名。Carion等人[4]首先提出了基于Transformer的端到端检测器DETR,由于其独特的特征,引起了广泛的关注。特别是,DETR 消除了手工制作的锚点和 NMS 组件。相反,它采用二分匹配并直接预测一对一的对象集。尽管 DETR 具有明显的优势,但存在一些问题:训练收敛缓慢、计算成本高、查询难以优化。已经提出了许多 DETR 变体来解决这些问题。加速收敛。Deformable-DETR [45] 通过提高注意力机制的效率来加速多尺度特征的训练收敛。DAB-DETR[23]和DN-DETR[17]通过引入迭代细化方案和去噪训练进一步提高了性能。Group-DETR [5] 引入了分组一对多分配。降低计算成本。高效的DETR[42]和稀疏DETR[33]通过减少编码器和解码器层数或更新查询的数量来减少计算成本。Lite DETR[18]通过交错方式减少低级特征的更新频率来提高编码器的效率。优化查询初始化条件DETR[27]和锚DETR[39]降低了查询的优化难度。朱等人。 [45] 提出了两阶段 DETR 的查询选择,DINO [44] 提出了混合查询选择来帮助更好地初始化查询。当前的 DETR 仍然计算量很大,无法实时检测。)

这启发我们探索DETR是否可以扩展到实时场景,并在速度和准确性上都优于先进的YOLO检测器,消除了NMS对实时目标检测造成的延迟。

以前的工作[42,44,45]表明难以优化的对象查询阻碍了DETR的性能并提出了查询选择方案,将vanilla可学习嵌入替换为编码器特征。然而,我们观察到当前的查询选择直接采用分类分数来选择,忽略了检测器需要同时对对象的类别和位置进行建模的事实,这两者都决定了特征的质量。这不可避免地导致选择定位置信度较低的编码器特征作为初始查询,从而导致相当大的不确定性和损害 DETR 的性能。我们将查询初始化视为进一步提高性能的突破。

Challenge

解决detr的问题

1、减少计算复杂度实现快速计算

2、加快收敛速度

3、多尺度的处理体征

4、之前的obj query阻碍了DETR的性能

Idea

1、为了快速处理多尺度特征,我们设计了一个高效的混合编码器来代替普通的Transformer编码器,通过解耦不同尺度特征的尺度内交互和跨尺度融合,显著提高了推理速度。(并且加快了收敛速度)

2、为了避免选择定位置信度较低的编码器特征作为对象查询,我们提出了不确定性最小查询选择,通过显式优化不确定性为解码器提供高质量的初始查询,从而提高准确性。

3、此外,由于 DETR 的多层解码器架构,RT-DETR 支持灵活的速度调整以适应各种实时场景而无需重新训练。

原文翻译

Abstract

YOLO系列因其速度和准确性之间的合理权衡而成为实时目标检测最流行的框架。然而,我们观察到 YOLO 的速度和准确性受到 NMS 的负面影响。最近,端到端基于变压器的检测器 (DETR) 提供了一种消除 NMS 的替代方案。然而,高计算成本限制了它们的实用性,阻碍了它们充分利用排除NMS的优势。在本文中,我们提出了实时检测转换器(RT-DETR),据我们所知,这是解决上述困境的第一个实时端到端对象检测器。我们分两步构建 RT-DETR,借鉴了之前的 DETR:首先我们专注于在提高速度的同时保持准确性,然后在提高准确性的同时保持速度。具体来说,我们设计了一种高效的混合编码器,通过解耦尺度内交互和跨尺度融合来提高速度来快速处理多尺度特征。然后,我们提出了不确定性最小查询选择来为解码器提供高质量的初始查询,从而提高准确性。此外,RT-DETR 通过调整解码器层的数量来适应各种场景而无需重新训练来支持灵活的速度调整。我们的 RT-DETR-R50 / R101 在 COCO 上达到 53.1% / 54.3% AP,在 T4 GPU 上达到 108 / 74FPS,在速度和准确性上都优于以前先进的 YOLO。此外,RT-DETR-R50 在准确率上比 DINO-R50 高 2.2%,FPS 高出约 21 倍。在使用Objects365进行预训练后,RTDETR-R50 / R101达到55.3% / 56.2% AP。项目页面:https://zhao-yian.github.io/RTDETR。

1. Introduction

实时目标检测是一个重要的研究领域,具有广泛的应用,如目标跟踪[43]、视频监控[28]和自动驾驶[2]等。现有的实时检测器通常采用基于cnn的架构,最著名的是YOLO检测器[1,10 - 12,15,16,25,30,38,40],因为它们在速度和准确性之间合理的权衡。然而,这些检测器通常需要非最大抑制 (NMS) 进行后处理这不仅会减慢推理速度,而且还引入了导致速度和准确性不稳定的超参数。此外,考虑到不同的场景对召回率和准确率有不同的重视,有必要仔细选择适当的NMS阈值,这阻碍了实时检测器的发展。

最近,端到端基于变压器的检测器(DETRs)[4,17,23,27,36,39,44,45]因其精简的体系结构消除手工制作的组件而受到了学术界的广泛关注。然而,它们的高计算成本阻碍了它们满足实时检测要求,因此无 NMS 的架构没有表现出推理速度优势。这启发我们探索DETR是否可以扩展到实时场景,并在速度和准确性上都优于先进的YOLO检测器,消除了NMS对实时目标检测造成的延迟。

为了实现上述目标,我们重新思考 DETR 并对关键组件进行详细分析以减少不必要的计算冗余并且进一步提高准确性。对于前者,我们观察到虽然多尺度特征的引入有利于加速训练收敛[45],但它导致序列输入编码器的长度显着增加。由多尺度特征交互引起的高计算成本使得 Transformer 编码器成为计算瓶颈。因此,实现实时 DETR 需要对编码器进行重新设计。对于后者,以前的工作[42,44,45]表明难以优化的对象查询阻碍了DETR的性能并提出了查询选择方案,将vanilla可学习嵌入替换为编码器特征。然而,我们观察到当前的查询选择直接采用分类分数来选择,忽略了检测器需要同时对对象的类别和位置进行建模的事实,这两者都决定了特征的质量。这不可避免地导致选择定位置信度较低的编码器特征作为初始查询,从而导致相当大的不确定性和损害 DETR 的性能。我们将查询初始化视为进一步提高性能的突破。

在本文中,我们提出了实时检测转换器(RT-DETR),据我们所知这是第一个实时端到端对象检测器。为了快速处理多尺度特征,我们设计了一个高效的混合编码器来代替普通的Transformer编码器,通过解耦不同尺度特征的尺度内交互和跨尺度融合,显著提高了推理速度。为了避免选择定位置信度较低的编码器特征作为对象查询,我们提出了不确定性最小查询选择,通过显式优化不确定性为解码器提供高质量的初始查询,从而提高准确性。此外,由于 DETR 的多层解码器架构,RT-DETR 支持灵活的速度调整以适应各种实时场景而无需重新训练。

RT-DETR 在速度和准确性之间实现了理想的权衡。具体来说,RT-DETR-R50 在 COCO val2017 和 T4 GPU 上的 108 FPS 上实现了 53.1%AP,而 RTDETR-R101 在速度和准确性方面都实现了 54.3% AP 和 74 FPS,优于先前高级 YOLO 检测器的 L 和 X 模型,图 1。我们还通过用较小的主干缩放编码器和解码器来开发缩放的 RT-DETR,其性能优于较轻的 YOLO 检测器(S 和 M 模型)。此外,RT-DETR-R50 在准确性方面优于 DINO-Deformable-DETR-R50 2.2% AP(53.1% AP vs50.9% AP),FPS 约为 21 倍(108FPS vs 5 FPS),显着提高了 DETR 的准确性和速度。在使用Objects365[35]进行预训练后,RTDETR-R50 / R101达到55.3% / 56.2% AP,导致性能惊人。附录中提供了更多实验结果。

主要贡献总结如下:(i)。我们提出了第一个称为 RTDETR 的实时端到端对象检测器,它不仅在速度和准确性上都优于之前先进的 YOLO 检测器,而且还消除了 NMS 后处理对实时对象检测的负面影响; (ii)。我们定量分析 NMS 对 YOLO 检测器速度和准确性的影响,并建立端到端速度基准来测试实时检测器的端到端推理速度; (iii)。所提出的 RT-DETR 通过调整解码器层的数量来支持灵活的速度调整,以适应各种场景而无需重新训练。

2. Related Work

2.1. Real-time Object Detectors

YOLOv1[31]是第一个基于cnn的单级目标检测器来实现真正的实时目标检测。经过多年的持续发展,YOLO检测器优于其他单阶段目标检测器[21,24],成为实时目标检测器的同义词。YOLO检测器可以分为两类:基于锚点的[1,11,15,25,29,30,37,38]和无锚点[10,12,16,40],在速度和精度之间实现了合理的权衡,并被广泛应用于各种实际场景中。这些先进的实时检测器产生大量的重叠框,需要NMS后处理,这会减慢它们的速度。

2.2. End-to-end Object Detectors

端到端对象检测器以其精简的流程而闻名。Carion等人[4]首先提出了基于Transformer的端到端检测器DETR,由于其独特的特征,引起了广泛的关注。特别是,DETR 消除了手工制作的锚点和 NMS 组件。相反,它采用二分匹配并直接预测一对一的对象集。尽管 DETR 具有明显的优势,但存在一些问题:训练收敛缓慢、计算成本高、查询难以优化。已经提出了许多 DETR 变体来解决这些问题。加速收敛。Deformable-DETR [45] 通过提高注意力机制的效率来加速多尺度特征的训练收敛。DAB-DETR[23]和DN-DETR[17]通过引入迭代细化方案和去噪训练进一步提高了性能。Group-DETR [5] 引入了分组一对多分配。降低计算成本。高效的DETR[42]和稀疏DETR[33]通过减少编码器和解码器层数或更新查询的数量来减少计算成本。Lite DETR[18]通过交错方式减少低级特征的更新频率来提高编码器的效率。优化查询初始化条件DETR[27]和锚DETR[39]降低了查询的优化难度。朱等人。 [45] 提出了两阶段 DETR 的查询选择,DINO [44] 提出了混合查询选择来帮助更好地初始化查询。当前的 DETR 仍然计算量很大,无法实时检测。我们的 RT-DETR 大力地探索了计算成本降低并尝试优化查询初始化,优于最先进的实时检测器。

3. End-to-end Speed of Detectors

3.1. Analysis of NMS

NMS是一种广泛应用于目标检测的后处理算法,用于消除重叠输出框。NMS 需要两个阈值:置信度阈值和 IoU 阈值。具体来说,得分低于置信度阈值的框被直接过滤掉,每当任意(分到相同类别的)两个框的 IoU 超过 IoU 阈值时,得分较低的框将被丢弃。这个过程是迭代执行的,直到处理每个类别的所有框。因此,NMS的执行时间主要取决于盒子的数量和两个阈值。为了验证这一观察结果,我们利用YOLOv5[11](基于锚的)和YOLOv8[12](无锚)进行分析。

我们首先计算在同一输入上过滤具有不同置信度阈值的输出框后剩余的框数。我们将值从 0.001 采样到 0.25 作为置信度阈值,以计算两个检测器的剩余框的数量并将它们绘制在条形图上,这直观地反映了 NMS 对其超参数敏感,图 2。随着置信度阈值的增加,过滤掉更多的预测框,需要计算 IoU 的剩余框的数量减少,从而减少 NMS 的执行时间。

此外,我们使用YOLOv8来评估COCO val2017的准确性,并测试NMS操作在不同超参数下的执行时间。注意,我们采用的NMS操作是指TensorRTefficientNMSPluggin,它涉及多个内核,包括EfficientNMSFilter、RadixSort、EfficientNMS等,我们只报告EfficientNMS内核的执行时间。我们使用TensorRT FP16在T4 GPU上测试速度,输入和预处理保持一致。超参数和相应的结果如表1所示。从结果中我们可以得出结论,随着置信阈值的减小或IoU阈值的增加,efficiency NMS内核的执行时间也会增加。原因是高置信度阈值直接过滤掉更多的预测框,而高 IoU 阈值在每一轮筛选中过滤掉更少的预测框。(如果你对NMS充分了解,这段精简的解释就很好理解)我们还在附录中可视化了具有不同NMS阈值的YOLOv8的预测。结果表明,不适当的置信度阈值会导致检测器出现显着的false positives误报或false negatives误报。置信阈值为 0.001,IoU阈值为 0.7,YOLOv8 获得了最好的 AP 结果,但相应的 NMS 时间处于更高的水平。考虑到 YOLO 检测器通常报告模型速度并排除 NMS 时间,因此需要建立端到端速度基准。

3.2. End-to-end Speed Benchmark

为了公平地比较各种实时检测器的端到端速度,我们建立了一个端到端的速度基准。考虑到NMS的执行时间受输入的影响,有必要选择一个基准数据集并计算多个图像的平均执行时间。我们选择COCO val2017[20]作为基准数据集,并将TensorRT的NMS后处理插件附加到YOLO检测器上,如上所述。具体来说,我们根据基准数据集(不包括 I/O 和 MemoryCopy 操作)上相应准确度的 NMS 阈值来测试检测器的平均推理时间。我们利用基准来测试基于锚点的检测器YOLOv5[11]和YOLOv7[38]的端到端速度,以及无锚检测器PP-YOLOE[40]、YOLOv6[16]和YOLOv8[12]在带有TensorRT FP16的T4 GPU上。根据结果(cf.表 2),我们得出结论,无锚检测器在 YOLO 检测器上的性能优于基于锚点的检测器,因为前者比后者需要更少的 NMS 时间。原因是基于锚的检测器比无锚检测器产生更多的预测框(在我们的测试检测器中增加了三倍)。

4. The Real-time DETR

4.1. Model Overview

RT-DETR 由一个特征提取网络backbone、一个高效的混合编码器(hybrid encoder)和一个带有辅助预测头的 Transformer 解码器组成。RT-DETR的概述如图4所示。具体来说,我们将特征提取网络的最后三层的特征{S3, S4, S5}输入到编码器中。高效的混合编码器通过尺度内特征交互和跨尺度特征融合将多尺度特征转换为一系列图像特征(cf.第 4.2 节)。随后,使用不确定性最小查询选择来选择固定数量的编码器特征作为解码器的初始对象查询(cf.第 4.3 节)。最后,带有辅助预测头的解码器迭代优化对象查询以生成类别和框。

4.2. Efficient Hybrid Encoder

计算瓶颈分析。多尺度特征的引入加速了训练收敛并提高了性能[45]。然而,尽管可变形注意力降低了计算成本,但序列长度急剧增加仍然导致编码器成为计算瓶颈。如Lin等人[19]所述,编码器占GFLOPs的49%,但在Deformable-DETR中只贡献了AP的11%。为了克服这个瓶颈,我们首先分析了多尺度 Transformer 编码器中存在的计算冗余。直观地说,包含对象丰富语义信息的高级特征是从低级特征中提取的,使得对拼接(concat)的多尺度特征进行特征交互变得多余。因此,我们设计了一组不同类型的编码器的变体来证明同时在尺度内和跨尺度特征交互是低效的,图3。特别地,我们使用拥有更小的数据读取器和轻量级解码器(这两个技术被使用在我们的RT-DETR中)的DINO-Deformable-R50进行实验,首先去除DINO-Deformable-R50中的多尺度Transformer编码器作为变体A。然后,不同类型的编码器被插入到模型中以生成一系列基于 A 的变体,详细说明如下((各变型的详细指标见表3):

  • A → B:变体 B 将单尺度 Transformer 编码器插入到 A 中,它使用一层 Transformer 块。多尺度特征共享编码器进行尺度内特征交互,然后concat作为输出。
  • B → C:变体 C 引入了基于 B 的跨尺度特征融合,并将拼接的特征馈送到多尺度 Transformer 编码器以执行同时尺度内和跨尺度特征交互。
  • C → D:变体 D 通过利用单尺度 Transformer 编码器和PANet-style  [22] 结构解耦尺度内交互和跨尺度融合。(单尺度Transformer Encoder负责尺度内交互,PANet-style负责跨尺度特征融合)
  • D → E:变体 E 增强了基于 D 的尺度内交互和跨尺度融合,采用了我们设计的高效混合编码器。(efficient hybrid encoder)

Hybrid design.

基于上述分析,我们重新思考编码器的结构,提出了一种有效的混合编码器,由基于注意力的尺度内特征交互(AIFI)基于 CNN 的跨尺度特征融合(CCFF)两个模块组成。具体来说,AIFI 通过使用单尺度 Transformer 编码器仅在 S5 上执行尺度内交互,进一步降低了基于变体 D 的计算成本。原因是将自注意力操作应用于具有更丰富语义概念的高级特征可以捕获概念实体之间的连接这有助于后续模块对对象的定位和识别。然而,由于缺乏语义概念以及重复和与高级特征交互混淆的风险,低级特征的尺度内交互是不必要的。为了验证这一观点,我们仅在变体 D 中的 S5 上执行尺度内交互,实验结果如表 3 所示(参见第 DS5 行)。与D相比,DS5 不仅显着减少了延迟(快 35%),而且提高了准确性(AP 高 0.4%)。CCFF是基于跨尺度融合模块优化的,该模块将多个由卷积层组成的融合块插入到融合路径中。融合块的作用是将两个相邻的尺度特征融合到一个新的特征中,其结构如图5所示。融合块包含两个1 × 1卷积来调整通道数,还使用了N个RepBlock(由RepConv[8]组成的)进行特征融合,两条路径输出通过元素相加被融合。我们将混合编码器的计算表述为:

4.3. Uncertainty-minimal Query Selection

为了减少在 DETR 中优化对象查询的难度,随后的几项工作 [42, 44, 45] 提出了查询选择方案,它们通常使用置信度分数从编码器中选择前 K 个特征来初始化对象查询(或仅位置查询)

置信度分数表示特征包含前景对象的可能性。然而,检测器需要同时对对象的类别和位置进行建模,这两者都决定了特征的质量。因此,特征的性能分数是一个与分类和定位共同相关的潜在变量。基于分析,当前的查询选择导致所选特征的不确定性相当大导致解码器的初始化次优,阻碍了检测器的性能。

为了解决这个问题,我们提出了不确定性最小查询选择方案该方案显式地构造和优化认知不确定性 来 建模编码器特征的联合潜在变量,从而为解码器提供高质量的查询。具体来说,特征不确定性 U 定义为等式(2)中定位 P 和分类 C 预测分布之间的差异。为了最小化查询的不确定性,我们将不确定性集成到损失函数中以基于梯度的进行优化如等式(3)所示。

Effectiveness analysis.

为了分析不确定性最小查询选择的有效性,我们可视化了COCO val2017上所选特征的分类分数和IoU分数(即分别对应着目标检测任务的分类和定位能力),如图6所示。我们用大于0.5的分类分数绘制散点图。紫色和绿色点分别表示从不确定度最小查询选择和普通查询训练的模型中选择的特征

点越接近图右上角,对应特征的质量越高,即预测类别和框越有可能描述真实对象。图上面和图右侧密度曲线反映了两种类型的点数。

散点图最显着的特点是紫色点集中在图的顶部,而绿色点集中在右下角。这表明不确定性最小查询选择会产生更高质量的编码器特征。此外,我们对两种查询选择方案进行了定量分析。紫色点比绿色点多 138%,即分类分数小于或等于 0.5 的绿色点,可以认为是低质量的特征。两个分数都大于0.5的紫点比绿点多120%。同样的结论可以从密度曲线中得出,其中紫色和绿色之间的差距在图中右上角最为明显。定量结果进一步表明,不确定性最小查询选择为查询提供了更多具有准确分类和精确位置的特征,从而提高了检测器的准确性(cf.第 5.3 节)。

4.4. Scaled RT-DETR

由于实时检测器通常提供不同尺度的模型以适应不同的场景,RT-DETR还支持灵活的缩放。具体来说,对于混合编码器,我们通过调整嵌入维度和通道数来控制宽度,并通过调整 Transformer 层和 RepBlock 的数量来控制深度。

解码器的宽度和深度可以通过操纵对象查询和解码器层的数量来控制。此外,RT-DETR 的速度通过调整解码器层的数量来支持灵活的调整。我们观察到,最后删除几个解码器层对准确性的影响最小,但大大提高了推理速度(cf.第 5.4 节)。我们将配备 ResNet50 和 ResNet101 [13, 14] 的 RT-DETR 与 YOLO 检测器的 L 和 X 模型进行比较。Lighter RT-DETR 可以通过应用其他更小的(例如 ResNet18/34)或可扩展的(例如 CSPResNet [40])主干来设计,该主干具有缩放编码器和解码器。我们将缩放的 RT-DETR 与附录中的较轻 (S 和 M ) YOLO 检测器进行比较,它们在速度和准确性上都优于所有 S 和 M 模型。

5. Experiments

相关文章:

《RT-DETR》论文笔记

原文出处 [2304.08069] DETRs Beat YOLOs on Real-time Object Detection (arxiv.org)https://arxiv.org/abs/2304.08069 原文笔记 What DETRs Beat YOLOs on Real-time Object Detection 1、设计了一种高效的混合编码器,通过解耦尺度内交互和跨尺度融合来提高…...

输出Docker容器的启动命令行脚本

当Docker容器启动后,如果忘记启动参数,比如目录挂载、端口映射等,可以通过Portainer等容器管理工具查看。但是,有时希望能获取容器启动的命令行,因为需要再启动一个类似容器,怎么办呢? 有一款工…...

Dubbo 快速掌握 这篇就够了

1. Dubbo概述 Dubbo 是一款高性能、轻量级的开源Java RPC框架,由阿里巴巴公司开发并在2011年开源。它主要用于解决分布式系统中服务之间的通信问题,支持多种协议,如Dubbo、HTTP、Hessian等,具有服务注册、服务发现、负载均衡、故…...

【每日刷题】Day100

【每日刷题】Day100 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 【模板】堆_牛客题霸_牛客网 (nowcoder.com) 2. 【模板】链表_牛客题霸_牛客网 (nowcoder.com) 3…...

网络协议九 应用层 HTTPS

一 什么是 HTTPS 二 什么是 SSL/TLS 协议 ,TLS 是 SSL 升级后的名字 三. TLS 协议 工作在那一层 四 。OpenSSL 是 SSL/TLS协议的开源实现。 五。重点 HTTPS 的通讯过程 六 TLS 1.2 的连接过程 1. client hello 是浏览器发送给服务器的第一条信息, 是客户…...

【ArrayList】JDK1.8源码详细注释 以及如何实现线程安全的链表

ArrayList(JDK8) ArrayList有四个内部类,成员内部类Itr,成员内部类ListItr,静态内部类SubList,ArrayListSpliterator(暂时用不到)Itr是Iterator的实现类,支持正向遍历,ArrayList的i…...

[python]rasterio运行代码警告proj_create_from_database: Cannot find proj.db

这个报错要分原因还有rasterio版本讨论,因此官方给出了十分具体回答 Frequently Asked Questions What does "RasterioIOError: file.ecw not recognized as a supported file format." mean? This exception is raised when none of rasterios format …...

ThinkPHP5.1.C+CmsEasy-SQL注入

目录 1、ThinkPHP 中存在的 SQL注入 漏洞( select 方法注入) 1.1环境配置 1.1.1将 composer.json 文件的 require 字段设置成如下: 1.1.2设置application/index/controller/Index.php 文件 1.1.3在 application/database.php 文件中配置…...

Python 绘图进阶之词云图:文本数据的可视化艺术

Python 绘图进阶之词云图:文本数据的可视化艺术 引言 在数据科学和自然语言处理领域,词云图(Word Cloud)是一种常用的可视化工具。它通过直观的图形展示文本数据中的高频词汇,使得我们能够快速抓住文本内容的核心主题…...

【Windows】Q-Dir(资源管理器)软件介绍

软件介绍 Q-Dir是一款免费的文件管理器软件,它可以让您更方便地浏览和管理计算机上的文件和文件夹。与Windows自带的资源管理器相比,Q-Dir具有更多的功能和选项。 安装教程 软件下载完成,解压软件。 点击Q-Dir.exe即可打开软件。 功能…...

什么是令牌桶算法?工作原理是什么?使用它有哪些优点和注意事项?

大家好,我是鸭鸭! 此答案节选自鸭鸭最近弄的面试刷题神器面试鸭 ,更多大厂常问面试题,可以点击下面的小程序进行阅读哈! 目前这个面试刷题小程序刚出,有网页和小程序双端可以使用! 回归面试题…...

C++-类与对象(中上篇)

一、目标 1. 类的 6 个默认成员函数 2. 构造函数 3. 析构函数 二、对目标的介绍 1. 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生…...

链表 206.反转链表

一般方法 不需要一个个来回换,只需要改变链表的指向,即可完成 一个链表的头节点,也代表了整个链表 class Solution {public ListNode reverseList(ListNode head) {ListNode temp;ListNode cur head;ListNode pre null;while(cur ! null…...

Ubuntu18.04 配置EtherCAT主站IGH SOEM

IGH IGH 是开源的EtherCAT 主站软件 一、安装依赖 sudo apt update sudo apt install build-essential linux-headers-$(uname -r) mercurial autoconf libtool 也不知道安装的完全不完全 uname -r 可以查看内核,我安装的ubuntu18.04的内核版本是 5.4.0-84-gen…...

航空航天构型管理

构型管理(CM)被定义为在产品的生命周期中应用的SE技术和管理规程。CM的五个原则是:CM计划与执行、配置识别、配置变更和差异控制、配置状态核算和配置验证。 广义上的构型管理规划和管理是有效实施配置管理的关键。特别是在不同项目之间的差异中,构型管理…...

Visual Studio Code 安装与 C/C++ 语言运行总结

​ 大家好,我是程序员小羊! 前言: Visual Studio Code(简称 VS Code)是由微软开发的一款轻量级、强大的代码编辑器,支持多种编程语言和开发框架。由于其丰富的插件生态系统和灵活的配置选项,VS…...

Science Robotics 受鳞片启发的可编程机器人结构,可同时进行形状变形和刚度变化

一、前言速览 生物有机体通常凭借复杂的结构表现出显著的多功能性,例如章鱼具有可以同时改变形状和刚度的能力。现有的仿生软体机器人要想实现这样的能力,往往需要繁琐的结构和复杂的控制系统。为此,来自新加坡南洋理工大学的研究人员从覆盖…...

SpringBoot 自定义 Starter 实现

一、定义,什么是Starter SpringBoot Starter 是”一站式服务(one-stop service)“的依赖 Jar 包: 包含 Spring 以及相关技术(比如Redis)的所有依赖提供了自动配置的功能,开箱即用提供了良好的…...

「Spring MVC」Session、Cookie

🎇个人主页:Ice_Sugar_7 🎇所属专栏:JavaEE 🎇欢迎点赞收藏加关注哦! Spring MVC 🍉Session & Cookie🍌联系与区别 🍉获取 Cookie🍉存储 & 获取 Sess…...

Java虚拟机:垃圾回收器

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 037 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…...

ES6-ES13学习笔记

初识ES6 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 1997年:EC…...

【Qt开发】QtCharts图表——在ui上添加QChartView控件并进行绘图配置

【Qt开发】QtCharts图表——在ui上添加QChartView控件并进行绘图配置 文章目录 控件安装和模块导入在ui上添加QChartView控件QChartView图表配置附录:C语言到C的入门知识点(主要适用于C语言精通到Qt的C开发入门)C语言与C的不同C中写C语言代码…...

Android14 屏幕录制(屏幕投影)和音频播放采集

Android 5开始支持屏幕采集, Android 10支持音频播放采集&#xff0c;不过Android 14用前台服务做屏幕录制时要增加一些处理. 1. app manifest 需要增加: <manifest><uses-permission android:name"android.permission.FOREGROUND_SERVICE" /><uses…...

一行实现88个群智能算法优化混合核极限学习机HKELM的多特征输入单输出的数据回归预测Matlab程序全家桶

一行实现88个群智能算法优化混合核极限学习机HKELM的多特征输入单输出的数据回归预测Matlab程序全家桶 文章目录 前言一行实现88个群智能算法优化混合核极限学习机HKELM的多特征输入单输出的数据回归预测Matlab程序全家桶 一、HKELM模型1. 极限学习机&#xff08;ELM&#xff0…...

redis面试(十五)公平锁队列重排

队列重拍 先说一下当前的加锁状态 anyLock由客户端A持有队列中是客户端B、客户端C并且客户端B现在是排在头部 那么队列重拍就是队列中某个客户端长时间没有重新申请加锁&#xff0c;没有刷新分数&#xff0c;就会被队列中挤掉。 假设这个长时间没有加锁的客户端是B。 总结 …...

python 基础语法os模块

一、os模块 待总结 二、os.path模块 1.abspath()方法--获取绝对路径 abspathO)方法用于返回文件或者目录的绝对路径。 语法格式如下: os .path.abspath(path) 参数说明: path:表示要获取绝对路径的相对路径&#xff0c;可以是文件也可以是目录。 返回值:返回获取到的绝…...

图论------迪杰斯特拉(Dijkstra)算法求单源最短路径。

编程要求 在图的应用中&#xff0c;有一个很重要的需求&#xff1a;我们需要知道从某一个点开始&#xff0c;到其他所有点的最短路径。这其中&#xff0c;Dijkstra 算法是典型的最短路径算法。 本关的编程任务是补全右侧代码片段中 Begin 至 End 中间的代码&#xff0c;实现 …...

河工院首届工业设计大赛程序组(挑战赛)题解

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 寻找ACMer 思想&#xff1a; 签到题按照题意遍历字符串&#xff0c;不断向后寻找包含 ACMer 完整字符串的数量即可 std标程&#xff1a; #include <iostream> #include <cstring> #include …...

文件上传漏洞(二,靶场搭建及漏洞利用)

前言&#xff1a; 本文基于github上的upload-labs&#xff0c;PHP study以及bp抓包软件进行操作。 一&#xff0c;靶场搭建。 靶场链接 1&#xff0c;下载zip文件到PHP study下的www文件夹内&#xff0c;并解压。 2&#xff0c;创建网站。 此处php版本应选择较老版本&…...

大厂面试题分享第二期

大厂面试题分享第二期 如果执行了一条命令&#xff0c;"select count(*)from…"&#xff0c;使用哪个引擎更快&#xff0c;为什么&#xff1f;垃圾回收器 CMS 和 G1的区别介绍一下CMS和G1CMS&#xff08;并发&#xff09;垃圾收集器G1垃圾回收器 HTTPS和HTTP的区别主…...