在过去的 5 年中,3D 深度学习方法已经从使用三维数据的派生表示(二维投影)转变为直接使用原始数据(点云)。而在方法上也从将二维卷积神经网络应用到三维数据上转变为专门为三维场景设计的方法,这大大提高了物体分类和语义分割等任务的性能。这些结果非常有前景,它们证明了通过三维技术观察和表示这个世界是有价值的。然而,这个领域才刚刚步入发展的快车道。

想象一下,如果你正在建造一辆自动驾驶汽车,它需要了解周围的环境。为了安全行驶,你的汽车该如何感知行人、骑车的人以及周围其它的车辆呢?你可能会想到用一个摄像头来满足这些需求,但实际上,这种做法似乎效果并不好:你面对的是一个三维的环境,相机拍摄会使你把它「压缩」成二维的图像,但最后你需要将二维图像恢复成真正关心的三维图像(比如你前方的行人或车辆与你的距离)。在相机将周围的三维场景压缩成二维图像的过程中,你会丢掉很多最重要的信息。试图恢复这些信息是很困难的,即使我们使用最先进的算法也很容易出错。

相反,用三维数据来增强对世界的二维视图是非常好的做法。与其试着从一张二维图像中估计你和行人或其它车辆的距离,你不如通过传感器直接对这些物体进行定位。但是,这样做又会使感知的工作变得十分困难。如何在三维数据中识别人、骑车者和汽车这样的目标呢?传统的像卷积神经网络(CNN)这样的深度学习技术,能够使在二维图像中识别这些目标变得简单而直接,但是它们也需要进行一些调整从而适应在三维环境下的工作。幸运的是,三维感知问题在过去的几年中已经被人们广泛研究,我们在本文中的任务就是对这项工作进行一个简要的概述。

具体来说,我们将关注最近的三维目标分类和语义分割的深度学习技术。我们将首先回顾一些获取和表示三维数据的常用方法的背景。接着,我们将介绍三种不同的表示三维数据的基本深度学习方法,最后,我们将介绍未来有前景的新研究方向,并且从我们的视角总结该领域未来的走向。

我们如何获取并表示三维数据?

显然,我们需要能够直接在三维空间进行操作的计算机视觉方法,但是这向我们提出了三个明确的挑战:感知、表示和理解三维数据。

感知

获取三维数据的过程是复杂的。虽然二维摄像头既便宜又随处可见,但是三维感知通常需要专用的硬件设备。

Stereo vision 需要使用多个摄像头,测量感知目标的位置变化,从而计算深度信息。(来源:爱丁堡大学)

1:立体视觉系统 Stero 需要在相对于待测物体特定的一些位置固定两个或多个摄像头,并且利用这样设定的结构获取不同场景下的图像,匹配相应的像素点,计算每个像素点对应的位置在不同的图像间的差异,从而计算出该像素点在三维空间中的位置。人类大致上就是像这样感知这个世界的。我们的眼睛会捕捉到两个独立的对于关于我们眼前世界的「图像」,接着大脑会从左眼和右眼的视角来看某个物体的位置有何不同,从而确定其三维位置。Stero 涉及到的硬件系统十分简单,这正是它吸引人的地方,它仅仅需要两个或多个普通的摄像头。然而,这种方法在对准确率和运行速度有要求的应用程序中表现并不好,这是因为使用视觉细节来匹配不同的摄像头得到的图像之间对应的像素点不仅具有很高的计算复杂度,而且在缺乏纹理特征或视觉重复的环境中也很容易出错。

RGB-D 摄像头输出一个四通道图像,该图像包含颜色信息和每个像素的深度(来源:九州大学)

2:RGB-D 涉及到对一种特殊摄像头的使用,这种摄像头除了颜色信息(「RGB」),还可以获取深度信息(「D」)。具体而言,它能够获取通过普通的二维摄像头得到的彩色图像,而且还能告诉你这些图像中像素点的某些子集代表的物体离摄像头有多远。在系统内部,RGB-D 传感器要么通过「结构光」技术工作,要么通过「飞行时间法」(TOF)工作。「结构光」技术能够将红外线图案投射到一个场景上,并且感知这种图案是如何在几何表面上变形的;「飞行时间法」会观察其发出的红外线返回摄像头所需要的时间。举例来说,微软的 Kinect 以及 Iphone X 的 FaceID 传感器都是 RGB-D 摄像头。由于这些传感器在尺寸相对较小、成本较低的同时,也能在对视觉匹配错误具有免疫性的同时很快地运行,所以 RGB-D 是一种很好的感知手段。然而,RGB-D 摄像头的深度输出常常有许多的「孔洞」,这是由于遮挡(前景中的物体遮挡住了其后方物体的投影),模式感知失败以及感知范围的问题(在离摄像头更远的地方,投影和感知会变得很困难)。

激光雷达(LiDAR)使用多个激光束(同心圆模式)直接感知环境的集合结构(Giphy)。

3:激光雷达会向物体发出快速激光脉冲,测量它们返回传感器所需要的时间,这类似于我们在上面描述的「飞行时间法」,但是激光雷达的感知范围更远,能够捕获更多像点,并且抗其它光源干扰的能力更强。目前,大多数的三维激光雷达传感器都会发出一些(多达 64 个)垂直排列的光束,会在传感器周围的各个方向上快速旋转。出于对准确性、感知范围以及鲁棒性的要求,目前大多数的自动驾驶汽车都会采用这种系统。但是激光雷达传感器存在的问题是,它们通常都很大很重并且极其昂贵(大多数自动驾驶汽车使用的 64 束传感器需要花费 7.5 万美元)!因此,许多公司目前正在尝试开发更加廉价的「固态激光雷达」系统,它无需旋转就可以在三维场景下进行感知。

三维表示

一旦你获取了三维数据,你就需要以一种形式来表示它,这种形式将作为你正在构建的处理流程的输入。以下是四种你应该已经知道的表示方式:

三维数据的不同表示方式。(a)点云(来源:加州理工学院);(b)体素网格(来源:印度理工学院);(c)三角网格(来源:华盛顿大学);(d)多视角表示(来源:斯坦福大学)。

a. 点云即三维空间中点的集合;每一点都是由某个(xyz)位置决定的,我们同时可以为其指定其它的属性(如 RGB 颜色)。它们是激光雷达数据被获取时的原始形式,立体视觉系统和 RGB-D 数据(包含标有每个像素点深度值的图像)通常在进行进一步处理之前会被转换成点云。

b. 体素网格是从点云发展而来的。「体素(Voxel)」就好比三维空间中的像素点,我们可以把体素网格看作量化的、大小固定的点云。然而,点云在空间中的任何地方能够以浮点像素坐标的形式涵盖无数个点;体素网格则是一种三维网格,其中的每个单元(或称「体素」)都有固定的大小和离散的坐标。

c. 多边形网格由一组带公共顶点的凸多边形表面组成,可近似一个几何表面。我们可以将点云看作是从基础的连续集合表面采样得到的三维点集;多边形网格则希望通过一种易于渲染的方式来表示这些基础表面。尽管多边形网格最初是为计算机图形学设计的,但它对于三维视觉也十分有用。我们可以通过几种不同的方法从点云中得到多边形网格,其中包括 Kazhdan 等人于 2006 年提出的「泊松表面重建法」。

d. 多视图表示是从不同的模拟视角(「虚拟摄像头」)获取到的渲染后的多边形网格二维图像集合,从而通过一种简单的方式表现三维几何结构。简单地从多个摄像头(如立体视觉系统 stereo)捕捉图像和构建多视图表示之间的区别在于,多视图实际上需要构建一个完整的 3D 模型,并从多个任意视点渲染它,以充分表达底层几何结构。与上面的其他三种表示不同,多视图表示通常只用于将 3D 数据转换为易于处理或可视化的格式。

理解

现在,你已经将你的三维数据转化成了易于理解的形式,你需要做的是真正构建一个计算机视觉处理流程来理解它。这里的问题在于,传统的在二维图像上性能良好的深度学习技术(如 CNN)在处理三维数据时可能会很困难,具体情况取决于数据的表示。这使得传统的如目标检测或图像分割等任务变得具有挑战性。

通过多视图输入学习

使用三维数据的多视图表示是将二维深度学习技术应用到三维场景下的最简单的方式。这是一种将三维感知问题转化为二维感知问题的明智做法,但它仍然在某种程度上允许你对物体的三维几何结构进行推理。早期的利用这种思想的基于深度学习的工作是 Su 等人在 2015 年提出的 multi-view CNN。

这是一种简单却十分有效的网络架构,它可以从三维物体的多个二维视图中学到特征描述符。实现这种方法与对目标分类任务使用单个二维图像相比,提高了模型的性能。这种方法通过将一张张图像输入在 ImageNet 上预训练好的 VGG 网络,从而提取出显著的特征、将这些结果向量组合在一起,并且将这些信息传递给其余的卷积层进行进一步的特征学习得以实现。

multi-view CNN 架构(来源:multi-view CNN)

然而,multi-view 图像表示仍然有很多的局限性。主要的问题是你并没有真正在三维环境下学习,固定数量的二维视图仍然只是一个对于底层的三维结构的不完美的近似。因此,像语义分割这样的任务,特别是在跨越更复杂的物体和场景时,就会因为从二维图像中获得的特征信息有限而变得具有挑战性。此外,这种可视化三维数据对于像自动驾驶和虚拟现实这样计算开销非常大的任务来说是不可扩展的。请记住,生成多视图表示需要渲染一个完整的三维模型并且模拟一些任意的视点。多视图学习仍然有许多缺陷,这些缺陷促使人们研究直接利用三维数据进行学习的方法。

通过体积式表示学习

https://v.qq.com/x/page/r0784nbxr4s.html

通过体素网格进行学习可以解决多视图表示的主要缺点。体素网格缩小了二维和三维之间的差距,它们是最接近图像的三维表示形式,这使得二维深度学习的概念(比如卷积操作)能够容易地应用于三维情景。

Maturana 和 Scherer 在 2015 年提出的 VoxNet(2015)是最早在给定体素网格输入的情况下在物体分类任务上取得优异表现的深度学习方法。VoxNet 使用的是概率占用网格,其中的每个体素都包含了该体素在空间中被占用的概率。这样做的一个好处就是,它允许网络区分已知是自由的体素(例如,激光雷达光束经过的体素)和占用情况未知的体素(例如,激光雷达击中位置后方的体素)。

VoxNet 架构(来源:VoxNet)

VoxNet 的架构本身非常简单,它由两个卷积层、一个最大池化层和两个用于计算输出的类别得分向量的全连接层组成。这个网络比最先进的图像分类网络要浅得多,参数也少得多,但是它是从上百种可能的卷积神经网络架构中挑选出来的。由于体素网格与图像十分相似,它们实际上使用的带步长的卷积和池化运算都是从二维像素的工作方式进行调整迁移到三维体素上来的。卷积算子使用的是 d×d×d×c 的卷积核而不是二维卷积神经网络中使用的 d×d×c,池化运算考虑的是不重叠的三维体素块而不是二维像素块。

VoxNet 存在的一个问题是,该架构本质上并没有旋转不变性,尽管作者合理地假设传感器保持直立,使体素网格的 z 轴和重力方向保持一致,但是并没有假设物体会绕着 z 轴旋转:一个物体从背后看仍然对应相同的物体,即使在体素网格中的几何形状与我们所学的卷积核有很大的不同。为了解决这个问题,他们使用了一个简单的数据增强策略。在训练中,他们多次对每个体素网格进行旋转,并且在所得到的副本上进行训练;接着在测试时,他们将最后的全连接层在输入的不同方向上得到的输出进行池化。他们指出,这种方法比 Su 等人使用的多视图 CNN 在「视图池化」步骤中所做的对中间卷积层输出进行池化的方法能更快收敛。通过这种方式,VoxNet 通过在输入的体素网格的不同旋转方向上共享相同的学到的卷积核权值来学习这种旋转不变性。

VoxNet 代表着我们向真正的三维学习迈进了一大步,但是体素网格仍然具有一些缺点。首先,与点云相比,它们丢失了分辨率。因为如果代表复杂结构的不同点距离很近,它们会被被绑定在同一个体素中。与此同时,与稀疏环境中的点云相比,体素网格可能导致不必要的高内存使用率。这是因为它们主动消耗内存来表示自由和未知的空间,而点云只包含已知点。

通过点云学习

PointNet

考虑到这些使用基于体素的方法存在的问题,近期的工作将重点放在了直接在原始点云数据上进行操作的架构上。最值得人们注意的是 Qi 等人于 2016 年提出的 PointNet 是最早的处理这种不规则三维数据的方法。然而,正如作者所指出的,点云仅仅是一组通过 xyz 坐标表示位置的点。更具体地说,当我们给定点云中的 N 个点,网络需要学到相对于这 N 个输入点的全排列不变的唯一特征,因为这些输入给神经网络的点的顺序并不会影响底层的几何形状。此外,网络应该对点云的旋转、平移等转换有很强的鲁棒性,而放缩操作也不应该影响预测结果。

为了保证对于不同的输入顺序的不变性,PointNet 背后的解决方案的关键思路是使用一个简单的对称函数,该函数为任意顺序排列的输入生成一致的输出(加法和乘法就属于这类函数)。在这种直觉的引导下,PointNet 背后的基本架构(称 PointNet Vanilla)可以定义为:

其中 f 是将输入点转换为 k 维向量的转换函数(用于物体分类)。该函数 f 可以近似表示为另一个存在的对称函数 g。在方程中,h 是一个多层感知机(MLP),它将单个输入点(以及它们相应的特征,如 xyz 位置、颜色、表面法线等)映射到更高维度的潜在空间。最大池化操作则会作为对称函数 g 起作用,它将学到的特征聚合为点云的全局描述符。这个单一特征向量会被传递给 另一个输出物体预测结果的多层感知机 γ。

为了应对学习对于点云的几何变换具有不变性的表示方式的挑战,PointNet 使用了一个称为 T-Net 的小型网络,它将仿射变换应用于输入点云。这个概念类似于 Jaderberg 等人于 2016 年提出的空间变换网络(https://arxiv.org/pdf/1506.02025.pdf),但是比它要简单得多,因为在这里不需要定义新的类型的层。T-Net 由可学习的参数组成,这些参数使 PointNet 能够将输入点云变换为一个固定的、规范的空间,从而确保整个网络对于即使是最细微的变化都具有很强的鲁棒性。

PointNet 的架构(来源:PointNet)

整体的 PointNet 架构继承了最基本的方法和 T-Net 以及多层感知机层,它们为点云创建特征表示。然而,除了物体分类之外,PointNet 还支持对物体和场景进行语义分割。为了实现这一点,该架构将来自最大池化对称函数的全局特征和将输入数据传递给一些多层感知机后学到的点特征相结合。通过将这两个向量连接起来,每个点都知道它的全局语义和局部特征,这使网络能够学习额外的、有助于分割的更有意义的特征。

使用 PointNet 得到的室内场景的语义分割结果(来源:PointNet)

PointNet++

尽管 PointNet 取得了令人满意的结果,其最主要的缺点是该架构不能获取点附近的底层局部结构,这一思想类似于使用 CNN 从图像中不断增大的感受野中提取特征,为了解决这个问题,Qi 等人于 2017 年开发了 PointNet ++。

它是一个从 PointNet 派生出来的架构,但是也能从点云的局部区域中学习到特征。这种方法的基本结构是一个有层次的特征学习层,它包含三个关键步骤:(1)为局部区域采样一些点作为质心,(2)根据到质心的距离对这些局部区域中的相邻点进行分组,(3)使用一个 mini-PointNet 对这些区域进行特征编码。

这些步骤将被不断重复,从而在点云中不同大小的点组中学习特征。这样做可以使网络更好地理解整个点云的局部点集中的底层关系,最终有助于提升泛化性能。这项工作的结果表明,PointNet++ 相对于包括 PointNet 在内的现有方法的性能有显著提升,并且在三维点云分析基准测试(ModelNet40 和 ShapeNet)中取得了目前最好的模型性能。

有前景的新研究领域

Graph CNNs

目前关于处理三维数据的深度学习架构的研究主要关注点云表示,而最近许多的工作扩展了从 PointNet/PointNet++ 发展而来的思想,从其它领域获得灵感,进一步提高了模型性能。举例而言,Wang 等人于 2018 年提出的动态图卷积神经网络(https://arxiv.org/pdf/1801.07829.pdf),使用了基于图形的深度学习方法来改进点云中的特征提取工作。其思想是,PointNet 和 PointNet++ 不能捕获各个点之间的几何关系,因为这些方法需要对不同的输入顺序的排列组合保持不变性。然而,通过将一个点和它周围最近的邻居作为一个有向图来考虑,Wang 等人构建了 EdgeConv 算子,它能够生成数据中各点独特的特征。如果你有兴趣学习更多关于图结构上的机器学习的知识,可以参阅这篇概述:https://thegradient.pub/structure-learning/

SPLATNet

SPLATNet 架构(来源:SPLATNet)

另一方面,一些研究不同于 PointNet/PointNet++ 中提出的经典特征提取方法,选择设计一种新的点云处理方法。Su 等人于 2018 年提出的 SPLATNet 架构是点云研究领域这个新的研究热点的很好例子。SPLATNet 的作者设计了一个新的架构和卷积算子,它可以对点云直接进行操作。这篇论文背后的关键思想是将「感受野」的概念转换为了不规则点云,这使得空间信息即使在稀疏区域(PointNet/PointNet++ 的一个主要缺陷)中也可以保持。特别吸引人的一点是,SPLATNet 可以将从多视图图像中提取的特征投影到三维空间中,将二维数据与原始点云以一种端到端的可学习的架构进行融合。SPLATNet 通过使用这种二维-三维联合学习取得了目前最好的语义分割模型性能。

基于截椎体的 PointNet

利用二维边界框估计生成的三维截椎体可视化结果(来源:Frustum PointNets)

基于同时使用二维数据和三维数据的思路,Qi 等人的 Frustrum PointNet 于 2017 年提出了一种将 RGB 图像和点云融合从而提高在大型三维场景中定位物体的新方法。传统的解决该任务的方法是通过直接在整个点云上的滑动窗口上执行分类来确定物体可能的三维边界框,这样做的计算开销非常大,并且很难进行实时预测。Qi 等人的工作有两个主要的贡献。首先,他们建议首先使用标准的卷积神经网络在二维图像上进行物体检测,提取出一个与待检测的物体可能从属点云区域相对应的三维边界框,然后在点云的这个「切片」上进行搜索。这大大缩小了边界框估计的搜索空间,减少了检测错误的可能性,在很大程度上简化了处理流程,这对自动驾驶应用十分关键。其次,Qi 等人设计了一种新颖的基于 PointNet 的架构,它可以直接对实例进行分割(将点云分割为一个个独立的物体),并一次性地在整个三维边界框中进行边界框估计,而不是在边界框搜索过程中执行经典的滑动窗口分类工作。这使得他们的方法对遮挡和稀疏等情况即迅速又鲁棒。最终,由于这些改进,这项工作发布时,它在 KITTI 以及 SUN RGB-D 检测等对比基准上比之前所有的方法都取得了更好的性能。

结语

在过去的 5 年中,3D 深度学习方法已经从使用三维数据的派生表示(多视图表示)转变为使用原始数据(点云)。在这个过程中,我们采用的方法已经从简单地将二维卷积神经网络应用到三维数据上(多视图卷积神经网络、体素网络 VoxNet)转变为专门为三维场景设计的方法(PointNet 以及其它基于点云的方法),这大大提高了物体分类和语义分割等任务的性能。这些结果非常有前景,因为它们证明了通过三维技术观察和表示这个世界是有价值的。然而,这个领域才刚刚步入发展的快车道。当前的工作不仅要着眼于提高这些算法的准确率和性能,还要确保鲁棒性和可扩展性。尽管目前大多数研究是由无人驾驶应用驱动的,但直接在点云上运行的新方法在三维医学影像、虚拟现实和室内地图中也将发挥重要的作用。

本文转自“机器之心” :https://www.jiqizhixin.com/articles/091203

原文链接:https://thegradient.pub/beyond-the-pixel-plane-sensing-and-learning-in-3d/

很好的3D深度学习的总结——超越像素平面:聚焦3D深度学习的现在和未来相关推荐

  1. 3D深度学习总结(聚焦3D深度学习的现在于未来)

    3D深度学习总结(聚焦3D深度学习的现在于未来) 本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载 选自The gradient[点击此处],作者:Mihir Gar ...

  2. 深度学习不是万灵药!神经网络3D重建只是图像分类

    https://www.toutiao.com/a6703122083485843972/ 2019-06-16 21:37:09 [新智元导读]随着深度学习的大热,许多研究都致力于如何从单张图片生成 ...

  3. 《强化学习周刊》第39期:近似最优深度、多智能体广义、角色动画强化学习...

    No.39 智源社区 强化学习组 强 化 学  习 研究 观点 资源 活动 周刊订阅 告诉大家一个好消息,<强化学习周刊>已经开启"订阅功能",以后我们会向您自动推送最 ...

  4. Ubuntu16.04 ROS 深度学习_传智播客 智能机器人软件开发 学习路线图出炉!首发优惠!!...

    黑马程序员 微信号:heiniu526 传智播客旗下互联网资讯,学习资源免费分享平台 智能机器人软件工程师学习计划 很多朋友对机器人软件开发和人工智能感兴趣,不知道怎么学习,传智播客武汉校区在今年3月 ...

  5. 【论文阅读】Learning Traffic as Images: A Deep Convolutional ... [将交通作为图像学习: 用于大规模交通网络速度预测的深度卷积神经网络](1)

    [论文阅读]Learning Traffic as Images: A Deep Convolutional Neural Network for Large-Scale Transportation ...

  6. python深度学习include框架_《用Python实现深度学习框架》上市

    朋友们,<用Python实现深度学习框架>已经由人民邮电出版社出版上市了.在这本书中,我们带领读者仅用Python+Numpy实现一个基于计算图的深度学习框架MatrixSlow.本书讲解 ...

  7. 基于python的深度学习框架有_《用Python实现深度学习框架》上市

    朋友们,<用Python实现深度学习框架>已经由人民邮电出版社出版上市了.在这本书中,我们带领读者仅用Python+Numpy实现一个基于计算图的深度学习框架MatrixSlow.本书讲解 ...

  8. SLAM学习笔记(十九)开源3D激光SLAM总结大全——Cartographer3D,LOAM,Lego-LOAM,LIO-SAM,LVI-SAM,Livox-LOAM的原理解析及区别

    本文为我在浙江省北大信研院-智能计算中心-情感智能机器人实验室-科技委员会所做的一个分享汇报,现在我把它搬运到博客中. 由于参与分享汇报的同事有许多是做其他方向的机器人工程师(包括硬件.控制等各方面并 ...

  9. 《强化学习周刊》第39期:近似最优深度、多智能体广义、角色动画强化学习

    文章转载|智源社区 本期贡献者|李明.刘青.小胖 关于周刊 强化学习作为人工智能领域研究热点之一,其研究进展与成果也引发了众多关注.为帮助研究与工程人员了解该领域的相关进展和资讯,智源社区结合领域内容 ...

最新文章

  1. 【匹配算法】渐进一致采样 PROSAC(PROgressive SAmple Consensus)
  2. [企业化NET]Window Server 2008 R2[1]-服务器基本安装即问题解决记录
  3. 2020计算机考研准备,2020考研:什么时候开始准备考研最合适?
  4. C语言程序流程设计之跳转【程序流程设计】(14)
  5. SAP UI5 应用开发教程之三十八 - 使用 Chrome 开发者工具查看程序执行出错时的上下文信息
  6. Mybatis学习笔记(一) —— mybatis介绍
  7. 音量放大器--软件实现
  8. 【Win10】使用“Windows照片查看器”查看照片
  9. c语言相反数补码,求一个数的相反数的补码
  10. 网站SEO的七个技巧
  11. 2、趋势科技2017校招开发岗试题
  12. STATA如何进行斯皮尔曼检验
  13. 小说形象特征包括哪些方面_小说的基本特征是塑造人物形象
  14. JS高级 之 深入浏览器的渲染原理
  15. 冷启动问题——协同过滤(推荐系统)
  16. 【数据结构】链表(含链式前向星)
  17. 网络安全将是未来10年里面的黄金产业
  18. 2022-2028全球与中国DevOps工具市场现状及未来发展趋势
  19. Tomcat 10 调用Servlet提示 500 实例化Servlet类异常
  20. C语言基础——sizeof的用法总结

热门文章

  1. 基本ROP之ret2libc2
  2. 2022高教社杯 国赛数学建模 D题思路
  3. R语言list.files
  4. Xshell下载激活使用心得
  5. matlab imshow 全屏不留边的方法
  6. Excel使用vba高亮文本关键词
  7. 2023最新泛站群系统
  8. RFID相关原理知识及RFID应用领域详细介绍
  9. AndroidStudio-NDK-r14b开发环境搭建
  10. 服务器常见故障判断与维修(上)