[论文阅读]CT3D——逐通道transformer改进3D目标检测

CT3D

论文网址:CT3D
论文代码:CT3D
CT3D

简读论文

本篇论文提出了一个新的两阶段3D目标检测框架CT3D,主要的创新点和方法总结如下:

  1. 创新点:

(1) 提出了一种通道注意力解码模块,可以进行全局和局部通道聚合,生成更有效的解码权重。

(2) 提出了建议到点嵌入模块,可以有效地将建议信息编码到每个原始点中。

(3) 整个框架端到端,可以非常方便的和任何高质量的建议生成网络结合,实现强大的建议优化。

  1. 方法:

(1) 利用SECOND作为默认的建议生成网络,由于其生成的建议质量很高。

(2) 对每个建议,采样256个原始点,计算这些点与建议框8个角点的相对坐标作为点特征。

(3) 通过多头自注意力层refine点特征,捕捉点之间的全局上下文信息。

(4) 提出通道注意力解码模块,先重复查询和键的矩阵乘法,然后点积重加权到键上,生成解码权重。既保留了全局信息,也强调了通道级别的局部信息。

(5) 最终解码后的全局特征,馈入两个全连接层分别预测 confidence 和 box regression。

(6) 使用IoU误差、分类误差和回归损失进行端到端训练。

本方法在KITTI和Waymo数据集上验证了其有效性,明显超过之前的状态矩阵方法。

摘要

尽管基于点云的3D目标检测近年来取得了快速发展,但缺乏灵活和高性能的提案细化仍然是现有最先进的两阶段检测器的一大障碍。之前关于完善3D提案的工作依赖于人工设计的组件,例如关键点采样、集合抽象和多尺度特征融合来生成强大的3D目标表示。然而,这样的方法捕获点之间丰富的上下文依赖关系的能力有限。本文利用高质量的区域提议网络和一个Transformer架构,构成两阶段的3D目标检测架构(CT3D)。CT3D同时执行提案感知嵌入和聚合每个提议通道上下文点的功能。具体来说,CT3D使用使用提案的关键点进行空间上下文建模,并在编码模块中学习注意力传播,将提案映射到点嵌入。接下来,一个新的通道解码模块通过通道重新加权来丰富查询键交互,以有效的合并多级上下文,这有助于更准确的对象预测。大量实验表明,CT3D方法具有良好的性能和可扩展性。CT3D在KITTI测试3D检测基准中的中型车类别中达到了81.77%的ap,优于最先进的3D检测器。

引言

从点云数据中检测三维物体被认为是未来自动驾驶汽车(AV)不可或缺的一部分。与已经成熟运用的二维检测算法不用,其成功主要是由于图像像素的规则结构,LiDAR点云通常是稀疏的,无序的和不均匀分布的。这使得类似CNN的操作不太适合直接处理非结构化的点云数据。为了应对这些挑战,许多方法采用点云体素化或自定义离散化。几种方法[Multi-view convolutional neural networks for 3d shape recognition-2015,Vehicle detection from 3d lidar using fully convolutional network-2016]将点云投影到鸟瞰图(BEV)表示并应用标准的2D卷积。但是,它将不可避免的牺牲某些几何细节,这些细节对于生成准确的定位至关重要。其他方法[Multi-view 3d object detection network for autonomous driving-2017,Second-2018]将点云绘制成3D体素网格并使用常规3D CNN在网格空间中执行计算,但这类方法存在与网格更精细相关的计算瓶颈。点云检测任务的重大突破是由于点云表示的有效深度架构,例如volumetric convolution[Second] 和 permutation invariant convolution[Pointnet]。
最近,大多数用于3D目标检测的最先进的方法采用由3D区域提议生成和提议特征细化组成的两阶段框架。请注意,最流行的区域提议网络(RPN)骨干在KITTI 3D检测基准上实现了超过95%的召回率,而这种方法仅实现了78%的平均精度(AP)。造成这种差距的原因是,在遮挡或长距离的情况下,难以对目标进行编码并从3D提案中提取鲁棒特征。因此,如何在提议的特征细化阶段,有效的建模点之间的几何关系,并利用准确的位置信息对实现良好性能是至关重要的。一个重要的模型家族是PointNet及其变体,他们使用灵活的感受野通过局部区域和置换不变网络来聚合特征。然而,这些方法涉及大量的手工设计,例如,相邻球半径和网格大小。另一类模型是基于体素的方法,它使用3D卷积收集来自相邻体素的信息。但由于体素量化和对超参数的敏感性,这些方法的性能并不是最优的。后来的研究进一步应用point-voxel混合策略来捕获多尺度特征,同时保留细粒度定位,但与特定的RPN架构密切相关。
本文做了两个主要贡献。首先,提出了一个新的端到端的两阶段的3D目标检测框架,称为CT3D。受最近基于Transformer的2D检测方法DETR的启发,该方法使用CNN主干提取特征,并使用encoder-decoder Transformer增强ROI区域特征,本文设计了CT3D,以在第一阶段生成3D边界框,然后通过在解码器中结合新颖的Transformer架构和通道重新加权机制来学习每个提案表示。所提出的框架在准确性和效率方面表现出非常强的性能,因为可以方便地与任何高质量的RPN骨干相结合。
第二个贡献是自定义Transformer,它比传统的而基于point/voxel的特征聚合机制提供了几个好处,尽管逐点卷积或体素卷积具有局部和全局上下文建模的能力,但在增强感受野或参数优化等方面仍存在一些限制。此外,基于点云的3D目标检测器还必须处理具有挑战性的丢失/噪声检测,如遮挡和与几个点的距离模式。最近,Transformer中的自注意力已经成为捕获远程交互的基本构件,因此在获取背景信息以丰富远处物体或增加假阴性的置信度方面是一个自然而然地选择。在这一思想地启发下,本文初步提出了一种提案到点地嵌入方法,以便在编码器模块中对RPN提案信息进行有效编码。此外,考虑到编码点的全局和局部通道特性,本文采用了通道重新加权的方法来增强标准Tranformer解码器。其目的是扩大特征解码空间,在这里可以计算关键字嵌入的每个通道维度上的注意力分布,从而增强查询关键字交互的表现力。

相关工作

基于点云表示的三维目标检测 : 最近,在学习原始LiDAR点云的有效表示方面取得了很大进展。一个值得注意的部分是PointNet系列,它采用排列不变操作来聚合点特征。F-PointNet为每个3D平截头体内的点云生成区域级特征。PointRCNN使用PointNet++来分割前景3D点,并使用分割功能完善提议。STD通过将稀疏点特征转换为密集体素表示,进一步扩展了提议的细化。此外,3DSSD通过基于特征距离的新采样策略改进了基于点的方法。然而,类似PointNet的架构仍然存在有限的能力来捕获LiDAR数据的局部结构。另一类方法旨在将非结构化点云体素化为常规的2D/3D网格,在该网格上可以很容易的应用传统的CNN。先驱的工作将点云编码为2D鸟瞰图特征图,以生成高度准确的3D候选框,激发了许多基于鸟瞰图表示的有效方法。VoxelNet将这些点转换为一个紧凑的特征表示。Second引入了3D稀疏卷积,用于高效的3D体素处理。这些基于体素的方法仍然集中在细分的体素,而不是自适应建模的局部几何结构。此外,已经提出了各种基于点-体素的方法用于多尺度特征聚合。SA-SSD提出了一种基于3D体素CNN的辅助网络。PV-RCNN及其变体VoelRCNN采用3D体素CNN作为RPN来生成高质量的提议,然后利用PointNet来聚合网格周围的体素特征。然而,这些混合方法需要大量手工制作的功能设计。
基于Transformer的目标检测 : 由于Transformer在计算机视觉领域的许多成功,最近发展了一种新的物体检测范例。由于Transformer模型在学习局部上下文感知表示方面非常有效,DETR将检测视为集合预测问题,并采用具有并行解码的Transformer来检测2D图像中的目标。DETR的一个变体进一步开发了一个可变性的注意力模块,以采用跨尺度聚合。对于点云,最近的方法[Pct-2020,Point transformer-2020]也探索了使用self-attention进行分类和分割任务。

CT3D for 3D Object Detection

鉴于广泛使用的 RPN 主干(如 3D 体素 CNN [33])生成的提案,当前最先进的提案细化方法专注于细化由卷积层提取的中间多阶段体素特征,遇到困难包括额外的超参数优化和设计通用模型。本文相信具有精确位置信息的原始点足以完善检测建议。考虑到这一观点,本文通过在 RPN 网络之上部署精心设计的 Transformer 来直接利用原始点云来构建 CT3D 框架。具体来说,整个 CT3D 检测框架由三部分组成,即用于生成提案的 RPN 主干、用于提案特征细化的通道级 Transformer 和用于对象预测的检测头。
CT3D

RPN for 3D Proposal Generation

从具有 3 维坐标和 C 维点特征的点云 P 开始,RPN 生成的预测 3D 边界框由中心坐标 pc = [xc, yc, zc]、长度 lc、宽度 wc、高度 hc 和方向θc。本文采用 3D 体素 CNN SECOND 作为默认 RPN,因为它具有高效率和准确性。请注意,任何高质量的 RPN 都应该可以在本文的框架中轻松替换,并且可以通过端到端方式进行训练。

Proposal-to-point Encoding Module

为了完善生成的 RPN 提案,采用了两步策略。具体来说,第一个提议到点嵌入步骤将提案映射到点特征,然后第二个自注意力编码步骤是通过对相应提案内点之间的相对关系进行建模来细化点特征。
Proposal-to-point Embedding. : 考虑到 RPN 生成的提案,根据提案在点云中划定了按比例缩放的 RoI 区域。其目的是通过尽可能多地包裹所有对象点来补偿提案与相应的地面实况框之间的偏差。具体来说,缩放后的 RoI 区域是一个高度无限、半径为 的圆柱体,其中 α 是超参数,l、w 表示区域的长度和宽度。分别提出建议。此后,取出缩放RoI内随机采样的N=256个点(N={p1,…,pN})以进行进一步处理。
首先,我们计算每个采样点与proposal中心点之间的相对坐标,以统一输入距离特征,表示为 Δpc i = pi − pc, ∀pi ∈ N。一个简单的想法是直接连接proposal将信息放入每个点特征中,即 [Δpc i , lc, wc, hc, θc, fr i ],其中 fr i 是原始点特征,例如反射。然而,提案的大小方向表示仅产生适度的性能,因为 Transformer 编码器根据上述几何信息重新定向的效果可能较差。
在这里插入图片描述
值得注意的是,关键点通常在检测任务中提供更明确的几何属性,我们提出了一种新颖的关键点减法策略来计算每个点与相应提案的八个角点之间的相对坐标。计算出的相对坐标为 Δpj i = pi − pj, j = 1,…, 8,其中 pj 是第 j 个角点的坐标。请注意,lc、wc、hc 和 θc 消失,但包含在距离信息的不同维度中。通过这种方式,新生成的相对坐标 Δpj i 可以被视为提案信息的更好表示。如上图左侧所示,对于每个点pi,proposalguided点特征可以表示为:
在这里插入图片描述
其中 A(·) 是线性投影层,用于将点特征映射到高维嵌入。
Self-attention Encoding. : 然后将嵌入的点特征输入多头自注意力层,然后是具有残差结构的前馈网络(FFN),以编码丰富的上下文关系和点依赖性,以细化点特征。如上图右半部分所示,这种自注意力编码方案与原始 NLP Transformer 编码器几乎具有相同的结构,除了位置嵌入,因为它已经包含在点特征中。表示 X = [fT 1 , . 。 。 , fT N]T ∈ RN×D 作为维度为 D 的嵌入点特征,有 Q = WqX; K=WkX; V = WvX,其中 Wq,Wk,Wv ∈ RN×N 是线性投影,Q、K 和 V 是所谓的查询、键和值嵌入。然后通过多头自注意力机制处理这三个嵌入。在 H-head 注意力情况下,Q,K 和 V 进一步分为 Q = [Q1, . 。 。 ,QH],K = [K1,. 。 。 ,KH],且 V = [V1,. 。 。 ,VH],其中 Qh,Kh,Vh ∈ RN×D′ , ∀h = 1, . , H 和 D′ = D/H 。多头自注意力后的输出由下式给出:
在这里插入图片描述
其中 σ(·) 是 softmax 函数。下面,应用简单的 FFN 和残差算子,结果如下:
在这里插入图片描述
其中 Z(·) 表示加法和归一化算子,F(·) 表示具有两个线性层和一个 Relu 激活的 FFN。本文观察到,由 3 个相同的自注意力编码模块组成的堆栈非常适合本文的 CT3D 框架。

Channel-wise Decoding Module

在本小节中,设法将编码器模块中的所有点特征(即 ^X)解码为全局表示,并由 FFN 进一步处理以进行最终检测预测。与标准 Transformer 解码器不同,标准 Transformer 解码器使用自编码器-解码器注意机制转换 M 个多个查询嵌入,本文的解码器仅根据以下两个事实操作一个查询嵌入:

  • M 查询嵌入会遭受较高的内存延迟,尤其是在处理大量提案时。
  • M 个查询嵌入通常独立地转换为 M 个单词或对象,而本文的提案细化模型只需要一次预测。
    一般来说,解码器之后的最终建议表示可以被视为所有点特征的加权和,本文的关键动机是确定专用于每个点的解码权重。下面,首先分析标准解码方案,然后开发改进的解码方案以获得更有效的解码权重。
    在这里插入图片描述
    Standard Decoding. : 标准解码方案利用 D 维的可学习向量(即查询嵌入)来聚合所有通道的点特征。如图3(a)所示,每个注意力头中所有点特征的最终解码权重向量为:
    在这里插入图片描述
    其中 Kˆ h 是通过编码器输出的投影计算出的第 h 个头的关键嵌入,qˆ h 是相应的查询嵌入。请注意,向量 qˆ h ˆKT h 的每个值都可以视为各个点(即每个密钥嵌入)的全局聚合,后续的 softmax 函数根据归一化向量中的概率为每个点分配解码值。因此,解码权重向量中的值是从简单的全局聚合导出的,缺乏局部通道建模,这对于学习点云的 3D 表面结构至关重要,因为不同的通道通常在点云中表现出很强的几何关系。
    Channel-wise Re-weighting. : 为了强调关键嵌入 K^ T h 的通道信息,一个简单的解决方案是基于 K^T h 的所有通道计算点的解码权重向量。也就是说,为每个通道生成D个不同的解码权重向量,以获得D个解码值。此外,对这些D个解码值引入线性投影以形成统一的通道方式解码向量。如图 3(b) 所示,用于解码权重向量的新通道方式重新加权可以总结为:
    在这里插入图片描述
    其中 s 是将 D′ 个解码值压缩为重新加权标量的线性投影,^σ(·) 沿 N 维度计算 softmax。然而,由 ^σ(·) 计算的解码权重与每个通道相关联,因此忽略了每个点的全局聚合。因此,我们可以得出结论,标准解码方案侧重于全局聚合,而通道方式重加权方案则集中于通道方式局部聚合。为了结合它们的特点,我们提出了一种扩展的通道方式重加权方案,如下所示。
    Extended Channel-wise Re-weighting. : 具体来说,首先重复查询嵌入和键嵌入的矩阵乘积,将空间信息传播到每个通道中,然后将输出按元素与键嵌入相乘以保持通道差异。如图 3 © 所示,这种新颖的扩展通道方式重加权方案为所有点生成以下解码权重向量:
    在这里插入图片描述
    其中 ρ(·) 是重复算子,使得 R1×N → RD′×N。这样,与通道方式重加权方案相比,我们不仅可以保持全局信息,而且与标准解码方案相比,可以丰富局部和详细的通道交互。此外,与其他两种方案相比,这种扩展的通道方式重新加权仅带来 1K+(字节)的增加。结果,最终解码的提案表示可以描述如下:
    在这里插入图片描述
    其中值嵌入 ^V 是从 ^X 获得的线性投影。

Detect head and Training Targets

在前面的步骤中,输入点特征被汇总为 D 维向量 y,然后将其输入到两个 FFN 中,分别用于预测相对于输入 3D 提案的置信度和框残差。
为了输出置信度,训练目标被设置为 3D 提案与其相应的地面实况框之间的 3D IoU。给定3D提案的IoU及其对应的ground-truth框,分配置信度预测目标,如下所示:
在这里插入图片描述
其中αF和αB分别是前景和背景IoU阈值。此外,回归目标(上标 t)由提案及其相应的地面实况框(上标 g)编码,由下式给出:
在这里插入图片描述
其中在这里插入图片描述是提案框底边的对角线。

Training Losses

本文采用端到端策略来训练 CT3D。因此,总体训练损失是 RPN 损失、置信度预测损失和框回归损失的总和,如下所示:
在这里插入图片描述
这里,利用二元交叉熵损失作为预测置信度 c 来计算 IoU 引导的置信度损失:
在这里插入图片描述
此外,框回归损失采用:
在这里插入图片描述
其中 I(IoU ≥ αR) 表示只有 IoU ≥ αR 的提案才会对回归损失产生影响。

结论

本文提出了一个两级 3D 对象检测框架 CT3D,具有新颖的通道 Transformer 架构。本文的方法首先通过有效的提案到点嵌入将提案信息编码到每个原始点中,然后通过自注意力来捕获点之间的远程交互。随后,通过扩展的通道重加权方案将编码点特征转换为全局提案感知表示,该方案可以获得所有点的有效解码权重。 CT3D提供了一个灵活且高效的框架,对于点云检测任务特别有帮助。 KITTI 数据集和大规模 Waymo 数据集上的实验结果也验证了 CT3D 可以比最先进的方法取得显着改进。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node.js下载安装教程

一、下载安装包 1、百度网盘自提链接: 链接:https://pan.baidu.com/s/1Bbw895MtUgjlfZylPHCCxw 提取码:x89v 2、进入官网下载 https://nodejs.org/zh-cn/download/ 选择对应版本,我这里选的windows64位版本 二、安装程序 1、…

INFINI Console 与华为鲲鹏完成产品兼容互认证

何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务(含公有云、私有云、混合云、桌面云)推出的一项合作伙伴计划,旨在为构建持续发展、合作共赢的鲲鹏生态圈,通过整合华为的技术、品牌资源,与合作伙伴共享商机和利…

[笔记] 使用 xshell 记录日志

平常会使用xshell登录远程系统,在一些场景下,由于远端节点不支持下载,因此无法下载日志,此时可以通过 xshell 自带的日志功能将远端节点的日志内容导出. 1. 登录远端节点后启动日志记录 2. 指定要保存的日志文件 3. 在终端中使用 cat /path/to/logfile 将文件内容全部打印到终…

Hash表

Hash表 前言存储结构链表法初始哈希表大致的思路代码讲解及实现声明插入寻找主函数 开放寻址法大致的思路代码讲解及实现声明find主函数 实际运用字符串前缀哈希法大致思路代码实现 前言 hello! 这里是欧_aita的博客。 每日一汤:不管你做什么,都要全心全意地投入其中…

网络相关-面试高频

网络 当前的应用系统主要分两大类,一类是C/S(Client/Server)客户端/服务器架构的,一类是B/S(Browser/Server)浏览器/服务器架构的[3],例如:PC上安装的QQ程序是典型的C/S架构中的客户…

LeetCode(37)矩阵置零【矩阵】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 73. 矩阵置零 1.题目 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]…

JVM

图来自JavaGuide 程序计数器 程序计数器是线程私有的,每个线程一份,是线程安全的;内部保存的字节码的行号,用于记录正在执行的字节码指令的地址。 java堆 java堆是线程共享的区域(线程不安全)&#xff…

Pandas进阶:20个实用的Pandas函数的基本使用

1. ExcelWriter 很多时候dataframe里面有中文,如果直接输出到csv里,中文将显示乱码。而Excel就不一样了,ExcelWriter是pandas的一个类,可以使dataframe数据框直接输出到excel文件,并可以指定sheets名称。 df1 pd.Da…

玻色量子对外合作

2023年 2023.7 首个央企量子云计算项目,中标! 2023.6 勇闯“量子电力”新领域,玻色量子与清大科越达成战略合作 2023.5 玻色量子签约移动云“五岳”量子云计算创新加速计划! 2023.3 “量子计算通信”!玻色量子与…

使用netconf配置华为设备

实验目的: 公司有一台CE12800的设备,管理地址位172.16.1.2,现在需要编写自动化脚本,通过SSH登陆到设备上配置netconf协议的用户名,密码以及netconf服务,并且通过netconf协议将设备的loopback0接口IP地址配…

小航助学题库蓝桥杯题库c++选拔赛(22年1月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号) 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)

适用于 Windows 的最佳电脑数据恢复软件是什么?

数据丢失是数字世界中令人不快的一部分,它会在某一时刻影响许多计算机用户。很容易意外删除一些重要文件,这可能会在您努力恢复它们时带来不必要的压力。幸运的是,数据恢复软件可以帮助恢复已删除的文件,即使您没有备份它们。这是…

CONTROLLING VISION-LANGUAGE MODELS FOR MULTI-TASK IMAGE RESTORATION

CONTROLLING VISION-LANGUAGE MODELS FOR MULTI-TASK IMAGE RESTORATION (Paper reading) Ziwei Luo, Uppsala University, ICLR under review(6663), Cited:None, Stars: 350, Code, Paper. 1. 前言 像CLIP这样的视觉语言模型已经显示出对零样本或无标签预测的各种下游任务…

fastadmin 如何引入自己的js

在需要的界面中&#xff1a;如何实例说明&#xff1a; 中<script> function zhuruJs(url) { let temp document.createElement( script ); temp.setAttribute( type, text/javascript" );temp.src urL; document.head . appendChild(temp); zhuruJs(location…

智能优化算法应用:基于哈里斯鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于哈里斯鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于哈里斯鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.哈里斯鹰算法4.实验参数设定5.算法结果6.参考…

【Hydro】SG滤波器纯numpy实现

目录 说明WIKI示例滑动平均卷积系数的推导第一点和最后点的处理scipy.signal中的savgol_filter纯numpy实现的savgol_filterCPP实现的savgol_filter参考文献说明 Savitzky-Golay滤波器(S-G滤波器)是一种在时域和频域上同时进行的滤波方法,它通过局部多项式拟合来平滑信号。这…

ExoPlayer - Failed to initialize OMX.qcom.video.decoder.avc

人莫鉴于流水而鉴于止水&#xff0c;唯止能止众止 1. 背景 使用ExoPlayer&#xff0c;我不信你没遇到过这个问题&#xff1a; java.lang.IllegalArgumentException: Failed to initialize OMX.qcom.video.decoder.avc 详细内容如下图所示&#xff1a; 2. MediaCodec(解码器) …

Android控件全解手册 - 多语言切换完美解决方案(兼容7.0以上版本)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

MySQL-函数

一、统计函数 CREATE TABLE student (id INT NOT NULL DEFAULT 1,name varchar(20) not null default ,chinese float not null default 0.0,english float not null default 0.0,math float not null default 0.0 );insert into student values (1,曹操,77,89,85);insert int…

Python内置函数与标准库函数的详细解读

一、内置函数与标准库函数的区分 Python 解释器自带的函数叫做内置函数&#xff0c;这些函数可以直接使用&#xff0c;不需要导入某个模块。 Python 解释器也是一个程序&#xff0c;它给用户提供了一些常用功能&#xff0c;并给它们起了独一无二的名字&#xff0c;这些常用功能…
最新文章