6种最常用的3D点云语义分割AI模型对比
由于增强现实/虚拟现实的发展及其在计算机视觉、自动驾驶和机器人领域的广泛应用,点云学习最近引起了人们的关注。 深度学习已成功用于解决 2D 视觉问题,然而,由于其处理面临独特的挑战,深度学习技术在点云上的使用仍处于起步阶段。
推荐:用 NSDT编辑器 快速搭建可编程3D场景
深度学习的早期方法通过将点云预处理为结构化网格格式来克服这一挑战,但代价是计算成本增加或深度信息丢失。 3D点云分割是将点云分类为不同同质区域的过程,使得同一孤立且有意义的区域中的点具有相似的属性。 由于高冗余、采样密度不均匀以及点云数据缺乏明确的结构,3D 分割是一项具有挑战性的任务。
将点云分割为前景和背景是处理 3D 点云的基本步骤。 人们可以精确地确定 3D 数据中对象的形状、大小和其他属性。 然而,分割 3D 点云中的对象并不是一项简单的任务。 点云数据通常是嘈杂、稀疏且无组织的。 除此之外,点的采样密度不均匀,表面形状可以是任意的,数据没有统计分布模式。 此外,由于 3D 传感器的限制,背景与前景纠缠在一起。 此外,很难拥有计算效率高且内存占用低的深度学习模型来执行分割。
分割过程有助于分析各种应用中的场景,例如定位和识别对象、分类和特征提取。 3D点云分割可以部署在场景级别(语义分割)、对象级别(实例分割)和零件级别(零件分割)。 语义分割是一种检测每个像素所属的对象类别并将同一类的多个对象视为单个实体的技术。
给定一个点云,语义分割的目标是根据点的语义将其分成几个子集。 当前的文章重点研究基于点的方法下最先进的语义分割技术。 各种基于点的 3D 语义分割技术的分类可以由 4 种范式给出,即 (a) 逐点 MLP、(b) 点卷积、© 基于 RNN 和 (d) 基于图。
在利用本文介绍的AI模型训练或推理点云数据之前,最好先看一下点云数据。你可以使用 NSDT 3DConvert 这个在线工具,它支持PCD、XYZ、PLY等多种格式的3D点云的在线预览和转换:
https://3dconvert.nsdt.cloud
1、PointNet
卷积架构需要高度规则的输入数据格式,以便执行权重共享和其他内核优化。 由于点云和网格不是常规格式,因此大多数方法通常将数据转换为常规 3D 体素网格或图像集合,然后再将其输入深度网络架构。 然而,这种转换使得结果数据变得不必要地庞大,并且还引入了可能掩盖数据自然不变性的量化伪影。
PointNet 直接利用考虑输入排列不变性的点云。 PointNet 架构包含三个关键模块
- 最大池化层作为对称函数来聚合来自所有点的信息
- 局部和全局信息组合结构以及两个对齐输入点
- 点特征的联合对齐网络
为了找到无序输入的对称函数,PointNet通过在变换元素上应用对称函数来近似在点集上定义的通用函数。 PointNet 通过多层感知器网络来近似函数,并通过单变量函数和最大池函数的组合来变换函数。 函数的输出形成一个向量,该向量被视为输入集的全局签名,并通过将全局特征与每个点特征连接来馈送到每个点特征。 然后,基于组合点特征提取新的每点特征,因为每点将了解局部信息和全局信息。
构成第三个模块的联合对齐网络的灵感来自于这样一个事实:如果点云经历几何变换,则点云的语义标签必须保持不变。 PointNet 通过 T-net 架构预测仿射变换矩阵,并将该变换直接应用于输入点的坐标。 T-net 由点独立特征提取、最大池化和全连接层组成。 特征空间中的变换矩阵具有更高的维数。 因此,为了优化,将约束特征变换矩阵接近正交矩阵的正则化项添加到softmax训练损失中。 图中给出了PointNet的详细架构和语义分割的输出。
PointNet架构和语义分割的输出
2、PointNet++
PointNet 不会捕获由存在点的度量空间引起的局部结构,从而限制了其识别细粒度模式的能力以及对复杂场景的泛化能力。
PointNet++ 引入了一种分层神经网络,它将 PointNet 递归地应用于输入点集的嵌套分区。 通过利用度量空间距离,PointNet++ 能够学习上下文尺度不断增加的局部特征。
PointNet++ 通过底层空间的距离度量将一组点划分为重叠的局部区域。 与 CNN 类似,它从小邻域中提取捕获精细几何结构的局部特征,这些局部特征被进一步分组为更大的单元并进行处理以产生更高级别的特征。 重复这个过程直到获得整个点集的特征。
PointNet++的设计解决了两个问题:如何生成点集的划分,以及如何通过局部特征学习器抽象点集或局部特征。 PointNet 使用单个最大池操作来聚合整个点集,而 PointNet++ 构建点的分层分组,并沿着层次结构逐步抽象更大的局部区域。 这种层次结构由多个抽象级别组成,在每个级别上,都会对一组点进行处理和抽象,以生成一个包含更少元素的新集合。
抽象层由三层组成:采样层、分组层和PointNet层。 采样层从输入点中选择一组点,这定义了局部区域的质心。 然后,分组层通过查找质心周围的“相邻”点来构造局部区域集。 PointNet 层使用迷你 PointNet 将局部区域模式编码为特征向量。 图中展示了 PointNet++ 所使用的架构细节及其与 PointNet 的比较。
PointNet++ 语义分割的架构和输出
3、RandLA-Net
RandLA-Net 引入了一种轻量级神经架构,可以处理大规模点云,速度比其他架构快 200 倍,因为大多数现有架构都使用昂贵的采样技术以及计算量大的后处理和预处理方法。
PointNet 计算效率高,但无法捕获每个点的上下文信息。 RandLA-Net 单次处理大规模 3D 点云,无需任何预处理/后处理步骤,例如体素化、块分区或图形构建。 RandLA-Net 仅依赖于网络内的随机采样,因此需要更少的内存和计算。 局部特征聚合器通过考虑局部空间关系和点特征来获得逐渐变大的感受野。 整个网络包含共享的多层感知器,不依赖于图构建和核化,因此是高效的。 不同的采样方法(例如最远点采样、逆密度重要性采样、基于生成器的采样)的计算效率非常高。 然而,它们可能会导致重要功能的丢失。 因此,RandLA-Net提出了本地聚合模块。 该模块并行应用于每个 3D 点,由三个神经单元组成。
- LocSE:在给定点云的该模块中,所有特征都明确用于编码三维坐标信息。 它使用 K 最近邻算法来收集邻近点,然后执行相对点位置编码的步骤,这有助于网络学习局部特征。 最后,在点特征增强中,将编码后的相对点位置与对应的点特征连接起来,得到增强的特征向量。 该向量对局部几何结构进行编码。
- Attentive Pooling:注意力池。对于给定的一组局部特征,设计一个共享函数来学习独特的注意力分数并聚合邻域点特征集中的使用信息。 共享的多层感知器后面是一个 softmax 函数。 然后将这些学习到的注意力分数相加。
- Dilated Residual Block:由于随机采样不断对输入点云进行下采样,因此需要增加每个点的感受野。 使用 Resnet 架构和跳过连接,将多个 LocSE 和 Attentive Pooling Block 连接起来形成 Dilated Residual Block。 该块负责扩大感受野并扩大有效邻域。 图 4 给出了 RandLA-Net 与 PointNet++ 的输出比较。
RandLA-NET 语义分割输出与 PointNet++ 的比较
4、PointCNN
PointCNN 能够利用网格中密集表示的数据的空间局部相关性,并提供从点云进行特征学习的框架。 PointCNN 从输入点学习 χ 变换,以促进与点相关的输入特征的加权以及将点排列成规范顺序。 PointCNN 的架构包含两种设计:
- 分层卷积:在规则网格中,卷积被递归地应用于局部网格块,这通常会降低网格分辨率,同时增加通道数。 类似地,在点云中,χ-Conv 递归地应用于“投影”或“聚合”,将来自邻域的信息分解为较少的代表点,但每个点都具有更丰富的信息。
- χ-Conv算子:χ-Conv算子在局部区域进行运算,将关联点和邻域点作为输入并与它们进行卷积。 将相邻点转换为代表点的局部坐标系,然后将这些局部坐标单独提升并与相关特征组合。
具有两个 χ-Conv 层的 PointCNN 将输入点转换为更少的特征表示,但每个特征表示都具有更丰富的特征。 然而,顶层 χ-Conv 层的训练样本数量迅速下降,导致训练效率低下。 为了解决这个问题,PointCNN 使用更密集的连接,其中更多的代表点保留在 χ-Conv 层中。 此外,为了在保持感受野增长率的同时保持网络的深度,采用了扩张卷积。 对于分割任务,需要高分辨率逐点输出,因此使用Conv-DeConv架构并遵循U-Net设计。
5、Recurrent Slice Networks
大多数其他语义分割网络不会对点云之间所需的依赖关系进行建模。 RSNet 的关键组件是轻量级本地依赖模块。 本地依赖模块非常高效,并且切片池化/反池化层的时间复杂度为 O(n) w.r.t(输入点数量)和 O(1) w.r.t(局部上下文分辨率)。
RSNet 将原始点云作为输入并输出每个点云的语义标签。 给定一组无序点和一个候选标签集,RSNet 的任务是为每个点分配一个语义标签。 输入和输出特征提取块用于独立的特征生成。 中间是本地依赖模块。 输入特征块消耗输入点并产生特征,输出特征块将处理后的特征作为输入并为每个点生成最终预测。 两个块都使用一系列多个 1 x 1 卷积层来为每个点生成独立的特征表示。
局部依赖模块是新颖的切片池化层、双向递归神经网络(RNN)层和切片反池化层的组合。 通过首先将无序点投影为有序特征,然后应用传统的端到端学习算法来解决局部上下文问题。 该投影是通过新颖的切片池层实现的。 在这一层中,输入是无序点的特征,输出是聚合特征的有序序列。
接下来,RNN 应用于此序列中的模型依赖关系。 最后,切片反池化层将序列中的特征分配回点。 该图给出了RSNets的详细架构。 RSNet 在三个广泛使用的基准测试中被证明超越了以前最先进的方法,同时需要更少的推理时间和内存。
RSNet架构
6、DGCNN
DGCNN 是一种 EdgeConv,适用于点云上基于 CNN 的高级任务,包括分类和分割。
EdgeConv 作用于网络每一层动态计算的图。 它捕获局部几何结构,同时保持排列不变性。 EdgeConv 不是直接从嵌入生成点特征,而是生成描述点与其邻居之间关系的边缘特征。 EdgeConv 被设计为对邻居的顺序不变,因此是排列不变的。 由于 EdgeConv 构造局部图并学习边缘的嵌入,因此该模型能够对欧几里得空间和语义空间中的点进行分组。
DGCNN 不像 PointNet 那样处理单个点,而是通过构建局部邻域图并在连接相邻点对的边缘上应用类似卷积的操作来利用局部几何结构。 边缘卷积(EdgeConv)具有介于平移不变性和非局部性之间的属性。
与图 CNN 不同,DGCNN 的图不是固定的,而是在网络的每一层之后动态更新。 也就是说,一个点的 k 个近邻集在网络的层与层之间发生变化,并且是根据嵌入序列计算出来的。 DGCNN 可以执行分类和分割任务。 分类模型以 n 个点作为输入,为 EdgeConv 层的每个点计算大小为 k 的边缘特征集,并聚合每个集中的特征以计算相应点的 EdgeConv 响应。
最后一个 EdgeConv 层的输出特征被全局聚合以形成 1D 全局描述符,用于生成 cc 类的分类分数。 分割模型通过连接每个点的一维全局描述符和所有 EdgeConv 输出(用作局部描述符)来扩展分类模型。 它输出 p 个语义标签的每点分类分数。 该网络包含两个块:
- 点云变换块:该块旨在通过应用估计的 3 × 3 矩阵将输入点集与规范空间对齐。 为了估计 3 × 3 矩阵,使用连接每个点的坐标及其 k 个相邻点之间的坐标差的张量。
- EdgeConv块:该块将形状为n×f的张量作为输入,通过应用具有层神经元数量的多层感知器(MLP)来计算每个点的边缘特征,并生成形状为n×an的张量 在相邻边缘特征之间进行池化之后。 DGCNN 架构可以轻松地按原样合并到现有的管道中,用于基于点云的图形、学习和视觉。
DGCNN架构
7、总结和定量比较
下表展示了对 3 个公开数据集 S3DIS、Semantic3D、ScanNet(v2) 和 Sem 的结果的定量分析。 KITTI使用评价指标OA、mIOU。
原文链接:3D点云语义分割综述 — BimAnt
相关文章:
6种最常用的3D点云语义分割AI模型对比
由于增强现实/虚拟现实的发展及其在计算机视觉、自动驾驶和机器人领域的广泛应用,点云学习最近引起了人们的关注。 深度学习已成功用于解决 2D 视觉问题,然而,由于其处理面临独特的挑战,深度学习技术在点云上的使用仍处于起步阶段…...
UG NX二次开发(C#)-获取UI中选择对象的handle值
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、设计一个简单的UI界面3、创建工程项目4、测试结果1、前言 我在哔哩哔哩的视频中看到有人问我如何获取UI选择对象的Handle,本来想把Tag、Taggedobject、Handle三者的关系讲一下,然后看…...
win10,WSL的Ubuntu配python3.7手记
1.装linux 先在windows上安装WSL版本的Ubuntu Windows10系统安装Ubuntu子系统_哔哩哔哩_bilibili (WSL2什么的一直没搞清楚) 图形界面会出一些问题,注意勾选ccsm出的界面设置 win10安装Ubuntu16.04子系统,并开启桌面环境_win…...
02-Zookeeper实战
上一篇:01-Zookeeper特性与节点数据类型详解 1. zookeeper安装 Step1: 配置JAVA环境,检验环境: java -versionStep2: 下载解压 zookeeper wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeepe…...
【C语言深入理解指针(1)】
1.内存和地址 1.1内存 在讲内存和地址之前,我们想有个⽣活中的案例: 假设有⼀栋宿舍楼,把你放在楼⾥,楼上有100个房间,但是房间没有编号,你的⼀个朋友来找你玩,如果想找到你,就得挨…...
模拟实现简单的通讯录
前言:生活中处处都会看到或是用到通讯录,今天我们就通过C语言来简单的模拟实现一下通讯录。 鸡汤:跨越山海,终见曙光! 链接:gitee仓库:代码链接 目录 主函数声明部分初始化通讯录实现扩容的函数增加通讯录所…...
rabbitMQ死信队列快速编写记录
文章目录 1.介绍1.1 什么是死信队列1.2 死信队列有什么用 2. 如何编码2.1 架构分析2.2 maven坐标2.3 工具类编写2.4 consumer1编写2.5 consumer2编写2.6 producer编写 3.整合springboot3.1 架构图3.2 maven坐标3.3 构建配置类,创建exchange,queue&#x…...
数位dp,338. 计数问题
338. 计数问题 - AcWing题库 给定两个整数 a 和 b,求 a 和 b 之间的所有数字中 0∼90∼9 的出现次数。 例如,a1024,b1032,则 a 和 b 之间共有 9 个数如下: 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出…...
如何解决git clone http/https仓库失败(403错误)
本来不打算写这篇文章,但是后来又遇到这个问题忘了之前是怎么解决的了。 一般情况下,个人使用 GitHub 等平台时是使用 SSH 协议的,这样不光方便管理可访问用户,也保证了安全性。但是 GitHub 上仓库的 SSH 地址是要登陆才能看到&a…...
华为云云耀云服务器L实例评测 | 实例评测使用之硬件性能评测:华为云云耀云服务器下的硬件运行评测
华为云云耀云服务器L实例评测 | 实例评测使用之硬件性能评测:华为云云耀云服务器下的硬件运行评测 介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器是什么华为云云耀…...
Elasticsearch:使用 Elasticsearch 进行语义搜索
在数字时代,搜索引擎在通过浏览互联网上的大量可用信息来检索数据方面发挥着重要作用。 此方法涉及用户在搜索栏中输入特定术语或短语,期望搜索引擎返回与这些确切关键字匹配的结果。 虽然关键字搜索对于简化信息检索非常有价值,但它也有其局…...
JVM的主要组成及其作用
jvm主要组成部分有: 类加载器、运行时数据区 (内存结构)、执行引擎、本地接口库、垃圾回收机制 Java程序运行的时候,首先会通过类加载器把Java 代码转换成字节码。然后运行时数据区再将字节码加载到内存中,但字节码文件只是JVM 的一套指令集规范…...
会议AISTATS(Artificial Intelligence and Statistics) Latex模板参考文献引用问题
前言 在看AISTATS2024模板的时候,发现模板里面根本没有教怎么引用,要被气死了。 如下,引用(Cheesman, 1985)的时候,模板是自己手打上去的?而且模板提供的那三个引用,根本也没有Cheesman这个人,…...
2023最新外贸建站:WordPress搭建外贸独立站零基础小白保姆级教程
想从零开始建立一个外贸自建站,那么你来对地方了。 如果你还在找外贸建站或者是WordPress建站教程,不妨看看这篇文章,本教程涵盖了2023最新的外贸建站教程,你将学会使用WordPress自建外贸独立站,步骤包括购买域名主机…...
HTTP请求交互基础(基于GPT3.5,持续更新)
HTTP交互基础 目的HTTP定义详解HTTP协议(规范)1. 主要组成部分1.1 请求行(Request Line):包含请求方法、请求URI(Uniform Resource Identifier)和HTTP协议版本。1.2 请求头部(Reques…...
小谈设计模式(6)—依赖倒转原则
小谈设计模式(6)—依赖倒转原则 专栏介绍专栏地址专栏介绍 依赖倒转原则核心思想关键点分析abc 优缺点分析优点降低模块间的耦合度提高代码的可扩展性便于进行单元测试 缺点增加代码的复杂性需要额外的设计和开发工作 Java代码实现示例分析 总结 专栏介绍…...
JetBrains常用插件
Codota AI Autocomplete Java and JavaScript:自动补全插件 Background Image plus:背景图片设置 rainbow brackets:彩虹括号,便于识别 CodeGlance2: 类似于 Sublime 中的代码缩略图(代码小地图ÿ…...
【C++哈希应用】位图、布隆过滤器
【C哈希应用】位图、布隆过滤器 目录 【C哈希应用】位图、布隆过滤器位图概念位图的实现位图改造位图应用总结布隆过滤器布隆过滤器的提出布隆过滤器的概念布隆过滤器的查找布隆过滤器删除布隆过滤器优点布隆过滤器缺陷 作者:爱写代码的刚子 时间:2023.9…...
Qt 编译纯c的C99的项目, error: undefined reference to `f()‘
把Cpp的后缀该为C是什么样的 尝试引用一个奇门排盘的c程序,在git上找到的叫cqm, 然后总是报错 error: undefined reference to f() 很是郁闷 于是新建了个项目试验一下,终于摸清了需要命名空间。 后来这么写就可以了 a.h namespace XX …...
TensorFlow入门(五、指定GPU运算)
一般情况下,下载的TensorFlow版本如果是GPU版本,在运行过程中TensorFlow能自动检测。如果检测到GPU,TensorFlow会默认利用找到的第一个GPU来执行操作。如果机器上有超过一个可用的GPU,除第一个之外的其他GPU默认是不参与计算的。如果想让TensorFlow使用这些GPU执行操作,需要将运…...
Unity - 实践: Metallic流程贴图 转 Specular流程贴图
文章目录 目的Metallic Flow - SP - 输出输出的 MRA (MGA) 贴图 Metallic->Specular (根据教程一步一步实践)1. Base color Metallic -> Diffuse2. Base color Metallic -> Specular3. Roughness -> Glossiness输出贴图,在 unity 中展示:M…...
第三章:最新版零基础学习 PYTHON 教程(第四节 - Python 运算符—Python 逻辑运算符及示例)
运算符用于对值和变量执行操作。这些是执行算术和逻辑计算的特殊符号。运算符运算的值称为操作数。 表中的内容逻辑运算符 逻辑与运算符 逻辑或运算符 逻辑非运算符 逻辑运算符的求值顺序 逻辑运算符 在 Python 中,逻辑运算符用于条件语句(True 或 False)。它们执行逻辑 AN…...
如何做好测试?(三)功能测试 (Functional Testing, FT)
1. 功能测试的详细介绍: 功能测试 (Functional Testing, FT),是一种软件测试方法,旨在验证系统的功能是否按照需求规格说明书或用户期望的方式正常工作。它关注系统的整体行为,以确保各个功能模块和组件之间的交互和集成正确。 …...
Ubuntu-Server-22.04安装桌面+VNC
前提:Ubuntu Server安装好后,ubantu其他版本是否适用这里未知,欢迎大佬们前来评论 一、默认没有图形界面,有时觉得用图形界面操作更简单直接,于是用如下命令安装: 1.更新本地环境 sudo apt-get update s…...
职业规划,什么是职业兴趣 - 我喜欢做什么?
能够在工作岗位上面做出成绩的人,都是结合自身兴趣,对职业进行合理规划的那一类。尤其是步入中年以后,能够创造出巨大价值的人,无一例外都是喜欢自己职业的人。没有将兴趣融入工作的人,只能够忍受默默无闻地活着&#…...
基于Java的高校学生党员发展流程管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...
【NLP的python库(03/4) 】: 全面概述
一、说明 Python 对自然语言处理库有丰富的支持。从文本处理、标记化文本并确定其引理开始,到句法分析、解析文本并分配句法角色,再到语义处理,例如识别命名实体、情感分析和文档分类,一切都由至少一个库提供。那么,你…...
面试理论篇三
关于异常机制篇 异常描述 目录 关于异常机制篇异常描述 注:自用 1,Java中的异常分为哪几类?各自的特点是什么? Java中的异常 可以分为 可查异常(Checked Exception)、运行时异常(Runtime Exception) 和 错误(Error)三类。可查异…...
ShardingSphere|shardingJDBC - 在使用数据分片功能情况下无法配置读写分离
问题场景: 最近在学习ShardingSphere,跟着教程一步步做shardingJDBC,但是想在开启数据分片的时候还能使用读写分离,一直失败,开始是一直能读写分离,但是分偏见规则感觉不生效,一直好像是走不进去…...
char s1[len + 1]; 报错说需要常量?
在C中,字符数组的大小必须是常量表达式,不能使用变量 len 作为数组大小。为了解决这个问题,你可以使用 new 运算符动态分配字符数组的内存,但在使用完后需要手动释放。 还有啥是只能这样的,还是说所有的动态都需要new&…...
怎样在领英上做公司网站/淘宝搜索指数
HTML介绍 HTML(HyperText MarkupLanguage)简称超文本标记语言。它和CSS、JavaScript组合完成一个网页的设计。对于一个网页,HTML定义网页的结构,CSS描述网页的样子,JavaScript则实现人机交互。 HTML语义化 说起HTML&am…...
wordpress邮箱功能不安全/百度推广售后
运维硬要求啊。。。 还好,有万能度娘~~ 开个命令行窗口(开始,cmd)输入 wmic memorychip list brief LOOK! 24根! 转载于:https://www.cnblogs.com/aguncn/p/3543211.html...
互联网设计师leader/天津网站优化
题目一:一个有10亿条记录的文本文件,已按照关键字排好序存储,设计算法,可以快速的从文件中查找指定关键字的记录答案:10亿在 G量级, 分成100份, 为10M量级, 基本上放入内存无压力了.在这10亿记录中, 均分为100份, 把每…...
怎么用域名建网站/青岛seo霸屏
观看在线演示效果,博客来自:http://tongqiuyan.blog.163.com/blog/static/1955453022011102023634598/ 如若需要源码,留下Email地址。 Flex中的行为由效果和触发器组成。 例如:Button 控件具有 mouseDown 事件和 mouseDownEffect …...
张家港做政府网站的公司/域名查询注册信息查询
引言:通过参考c语言库函数qsort: 1void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) ); 完成回调函数实现冒泡排序字符串或数字: 代码如下: 1234567891011121…...
号号网站开发/百度seo费用
雨的印记原名Kiss The Rain,这首曲子出自韩国最擅长描绘爱情的音乐家李闰珉(YIRUMA)之手,写这首歌的时候,是在一个星星满天的夜晚,忽然间一场雨,让YIRUMA有感而发写下Kiss The Rain这首曲子。中文名称雨的印记外文名称…...