PointNEXT阅读:重铸PointNet荣光

  • Post author:
  • Post category:其他




PointNEXT阅读:重铸PointNet荣光





摘要

PointNet++是对点云理解最有影响力的神经网络架构,

尽管

PointNet++已经被

Point MLP

以及

Point Transformer

大幅超过,然而经过我们分析,他们的效果提升是很大一部分是由于

四点



1.不错的训练策略



2.数据增强



3.优化策略



4.增大的模型尺寸

(参数量更多了),因此我们很难说是因为新的结构导致准确率提升,还是因为一些非结构性训练技巧导致的效果提升。作者在这篇文章中探究PointNet++的潜力,在没有改变PointNet++结构的情况下,只利用了我们优化的训练策略,ScanObjectNN object classification任务中准确率从

77.9%



86.1%

好于目前最好的

Point MLP

。再者,作者引入

反转残差结构

设计以及

可分离MLP

,这样可以让模型更高效的缩放。结合了优化的训练策略以及结构创新,我们提出了PointNeXt.


效果

:PointNeXt 可以灵活扩展,在 3D 分类和分割任务上都优于最先进的方法。 对于分类,PointNeXt 在 ScanObjectNN 上的整体准确率达到 87.7%,超过 PointMLP 2.3%,同时推理速度快

10 倍

。 对于语义分割,PointNeXt 在

S3DIS

(6 折交叉验证)上以

74.9%

的平均 IoU 建立了新的最先进的性能,优于最近的

Point Transformer

注:(总体意思是在以往的方法中没有很好的说明到底是

训练策略

还是

结构创新

或者

模型尺寸

导致的效果提升,在分析的基础上提出了

新的架构

干翻了其他方法。)



1.介绍

点云处理发展了许久,对于点云处理又到了一个新的阶段,poinet开创了点云处理的新时代,现在许多基于点的模型,都更加关注于

新的



复杂的

模型来提取局部特征。比如说:KPConv中的

伪网格

,Point Transformer

自注意力层

,虽然这些方法都超过pointnet++很多,但令人印象深刻的是:

真的是因为pointnet结构太过于简单而不能学习更复杂的表示吗?

但是

pointnet

仍然值得我们去探索,作者改进以下方面:

  • 优越的训练策略
  • 有效的模型尺度策略

通过一系列比较全面的实验,

ScanObjecNN

分类,

S3DIS

语义分割

在这里插入图片描述


结果

:实验证明相比于结构创新,更好的训练策略让poinnet++提升到顶尖水平。

一些手段:


数据增强:

Point resampling

Jittering

Height


appending

Random scaling

Rotation

Color


droping


优化策略


Label Smoothing

Adam 优化器

step decay (学习率衰退)

refine lr


感受野缩放

改变查询半径R

标准化


模型缩放:

我们将

主干mlp

的通道大小表示为

C



反残差mlp

块的数量表示为

B


• PointNeXt-S: C = 32, B = 0



• PointNeXt-B: C = 32, B = (1, 2, 1, 1)



• PointNeXt-L: C = 32, B = (2, 4, 2, 2)



• PointNeXt-XL: C = 64, B = (3, 6, 3, 3)


PointNeXt贡献:

• 我们首次对点云领域的

训练策略

进行

系统研究

,并表明PointNet++ 仅通过单独采用改进的训练策略就可以反映(ScanObjectNN 上的 OA 增加 8.2%,S3DIS 上的 mIoU 增加 13.6%)。 改进的训练策略是通用的,可以很容易地应用于改进其他方法。

• 我们提出PointNeXt,即PointNet 的下一个版本。 PointNeXt 是

可扩展

的,在所有研究的任务上都超过了 SOTA,包括对象

分类



语义分割



部件分割

,同时在推理方面比 SOTA 更快。



2.

回顾PointNet++

PointNeXt是基于PointNet++构建的,它使用类似U-Net的架构,带有编码器和解码器,如图2所示。编码器部分使用多个集合抽象(SA)块分层抽象点云的特征,而解码器通过相同数量的特征传播块逐步插值抽象的特征。

SA块包括一个用于对输入点进行下采样的子采样层、一个用于查询每个点的邻居的分组层、一组用于提取特征的共享多层感知器(MLP)以及一个用于聚合邻居中的特征的简化层(maxpooling)



3.方法论:从pointNet++到pointNeXt

这一节,展示如何使得经典的pointNet++转化到pointNext,主要表现在两个方面:

  • 训练现代化用来改善

    数据增强

    以及

    优化策略
  • 结构现代化用来探究

    感受野缩放



    模型缩放

这两个方面在模型表现上都有着极其重要的影响,但是在之前的研究中并没有

充分研究



3.1训练现代化:PointNet++反击

作者做了一些研究来量化现代点云网络采用的

数据增强



优化策略

、并且提出了一系列改善的策略。



3.1.1数据增强

数据增强一直都是提高神经网络表现得最重要的策略之一,作者决定从这里着手。

各文章所用方法如下:

research method
PointNet++ random rotation, scaling, translation, and jittering
KPConv randomly drops colors
Point-BERT point resampling
RandLA-Net/Point Transformer load the entire scene as input on segmentation

既然以往的文章采用了一些不同的数据增强策略我们通过添加或着移除这些方法来保留必要的,我们系统的研究了这些数据增强在这些具有代表性的工作上。

具体表现在如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gYr58WTj-1660523535570)(C:\Users\huang\OneDrive\图片\屏幕快照\屏幕截图 2022-08-11 143123.png)]

不同的任务上不同的数据增强操作也不太一样。



3.1.2优化策略

优化策略也同样对神经网络的表现至关重要,例如

损失函数



优化器



学习率规划



超参数

,PointNet++在其整个实验中使用了相同的优化技术:交叉熵损失、Adam优化器、指数学习率衰减(阶跃衰减)和相同的超参数。由于机器学习理论的发展,现代神经网络可以使用理论上

更好的优化器

(如AdamWvs.Adam)和更好的损失函数(

带标签平滑的交叉熵

)进行训练。与我们对数据扩充的研究类似,我们还量化了每种现代优化技术对PointNet++的影响。我们首先对

学习率



权重衰减

进行顺序超参数搜索。然后,我们对

标签平滑



优化器



学习率调度器

进行加性研究。我们发现了一组改进的优化技术,通过可观的差额。

标签平滑



AdamW



余弦衰减

的交叉熵通常可以提高各种任务的性能。

实验效果如下

在这里插入图片描述


PointNeXt具体结构:

在这里插入图片描述


红色框

代表pointNeXt与pointNet的差异部分。

PointNeXt 架构。 PointNeXt 与 PointNet++ 共享相同的

Set Abstraction



Feature Propagation

块,同时在开始时添加一个额外的 MLP 层,并使用建议的

Inverted Residual MLP

(InvResMLP) 块扩展架构。 在这里,以 PointNeXt 为例进行分割。 有关分类架构,请参阅附录。



3.2结构现代化

作者将poinrnet++现代化转变为PointNeXt,结构现代化包括两点:

  • 感受野缩放
  • 模型缩放


3.2.1感受野缩放

感受野也是在神经网络设计空间里一个重要影响因素,在点云处理中至少有两个方式来调节感受野

  • 改变查询半径
  • 分层结构

由于pointnet++采用了分层结构,后面我们主要研究pointnet++中的查询半径对于性能的影响。请注意,PointNet++的半径设置为初始值r,该值在点云下采样时加倍。我们研究了每个基准中不同的初始值,发现半径是特定于数据集的,可以对性能产生重大影响。

此外,我们还发现在eq中的相对坐标为∆p=pj−pi。(1)使网络优化更加困难,导致性能下降。因此,我们建议用半径来归一化∆p:



3.2.2模型缩放

PointNet++ 是一个相对较小的网络,其中编码器仅由分类架构中的 2 个阶段和用于分割的 4 个阶段组成。 每个阶段仅包含 1 个 SA 块,每个块包含 3 层 MLP。 PointNet++ 用于分类和分割的模型大小都小于 2M,与通常使用超过 10M 参数的现代网络相比要小得多 [47,29,34]。 有趣的是,我们发现添加更多 SA 块或使用更多通道都不会显着提高准确性,同时导致吞吐量显着下降。

主要原因是

梯度消失



过度拟合

。因此,在本小节中,我们将研究如何以有效的方式扩展PointNet++。我们建议在每个阶段的第一个SA块之后附加一个

反向残差MLP

(InvResMLP)块,以实现有效的模型缩放。InvResMLP构建在SA块上如图2中下部所示。InvResMLP和SA之间有三个区别。

  • 在输入和输出之间添加一个

    残差网络连接

    ,以缓解梯度消失问题,尤其是当网络更深时。
  • 为了减少计算量和加强逐点特征提取,引入了可分离的MLP。虽然原始SA块中的所有3层MLP都是基于邻域特征计算的,但InvResMLP将MLP分为一个基于邻域特征计算的层(分组层和缩减层之间)和两个用于点特征的层(缩减后),这是受ASSANet[34]和ConvNeXt[27]启发的。
  • 利用反向瓶颈设计将第二个MLP的输出通道扩展了4倍,以丰富特征提取。与附加原始SA块相比,附加InvResMLP块可显著提高性能(见第4.4.2节)

除了InvResMLP之外,我们还介绍了宏观体系结构中的三个变化

  • 我们统一了用于分类和分割的PointNet++编码器的设计,即将用于分类的SA块的数量从2个缩放到4个,同时在每个阶段保持用于分割的原始数量(4个块)。
  • 我们使用了一个对称解码器,其中它的信道大小被改变以匹配编码器。
  • 我们添加了一个stem MLP,即在体系结构开始处插入的附加MLP层,以将输入点云映射到更高的维度。

最后总的来说:

总之,我们提出了 PointNeXt,即 PointNets 的下一个版本,它是从 PointNet++ 修改而来,结合了所提出的 InvResMLP 和上述宏观架构变化。PointNeXt 的架构如图 2 所示。我们将 stem MLP 的通道大小表示为 C,将 InvResMLP 块的数量表示为 B。较大的 C 会导致网络宽度的增加(即宽度缩放) ,而较大的 B 会导致网络深度的增加(即深度缩放)。 请注意,当 B = 0 时,每个阶段仅使用一个 SA 块且不使用 InvResMLP 块。 SA 块中的 MLP 层数设置为 2,每个 SA 块内部添加一个残差连接。 当 B不等于0 时,InvResMLP 块被附加在原始 SA 块之后。

在这里插入图片描述

具体参数

我们将

主干mlp

的通道大小表示为

C



反残差mlp

块的数量表示为

B


• PointNeXt-S: C = 32, B = 0



• PointNeXt-B: C = 32, B = (1, 2, 1, 1)



• PointNeXt-L: C = 32, B = (2, 4, 2, 2)



• PointNeXt-XL: C = 64, B = (3, 6, 3, 3)



4.实验

我们在三个标准基准上评估 PointNeXt:S3DIS [1] 用于

语义分割

,ScanObjectNN [49] 用于

现实世界对象分类

,ShapeNetPart [3] 用于

对象部件分割


实验设置

交叉熵损失和标签平滑

AdamW优化器

初始学习率lr=0.002,权重衰减10−4,具有余弦衰减

以0.04m的体素大小进行体素下采样



4.1 S3DIS上的三维语义分割


数据集介绍:


S3DIS(

斯坦福大学大型3D室内空间)是一个具有

挑战性

的基准,由6个大型室内区域、271个房间和13个语义类别组成。S3DIS上的标准6倍交叉验证结果如表所示。

在这里插入图片描述

我们的

PointNeXt-S

是小型变体,在

平均 IoU (mIoU)



总体准确度 (OA)



平均准确度 (mAcc)

方面分别比 PointNet++ 高

13.5%



6.4%



10.2%

,同时速度更快 吞吐量。 速度的提高是由于 PointNeXt-S 的 SA 块中的层数减少。 通过提出的

模型缩放

,PointNeXt 的性能可以逐渐提升。 例如,PointNeXt-L 在 mIoU 方面比 SOTA Point Transformer [62**] 高 0.4%

,同时

速度快 3 倍**。

请注意,Point Transformer 使用了我们大部分改进的训练策略。 超大型变体 PointNeXt-XL 以 74.9%/90.3%/83.0% 的 mIoU/OA/mAcc 设定了新的 SOTA 性能,同时比 Point Transformer 运行速度更快。 作为限制,我们的 PointNeXt-XL 包含更多参数,并且在 FLOP 方面的计算成本更高,主要是由于

反向瓶颈中的通道扩展

(×4)和

通道大小

加倍(C = 64)。




4.2 ScanObjectNN

上的3D对象分类


数据集介绍

ScanObjectNN[49]包含约15000个实际扫描对象,这些对象分为15个类,有2902个唯一的对象实例。由于遮挡和噪声,ScanObjectNN对现有的点云分析方法提出了重大挑战。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A6ieNTS5-1660523535573)(C:\Users\huang\OneDrive\图片\屏幕快照\屏幕截图 2022-08-12 104157.png)]



PointMLP

之后,我们在 PB_T50_RS(ScanObjectNN 最难和最常用的变体)上进行实验,并在三个随机运行中报告平均值±标准差。 如选项卡中所述。 如图 2 所示,所提出的 PointNeXt-S 在 OA 和 mAcc 方面都超过了现有方法,同时使用

更少的模型参数

并且运行

速度更快

。 基于 PointNet++ [32],PointNeXt 在最初报告的 PointNet++ 性能上实现了显着改进,即 +9.8% OA 和 +10.4% mACC。

说明

PointNeXt

结构更简洁,计算效率更高!!!效果好的也太离谱了吧。



4.3 ShapeNet零件上的三维对象部件分割


数据集介绍:

ShapeNet part是一个用于部件分割的对象级数据集。它由16个不同形状类别的16880个模型组成,每个类别有2-6个零件,总共有50个零件标签。

在这里插入图片描述

如图 3 所示,我们的具有默认宽度 (C = 32) 的 PointNeXt-S 获得了与 SOTA CurveNet [56] 相当的性能,并且优于大量代表性网络,例如 KPConv 和 ASSANet 就实例平均 IoU (Ins. mIoU) 和吞吐量而言。 此外,通过将宽度从 32 增加到 64,PointNeXt 的性能优于 CurveNet,同时速度提高了 4 倍以上。 值得强调的是,具有

更大宽度

(C = 160)的 PointNeXt 达到了 87.2% Ins. mIoU,而基于点的方法的性能多年来一直饱和在

87%

以下。



4.4消融实验与分析

表4和表5分别对ScanObjectNN[48]和S3DIS[1]提出的

训练和缩放策略

进行相加研究

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fNFWutrX-1660523535574)(C:\Users\huang\OneDrive\图片\屏幕快照\屏幕截图 2022-08-11 143123.png)]


ScanObjectNN上:

PointNet++最初使用交叉熵损失、Adam优化器、学习率1e-3、权重衰减1e-4、每20个迭代阶跃衰减

0.7

、批次大小16(250个迭代)进行训练,同时使用

随机旋转



抖动

作为数据增强。

官方的PointNet++没有在S3DIS数据集上进行实验。我们参考了广泛使用的重新实现,其中PointNet++使用与ScanObjectNN相同的设置进行训练,除了仅使用

随机旋转

作为增强。注意,对于所有实验,我们在ScanObjectNN上训练了

250

个迭代的所有模型,在S3DIS上训练了

100

个迭代的模型。



4.4.1训练策略


数据增强

数据增强是我们研究使 PointNet++ 现代化的第一个方面。 我们根据表中的观察得出

四个结论

1.

数据增强

提高了分类和分割任务的性能。 例如,

点重采样

显示可将 ScanObjectNN 上的 OA 性能提高 2.5%。 将整个场景作为输入,而不是像 PointNet++ 和其他先前的工作 中所做的那样使用块或球体二次采样输入,将分割结果提高了 1.1% mIoU。

2.

高度附加

提高了性能,尤其是在对象分类方面。高度附加使网络了解实际大小从而提高了精确度(+1.1%OA)。

3.

颜色丢弃法

是一种强大的增强功能,可显着提高可用颜色任务的性能。单独采用颜色丢弃在 S3DIS 区域 5 上增加了 5.9% 的 mIoU。我们假设颜色丢弃迫使网络更多地关注

点之间的几何关系

,这反过来又提高了性能。

4.

更大的模型

有利于更强的

数据增强

。 尽管随机旋转使

PointNet++

在 S3DIS 上的性能下降了

0.3% mIoU

(表 5 数据增强部分中的第 2 行),

但它被证明对更大规模的模型是有益的

(例如,在 PointNeXt-B 上提高了 1.5% mIoU)。 ScanObjectNN 上的另一个示例表明,消除随机抖动也会增加 1.1% 的 OA。 总体而言,随着数据增强的改进,PointNet++ 在 ScanObjectNN 上的 OA 和 S3DIS area 5 上的 mIoU 分别提高了 5.8% 和 9.5%。



优化技术

优化技术涉及损失函数、优化器、学习率调度器和超参数。 如表中所示。 4 和 5、标签平滑、AdamW 优化器和余弦衰减在分类和分割任务中不断提高性能。

这表明更发达的优化方法,如标签平滑和 AdamW 通常有利于优化神经网络。 与 Step Decay 相比,Cosine Decay 也更容易调优(通常只需要初始和最小的学习率),并且可以达到类似于 Step Decay 的性能。 关于超参数,使用大于 PointNet++ 的学习率提高了 S3DIS 的分割性能。

总的来说,我们的训练策略包括更强的

数据增强



现代优化技术

,可以将 PointNet++ 在 ScanObjectNN 数据集上的 OA 性能从

77.9%

提高到

86.1%

,令人印象深刻地超过 SOTA PointMLP 0.7%。 S3DIS 区域 5 和 S3DIS 6 倍的 mIoU(如图 1 所示)分别提高了 11.7 和 13.6 个绝对百分点。 我们的观察表明,经典 PointNet++ 和 SOTA 之间的很大一部分性能差距是由于

训练策略

造成的。


推广至其他网络

在这里插入图片描述

虽然这些训练策略是针对PointNet++提出的,但我们发现它们可以应用于其他方法,如PointNet、DGCNN和PointMLP,并提高其性能。ScanObjectNN验证了这种通用性。如表6所示。有代表性的方法的OA都可以通过我们的训练策略来提高。那么以前的作品也有可能不是

结构更优

,也有可能是采用更先进的

训练策略

导致的。



4.4.2模型缩放

在这里插入图片描述


感受野缩放

包括

半径缩放



归一化 Δp

。 半径是特定于数据集的,而将半径从 0.2 缩小到 0.15 在 ScanObjectNN 上提高了 0.3% 的 OA,保持半径与 0.1 相同可以在 S3DIS 上实现最佳性能。 关于对 Δp 进行归一化,它改进了

ScanObjectNN 和 S3DIS 的性能分别提高了 0.3 OA 和 0.4 mIoU。 此外,在选项卡中。

如图 7

所示,我们展示了对更大的模型 PointNext-XL 进行正态化 Δp 的影响更大(在 S3DIS 数据集上为 2.3 mIoU)。

通过建议的InvResMLP和一些宏观架构更改(见第3.2.2节)缩放PointNet+。在表4中ScanObjectNN上,使用stem MLP、对称解码器和SA块中的剩余连接的PointNeXt-S将OA提高了1.0%。通过使用建议的

InvResMLP

的更多块来

放大PointNeXt-S

,可以进一步展示大规模S3DIS数据集的性能(从63.8%到70.5%mIoU)

如图 7 所示,我们使用性能最佳的模型 PointNeXt-XL 作为基线,消融了所提出的 InvResMLP 块的每个组件和 S3DIS 区域 5 上的不同阶段比率。 正如所观察到的,每个架构更改确实有助于提高性能。 在所有变化中,

残差连接

是最重要的,没有它,mIoU 将从 70.5% 下降到仅 64.0%。

可分离 MLP

在将网络加速 3 倍的同时增加了 3.9% mIoU。 从基线中移除倒置瓶颈会导致 mIoU 下降 1.5%,而速度提升不到 1%。 图 7 还显示了朴素宽度缩放的性能,它将 PointNet++ 的宽度从 32 增加到 256 以匹配 PointNeXt-XL 的吞吐量,朴素深度缩放以在 PointNet++ 中附加更多 SA 块以获得相同数量的 PointNext-XL 块( B = (3, 6, 3, 3)) 和朴素复合缩放,将朴素深度缩放模型的宽度加倍到与 PointNeXt-XL 相同的宽度64。我们提出的缩放策略比原始的缩放策略更快。(相较于PointNeXt XL用朴素的复合缩放)



5.相关工作

与基于

体素

的方法 [11, 6] 和基于

多视图

的方法 [41, 13, 10] 相比,

基于点的方法

直接使用其非结构化格式处理点云。 PointNet [31] 是基于点的方法的开创性工作,它提出通过将特征提取限制为逐点来对具有共享 MLP 的

点的排列不变性

进行建模。 PointNet++ [32] 通过捕获局部几何结构来改进 PointNet。 目前,大多数基于点的方法都集中在

局部模块

的设计上。 [51,50,33] 依赖于图神经网络。 [57,21,47,46] 将点云投影到伪网格上以允许常规卷积。 [53,22,23]通过由局部结构确定的权重自适应地聚合邻域特征。 此外,最近的方法利用类似 Transformer 的网络 [62, 17] 通过自我注意提取本地信息。 我们的工作在本地模块设计中没有遵循这种趋势。 相比之下,我们将注意力转移到另一个重要但很大程度上未被充分探索的方面,即

训练和扩展策略



最近在 [2, 52, 27] 中研究了关于图像分类的训练策略。 在点云领域,SimpleView [10] 是第一个表明训练策略对神经网络性能有很大影响的工作。 然而,SimpleView 只是采用了与 DGCNN [51] 相同的训练策略。 相反,我们进行了系统研究以

量化每种数据增强



优化技术

的效果,并提出了一组改进的训练策略,以提高 PointNet++ [32] 和其他代表作品 [31, 51, 29] 的性能。


模型缩放

可以显着提高网络的性能,如各个领域的开创性工作所示 [44, 61, 20]。 与使用小于 2M 的参数的 PointNet++ [32] 相比,大多数当前流行的网络由大于 10M 的参数组成,例如 KPConv [47] (15M) 和 PointMLP [29] (13M)。 在我们的工作中,我们探索了能够

以有效和高效

的方式扩展 PointNet++ 的

模型扩展策略

。 我们提供了关于提高性能的扩展技术的实用建议,即使用

残差连接



倒置瓶颈

设计,同时通过使用

可分离的 MLP

来保持吞吐量。



6.结论

在本文中,我们证明了通过改进的

训练和缩放策略

,PointNet++ 的性能可以提高到超过当前的技术水平。 更具体地说,我们量化了当今广泛使用的每种数据增强和优化技术的效果,并提出了一组改进的训练策略。 这些策略可以很容易地应用于提高 PointNet++ 和其他代表性作品的性能。 我们还将

Inverted Residual MLP

块引入

PointNet++ 以开发 PointNeXt

。 我们证明,PointNeXt 在各种基准测试中都具有优于 PointNet++ 的性能和可扩展性,同时保持高吞吐量。 这项工作旨在引导研究人员更加关注

训练和扩展策略的效果

,并激励未来朝着这个方向开展工作。

局限性。 尽管 PointNeXt-XL 是所有具有代表性的基于点的网络中最大的模型之一 [32, 47, 15, 62],但它的参数数量(44M)仍然低于图像分类中的小型网络,例如 Swin-S [24] (50M)、ConNeXt-S [27] (50M) 和 ViT-B [9] (87M),远非它们的大型变体,包括 Swin-L (197M)、ConvNeXt-XL (350M) , 和 ViT-L (305M)。

在这项工作中,我们没有进一步推动模型大小,主要是由于点云数据集的规模较小,与其较大的图像对应物(如 ImageNet [7])相比。 此外,我们的工作仅限于现有模块,因为重点不是引入新的架构更改。

XL 是所有具有代表性的基于点的网络中最大的模型之一 [32, 47, 15, 62],但它的参数数量(44M)仍然低于图像分类中的小型网络,例如 Swin-S [24] (50M)、ConNeXt-S [27] (50M) 和 ViT-B [9] (87M),远非它们的大型变体,包括 Swin-L (197M)、ConvNeXt-XL (350M) , 和 ViT-L (305M)。

在这项工作中,我们没有进一步推动模型大小,主要是由于点云数据集的规模较小,与其较大的图像对应物(如 ImageNet [7])相比。 此外,我们的工作仅限于现有模块,因为重点不是引入新的架构更改。



版权声明:本文为qq_45228845原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。