51 -25 Scene as Occupancy 3D占用作为场景表示 论文精读

本文阅读的文章是Scene as Occupancy,介绍了一种将物体表示为3D occupancy的新方法,以描述三维场景,并用于检测、分割和规划。

文章提出了OccNet和OpenOcc两个核心概念。

OccNet 3D占用网络是一种以多视图视觉为中心的方法,通过层级化的体素解码器,可以重建3D感知模型和3D占用,适用于多种下游任务。

OpenOCC是一种3D占用基准,第一个基于nuScenes的高密集、高质量3D占用基准。

论文和代码地址

论文名称:Scene as Occupancy

论文地址:https://arxiv.org/abs/2306.02851

代码地址:https://github.com/OpenDriveLab/OccNet

本文由深圳季连科技有限公司AIgraphX自动驾驶大模型团队编辑。如有错误,欢迎在评论区指正。

Abstract

人类驾驶员可以很容易地通过视觉系统描述复杂的交通场景。这种精确感知的能力对于驾驶员的规划至关重要。为此,需要一种几何感知表示,将物理3D场景量化为具有每个单元格语义标签的结构化网格地图,称为3D占用。与bounding box形式相比,occupancy的关键见解是它可以捕获场景中关键障碍物的细粒度细节,从而促进后续任务。先前或当前并发的文献主要集中在单个场景任务完成上,我们可能会认为这种占用表示的潜力可能会掩盖更广泛的影响。在本文中,我们提出了 OccNet,这是一种用具有级联和时间体素解码器,多视图视觉中心管道来重建 3D 占用。OccNet的核心是用occupancy embedding来表示3D物理世界。这样的表示可以应用于广泛的驾驶任务,包括检测、分割和规划。为了验证这个新表示和算法的有效性,我们提出了OpenOcc,这是第一个建立在nuScenes之上的密集、高质量3D占用基准。实证实验表明,多个任务之间存在明显的性能提升,例如运动规划可以使碰撞率降低15%-58%,证明了我们方法的优越性。

Introduction

当你在路上开车时,你会如何通过你的眼睛来描述3D空间中的场景?人类驾驶员可以很容易地描述周围的环境,“在我的车左边大约5英寸处有一辆奔驰”,“在前面大约50米处,有一辆卡车载有巨大突出的煤气管”等等。能够以“有”的形式描述现实世界,这对于实现安全自动驾驶 (AD) 至关重要。然而这对于以视觉为中心的 AD 系统来说并非易事,因为场景中存在各种各样的实体,包括汽车、SUV 和工程卡车等车辆,以及静态障碍物、行人、背景建筑和植被。

将 3D 场景量化为带有语义标签的结构单元,称为 3D Occupancy,是一种直观的解决方案。

这种形式在 Mobileye 和 Tesla  等行业社区中也得到了提倡。与过度简化对象形状的 3D box 相比,3D occupancy 是几何感知的。它通过具有不同几何结构的 3D 立方体集合,描绘不同的对象和背景形状。

如图1(c-d)所示,3D box 只能描述施工车辆的主体,而 3D occupancy 可以保留施工车辆吊臂的细节。其他传统的替代方案,如点云分割和鸟瞰(BEV)分割,虽然在AD的背景下被广泛部署,但分别在成本和粒度上有其局限性。

详细的对比见表1。3D占用的这些明显优势促使人们对其增强传统感知和下游规划任务的潜力进行研究。

在早期阶段,类似的工作已经讨论了3D占用。占用网格地图(Occupancy grid map)在机器人技术中也有类似的概念,是移动导航中的典型表示,但只是作为规划的搜索空间。3D语义场景补全(3D semantic scene completion, SSC)可以看作是评估3D占用想法的感知任务。利用时间信息作为几何先验对于以视觉为中心的模型来说是直观的,可以重建几何感知的 3D 占用,但之前的尝试未能解决这一问题。从粗到精的方法也有利于以可承受的成本改善三维几何表示,而单阶段方法却忽略了这一点。此外,随着以视觉为中心的解决方案盛行,业界仍在寻求一种实用的方法来评估全栈自动驾驶精神下的3D占用。

针对上述问题,我们提出了OccNet,这是一个以视觉为中心的多视图管道,具有cascade voxel decoder,可以借助时间线索重建3D占用,以及支持广泛驾驶任务的特定头部Head。OccNet的核心是一个紧凑的、具有代表性的三维占用嵌入来描述三维场景。

为了实现这一目标,OccNet不像以往文献那样直接从图像特征中生成体素特征或单独使用BEV特征,而是采用级联方式从BEV特征中解码3D占用特征。解码器采用基于体素的时间自注意和空间交叉注意的渐进方案来恢复高度信息,并与可变形的3D注意模块绑定以提高效率。

有了这样一个3D占位描述符,OccNet在支持一般3D感知任务的同时,也为下游规划任务提供了便利,即3D占位预测、3D检测、BEV分割和运动规划。为了公平比较不同的方法,我们基于nuScenes数据集构建了OpenOcc,这是一个具有密集和高质量注释的3D占用基准。它包含34149个带注释的帧,超过14亿个3D占用单元,每个被分配到16个类中的一个来描述前景物体和背景东西。与稀疏的替代方法相比,这种密集且语义丰富的标注,利于用视觉模型来实现卓越的3D几何学习。它还考虑了对象运动和方向流标注,可扩展到规划任务。

我们在OpenOcc基准上对OccNet进行了评估,实证研究从三个方面证明了3D占位作为场景表示优于传统替代方案:

1)更好的感知。3D占用有助于从纯视觉模型中获取3D几何形状,其点云分割性能可与基于lidar的方法相媲美,基于占用的预训练或联合训练增强了3D检测性能。

2)更好的规划。更准确的感知也转化为更好的规划性能。

3)越密集越好。纯视觉监督模型,密集的三维占用比稀疏的形式更有效。在OpenOcc基准测试中,OccNet优于最先进的技术,例如TPVFormer,在语义场景完成任务中相对提高了14%。与FCOS3D相比,在OccNet上预训练的检测模型性能,在小规模数据上微调后提高了约10个点。对于基于3D占用的运动规划任务,与基于BEV分割或3D Box的规划策略相比,我们可以将碰撞率降低15%-58%。

综上所述,我们的贡献有两个方面:

1)我们提出了OccNet,这是一个以视觉为中心的管道,具有级联体素解码器cascade voxel decoder,可以使用时间线索生成3D占用。它可以更好地捕捉物理世界的细粒度细节,并支持广泛的驾驶任务。

2)基于所提出的具有密集和高质量注释的OpenOcc基准,我们证明了ococnet在感知和规划任务上的有效性,并取得了明显的性能提升。一个初步的结论是,3D占用作为场景表示,优于传统的替代方案。

Related Work

3D object detection

3D目标检测采用3D box作为AD中的感知目标,因为box形式对于下游基于规则的方法来说结构良好。这种表示法将具有不同形状的3D对象抽象为标准化的长方体,因此只关心前景对象,并过度简化对象形状。相比之下,3D占用是对物理世界的细粒度描述,可以区分各种形状的物体。

LiDAR segmentation

激光语义分割是对点级3D场景的理解。它需要点云作为输入,既昂贵又不便携。由于LiDAR在3D场景描述中固有的传感范围有限和稀疏性,使用这种管道对整体3D场景语义理解不友好。

3D reconstruction and rendering

从二维图像中推断物体或场景的三维几何形状是计算机视觉领域多年来普遍存在但具有挑战性的问题。该领域的大多数方法处理单个对象或场景。对于AD应用来说,这是不可行的,因为它需要很强的泛化能力。请注意,3D重建和渲染更注重场景几何和视觉外观的质量。它不太关注模型效率和语义理解。

Semantic Scene Completion

本文讨论的占用预测的定义与Semantic Scene Completion from a Single Depth lmage,SSC最相似。MonoScene首先采用U-Net从单眼RGB图像中推断出带有语义标签的密集3D占用。最近在arXiv上发布了一系列相关的作品。我们认为这些是与它们并发的工作,并在下面简要讨论。VoxFormer利用深度估计在两阶段框架中设置体素查询。OccDepth 在带有蒸馏的立体设置中也采用了深度感知神经来预测语义占用。TPVFormer采用基于lidar的稀疏3D占用作为监督,提出三视角视图表示来获取特征。OpenOccupancy: A Large Scale Benchmark for Surrounding SemanticOccupancy Perception提供了一个精心设计的占用基准,可以促进社区的发展。尽管我们在Semantic-KITTI和NYUv2(单目或RGB-D)上的研究设置不同,但之前或现在一些文献一致忽略了时间上下文的采用。由特斯拉验证了利用历史体素特征很简单,然而,没有技术细节或向公众报告。此外,我们的工作定位为第一个将占用作为一种通用descriptor,它可以增强检测之外的多种任务。

Methodology - OccNet

在本文中,我们提出了一个有效且通用的框架OccNet,它从图像中获得鲁棒的占用特征,并支持多种驾驶任务,如图2所示。该方法分为两个阶段,即占用重建阶段和占用开发阶段。我们将桥接部分称为占用描述符Occupancy Descriptor,即对驾驶场景的统一描述。

OccNet pipeline OccNet的核心是获取具有代表性的占用描述符,并将其应用于各种驾驶任务。算法包括两个阶段。

1 )占用重建。给定多个视觉输入,我们首先从BEV编码器生成特征。体素解码器以级联方式执行,其中体素逐步细化。3D可变形注意力(attention)单元的功能与2D情况类似。时间体素Vt−1也被纳入。为简洁起见,省略了一些连接。

2)占用利用。有了占用描述符,我们可以进行包括语义场景补全和3D物体检测在内的任务。在BEV空间中压缩得到BEV分割图,直接输入规划管道。这样的设计可以保证规划任务得到理想的改进。

Reconstruction of Occupancy

此阶段的目标是获得支持下游任务的代表性占用描述符。受BEV感知快速发展的推动,OccNet旨在利用这一优势在3D空间中进行体素预测任务。为了实现这一点,在下游任务中单独使用BEV功能,作为最简单的架构,并不适合3D空间中的高度感知任务。从一个极端到另一个极端,直接从图像中构造体素特征具有巨大的计算成本。我们将这两个极端称为BEVNet和VoxelNet, OccNet的设计在两者之间找到了平衡,以可承受的成本实现了最佳性能。重构阶段首先从周围图像中提取多视图特征Ft,与历史BEV特征Bt−1和当前BEV查询Qt一起输入到BEV编码器中,得到当前BEV特征。BEV编码器采用BEVFormer结构,其中历史BEV特征Bt−1、当前BEV查询Qt和图像特征Ft经过一个时空变换块得到当前BEV特征。然后,通过级联体素解码器Cascade Voxel Decoder将图像特征、历史和当前BEV特征一起解码为占用描述符。解码器的细节在第3.1节中给出。

Exploitation of Occupancy

基于重构的占用描述符,可以部署到广泛的驾驶任务。受Uni-AD的启发,优选每个表示的显式设计。从直观上来看,3D语义场景补全和3D物体检测附加在占用描述符上。沿着高度挤压3D占用网格图和3D框生成BEV分割图。这样的地图可以直接输入到运动规划头部,连同高级指令采样器,通过argmin和GRU模块得到自车轨迹。第3.2节提供了详细的说明。

Cascade Voxel Decoder

为了有效地获得更好的体素特征,我们在解码器中设计了级联结构,逐步恢复体素特征中的高度信息。

From BEV to Cascaded Voxel

为便于阅读,再次引用OccNet架构图。 

Voxel based Temporal Self-Attention

时间信息对于准确表征驾驶场景至关重要。给定历史体素特征V 't - 1,i,我们通过ego vehicle的位置将其与当前占用特征V 't,i对齐。对于典型的self-attention,每次Q都会涉及到K和V值,因此计算成本非常巨大,在3D空间中甚至比在2D情况下增加Z*Z倍。为了降低计算成本,我们设计了一种基于体素的高效注意力,称为3D可变形注意力(3D- da)来处理计算负担。通过将其应用于基于体素的时间自关注,我们确保每个体素查询只需要与感兴趣的局部体素交互,从而使计算成本可以承受。

备注,关于可变形自注意如何实现,请参见博主的Deformable attention论文。

3D Deformable Attention

Voxel-based Spatial Cross-Attention

在交叉注意中,体素特征V′t,i与具有二维可变形注意的多尺度图像特征Ft相互作用。每个第 i 个解码器直接从对应体素中采样Nref,i个3D点到图像视图中,并与采样后的图像特征交互。这样的设计既保留了高度信息,又保证了体素特征的学习。

Exploiting Occupancy on Various Tasks

OccNet使用细粒度占用描述符在3D空间中描述场景,可以将其输入到各种驾驶任务中,而不会产生过多的计算开销。

Semantic Scene Completion

为了简单起见,我们设计了MLP头部来预测每个体素的语义标签,并应用Focal loss来平衡被占用体素和空体素之间巨大的数值不平等。此外,附加了L1损失的flow head来估计每占用体素的流速。

3D Object Detection

受BEVFormer中头部设计的启发,我们将占用描述符压缩到BEV中,然后应用基于查询的检测头(Deformable DETR的不变量)来预测3D框。

BEV segmentation

遵循ST-P3中的时空融合感知结构

从BEV特征预测地图表示和语义分割,就像在3D物体检测中一样。纯电动汽车分割头包括用于地图表示的可行驶区域分割头和车道线分割头,用于语义分割中的车辆分割和行人分割。

Motion Planning

对于运动规划任务,可以将SSC或3D边界框中预测的占用结果转化为BEV分割,如图OccNet架构图所示。

3D占用结果沿着高度维度和三维框进行挤压。

来自3D占用或3D框的每个BEV单元的所有语义标签都转换为0-1格式,其中1表示单元被占用,0表示空。然后,将该BEV分割映射应用于安全代价safety cost f函数,计算采样轨迹上的安全、舒适和进度代价safety, comfort and progress cost。

需要注意的是,与3D框相比,占用场景补全的背景信息越丰富,安全成本函数越全面,因此需要在两种BEV分割之间进行安全成本值的归一化。

所有候选轨迹通过随机速度、加速度和曲率进行采样。在前进、左转、右转等高级指令的指导下,输出成本最低的特定指令所对应的轨迹。

利用前视特征对该轨迹进一步进行ST-P3的GRU细化,得到最终轨迹。

OpenOcc: 3D Occupancy Benchmark

为了公平地评估文献中的占用性能,我们引入了第一个3D占用基准,称为OpenOcc,它建立在流行的nuScenes数据集之上。与现有的同类产品(如SemanticKITTI)相比,只有前置摄像头,OpenOcc提供环视摄像头视图,并提供相应的3D占用和流标注。

Benchmark Overview

我们利用稀疏的LiDAR信息和3D box生成密集和高质量的标注占用数据。它包括所有700个训练场景和150个验证场景的34149个带标注的帧。我们在基准测试中标注了超过14亿体素和16个类,包括10个前景对象和6个背景对象。此外,我们还考虑了前景物体的运动,并对物体体素进行了额外的流标注。

我们将我们的占用率数据与表2中的其他基准进行了比较,表明我们的基准可以提供最完整的场景表示,包括占用和流量信息。

Visual comparison on 3D occupancy annotations

与(a)稀疏占用和(b) OccData相比,我们使用(d)前景物体的额外流标注生成(c)密集和高质量的标注,可用于运动规划。

如图3所示,SparseOcc仅使用了稀疏关键帧激光雷达数据来体素化三维空间,它太稀疏了,无法表示3D场景。相比之下,我们的占用可以用流信息表示完整的场景,并且可以高质量地捕获局部细粒度的场景几何。

Generating High-quality Annotation

Independent Accumulation of Background and Foreground

为了生成密集表示,可以直观地将K帧和中间帧的所有稀疏LiDAR点累加起来,得到密集表示。但是,由于运动物体的存在,直接通过坐标变换从中间帧积累点是有问题的。

我们提出将激光雷达点基于3D box分割为静态背景点和前景点,分别进行累积。

然后我们可以累积全局世界系统中的静态背景点和物体坐标系中的物体点来生成密集点。

Generation of Annotation

给定密集的背景和目标点,我们首先对3D空间进行体素化,并根据体素中标记点的多数投票对体素进行标记。不同于现有的基准,只有occupancy标注。

我们根据3D box速度标注体素的流速,以方便后续的运动规划等任务。仅使用关键帧会导致生成的占用数据稀疏,因此我们在周围标记体素的基础上,用中间帧的未标记LiDAR点对体素进行标注,进一步提高数据密度。此外,由于nuScenes存在z轴平移缺失的问题,我们通过场景补全来细化占用数据,例如填充道路上的洞以获得更高的质量。此外,我们通过追踪光线将部分体素设置为不可见的,这更适用于有相机输入的任务。

Experiments

Main Results

Semantic Scene Completion

3D Occupancy Prediction in terms of Semantic Scene Completion

Qualitative results of occupancy prediction

我们的方法在场景细节和前景对象(如虚线区域的行人)的语义分类精度方面优于TPVFormer。

Occupancy for LiDAR Segmentation

Occupancy for 3D Detection

Joint training of 3D occupancy and 3D detection


在nuScenes验证集上报告的结果表明,联合3D检测训练和3D占用有助于后面的任务

Pretrained Occupancy for 3D Detection and BEV segmentation

不同模型和不同训练数据集规模下检测器性能的比较。

Different pretraining tasks for BEV segmentation,占用任务可以帮助BEV分段任务实现更高的IoU。

Occupancy for Planning

Planning results with different scene representations.

占位表示有助于规划任务在所有时间间隔内实现更低的碰撞率和更准确的L2距离。

Visualization of planning,蓝线为规划轨迹,下图分别为边界框和占用的栅格化结果。

Discussion

Model Efficiency

我们比较了不同模型在语义场景完成任务中的性能。与BEVNet和VoxelNet相比,OccNet在mIOU和IoUgeo方面的性能最好,效率高,效果好。

Irregular Object

如图7所示,用3D方框表示不规则物体(如施工车辆)或背景物体(如交通标志)是困难和不准确的。我们将3D box转换为体素,对比表9中不规则物体的3D检测和占用任务,验证占用可以更好地描述不规则物体。为了研究体素大小的影响,我们还生成了∆s = 0.25m的数据集。随着∆s从0.5m减小到0.25m, 3D box与occupancy之间的性能差距增大,因为越细的粒度越能更好地描绘不规则物体。

Dense v.s. Sparse Occupancy

与稀疏占用相比,密集占用有助于更详细地描绘背景和前景物体的完整几何形状。

直观上看,密集占用更有利于3D感知和运动规划,因为信息输入更丰富。我们验证了在密集占用上预训练的模型更有利于下游的3D Detection任务。

Conclusion

We dive into the potential of the 3D occupancy as scene representation and propose a general framework OccNet to evaluate the idea. The experiments on various downstream tasks validate the effectiveness of our method. The OpenOcc benchmark with dense and high-quality labels is also provided for community.

Limitations and future work.

Currently, the annotation is still based on the well-established dataset. Utilizing selfsupervised learning to further reduce the human-annotation cost is a valuable direction. We hope occupancy framework can be the foundation model of autonomous driving.

本文工作内容和技巧多而复杂,要多研读代码,收获会更大。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第 383 场 LeetCode 周赛题解

A 边界上的蚂蚁 模拟 class Solution { public:int returnToBoundaryCount(vector<int> &nums) {int s 0;int res 0;for (auto x: nums) {s x;if (s 0)res;}return res;} };B 将单词恢复初始状态所需的最短时间 I 枚举&#xff1a;若经过 i i i 秒后 w o r d w…

ubuntu22.04安装部署03: 设置root密码

一、前言 ubuntu22.04 安装完成以后&#xff0c;默认root用户是没有设置密码的&#xff0c;需要手动设置。具体的设置过程如下文内容所示&#xff1a; 相关文件&#xff1a; 《ubuntu22.04装部署01&#xff1a;禁用内核更新》 《ubuntu22.04装部署02&#xff1a;禁用显卡更…

【语音合成】中文-多情感领域-16k-多发音人

模型介绍 语音合成-中文-多情感领域-16k-多发音人 框架描述 拼接法和参数法是两种Text-To-Speech(TTS)技术路线。近年来参数TTS系统获得了广泛的应用&#xff0c;故此处仅涉及参数法。 参数TTS系统可分为两大模块&#xff1a;前端和后端。 前端包含文本正则、分词、多音字预…

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测&#x…

React+Antd实现表格自动向上滚动

1、效果 2、环境 1、react18 2、antd 4 3、代码实现 原理&#xff1a;创建一个定时器&#xff0c;修改表格ant-table-body的scrollTop属性实现滚动&#xff0c;监听表层的元素div的鼠标移入和移出实现实现鼠标进入元素滚动暂停&#xff0c;移出元素的时候表格滚动继续。 一…

Spring基础 - Spring简单例子引入Spring要点

Spring基础 - Spring简单例子引入Spring要点 设计一个Spring的Hello World 设计一个查询用户的案例的两个需求&#xff0c;来看Spring框架帮我们简化了什么开发工作 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…

vue3 之 商城项目—登陆

整体认识 登陆页面的主要功能就是表单校验和登陆登出业务 路由配置 模版 <script setup></script><template><div><header class"login-header"><div class"container m-top-20"><h1 class"logo"&g…

第1节、电路连接【51单片机+L298N步进电机系列】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍如何搭建一个51单片机L298N步进电机控制电路&#xff0c;所用材料均为常见的模块&#xff0c;简单高效的方式搭建起硬件环境。 一、硬件清单 ①51单片机模块 ②恒流模块 ③开关电源 ④L298N模…

2024-02-08 Unity 编辑器开发之编辑器拓展1 —— 自定义菜单栏与窗口

文章目录 1 特殊文件夹 Editor2 在 Unity 菜单栏中添加自定义页签3 在 Hierarchy 窗口中添加自定义页签4 在 Project 窗口中添加自定义页签5 在菜单栏的 Component 菜单添加脚本6 在 Inspector 为脚本右键添加菜单7 加入快捷键8 小结 1 特殊文件夹 Editor ​ Editor 文件夹是 …

MYSQL笔记:约束条件

MYSQL笔记&#xff1a;约束条件 主键约束 不能为空&#xff0c;值必须是不同的&#xff08;唯一性&#xff09; 一个表只能修饰一个主键 PRIMARY KEY自增约束 AUTO_INCREMENT唯一键约束 可以为空 unique非空约束 not null 默认值约束 default 外键约束 foreign key …

代码随想录|Day 14

Day 14 新年将至 一、理论学习 BFS 的使用场景总结&#xff1a;层序遍历、最短路径问题(https://leetcode.cn/problems/binary-tree-level-order-traversal/solutions/244853/bfs-de-shi-yong-chang-jing-zong-jie-ceng-xu-bian-l/) BFS 的应用一&#xff1a;层序遍历 BFS …

详述FlinkSql Join操作

FlinkSql 的 Join Flink 官网将其分为了 Joins 和 Window Joins两个大类&#xff0c;其中里面又分了很多 Join 方式 参考文档&#xff1a; Joins | Apache Flink Window JOIN | Apache Flink Joins 官网介绍共有6种方式&#xff1a; Regular Join&#xff1a;流与流的 Joi…

开发JSP应用程序

开发JSP应用程序 问题陈述 TecknoSoft Pvt Ltd.公司的首席技术官(CTO)John Barrett将创建一个应用程序的任务委托给了开发团队,该应用程序应在客户访问其账户详细信息前验证其客户ID和密码。客户ID应是数字形式。John希望如果所输入的客户ID或密码不正确,应向客户显示错误…

Qt可视化大屏布局

科技大屏现在非常流行&#xff0c;这里分享一下某个项目的大屏布局&#xff08;忘了源码是哪个博主的了&#xff09; 展示 这个界面整体是垂直布局&#xff0c;分为两个部分&#xff0c;标题是一个部分&#xff0c;然后下面的整体是一个layout布局&#xff0c;为另外一部分。 l…

【C语言】深入理解指针

目录 1.字符指针 2.指针数组 3.数组指针 4.数组传参与指针传参 一维数组传参 二维数组传参 一级指针传参 二级指针传参 5.函数指针 6.函数指针数组 7.指向函数指针数组的指针&#xff08;了解即可&#xff09; 8.回调函数 回调函数的应用&#xff1a;库函数qsort …

基于ESP8266 开发板(MCU)遥控小车

遥控小车 ​ 遥控界面 ​ 【项目源码】 第一版ESP8266 https://github.com/liyinchigithub/esp8266_car_webServerhttps://github.com/liyinchigithub/esp8266_car_webServer 第二版ESP32 GitHub - liyinchigithub/esp32-wroom-car: 嵌入式单片机 ESP32 Arduino 遥控小车&a…

贵金属交易包括哪些?香港有哪些贵金属交易平台?

随着金融市场的不断发展&#xff0c;贵金属交易作为一种投资方式&#xff0c;越来越受到投资者的关注。贵金属交易不仅具有投资价值&#xff0c;还能够为投资者提供规避风险和保值的工具。本文将介绍贵金属交易的种类和香港的贵金属交易平台。 一、贵金属交易的种类 贵金属交…

红队打靶练习:PHOTOGRAPHER: 1

目录 信息收集 1、arp 2、nmap 3、nikto 目录扫描 1、gobuster 2、dirsearch WEB 信息收集 enum4linux smbclient 8000端口 CMS利用 信息收集 文件上传漏洞利用 提权 信息收集 get user.txt get flag 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# a…

小埋的解密游戏的题解

目录 原题描述&#xff1a; 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 提示 主要思路&#xff1a; 代码实现code&#xff1a; 原题描述&#xff1a; 题目描述 小埋最近在玩一个解密游戏&#xff0c;这个游戏…

秒杀相关问题解决

秒杀 超卖问题 如下,我们先来复现问题,抢购秒杀券的代码逻辑也是很简单, 先判断优惠券是否开始了,是的化,判断库存是否充足,如果是的化,扣减库存,最后创建订单 如下是代码 Override Transactional public Result seckillVoucher(Long voucherId) {//1.查询优惠券SeckillVo…