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

3D目标检测(一)—— 基于Point-Based方法的PointNet系列

3D目标检测(一)—— PointNet,PointNet++,PointNeXt, PointMLP

目录

3D目标检测(一)—— PointNet,PointNet++,PointNeXt, PointMLP

前言

零、网络使用算法

FPS最远点采样法

Ball-query球查询

一、PointNet

二、PointNet++

MSG-PointNet++

三、PointNeXt

四、PointMLP

总结

前言

在3D目标检测中,可以大致分为基于图像、基于点云和基于多模态融合的三种方法。而基于点云处理的3D目标检测中,如何有效处理点云数据信息是其中的重点。常见的处理点云的方法有两种,一种为将无序的点云处理成有规则的体素或者柱体(voxel or pillar)等来进行处理,被称为Voxel-Based,另一种则是直接在原始点云上进行操作的Point-Based方法。

本文主要介绍如何Point-Based中的经典网络PointNet,PointNet++和其发展PointNeXt、PointMLP。


零、网络使用算法

有许多对于点云预处理的算法,如FPS,ball-query等,在这里介绍一下,方便大家对于后续网络结构的了解和认识。

FPS最远点采样法

对于点云来说,每次采集的信息少则是上万个点,多则则是几十万个点,如果把这些点都塞到网络结构中进行处理,毫无疑问对于显存等的消耗都是十分巨大的,故如何对这些点进行采样降低点云的数量的同时,最大程度保留其中蕴含的特征是研究之一。

而FPS最远点采样,则是其中比较常用的方法之一,其核心思想则是使采样后的点集中的点互相相距最远,从欧式空间来看,这种方法最大限度的使点在空间中较为分散的分布,概率上能最大保留空间中点的特征。这里引用知乎文章FPS理解,来介绍其主要步骤。

  1. 随机选取点P0为起始点,获得初始集合S={P0},并定义初始距离矩阵D,其中D[i]记录集合中每个点Pi到集合S中点的最远距离。
  2. 计算点云中的点到P0的距离,更新距离矩阵D[i],选择D[i]最大值对应的点P1加入集合,S={P0,P1}
  3. 循环第二个步骤,直至S中集合的点数达到设定值

代码如下

def farthest_point_sample(xyz, npoint):"""Input:xyz: pointcloud data, [B, N, 3]npoint: number of samplesReturn:centroids: sampled pointcloud index, [B, npoint]"""device = xyz.deviceB, N, C = xyz.shapecentroids = torch.zeros(B, npoint, dtype=torch.long).to(device)distance = torch.ones(B, N).to(device) * 1e10farthest = torch.randint(0, N, (B,), dtype=torch.long).to(device)batch_indices = torch.arange(B, dtype=torch.long).to(device)for i in range(npoint):centroids[:, i] = farthestcentroid = xyz[batch_indices, farthest, :].view(B, 1, 3)dist = torch.sum((xyz - centroid) ** 2, -1)mask = dist < distancedistance[mask] = dist[mask]farthest = torch.max(distance, -1)[1]return centroids

其具体效果大致如下

而FPS算法不仅可以使用欧式空间来进行采样,同样也可以嵌入网络中,在特征空间利用特征向量来计算出特征距离矩阵,利用此来进行FPS。

Ball-query球查询

点云数据除了无序性的特征外,还存在着邻域相关性的特征,即点与点之间不是孤立的关系,相邻的点云构成的具有特征的点云集,故如何有效概括区域点云,则是ball-query要干的事。

ball-query的思想十分简单,即设定球心,将球心半径内的和球心最近的点聚类起来作为一个领域。而在PointNet系列中,其球心的一般是由FPS算法采样后的点确立的,故这两个算法经常同时使用,统称为QueryAndGroup

def query_ball_point(radius, nsample, xyz, new_xyz):"""Input:radius: local region radiusnsample: max sample number in local regionxyz: all points, [B, N, 3]new_xyz: query points, [B, S, 3],一般为FPS采样确定的点Return:group_idx: grouped points index, [B, S, nsample]"""device = xyz.deviceB, N, C = xyz.shape_, S, _ = new_xyz.shapegroup_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1])sqrdists = square_distance(new_xyz, xyz)group_idx[sqrdists > radius ** 2] = Ngroup_idx = group_idx.sort(dim=-1)[0][:, :, :nsample]group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample])mask = group_idx == Ngroup_idx[mask] = group_first[mask]return group_idx

一、PointNet

PointNet是直接处理点云的开山之作,我们假设如果没有现在这么多处理点云的方法,在我们拿到点云数据时,应该如何考虑通过神经网络进行处理。

通过分析,我们可以得出点云数据有着如下几大特点。

  • 无序性:点云中的点不像图像中的像素一样,具有严格的顺序,即如果通过一个数据存储点云,随机的打乱数组的顺序,并不会有任何影响。
  • 点与点之间存在联系:虽然点之间没有顺序的概念,但空间中相邻的点构成的领域具有联系性,能够表征整体的特征,每个点不是孤立的。
  • 变换不变性:这点和图像是类似的,即不管如何旋转和翻转部分的点,其代表的整体还是同样的。

根据上述特点,当拿到一个(B,N,C)维度的点云数据时,应该利用什么神经网络的什么结构能处理呢。其实最直观,最简单的方法则是利用汇聚层来进行处理,不管是max pooling还是avg pooling,在图像领域里的作用都是将处理好的特征汇聚起来,集合成更有全局性的特点,且根据max pooling和avg pooling的数学表达max()和mean()操作,均满足点云中的无序性特征要求。

                                         Max(f_{i}, f_{i+1}, f_{i+2}) = Max(f_{i}, f_{i+2}, f_{i+1})

                                        Mean(f_{i}, f_{i+1}, f_{i+2}) = Mean(f_{i}, f_{i+2}, f_{i+1})

但对于一个sample的点云(N,3)来,其初始只有XYZ三个坐标维度的特征,直接进行汇聚操作,得到的特征都是十分浅层的特征,没法利用来做什么后续的操作。那根据图像领域利用卷积来获得高维特征,最后进行汇聚的思路,点云框架也可以这么设计,而由于点云是二维的特征,没法利用卷积,则使用全连接层(也可以认为是一维卷积)的方法,来对点云进行升维,在PointNet中,则将初始点云由(N,3)经过MLP一步步从3维升维至64维,最后为1024维度,在升维后,通过max pooling操作将(N,1024)的特征,汇聚成1024的特征向量,完成对点云的特征处理。

而在点云送入神经网络前,由于每个物体采集到点云的数量不一样,为了方便处理,会利用FPS算法或者就随机采样将点云采样到相同的数量来进行处理。

至于PointNet中还有input transform模块和feature transform模块,则是考虑到变换不变性来设计的,但在后续的论文中,被认为其对整体的效果并不大,这里就不讲述了。

所以PointNet作为开山之作,其提供的最重要的思想就是,对于无序的点云,可以沿用图像领域的经验,对点云先升维,然后利用max pooling或者avg pooling等汇聚操作来处理特征。

二、PointNet++

根据上述对PointNet的讲解,可以知道PointNet只是提出了一种直接处理点云的整体的框架,但其在处理时,并没有考虑到点云的第二个特征,即点与点之间的局部特征特点,故PointNet++则是基于此在PointNet的基础上对局部区域进行改进的框架。

       

 PointNet++的设计思路也很直观,既然PointNet是缺少局部特征处理的,而在图像领域中卷积的作用就是把一个个局部的特征提取出来生成高维的特征,可在点云里无法利用卷积核这种方便的操作,于是作者就引入了sampling&grouping的操作,被称为set abstraction(SA)层来模拟这种卷积的操作。

像图示如此,作者对原始的N个点进行FPS采样得到N1个点,并将采样后的N1个点作为中心点,使用ball-query算法来形成K个领域,而后将每个领域都单独的经过PointNet层,即上述PointNet框架中的mlp升维+汇聚操作,这样采样后的N1个点就可以认为汇聚了其对应区域中点的特征。经过上述操作,原本N个带有d+C特征的点,被采样升维为N1个带有d+C1个特征点,其中d一般为原始坐标特征xyz。至此,SA层的设计思路一直被沿用,可以认为就是当初图像领域中conv+bn+relu层的点云版本。

                                                   g_{i}=\mathcal{A}\left(\Phi\left(f_{i, j}\right) \mid j=1, \cdots, K\right)

可以用上述的数学表达式来表示PointNet++的网络结构,其中\mathcal{A}(\cdot )表示特征聚合操作(在PointNet++为max_pooling),\Phi(\cdot )表示局部的特征提取器(在PointNet++为MLP),f_{i, j}则表示第i个采样点的第j个领域的特征。

PointNet++可以说奠定了点云处理的框架都依此数学表达式来构建,后面的更多工作都在\Phi(\cdot )上做许多文章,如引入attention机制或者用CNN,GNN等方法。

MSG-PointNet++

                                                      

作者另外还考虑到了点云在收集时,不同的区域中点云的稀疏性可能会差别很大,有可能某个角落的点云数量只有少数几个,那么这种情况就会导致grouping后的点云区域中只有少量的点云,而少量的点云无法有效的概括局部特征。解决这个问题,最简单的想法就是加大ball-query中球的半径,那么可以保证每个领域点的数量都不会太少,但领域的半径过大,就会导致网络对于精细局部的建模不够。综合上述因素,作者提出multi-scale grouping(MSG)的思路,即在每层grouping的时候,不仅使用一个半径来进行grouping,而使用多个半径来进行grouping,把这几个半径grouping的结果邻域送入PointNet后最后拼接起来形成最后的新特征。

PointNet++的核心思想就是考虑在PointNet的基础上,利用邻域的概念,对局部特征进行了有效的建模,提出的SA层,也成为现在直接处理点云框架中最常用的backbone module。

三、PointNeXt

个人认为PointNeXt本身是一篇偏向于工程性的文章,但其提出了如何做大PointNet系列的一个思路。最直观的做大PointNet获得高性能的方法,就是加多几个SA层,并把维度升的更高,以获得更大感受野和更深层的特征,但PointNeXt通过实验证明,单纯的这么做,对网络没有太大的提升,反而会影响网络的性能,作者给出的解释在于过深的网络结构会导致梯度消失和过拟合现象的产生,于是作者仿照Resnet的成功,也在PointNet++的基础上,在网络中引入了残差结构,来构造更深更大的网络。

网络的处理module,在原来SA层的基础上,加入了InvResMLP残差结构,InvResMLP模块中,把原先的SA层中的3层MLP,划分为作用在grouping后的MLP,来提取邻域特征,和后两层MLP来提取点特征以此增强网络的性能。在PointNeXt中用这种SA+InvResMLP的结构来当成基础处理模块。

PointNeXt其他贡献在于其做了大量的实验,去说明调参的重要性(doge),这里就不介绍了。而PointNeXt的主要思想则是通过残差结构的设计来做大模型,以此提升模型的整体性能,也给网络的设计提供了一种方向。

四、PointMLP

PointMLP和PointNeXt的整体方向都是希望通过残差结构的MLP来提升原有PointNet架构的性能,并且也同时考虑了grouping前的局部区域特征,可以认为是同一方向但两种设计思路的方法。

       

PointMLP用数学表达的话,可以以下面的公式来呈现

                                         g_{i}=\Phi_{\text {pos }}\left(\mathcal{A}\left(\Phi_{\text {pre }}\left(f_{i, j}\right), \mid j=1, \cdots, K\right)\right)

可以看到其相对PointNet++而言,其多了\Phi_{\text {pos }}来学习聚合后的深层信息,其实PointNeXt中的InvResMLP可以认为是\Phi_{\text {pos }}的一种,所以PointNext和PointMLP其实在数学表达上是一样的。而其中的差别在于其中MLP层的设计,PointMLP中在MLP层之间还加入了BN RELU的设计(感觉上没什么创新,本质上都是MLP层+pooling层的组合罢了)

另外文章还指出了如果单纯堆叠这样的处理结构,网络效果并不会变好,反而变差,作者分析是由于区域的局部稀疏和不规则导致的(我个人感觉是网络设计问题,因为PointNeXt并没有考虑这个问题,但也work),与是设计了一个类似归一化的映射模块,在点云输入到网络前就需要经过此模块进行处理,来解决区域稀疏性的问题。

         

                 \left\{f_{i, j}\right\}=\alpha \odot \frac{\left\{f_{i, j}\right\}-f_{i}}{\sigma+\epsilon}+\beta, \quad \sigma=\sqrt{\frac{1}{k \times n \times d} \sum_{i=1}^{n} \sum_{j=1}^{k}\left(f_{i, j}-f_{i}\right)^{2}}

 其中f_{i,j}表示f_{i}区域内的第j个点,其需要通过上述公式进行区域归一化映射,k表示第f_{i}附近拥有k个领域点,d表示点代表的维度信息,n则是总的点数。这个模块的功能,作者并没有进行过多的消融实验,如加入这个模块后,其他网络的性能是否有提升等,所以其泛用性还有待验证。

总结

本文介绍了3D目标检测中Point-Based方法中的Backbone处理方法,介绍常用backbone PointNet,PointNet++及其发展PointNeXt和PointMLP。这些种类的方法其实都是基于MLP和pooling层的结构,除此之外,也有许多方法如PointCNN尝试使用CNN来处理点云,和DGCNN尝试使用图网络来处理点云等。

相关文章:

3D目标检测(一)—— 基于Point-Based方法的PointNet系列

3D目标检测&#xff08;一&#xff09;—— PointNet&#xff0c;PointNet&#xff0c;PointNeXt&#xff0c; PointMLP 目录 3D目标检测&#xff08;一&#xff09;—— PointNet&#xff0c;PointNet&#xff0c;PointNeXt&#xff0c; PointMLP 前言 零、网络使用算法 …...

《设计模式》策略模式

策略模式 前言 先了解一下设计模式的几种类似&#xff1a; 行为型设计模式&#xff08;Behavioral Design Pattern&#xff09;是指一组设计模式&#xff0c;它们关注的是对象之间的通信和协作。行为型设计模式描述了对象之间的职责分配和算法的封装&#xff0c;以及如何在运…...

【离散数学】1. 数理逻辑

1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 离散数学&#xff1a;研究离散量结构及相互关系的学科 数理逻辑集合论代数系统图论 逻辑&#xff1a;研究推理的科学 数学方法&#xff1a;引进一套符号系统的方法 数理逻辑是用数学方法研究形式逻辑的科学&#xff0c;即使用符号化…...

Java8新特性学习

Java8新特性学习为啥使用Lambda表达式Lambda表达式的基础语法无参无返回有参无返回一个参数多参单个语句体类型推断四大内置核心函数式接口其他接口方法引用与构造器引用Stream简介什么是StreamStream操作步骤创建Stream中间操作终止操作(终端操作&#xff09;归约与收集并行流…...

SPARK outputDeterministicLevel的作用--任务全部重试或者部分重试

背景 目前spark的repartition()方法是随机分配数据到下游&#xff0c;这会导致一个问题&#xff0c;有时候如果我们用repartition方法的时候&#xff0c;如果任务发生了重试&#xff0c;就有可能导致任务的数据不准确&#xff0c;那这个时候改怎么解决这个问题呢&#xff1f; …...

图数据库中的 OLTP 与 OLAP 融合实践

在一些图计算的场景下&#xff0c;我们会遇到同时需要处理 OLTP 和 OLAP 的问题。而本文就给了一个 OLTP 与 OLAP 融合实践的指导思路&#xff0c;希望给你带来一点启发。 Dag Controller 介绍 Dag Controller 是 NebulaGraph 企业版的图系统&#xff0c;经过反复测试无误后已…...

Shader Graph简介

使用着色器&#xff08;shader&#xff09;和材质&#xff08;material&#xff09;&#xff0c;我们能够创造出非常多有趣的效果。除了Unity自带的shader外&#xff0c;还可以自己编写shader或使用其他人所编写的shader。编写shader通常需要我们了解shader编程语言的语法和相关…...

kubectl

目录 一、陈述式资源管理方法 二、基本信息查看 2.1 基本信息查看格式 2.2 查看master节点组件状态 2.3 查看命名空间 2.4 创建/查看命名空间 2.5 删除&#xff08;重启&#xff09;命名空间/pod 2.6 查看资源的详细信息 2.7 创建副本控制器来启动Pod 2.8 查看指定命…...

实验室设计SICOLAB第三方检测中心实验室设计

第三方检测中心实验室怎么设计&#xff1f;详细设计内容有哪些&#xff1f;功能区域有哪些&#xff1f;仪器有哪些&#xff1f;要多少面积&#xff1f;第三方检测中心实验室是一种独立的实验室&#xff0c;为客户提供各种测试和分析服务。以下是一个第三方检测中心实验室的详细…...

GPS经纬度转距离

function [pN, pE] distance_gps(lon1, lon2, lat1, lat2)d2r pi/180; % deg转radR 6371000.0; % 地球半径pN (lat2 - lat1) * d2r * R;pE (lon2 - lon1) * d2r * R * cos(lat2 * d2r); end...

7-周赛333总结

7-周赛333总结 还是只过了前两题&#xff0c;第三题又写了好久好久&#xff0c;然后也不知道错在了哪里&#xff0c;只过了部分题解&#xff0c;也许是思考不全面吧。下次也许先做第四题更好…第四题今天花了点时间 做出来了个大概 开心 :happy: 合并两个二维数组 - 求和法【…...

电子招标采购系统源码—互联网+招标采购

智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#xff0c;可…...

SQL注入和XSS攻击

1、SQL注入 所谓SQL注入&#xff0c;就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令。 我们永远不要信任用户的输入&#xff0c;我们必须认定用户输入的数据都是不安全的&#xff0c;我们都需要对用户输…...

js Map的使用

前言&#xff1a;Map数据集可以理解为加强版的对象 一、for...of 1、对象不能用于for of&#xff0c;因其没有部署Iterator接口&#xff1b;其他数据集如&#xff1a;数组、Map、Set、Iterator对象等都可以用for...of2、使用for...of的优势&#xff1a; for of的循环体中可以…...

企业应该怎么管理香港服务器?

做好服务器管理&#xff0c;往往能为站长避免很多麻烦。用户租用服务器&#xff0c;除了希望它快速而安全&#xff0c;还有就是如何才能得到优质及时的售后和指导建议了。服务器供应商只提供服务器管理的基础服务&#xff0c;负责提供硬件、带宽和电力等服务&#xff0c;服务器…...

软件设计(十四)-UML建模(上)

软件设计&#xff08;十三&#xff09;-原码、反码、补码、移码https://blog.csdn.net/ke1ying/article/details/129115844?spm1001.2014.3001.5501 UML建模包含&#xff1a;用例图&#xff0c;类图与对象图&#xff0c;顺序图&#xff0c;活动图&#xff0c;状态图&#xff…...

本地主机搭建服务器后如何让外网访问?快解析内网端口映射

本地主机搭建应用、部署服务器后&#xff0c;在局域网内是可以直接通过计算机内网IP网络地址进行连接访问的&#xff0c;但在外网电脑和设备如何访问呢&#xff1f;由于内网环境下&#xff0c;无法提供公网IP使用&#xff0c;外网访问内网就需要一个内外网转换的介质。这里介绍…...

Flink-Table API 和 SQL(基本API、流处理的表、时间属性和窗口、聚合查询、联结查询、函数、SQL客户端、连接到外部系统)

文章目录Table API 和 SQL快速上手基本 API程序架构创建表环境创建表表的查询输出表表和流的转换流处理中的表动态表和持续查询将流转换成动态表原理用 SQL 持续查询-更新查询&追加查询将动态表转换为流(Append-only、Retract、Upsert)时间属性和窗口事件时间处理时间窗口&…...

C++入门:数据抽象

数据抽象是指&#xff0c;只向外界提供关键信息&#xff0c;并隐藏其后台的实现细节&#xff0c;即只表现必要的信息而不呈现细节。数据抽象是一种依赖于接口和实现分离的编程&#xff08;设计&#xff09;技术。让我们举一个现实生活中的真实例子&#xff0c;比如一台电视机&a…...

WRF进阶:使用IO选项控制WRF变量输出/WRF指定变量输出添加/删除

Registry文件 WRF模式在运行求解时&#xff0c;会涉及到大量的数据变量运算&#xff0c;而这些数据变量的管理、规定、控制则需要依赖于WRF的Registry文件&#xff0c;简单来说&#xff0c;它可以理解为管理WRF数据结构的“数据字典”&#xff08;"Active data-dictionar…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...