作者
Christian Szegedy (Google Inc.)
Wei Liu(University of North Carolina, Chapel Hill)
Yangqing Jia(Google Inc.)
Pierre Sermanet(Google Inc.)
Scott Reed(University of Michigan)
Dragomir Anguelov(Google Inc.)
Dumitru Erhan(Google Inc.)
Vincent Vanhoucke(Google Inc.)
Andrew Rabinovich(Google Inc.)
摘要
我们提出了一种代号为Inception的深度卷积神经网络体系结构,该体系结构负责为ImageNet大规模视觉识别挑战赛2014(ILSVRC14)设置分类和检测的最新技术水平。 该体系结构的主要特点是网络内部计算资源的利用率得到提高。 这是通过精心设计的设计实现的,该设计允许在保持计算预算不变的情况下增加网络的深度和宽度。 为了优化质量,架构决策基于Hebbian原则和多尺度处理的直觉。 在我们提交的ILSVRC14中使用的一种特定化身叫GoogLeNet,它是一个22层深的网络,其质量在分类和检测的背景下进行评估。
1. 引言
在过去的三年中,主要是由于深度学习的进步,更具体地是卷积网络的发展,图像识别和对象检测的质量一直在飞速发展。一个令人鼓舞的消息是,这种进步的大部分不只是功能更强大的硬件,更大的数据集和更大的模型的结果,而且主要是新思想,算法和改进的网络体系结构的结果。除了用于检测目的的相同竞赛的分类数据集以外,例如,ILSVRC 2014竞赛的前几位均未使用新的数据源。实际上,我们向ILSVRC 2014提交的GoogLeNet提交的参数实际上比两年前Krizhevsky等人的获奖架构少了12倍,但准确性却大大提高了。在对象检测中最大的收获不是来自单独使用深度网络或更大的模型,而是来自深度架构与经典计算机视觉的协同作用,例如Girshick等人的R-CNN算法。
另一个值得注意的因素是,随着移动和嵌入式计算的不断发展,我们算法的效率,尤其是其功能和内存使用,变得越来越重要。 值得注意的是,导致本文设计的深层体系结构的考虑因素包括此因素,而不是单纯地将精度数字固定下来。 对于大多数实验,这些模型的设计目的是在推理时保持15亿次乘法运算的计算预算,这样它们就不会成为纯粹的学术好奇心,而是可以在现实世界中使用,甚至 在大型数据集上,价格合理。
在本文中,我们将专注于代号为Inception的高效的用于计算机视觉的深度神经网络架构,该架构的名称来自Lin等人在网络论文中的网络以及著名的“我们需要更深入”的网络模因。 在我们的案例中,“深度”一词有两种不同的含义:首先,在某种意义上,我们以“初始模块”的形式引入了新的组织层次,在更直接的意义上是网络的增加 深度。 通常,人们可以将Inception模型视为[12]的逻辑高潮,同时可以从Arora等人的理论工作中获得启发和指导。 该架构的优势在ILSVRC 2014分类和检测挑战中得到了实验验证,在此方面其性能明显优于现有技术。
2. 相关工作
从LeNet-5开始,卷积神经网络(CNN)通常具有标准结构-堆叠的卷积层(可选地,其后进行对比度归一化和最大合并),然后是一个或多个完全连接的层。 这种基本设计的变体在图像分类文献中很普遍,并且迄今为止在MNIST,CIFAR以及ImageNet分类挑战方面都取得了最佳结果。 对于较大的数据集,例如Imagenet,最近的趋势是增加层数和层大小,同时使用辍学解决过拟合的问题。
尽管担心最大池化层会导致丢失准确的空间信息,但与[9]相同的卷积网络体系结构也已成功用于定位,目标检测和人体姿态估计。 受灵长类动物视觉皮层神经科学模型的启发,Sereetal使用一系列不同大小的固定Gabor滤镜,以处理多个尺度,类似于Inception模型。 但是,与文献[15]的固定2层深度模型相反,学习了Inception模型中的所有滤波器。 此外,在Inception层中重复了很多次,在GoogLeNet模型的情况下,导致了22层深度模型。
网络中网络是Lin等人为了提高神经网络的表示能力而提出的一种方法。 当应用于卷积层时,该方法可以看作是附加的1×1卷积层,然后通常是经过整流的线性激活。 这使它可以轻松集成到当前的CNN管道中。 我们在架构中大量使用了这种方法。 但是,在我们的设置中,1×1卷积具有双重目的:最关键的是,它们主要用作降维模块以消除计算瓶颈,否则将限制我们网络的规模。 这不仅增加了网络的深度,而且还增加了网络的宽度,而不会造成明显的性能损失。
当前用于对象检测的领先方法是Girshick等人提出的具有卷积神经网络的区域(R-CNN)。R-CNN将整个检测问题分解为两个子问题:首先以与类别无关的方式将低级提示(例如颜色和超像素一致性)用于潜在的对象建议,然后使用CNN分类器在那些位置识别对象类别。 这种两阶段方法利用了具有低级提示的包围盒分割的准确性以及最新的CNN的强大分类能力。 我们在检测提交中采用了类似的流程,但是在两个阶段都进行了改进,例如针对更高的对象边界框召回率的多框预测,以及对边界框建议进行更好分类的集成方法。
3. 动机和高层的考虑
改善深度神经网络性能的最直接方法是增加其大小。 这包括增加网络的深度(级别数)和网络宽度:每个级别的单元数。 这是训练高质量模型的一种简单而安全的方法,特别是考虑到有大量标记的训练数据的可用性。 但是,这种简单的解决方案具有两个主要缺点。
较大的尺寸通常意味着大量的参数,这使得扩大的网络更容易过度拟合,尤其是在训练集中标记的示例数量有限的情况下。 这可能会成为主要瓶颈,因为创建高质量的培训集可能会非常棘手且昂贵,尤其是如果需要专家级评估人员来区分像ImageNet(甚至是1000级ILSVRC子集)中的细粒度视觉类别时,尤其如此,如图1所示。
图1. ILSVRC 2014分类挑战的1000个类别中的两个不同类别
统一增加网络大小的另一个缺点是计算资源的使用急剧增加。 例如,在深度视觉网络中,如果将两个卷积层链接在一起,则其滤镜数量的任何均匀增加都会导致计算量的平方增加。 如果增加的容量使用效率不高(例如,如果大多数权重最终接近于零),则会浪费大量计算量。 由于在实践中计算预算始终是有限的,因此即使主要目的是提高结果的质量,也要有效分配计算资源,而不是随意增加大小。
解决这两个问题的根本方法是最终从完全连接的架构过渡到稀疏的连接架构,甚至在卷积内部也是如此。 除了模仿生物系统之外,由于Arora等人的开创性工作,这还将具有更牢固的理论基础的优势。 他们的主要结果表明,如果数据集的概率分布可以由大型的,非常稀疏的深度神经网络表示,则可以通过分析最后一层的激活的相关统计量,逐层构建最佳网络拓扑。 聚集具有高度相关输出的神经元。 尽管严格的数学证明需要非常严格的条件,但这一陈述与众所周知的赫比原理(即将神经元一起发射,连接在一起)相呼应的事实表明,即使在不太严格的条件下,实际上也可以应用基本思想。
不利的一面是,今天的计算基础架构在对非均匀稀疏数据结构进行数值计算时效率很低。即使算术运算的数量减少了100倍,查找和缓存未命中的开销仍然占主导地位,以至于切换到稀疏矩阵都不会奏效。通过使用稳定改进的,经过高度调整的数值库,利用底层CPU或GPU硬件的微小细节,可以实现极为快速的密集矩阵乘法,从而进一步拉大了差距。而且,非均匀的稀疏模型需要更复杂的工程和计算基础结构。当前大多数面向视觉的机器学习系统仅通过使用卷积就在空间域中利用稀疏性。但是,卷积被实现为到较早层中补丁的密集连接的集合。自从[11]以来,ConvNets就一直在特征维度上使用随机和稀疏的连接表,以打破对称性并改善学习,[9]则将趋势改回完全连接,以便更好地优化并行计算。结构的均匀性和大量的过滤器以及更大的批处理大小允许利用有效的密集计算。
这就提出了一个问题,即下一步是否有希望:一种架构,如理论所建议的那样,利用了额外的稀疏性,即使在滤波器级别,也是如此,但是通过利用密集矩阵的计算来利用我们当前的硬件。 有关稀疏矩阵计算的大量文献(例如[3])表明,将稀疏矩阵聚类为相对密集的子矩阵往往会为稀疏矩阵乘法提供最新的实用性能。 认为不久的将来,类似的方法将用于非均匀深度学习架构的自动化构建似乎并不为过。
Inception架构最初是作为第一作者的案例研究来评估复杂网络拓扑构造算法的假设输出的,该算法试图逼近[2]所暗示的视觉网络的稀疏结构,并通过密集,易于获得的方法覆盖了假设的结果 组件。 尽管这是一个高度投机的工作,但仅在对拓扑的确切选择进行两次迭代之后,我们已经可以基于[12]相对于参考架构看到适度的收益。 在进一步调整学习率,超参数和改进的训练方法之后,我们确定了所得的Inception体系结构在定位和对象检测(作为[6]和[5]的基础网络)中特别有用。 有趣的是,尽管大多数原始建筑选择都经过了充分的质疑和测试,但事实证明它们至少是局部最优的。
但是,必须谨慎:尽管所提出的体系结构已经成功地实现了计算机视觉,但它的质量是否可以归因于导致其构建的指导原则仍然值得怀疑。 确保将需要进行更彻底的分析和验证:例如,如果基于下述原理的自动化工具会为视觉网络找到相似但更好的拓扑结构。 最有说服力的证据是,如果一个自动化系统会创建网络拓扑,从而使用相同的算法但在全局架构上看起来却大不相同,从而在其他域中获得相似的收益。 至少,Inception架构的初步成功为在此方向上激动人心的未来工作提供了坚定的动力。
4. 体系结构细节
Inception体系结构的主要思想是基于找出卷积视觉网络中最佳局部稀疏结构的近似值,并通过易于使用的密集组件来对其进行覆盖。请注意,假设平移不变意味着我们的网络将由卷积构建块构建。我们所需要的只是找到最佳的局部构造并在空间上进行重复。 Arora等人建议进行逐层构造,其中应分析最后一层的相关统计量,并将它们统计到具有高相关性的单元组中。这些群集形成下一层的单元,并连接到上一层的单元。我们假设来自较早层的每个单元对应于输入图像的某些区域,并且这些单元被分组为滤镜组。在较低的层(靠近输入层),相关单元将集中在局部区域。这意味着,我们最终将有很多簇集中在一个区域中,并且可以在下一层中用1×1卷积层覆盖它们,如[12]中所建议。但是,人们也可以预期,在空间上更分散的群集数量会更少,而较大的斑块上的卷积可以覆盖这些簇,并且在越来越大的区域上,斑块的数量将会减少。为了避免补丁对齐问题,Inception体系结构的当前化身被限制为1×1、3×3和5×5的过滤器大小,但是该决定更多地基于便利性而不是必要性。这也意味着建议的体系结构是所有这些层的组合,它们的输出滤波器组被串联到单个输出矢量中,形成下一级的输入。另外,由于池化操作对于在当前最先进的卷积网络中取得成功至关重要,因此建议在每个这样的阶段添加替代并行池化路径也应具有额外的有益效果(见图2(a))。
由于这些“ Inception模块”彼此堆叠,因此它们的输出相关性统计数据必然会发生变化:随着更高层捕获更高抽象度的特征,预计它们的空间集中度会降低,表明3×3与 随着我们移到更高的层,5×5卷积应该增加。
至少以这种幼稚的形式,上述模块的一个大问题是,即使是适度的5×5卷积,在具有大量过滤器的卷积层之上也可能是非常昂贵的。 一旦将池单元添加到混合中,此问题将变得更加明显:它们的输出过滤器数量等于上一阶段的过滤器数量。 合并层的输出与卷积层的输出的合并将导致不可避免地增加每个阶段的输出数量。 即使此体系结构可能涵盖了最佳的稀疏结构,它也会非常低效地进行处理,从而导致在几个阶段内出现计算爆炸。
图2. Inception模块
这导致了所提出的体系结构的第二个想法:明智地在任何情况下如果计算需求会增加太多的地方应用降维和投影。 这是基于嵌入的成功:即使是低维的嵌入也可能包含许多有关较大图像补丁的信息。 但是,嵌入以密集,压缩的形式表示信息,并且压缩的信息很难建模。 我们想在大多数地方保持表示稀疏(根据[2]的条件要求),并且仅在必须将它们汇总时才压缩信号。 也就是说,在昂贵的3×3和5×5卷积之前,使用1×1卷积来计算减少量。 除了用作减少量外,它们还包括使用整流线性激活,使其具有双重用途。 最终结果如图2(b)所示。
通常,Inception网络是由彼此堆叠的上述类型的模块组成的网络,偶尔具有最大步距为2的最大池化层,以将网格的分辨率减半。 由于技术原因(训练过程中的内存效率),似乎仅在较高的层开始使用Inception模块,而以传统的卷积方式保留较低的层似乎是有益的。 这不是严格必要的,仅反映了我们当前实施中的一些基础设施效率低下。
该体系结构的主要优点之一是,它可以显着增加每个阶段的单元数,而不会导致计算复杂性的急剧增加。 普遍使用降维可将最后一级的大量输入滤波器屏蔽到下一层,首先缩小其尺寸,然后再以较大的补丁尺寸对它们进行卷积。 该设计的另一个实际有用的方面是,它与直觉一致,即视觉信息应在不同的比例下进行处理,然后进行汇总,以便下一阶段可以同时从不同的比例抽象特征。
改进的计算资源使用可以增加每个阶段的宽度以及阶段数,而不会引起计算困难。利用初始架构的另一种方法是创建稍逊一筹但在计算上更便宜的版本。我们发现,所有随附的旋钮和杠杆都可以实现计算资源的受控平衡,这可能导致网络的运行速度比具有非Inception架构的类似性能的网络快2-3倍,但是这时需要谨慎的手动设计。
5. GoogLeNet
在ILSVRC14比赛中,我们选择了GoogLeNet作为我们的团队名称。 此名称是对Yann LeCuns开拓性LeNet 5网络的致敬。 我们还使用GoogLeNet来指代我们提交的竞赛中使用的Inception体系结构的特定形式。 我们还使用了更深入,更广泛的Inception网络,其质量略逊一筹,但是将其添加到整体中似乎可以稍微改善结果。 我们省略了该网络的细节,因为我们的实验表明,确切的体系结构参数的影响相对较小。 此处,出于演示目的,表1中描述了最成功的特定实例(名为GoogLeNet)。 在我们的集成模型中,有7个模型中的6个使用了完全相同的拓扑(使用不同的采样方法进行训练)。
表1. Inception架构的GoogLeNet化身
所有卷积,包括Inception模块内部的那些卷积,均使用整流线性激活。 在我们的网络中,接收场的大小为224×224,采用RGB颜色通道(均值相减)。“#3×3缩小”和“#5×5缩小”表示在3×3和5×5卷积之前使用的缩小层中1×1滤波器的数量。在pool proj列中内置最大池之后,可以看到投影层中1×1滤镜的数量。所有这些缩小/投影层也都使用整流线性激活。
该网络在设计时就考虑到了计算效率和实用性,因此可以在包括计算资源有限(尤其是内存占用量少)的单个设备上运行推断。仅计算带参数的层时,网络深22层(如果我们也计算池,则网络为27层)。用于网络构建的层(独立构建块)的总数约为100。但是,此数目取决于所使用的机器学习基础结构系统。在分类器之前使用平均池基于[12],尽管我们的实现不同之处在于我们使用了额外的线性层。这使我们可以轻松地针对其他标签集调整和微调我们的网络,但这主要是方便,我们并不期望它会产生重大影响。已经发现,从完全连接的层过渡到平均池可将top-1准确性提高约0.6%,但是即使在删除完全连接的层之后,仍必须使用压降。
考虑到网络的深度相对较大,以有效方式将梯度传播回所有层的能力令人担忧。 一个有趣的见解是,相对较浅的网络在此任务上的强大性能表明,网络中间各层所产生的功能应非常有区别。 通过添加连接到这些中间层的辅助分类器,我们有望鼓励在分类器的较低级进行区分,增加被传播回的梯度信号,并提供其他正则化。 这些分类器采用较小的卷积网络的形式,位于Inception(4a)和(4d)模块的输出之上。 在训练过程中,它们的损失将以折扣权重添加到网络的总损失中(辅助分类器的损失加权为0.3)。 在推断时,这些辅助网络将被丢弃。
侧面的额外网络(包括辅助分类器)的确切结构如下:
- 平均池化层具有5×5的滤镜大小和3的步幅,导致(4a)的输出为4×4×512,(4d)的输出为4×4×528。
- 具有128个滤镜的1×1卷积,用于减小尺寸和校正线性激活。
- 具有1024个单位的完整连接层,并具有线性校正整流功能。
- 一个具有70%的下降输出比率的下降层。
- 一个具有softmax损失的线性层作为分类器(预测与主分类器相同的1000个分类,但在推理时将其删除)。
生成的网络的示意图如图3所示。
图3. GoogLeNet 网络结构
6. 训练方法
我们的网络使用DistBelief分布式机器学习系统进行了训练,该系统使用了少量模型和数据并行性。 尽管我们仅使用基于CPU的实现,但粗略估计表明,可以训练GoogLeNet网络在一周内使用很少的高端GPU进行融合,主要限制是内存使用率。 我们的训练使用具有0.9动量的异步随机梯度下降,固定的学习速率计划(每8个周期将学习速率降低4%)。Polyak平均用于创建推断时使用的最终模型。
我们的图像采样方法在进入竞争的几个月中已经发生了巨大变化,并且已经对融合模型进行了其他选择的训练,有时还结合了已更改的超参数(例如辍学率和学习率),因此很难给出最终的指导。训练这些网络的最有效的单一方法。使问题更加复杂的是,受[8]的启发,一些模型主要针对较小的相对作物进行了训练,而另一些则针对较大的相对作物进行了训练。尽管如此,一项经验证在比赛后效果很好的处方包括对各种尺寸的图像斑块进行采样,这些斑块的大小均匀分布在图像区域的8%和100%之间,并且长宽比在3/4和100之间随机选择。 4/3。此外,我们发现安德鲁·霍华德(Andrew Howard)的光度学失真在某种程度上有助于防止过度拟合。此外,我们开始使用随机插值方法(双线性,面积,最近邻和三次,具有相等的概率)来调整相对较晚的大小,并与其他超参数更改结合使用,因此我们无法确切确定最终结果是否受到以下因素的正影响他们的使用。
7. ILSVRC 2014分类挑战赛启动和结果
ILSVRC 2014分类挑战涉及将图像分类为Imagenet层次结构中1000个叶节点类别之一的任务。 大约有120万张图像用于训练,50,000张图像用于验证,100,000张图像用于测试。 每个图像都与一个地面真相类别相关联,并且根据得分最高的分类器预测来测量性能。 通常报告两个数字:前1个准确率,将基础真实性与第一个预测类进行比较;前5个错误率,将基础真实性与前5个预测类进行比较:图像被视为正确分类 如果基本事实位于前五名之中,则无论其排名如何。 挑战使用top-5错误率进行排名。
我们参加了挑战,没有用于培训的外部数据。 除了本文前面提到的训练技术外,我们在测试过程中采用了一系列技术来获得更高的性能,下面我们将对其进行详细说明。
- 我们独立训练了同一GoogLeNet模型的7个版本(包括一个更广泛的版本),并对其进行了整体预测。 这些模型以相同的初始化(即使是相同的初始权重,主要是由于疏忽而定)和学习速率策略进行了训练,并且它们的区别仅在于采样方法和它们看到输入图像的随机顺序。
- 在测试过程中,我们采用了比Krizhevsky等人更积极的耕作方法。 具体来说,我们将图像调整为4个比例,其中较短的尺寸(高度或宽度)分别为256、288、320和352,取这些调整后图像的左,中和右正方形(在纵向图像的情况下, 顶部,中央和底部正方形)。 然后,对于每个正方形,我们取4个角和中心的224×224作物,以及将正方形调整为224×224的大小以及它们的镜像版本。 这导致每个图像4×3×6×2 = 144个作物。 安德鲁·霍华德(Andrew Howard)在上一年的入学考试中使用了类似的方法,根据经验,我们证明该方法的效果比拟议的方案稍差。 我们注意到,在实际应用中,这种积极的种植可能不是必需的,因为在存在一定数量的农作物之后,更多农作物的收益就微不足道了(我们将在后面展示)。
- 将softmax概率在多个农作物和所有单个分类器上取平均,以获得最终预测。 在我们的实验中,我们分析了验证数据的替代方法,例如,对作物的最大池化和对分类器的平均化,但与简单的平均化相比,它们的性能较差。
在本文的其余部分,我们分析了影响最终提交书整体性能的多种因素。
我们在挑战赛中的最终提交在验证和测试数据上均获得6.67%的前5名错误,在其他参与者中排名第一。 与2012年的SuperVision方法相比,相对降低了56.5%,与上一年的最佳方法(Clarifai)相比,相对降低了约40%,这两种方法均使用外部数据来训练分类器。 下表显示了一些效果最好的方法的统计信息。
我们还通过改变下表中预测图像的型号和使用的农作物的数量来分析和报告多种测试选择的性能。 当我们使用一种模型时,我们在验证数据上选择了top-1错误率最低的模型。 所有数字均报告在验证数据集上,以免过度拟合测试数据统计信息。
表2. 分类性能
表3. GoogLeNet分类性能细分
8. ILSVRC 2014检测挑战赛启动和结果
ILSVRC检测任务是在200种可能的类别中的图像中的对象周围生成边界框。 如果检测到的对象与groundtruth的类别匹配并且其边界框至少重叠50%(使用Jaccard索引),则算为正确。 无关检测会被视为误报,并会受到处罚。 与分类任务相反,每个图像可能包含许多对象或不包含任何对象,并且其比例可能从大到小变化。 使用平均平均精度(mAP)报告结果。
表4. 检测性能
表5. 用于检测的单个模型性能
GoogLeNet用于检测的方法与[6]中的R-CNN相似,但是使用Inception模型作为区域分类器进行了扩充。此外,通过将“选择性搜索”方法与多框预测相结合以提高对象边界框召回率,可以改善区域建议步骤。为了减少误报的数量,超像素尺寸增加了2倍。这将来自选择性搜索算法的建议减半。我们增加了200个来自多框提案的区域提案,总计约占[6]使用的提案的60%,同时将覆盖范围从92%增加到93%。减少提案数量并增加覆盖范围的整体效果是,单个模型案例的平均平均精度提高了1%。最后,在对每个区域进行分类时,我们使用6个ConvNet的集合,将结果的准确度从40%提高到43.9%。请注意,与R-CNN相反,由于缺乏时间,我们没有使用边界框回归。
我们首先报告最高的检测结果,并显示自第一版检测任务以来的进度。 与2013年的结果相比,准确性几乎提高了一倍。 表现最好的团队都使用卷积网络。 我们在表4中报告了官方成绩以及每个团队的共同策略:使用外部数据,整体模型或上下文模型。 外部数据通常是用于预先训练模型的ILSVRC12分类数据,该模型随后将根据检测数据进行完善。 一些团队还提到了本地化数据的使用。 由于检测数据集中未包含很大一部分的本地化任务边界框,因此可以使用此数据对一般的边界框回归器进行预训练,就像使用分类进行预训练一样。 GoogLeNet条目未使用本地化数据进行预训练。
在表5中,我们仅使用单个模型比较结果。 表现最好的模型是Deep Insight提供的,令人惊讶的是,只有3个模型的组合才提高了0.3点,而GoogLeNet的组合则获得了明显更强的结果。
9. 结论
我们的结果似乎提供了有力的证据,即通过随时可用的密集构造块来近似预期的最佳稀疏结构是改善计算机视觉神经网络的可行方法。 与较浅和较不宽泛的网络相比,此方法的主要优点是在计算需求适度增加的情况下可显着提高质量。 还要注意,尽管我们既未利用上下文也未执行边界框回归,但我们的检测工作具有竞争优势,这一事实进一步证明了Inception体系结构的实力。 尽管可以预期,通过深度和宽度相近的昂贵得多的网络可以达到类似的结果质量,但是我们的方法得出的确凿证据表明,转向稀疏结构通常是可行且有用的想法。 这表明在[2]的基础上以自动化方式创建稀疏和更精细的结构的未来工作很有希望。
10. 致谢
我们要感谢Sanjeev Arora和Aditya Bhaskara对[2]的富有成果的讨论。 我们还要感谢DistBelief团队的支持,尤其是对Rajat Monga,Jon Shlens,Alex Krizhevsky,Jeff Dean,Ilya Sutskever和Andrea Frome的支持。 我们还要感谢Tom Duerig和Ning Ye在光度畸变方面的帮助。 同样,如果没有Chuck Rosenberg和Hartwig Adam的支持,我们的工作将是不可能的。
参考文献