BEVFormer v2(CVPR2023)
文章目录
- Abstract
- Introduction
- Related Works
- BEV 3D Object Detector
- Auxiliary Loss in Camera 3D Object Detection
- Two-stage 3D Object Detector
- BEVFormer v2
- Overall Architecture
- Perspective Supervision
- Perspective Loss
- Ravamped Temporal Encoder
- Two-stage BEV Detector
- Decoder with Hybrid Object Queries
- Conclusion
paper
Abstract
作者提出了一种具有视角监督的新型鸟瞰(BEV)检测器,该检测器收敛速度更快,更适合现代图像主干。现有的最先进的BEV检测器通常与VoVNet等深度预训练的主干相关联,阻碍了蓬勃发展的图像主干与BEV检测器之间的协同作用。为了解决这一限制,我们优先考虑通过引入透视视图监督来简化BEV检测器的优化。为此,我们提出了一种两阶段的BEV探测器,其中来自视角头部的建议被馈送到鸟瞰头部以进行最终预测。为了评估我们的模型的有效性,我们进行了广泛的消融研究,重点是监督的形式和提议的检测器的一般性。该方法在大尺度nuScenes数据集上得到了新的SoTA结果。
Introduction
鸟瞰(BEV)识别模型[17,21,25,27,29,35,42]是一类基于相机的3D目标检测模型。它们吸引了人们对自动驾驶的兴趣,因为它们可以自然地将来自多个传感器的部分原始观察整合到一个统一的整体3D输出空间中。典型的BEV模型建立在图像主干上,然后是视图转换模块,该模块将透视图像特征提升为BEV特征,然后由BEV特征编码器和一些特定任务头进一步处理。尽管在设计视图转换模块[17,27,42]和整合不断增长的下游任务列表[9,27]上投入了很多努力。在新的识别框架中,对纯电动汽车模型中图像主干的研究很少受到重视。作为一个前沿和高要求的领域,将现代图像骨干引入自动驾驶是很自然的。令人惊讶的是,研究界选择坚持使用VoVNet[13]来享受其大规模深度预训练[26]。在这项工作中,我们专注于释放现代图像特征提取器在纯电动汽车识别中的全部力量,为未来研究人员在该领域探索更好的图像骨干设计打开大门。
然而,简单地使用现代图像主干而不进行适当的预训练并不能取得令人满意的效果。例如,ImageNet[6]预训练的ConvNeXt-XL[23]骨干与DDAD-15M预训练的VoVNet-99[23]骨干在3D目标检测方面的性能相当,尽管后者的参数是前者的3.5倍。我们将适应现代图像主干的斗争归功于以下问题:1)自然图像与自动驾驶场景之间的领域差距。在一般的2D识别任务中,预训练的主干在感知3D场景,尤其是深度估计方面存在不足。(2)现行BEV探测器结构复杂。以BEVFormer[17]为例。三维边界框和目标类标签的监督信号通过视图编码器和目标解码器从图像主干中分离出来,每个编码器都由多层变压器组成。用于自动驾驶任务的一般二维图像主干的梯度流被叠加的变压器层扭曲。
为了解决上述问题,我们在BEVFormer中引入了视角监督,即从视角-视角任务中提取额外的监督信号,并直接应用于主干网。它引导骨干学习2D识别任务中缺失的3D知识,克服了BEV检测器的复杂性,极大地促进了模型的优化。具体而言,我们在主干上构建透视三维检测头[26],以图像特征为输入,直接预测目标物体的三维边界框和类标签。将该透视头的损耗记为透视损耗,与由该BEV头导出的原始损耗(BEV损耗)相加,作为辅助检测损耗。用相应的损失项对两个检测头进行联合训练。此外,我们发现很自然地将两个检测头组合成一个两级BEV检测器,BEV- Former v2。由于透视图头部是成熟的,它可以在透视图中生成高质量的对象建议,我们将其用作第一阶段的建议。我们将它们编码为对象查询,并将它们与原始BEVFormer中的可学习对象收集在一起,形成混合对象查询,然后将其输入第二阶段检测头以生成最终预测。
我们进行了大量的实验来证实我们所提出的视角监督的有效性和必要性。透视损失有利于图像主干的自适应,提高了检测性能,加快了模型收敛速度。然而,如果没有这种监督,即使用更长的时间表训练,该模型也无法获得可比的结果。因此,我们成功地将现代图像骨干适应为BEV模型,在nuScenes[2]测试集上实现了63.4%的NDS。我们的贡献可以总结如下:
我们指出,视角监督是使一般2D图像骨干适应BEV模型的关键。我们通过透视视图中的检测损失显式地添加了这种监督。
我们提出了一种新型的两级BEV检测器,BEV- Former v2。它由一个透视3D和一个BEV检测头组成,前者的建议与后者的目标查询相结合。我们通过将其与最新开发的图像主干相结合,突出了我们方法的有效性,并在nuScenes数据集上实现了比以前最先进的结果的显着改进。
Related Works
BEV 3D Object Detector
鸟瞰(BEV)目标检测由于在自动驾驶系统中的巨大成功,近年来引起了越来越多的关注[17,21,25,27,29,35,42]。早期的工作包括OFT [29], Pseduo LiDAR[35]和VPN[25],它们阐明了如何将视角特征转换为BEV特征,但无论是用于单个摄像机还是用于不太知名的任务。OFT[29]率先采用从2D图像特征到3D BEV特征的转换进行单眼3D物体检测。伪激光雷达[35],顾名思义,是通过单目深度估计和相机本征产生伪点云,然后在BEV空间进行处理。VPN[25]是第一个将多视图摄像机输入融合到自上而下的视图特征图中进行语义分割的。
现代方法得益于 2D-3D 视图转换所提供的不同视角传感器特征的整合便利性。LSS [27] 通过在 BEV 柱特征池化过程中引入潜在深度分布扩展了 OFT。此外,LSS 在池化时使用了六张周围图像,而 OFT 只使用了一张。与 LSS 中的 2D 到 3D 抬升或 OFT 中的 3D 到 2D 投影不同,CVT [42] 利用相机感知的位置编码和密集交叉注意力来连接透视视图和 BEV 视图特征。PETR [21] 设计了一种无需显式构建 BEV 特征的方法。透视特征图与 3D 位置嵌入特征图按元素融合,随后应用 DETR 风格的解码器进行目标检测。BEVFormer [17] 利用空间交叉注意力进行视图转换,利用时间自注意力进行时间特征融合。BEVFormer 的全 Transformer 结构使其 BEV 特征比其他方法更具通用性,能够轻松支持非均匀和非规则采样网格。此外,正如 Simple-BEV [7] 所展示的那样,多尺度可变形注意力机制 [43] 在所有提升策略中表现出色。因此,我们选择基于 BEVFormer 构建检测器,以利用上述优势。除了已出版的作品外,由于这一领域的普及,还有许多并行的作品。引入了丰富的图像级和bev级增强训练。BEVStereo[14]和STS[37]均采用了时-分形立体模式,以获得更好的深度估计。Polar- Former[11]提出了一个非直角三维网格设置。SimpleBEV[7]比较了不同的2D-3D提升方法。与现有的主要探索检测器设计的工作不同,我们专注于将现代图像主干应用于BEV识别模型。
Auxiliary Loss in Camera 3D Object Detection
由于大多数方法[15,20,26,30,32,33,40]是建立在2D检测器(如RetinaNet[18]和FCOS[31])上,辅助损失在单眼3D物体检测中普遍存在。但这些辅助损失很少赋予二维监督任何明确的意义。MonoCon[20]通过使用多达5种不同的2D监督,充分利用了2D辅助。对于BEV探测器,BEVDepth[15]利用Li- DAR点云对其中深度网络进行监督。MV-FCOS3D++[32]引入了视角监督来训练其图像骨干,但检测器本身仅受BEV损失的监督。SimMOD[41]的单目提议头采用2D辅助损耗。与以往的方法不同,我们的方法采用了端到端的视角监督方法,没有使用LiDAR点云等额外数据。
Two-stage 3D Object Detector
尽管两级探测器在基于激光雷达的三维目标检测中很常见[1,5,12,16,28,38,41],但它们在基于相机的三维检测中的应用却鲜为人知。MonoDIS[30]使用RoIAlign从2D方框中提取图像特征,然后对3D方框进行回归。SimMOD[41]采用单目3D头进行建议,使用DETR3D[36]头进行最终检测。然而,在两个阶段使用相同的主干骨特征不能为第二阶段的头部提供信息增益。我们认为这是两级检测器在基于相机的3D检测中不那么流行的主要原因。相反,我们的两阶段检测器利用了视角和BEV视图的特征,从而同时享受图像和BEV空间的信息。
BEVFormer v2
将现代2D图像主干应用于纯电动汽车识别,而无需繁琐的深度预训练,可以为下游自动驾驶任务解锁许多可能性。在这项工作中,我们提出了BEVformer v2,这是一种两级BEV检测器,它结合了BEV和视角监督,以便在BEV检测中轻松采用图像骨干。
BEVFormer v2的整体架构。图像主干生成多视图图像的特征。透视图3D头进行透视图预测,然后将其编码为对象查询。BEV头是编码器-解码器结构。空间编码器通过聚合多视图图像特征生成电动汽车特征,时间编码器收集历史电动汽车特征。解码器将混合对象查询作为输入,并根据BEV特征进行最终的BEV预测。整个模型用两个检测头的两个损失项Lpers和Lbev进行训练。
Overall Architecture
如图1所示,BEVFormer v2主要由五个部分组成:图像主干、透视3D检测头、空间编码器、改进的时间编码器和BEV检测头。与原来的BEVFormer[17]相比,除了空间编码器外,所有组件都进行了更改。具体来说,BEVFormer v2中使用的所有图像主干都没有使用任何自动驾驶数据集或深度估计数据集进行预训练。介绍了一种透视三维检测头,以方便二维图像骨干的自适应,并为BEV检测头生成目标方案。为了更好地融合长时频信息,采用了一种新的时域BEV编码器。BEV检测头现在接受一组混合对象查询作为输入。我们将第一阶段的建议与学习到的对象查询结合起来,形成第二阶段的新的混合对象查询。
Perspective Supervision
我们首先分析了BEV模型的问题,以解释为什么需要额外的监督。如图2所示,典型的BEV模型保持网格形状的BEV特征,其中每个网格在相应的2D像素处聚集来自多视图图像特征的3D信息。然后根据BEV特征预测目标物体的三维边界框和类标号,我们将这种监督称为BEV监督。以BEVformer[17]为例,它由一个编码器和一个解码器组成,两者都是多层的变压器。
视角(a)与BEV (b)监管的比较。透视检测器的监督信号是直接针对图像特征的,而纯电动检测器的监督信号是间接的
编码器为每个网格单元分配一组3D参考点,并将其作为2D参考点投射到多视图图像上,通过空间交叉注意对其周围的图像特征进行采样和聚合。解码器是一个可变形的DETR[43]头。BEV监管的根本问题是,它是间接的图像特征。梯度流被三维到二维的投影和多层变压器的细心采样所扭曲,这意味着监督信号在很大程度上与图像主干分离。因此,在训练过程中出现了一个一致性,即BEV检测头依赖于图像特征中包含的3D信息,但对于如何对这些信息进行编码却没有提供足够的指导。
以前的BEV方法没有受到这种不一致的严重影响,它们甚至可能没有意识到这个问题。这是因为它们的骨干要么规模相对较小,要么已经接受过单眼检测头的3D检测任务的预训练。如图2所示,与BEV头相比,透视3D头对图像特征进行逐像素预测,为适应2D图像骨干提供了更丰富的监督信号。我们将这种直接施加于图像特征上的监督定义为透视监督。我们假设视角监督明确地引导主干感知3D场景并提取有用的信息,例如物体的深度和方向,克服了BEV监督的缺点,因此在使用现代图像主干训练BEV模型时至关重要。
Perspective Loss
正如上一节所分析的,视角监督是优化纯电动汽车模型的关键。在BEVformer v2中,我们通过辅助视角损失引入了视角监督。具体来说,在骨架上构建一个透视3D检测头,用于在透视视图中检测目标物体。我们采用类似FCOS3D[33]的检测头,预测三维边界框的中心位置、大小、方向和投影中心度。该头部的检测损耗记为视角损耗Lpers,作为BEV损耗Lbev的补充,便于骨干网络的优化。整个模型是用一个总目标来训练的
Ravamped Temporal Encoder
BEVFormer使用循环时间自关注来合并历史BEV特征。但是时间编码不能充分利用长期时间信息,简单地将循环步骤从4增加到16不会产生额外的性能增益。我们通过使用简单的翘曲和连接策略重新设计了BEVFormer v2的时间编码器。给定不同帧k的BEV特征Bk,我们首先根据帧t和帧k之间的参考帧变换矩阵Tkt =[R|t]∈SE3,将Bk双线性地变形为当前帧Bkt,然后沿着通道维数将之前的BEV特征与当前BEV特征连接起来,并使用残差块进行降维。为了保持与原始设计相似的计算复杂度,我们使用了相同数量的历史BEV特征,但增加了采样间隔。除了受益于长期时间信息,新的时间编码器还解锁了在离线3D检测设置中利用未来BEV功能的可能性。
Two-stage BEV Detector
虽然联合训练两个检测头提供了足够的监督,但我们从不同的角度分别得到两组检测结果。我们设计了一种新颖的结构,将两个头部集成到一个两级预测管道中,即两级BEV检测器,而不是采用BEV头部的预测而丢弃视角头部的预测或通过NMS启发式地组合两组预测。BEV头部的目标解码器adedr[3]解码器使用一组学习到的嵌入作为对象查询,通过训练学习到目标对象可能的位置。然而,随机初始化的嵌入需要很长时间来学习合适的位置。此外,在推理过程中,对所有图像的学习对象查询是固定的,由于对象的空间分布可能会发生变化,因此可能不够准确。为了解决这些问题,透视头的预测通过后处理进行过滤,然后融合到解码器的对象查询中,形成一个两阶段的过程。这些混合对象查询提供了高分(概率)的候选位置,使BEV头在第二阶段更容易捕获目标对象。后面将描述带有混合对象查询的解码器的细节。需要注意的是,第一阶段的建议并不一定是来自透视探测器,例如来自另一个BEV探测器,但实验表明,只有透视视图的预测对第二阶段的BEV头有帮助。
Decoder with Hybrid Object Queries
BEVFromer v2中BEV头的解码器。第一阶段建议的投影中心被用作每个图像的参考点(紫色的),它们与每个数据集学习的内容查询和位置嵌入(蓝色的)结合起来作为混合对象查询。
为了将第一阶段的建议融合到第二阶段的对象查询中,基于BEVFormer[17]中使用的Deformable DETR[43]解码器,对BEV- former v2中BEV头部的解码器进行了修改。解码器由堆叠交替的自注意层和交叉注意层组成。交叉注意层是一个可变形的注意模块[43],它接受以下三个元素作为输入。(1)内容查询,查询特征产生采样偏移量和关注权值。(2)参考点,将值特征上的二维点作为每次查询的采样参考。(3)价值特征,要参加的BEV特征。在原始的BEVFormer[17]中,内容查询是一组学习到的嵌入,参考点是用一组学习到的位置嵌入的线性层来预测的。在BEVformer v2中,我们从透视头部获得建议,并通过后处理选择其中的一部分。如图3所示,所选提案的BEV平面上的投影框中心被用作每幅图像的参考点,并与位置嵌入生成的每个数据集的参考点相结合。每幅图像的参考点直接指示物体在BEV平面上的可能位置,使解码器更容易检测到目标物体。然而,由于遮挡或出现在两个相邻视图的边界上,一小部分物体可能无法被透视头检测到。为了避免丢失这些对象,我们还保留了原始的每个数据集参考点,以便通过学习空间先验来捕获它们。
Conclusion
现有的研究在设计和改进鸟瞰图识别模型的检测器方面做了大量的工作,但往往停留在特定的预训练骨架上,缺乏深入的研究。在本文中,我们的目标是在纯电动汽车模型上释放现代图像骨架的全部力量。我们将一般二维图像骨架的适应问题归结于BEV探测器的优化问题。为了解决这一问题,我们在纯电动汽车模型中引入了视角监督,从一个额外的视角3D检测头中添加了辅助损失。此外,我们将两个检测头集成为一个两级检测器,即BEVFormer v2。成熟的视角头提供第一阶段的目标建议,这些建议被编码到BEV头的目标查询中,用于第二阶段的预测。大量的实验验证了该方法的有效性和通用性。视角监督引导2D图像骨干感知自动驾驶的3D场景,帮助BEV模型实现更快的收敛和更好的性能,适用于广泛的骨干。此外,我们成功地将大规模骨干网应用于BEV- Former v2,在nuScenes数据集上获得了新的SoTA结果。我们认为我们的工作为未来的研究人员探索更好的纯电动汽车模型的图像主干设计铺平了道路。
相关文章:
BEVFormer v2(CVPR2023)
文章目录 AbstractIntroductionRelated WorksBEV 3D Object DetectorAuxiliary Loss in Camera 3D Object DetectionTwo-stage 3D Object Detector BEVFormer v2Overall ArchitecturePerspective SupervisionPerspective LossRavamped Temporal EncoderTwo-stage BEV DetectorD…...
车载通信架构 --- AUTOSAR 网络管理
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
STM32单片机入门学习——第16节: [6-4] PWM驱动LED呼吸灯PWM驱动舵机PWM驱动直流电机
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.05 STM32开发板学习——第16节: [6-4] PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱…...
RoMo: Robust Motion Segmentation Improves Structure from Motion
前言 看起来像是一篇投稿CVPR的文章,不知道被哪个瞎眼审稿人拒了。同期还有一篇CVPR被接收的工作Segment Any Motion in Videos,看起来不如这篇直白(也可能是因为我先看过spotlesssplats的缘故),后面也应该一并介绍了…...
【AI编程学习之Python】第五天:Python的变量和常量
对象 Python中一切变量的值皆为对象。每个对象由:标识(identity)、类型(type)、value(值)组成。 标识用于唯一标识对象,通常对应于对象在计算机内存中的地址。使用内置函数id(obj)可返回对象obj的标识。 类型用于表示对象存储的“数据”的类型。类型可以限制对象的取值范围以…...
经典算法 约数之和
原题目链接 问题描述 假设现在有两个自然数 A 和 B,设 S 为 A^B 的所有约数之和。 请你计算:S mod 9901 的值。 输入格式 在一行中输入两个用空格隔开的整数 A 和 B。 输出格式 输出一个整数,表示 S mod 9901 的值。 数据范围 0 ≤ A, …...
zookeeper基本概念和核心作用
图片来源: 02-Zookeeper概念_哔哩哔哩_bilibili02-Zookeeper概念是黑马程序员Zookeeper视频教程,快速入门zookeeper技术的第2集视频,该合集共计24集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilib…...
蓝桥杯嵌入式客观题二
十四届模拟一 1. 2.串口通信是一种传输线按位数据顺序传输方式 3.USART_SR是属于STM32微控制器USART的状态寄存器。 4.STM32G431RBT6是32位的ARM微控制器 ARM处理器是英国ARM公司设计的一种低功耗RISC微处理器 5.中断配置EXTI->FTSR(下降沿触发选择寄存器…...
第一章:服务架构演进史_《凤凰架构:构建可靠的大型分布式系统》_Notes
第一章 服务架构演进史 1. 原始分布式时代(1970s-1980s) 核心问题:如何用不可靠的硬件构建可靠的大规模系统? 关键知识点: 技术背景: 硬件限制:微型计算机性能低下(如Intel 8086处…...
BUUCTF-web刷题篇(13)
22.NiZhuanSiWei 分析:有三个参数需要以get方式传入,发现有file_get_contents(),所以要使用php伪代码,preg_match("/flag/",$file)说明正则匹配不能含有flag,同时还有反序列化,存在漏洞。 已知前…...
7-9 趣味游戏
题目解析 在某个学校的趣味游戏活动中,N 名同学站成一排,他们的年龄恰好是 1 到 N ,需要注意的是他们并不是按照年龄的大小排列的,而是随机排列的。 游戏的规则是请同学们快速计算出,如果在这 N 名同学的小组中&…...
用 Python 制作仓库自动化指南
1. 环境准备 Python 3.x pip (Python 包管理工具) 文本编辑器或 IDE (如 VS Code、PyCharm) 2. 安装依赖库 pandas: 数据处理 openpyxl: Excel 文件操作 sqlite3: SQLite 数据库交互 smtplib: 邮件发送 bash pip install pandas openpyxl sqlite3 smtplib 3. 功能实现…...
Johnson算法——两阶段流水线调度的最优解法
前言:写这个题目的时候感觉就是说任务a的时候是一定需要的,无法避免,怎么才能节约时间呢,就是进行任务a时候也进行任务b 第一个进行的任务a肯定时间越短越好,因为这样b的等待时间越短 最后一个进行的任务b的时候越短越…...
反向查询详解以Django为例
以下给出两张表格 class User(AbstractUser):mobilemodels.CharField(max_length11,default0,uniqueTrue,verbose_name手机号)email_activemodels.BooleanField(defaultFalse,verbose_name邮箱验证状态)default_address models.ForeignKey(Address, related_nameusers, nullT…...
PDP动物性格测试:趣味性格分析工具
PDP动物性格测试:趣味性格分析工具 📝 简介 大家好!今天我想向大家推荐一个有趣且实用的在线工具 —— PDP动物性格测试。这是一个基于PDP(Process Dynamic Pattern)理论的性格测试工具,通过将性格特征与…...
蓝桥杯 完全平方数 刷题笔记
关键分析 --- ### **完全平方数的质因数指数特性** **核心结论**: 一个数是完全平方数,当且仅当它的所有质因数的指数均为偶数。 --- #include <bits/stdc.h> using namespace std; #define int long long int n;signed main(){cin >>…...
C++自学笔记---数组和指针的异同点
数组和指针的异同点 0. 复习一下:指针运算符 * 和 & 我们前两篇有讲过这两个运算符,& 是取地址运算符,* 是解引用运算符。这两个运算符是理解指针的关键,因为它们分别代表了获取变量地址和访问指针指向的值这两个基本操…...
【学习笔记】pytorch强化学习
https://www.bilibili.com/video/BV1zC411h7B8 文章目录 [mcts] 01 mcts 基本概念基本原理(UCB)及两个示例[mcts] 02 mcts from scartch(UCTNode,uct_search, pUCT,树的可视化) [mcts] 01 mcts 基本概念基本…...
C++学习之线程同步
目录 1.线程同步相关概念 2.锁属性-建议锁 3.Mutex互斥锁操作 4.互斥锁使用注意事项 5.互斥量的初始化方法 6.死锁 7.读写锁特性 8.读写锁操作函数 9.读写锁使用示例 10.条件变量操作函数 11.生产者消费者模型简单分析 12.条件变量实现生产者消费者模型代码预览 13…...
定积分的应用(4.39-4.48)
battle cry 前言4.394.404.414.424.434.444.454.464.474.48 前言 题目确实比较多。slow down and take your time. 4.39 狂算了一遍,然后发现不是计算出问题了,是积分上下限写错了。还有把函数代进去也出了一点问题。 点火公式一家人我不记得&#x…...
Java EE期末总结(第三章)
目录 一、JavaBean 1、规范与定义 2、与JavaBean相关的JSP动作标签 二、MV开发模式(JSPJavaBean) 三、Servlet组件 1、Servlet定义 2、基于HTTP请求的Servlet开发 3、Sevlet执行原理 4、控制器程序的分层设计(DAO)模式 5、…...
Data_Socket和UDP_Socket
Data_Socket 和 UDP_Socket 是两种不同类型的网络套接字,它们用于不同的协议和应用场景。以下是它们的主要区别: 协议类型: UDP_Socket:使用的是 UDP(User Datagram Protocol) 协议,这是一种无连…...
6547网:蓝桥STEMA考试 Scratch 试卷(2025年3月)
『STEMA考试是蓝桥青少教育理念的一部分,旨在培养学生的知识广度和独立思考能力。考试内容主要考察学生的未来STEM素养、计算思维能力和创意编程实践能力。』 一、选择题 第一题 运行下列哪个程序后,飞机会向左移动? ( ) A. …...
使用MATIO库读取Matlab数据文件中的多维数组
使用MATIO库读取Matlab数据文件中的多维数组 MATIO是一个用于读写Matlab数据文件(.mat)的开源C库。下面是一个完整的示例程序,展示如何使用MATIO库读取Matlab数据文件中的多维数组。 示例程序 #include <stdio.h> #include <stdlib.h> #include <…...
Spring @Transactional 注解是如何工作的?
Transactional 注解是 Spring 框架中用于声明式事务管理的核心注解。它可以应用于类或方法,用于指定事务的属性,例如传播行为、隔离级别、超时时间、只读标志等。下面详细解释 Transactional 注解的工作原理: 1. 启用事务管理: …...
spring security 过滤器链使用
Spring Security 的过滤器链提供了灵活的安全控制机制,以下是其在实际开发中的 常见用法 及对应的过滤器配置示例: 一、认证方式配置 1. 表单登录认证 • 过滤器:UsernamePasswordAuthenticationFilter • 配置: http.formLogi…...
k8s 自动伸缩的场景与工作原理
k8s 自动伸缩的场景与工作原理 在现代云原生架构中,应用的访问量和资源需求常常存在波动。为了解决高峰时资源不足、低谷时资源浪费的问题,Kubernetes 提供了自动伸缩功能。自动伸缩可以根据预设的指标(如 CPU 利用率、内存占用、网络流量等…...
SYN Flooding攻击原理
SYN Flooding攻击原理详解 SYN Flooding(SYN洪泛攻击)是一种典型的拒绝服务攻击(DoS/DDoS),利用TCP协议的三次握手缺陷耗尽目标系统资源。以下是其工作原理、影响及防御措施的全面解析: 1. TCP三次握手回顾…...
【爬虫案例】采集 Instagram 平台数据几种方式(python脚本可直接运行)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、概述1.1 Instagram基础信息1.2 Instagram平台架构核心技术栈1.3 采集提示1.4 几种采集方案对比二、四种采集方案分析三、写爬虫采集Instagram案例3.1 采集作品信息并下载视频或图片(无需登录)3.2 explore接口的采…...
通过构造函数和几何条件,研究了不同函数的最近点存在性、性质及单调性
解: (1)对于函数 f ( x ) 1 x f(x) \frac{1}{x} f(x)x1 和点 M ( 1 , 0 ) M(1, 0) M(1,0),构造函数 s ( x ) ( x − 1 ) 2 ( 1 x ) 2 s(x) (x - 1)^2 \left(\frac{1}{x}\right)^2 s(x)(x−1)2(x1)2。求导得到 s ′ …...
项目复杂业务的数据流解耦处理方案整理
目前项目中使用mobx,项目比较久了,每个Store的内容是越来越多了,逻辑也是越来越复杂,如果不梳理估计以后模块的层级会很乱。 之前整理了一些数据流管理的对比实践和最佳方案的梳理,最后写来写去感觉还是要整理一个架构…...
手部穴位检测技术:基于OpenCV和MediaPipe的实现
手部穴位检测是医学和健康管理领域的重要技术之一。通过准确识别手部的关键穴位,可以为中医诊断、康复治疗以及健康监测提供支持。本文将介绍一种基于OpenCV和MediaPipe的手部穴位检测方法,展示如何利用计算机视觉技术实现手部关键点的检测,并进一步标注手部的穴位位置。 技…...
Pycharm 启动时候一直扫描索引/更新索引 Update index/Scanning files to index
多个项目共用一个虚拟环境,有助于加快PyCharm 启动吗 chatgpt 4o认为很有帮助,gemini 2.5pro认为没鸟用,我更认可gemini的观点。不知道他们谁在一本正经胡说八道。 -------- 打开pycharm的时候,下方的进度条一直显示在扫描文件…...
解锁健康密码,拥抱品质生活
在生活节奏不断加快的今天,健康养生已成为人们关注的焦点。它不仅关乎当下生活质量,更是对未来幸福的投资。从日常生活的点滴出发,掌握正确养生方法,我们就能轻松收获健康。 饮食是健康的基石。我们应当遵循 “食物多样&#x…...
安卓开发工程师- Intent 机制
Intent 的作用是什么? Intent(意图)是 Android 中用于组件之间通信的一种机制。它主要用于以下几种场景: 启动 Activity:从一个 Activity 跳转到另一个 Activity。启动 Service:用于启动后台服务或与服务…...
iOS 使用 - 修改屏幕为黑白显示(墨水屏)
iOS 18 设置 – 辅助功能 – 显示与文字大小 – 色彩滤镜 打开色彩滤镜,选择 灰度,最下方调节 强度值 怀念起那个用电子词典的岁月,一个个字母键入,就可以获得很多知识。 触屏时代,一切好像更简单了,但也更…...
小白速通:Verilog流水线实现及时序分析
目录 题目:时序分析:时钟频率为50MHz数据1: a10, b20, c30, d40, e2数据2: a5, b15, c25, d35, e3数据3: a8, b12, c16, d24, e4 流水线效率分析 题目: verilog中,y(abcd)*e,时钟频率为50Mhz,用流水线的形式…...
微软的 Copilot 现在可以浏览网页并为您执行操作
在庆祝其 50 岁生日之际,微软正在向其人工智能驱动的 Copilot 聊天机器人传授一些新技巧。 从 BASIC 到 AI,改变世界的公司:微软 微软表示,Copilot 现在可以在“大多数网站”上采取行动,使其能够预订门票、预订餐厅等…...
【C++】vector的模拟实现
文章目录 前言一. vector的底层二. 关于容量和大小的函数2.1 size和capacity2.2 reserve2.3 resize2.4 empty 三. vector的默认成员函数3.1 构造函数3.1.1 无参构造函数3.1.2 构造初始化为n个val值3.1.3 用initializer_list构造初始化3.1.4 使用迭代器区间进行构造初始化 3.2 拷…...
C# Winform 入门(9)之如何封装并调用dll
封装dll 首先创建 .Net平台 类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求两个double类型的数值的和/// &l…...
【C语言】内存函数
大家好,很高兴又和大家见面了!!! 在C语言标准库中,有一些直接对内存进行操作的函数,我们将其称之为内存函数,这些函数位于头文件<string.h>,在网站https://cplusplus.com/ref…...
SDL视频显示函数
文章目录 1. **`SDL_Init()`**2. **`SDL_CreateWindow()`**3. **`SDL_CreateRenderer()`**4. **`SDL_CreateTexture()`**5. **`SDL_UpdateTexture()`**6. **`SDL_RenderCopy()`**7. **`SDL_RenderPresent()`**8. **`SDL_Delay()`**9. **`SDL_Quit()`**总结示例代码:代码说明:…...
博客文章:深入分析 PyMovie - 基于 Python和 MoviePy 的视频管理工具
这是一个使用 wxPython 构建界面、moviepy 处理视频的自定义 GUI 应用程序。该工具提供了视频播放、元数据提取、格式转换、视频裁剪和截图等功能。通过分析其设计和实现,我们将了解其工作原理、优点和潜在的改进空间。 C:\pythoncode\new\output\pymovieSample.py …...
Redis中AOF的实现方式和AOF重写
一、AOF 的实现方式 核心原理 AOF 通过将写操作命令以追加方式记录到日志文件中,重启时通过重放命令恢复数据。与 RDB 的快照机制不同,AOF 是增量记录,更适用于数据一致性要求较高的场景。写入流程 命令执行:客户端发送写命令&am…...
Supervisor的安装和使用
Supervisor 使用笔记(CentOS 8 环境) 本周,老师让我使用supervisor管理项目服务,当时第一次听说过这个进程管理工具😶🌫️,就上网搜了搜安装和使用,又用ai查了一些细节࿰…...
JVM 内存区域详解
JVM 内存区域详解 Java 虚拟机(JVM)的内存区域划分为多个部分,每个部分有特定的用途和管理机制。以下是 JVM 内存区域的核心组成及其功能: 一、运行时数据区(Runtime Data Areas) 1. 线程共享区域 内存…...
【java】在 Java 中,获取一个类的`Class`对象有多种方式
在 Java 中,获取一个类的Class对象有多种方式。Class对象代表了 Java 中的一个类或接口的运行时类信息,可以用于反射操作。以下是获取Class对象的几种常见方法: 1.使用.class属性 每个类都有一个.class属性,可以直接获取该类的Cl…...
蓝桥杯:对字符串处理常用知识笔记
一、前面四个是计算带有空格字符串的的长度计算 C语言代码 #include<string.h> #include<stdio.h> int main() { char s[105]; gets(s); printf("%d", strlen(s)); return 0; } 算法2 C 代码(常用) #include <iostream> #in…...
c++网络编程,信号透传可能是什么意思
在 C 网络编程中,**信号透传**(Signal Pass-Through)通常 refers to the concept of allowing signals to propagate through a network protocol stack without being interrupted or modified. 具体来说,信号透传可以涉及到几个…...
数据结构与算法学习笔记----贪心·绝对值不等式
数据结构与算法学习笔记----贪心绝对值不等式 author: 明月清了个风 first publish time: 2025.4.5 ps⭐️感觉其实是一个数学的问题, Acwing 104. 货仓选址 [原题链接](104. 货仓选址 - AcWing题库) 在一条数轴上有 N N N家商店,他们的坐标分别为 A…...