查看原文
其他

使用机器学习从移动LiDAR点云中提取对象

GIS前沿 2022-12-04


本文作者:Dmitry Kudinov,Nick Giner。本文主要讲解利用机器学习从车载LiDAR点云提取矢量特征(建筑物、树木、红绿灯...)文章讲解的非常详细,作者Dmitry Kudinov为Esri Inc. 高级首席数据科学家,主要研究人工智能在遥感和交通领域的应用。本译文只是使用谷歌翻译而成,文章可能有错误语句及不通顺情况,所以仅供参考学习。有需要的可点击文末阅读原文跳转原文英文版。

今天我们将讨论移动点云,即安装在移动车辆上的 LiDAR 传感器收集的 3D 点,以及提取更高级别对象(矢量特征)的准确表示的实用工作流程,如树多边形或交通灯点,从这种类型的数据。

我们之前讨论过使用机载 LiDAR 传感器收集的点云进行深度学习,例如使用 Mask R-CNN重建 3d 建筑模型,然后使用 PointCNN检测和标记架空导体,但是从“街道级”收集的移动点云有它们的特性使分类和数据提取变得复杂。另一方面,随着半自动和自动驾驶汽车数量的增长,这种类型的数据采集变得越来越具有可扩展性和可负担性。

对于这些实验,我们与CycloMedia团队合作,该团队提供移动点云、定向图像和 2D 语义掩码来标记点云数据。

迈向有用的“数字孪生”

及时且具有成本效益的调查是任何高效地方政府的基石。问题是如何以最低成本定期收集有关城市资产的详细信息?换句话说,有没有办法降低“数字双胞胎”的成本,并且是否经常更新以使其在日常运营中仍然有用?

答案可能是安装在城市周围行驶的车辆上的 LiDAR 传感器收集点云数据,并将机器学习技术应用于收集的点以提取准确的地理参考矢量特征,从而可用于传统的 GIS 分析和系统记录。

移动 LiDAR 的替代方案是面向街道级别的图像,这是收集大量数据的另一种经济实惠的方式,我们在最近的“使用深度学习的道路特征检测和地理标记”帖子中讨论了详细的工作流程。

移动 LiDAR 数据的主要缺点是不规则的点密度、城市环境中的高噪声水平以及数据标记的复杂性。好的一面是——激光雷达数据具有精确的 XYZ 坐标,可以进行高保真地理参考矢量特征提取。

定向图像的主要缺点是缺乏深度信息,这会影响将对象检测从像素空间转换为真实世界坐标的准确性,并使诸如树木之类的多边形对象或线之类的线性对象的提取变得复杂。优点是创建标记数据以训练对象检测器的成本最低且容易(您甚至可以使用预训练的神经网络模型开始实验:TensorFlow或PyTorch)。基于图像的特征提取的另一个无与伦比的优势是它允许通过光学字符识别进行有效的元数据捕获,例如,如果图像分辨率足够高,我们不仅可以自动收集道路标志的位置和类型,而且还有他们上面写的。

两全其美的方法可能是将 LiDAR 和定向图像结合起来:例如,通过从移动 LiDAR 点云计算所谓的光栅深度图,然后将它们与图像相结合。这将产生 RGB+D(深度)4 通道栅格,可以与传统的卷积对象检测器一起使用,并且在对象检测和像素到世界坐标转换方面具有更高的精度。

这就是 CycloMedia 发挥作用的地方。他们的街道级捕获车辆配备了高分辨率摄像头和激光雷达。然后对这些数据进行后处理,以提供本实验中使用的 LiDAR 和图像的独特组合。

在这篇文章中,我们将依靠移动点云作为高保真和精确地理参考矢量特征的来源,并将利用同步的定向图像来展示一种标记训练所需的大量移动点云的有效技术深度神经网络。

工作流程

一般来说,对象提取工作流程看起来很简单:

  1. 使用深度神经网络将点云分割(分类)为感兴趣的对象类别,即为点云的每个点分配一个类别值,

  2. 使用两个 GIS 处理管道之一(一个基于栅格,一个基于机器学习)来提取矢量特征及其属性。

……但是,正如它经常发生的那样,困难在细节上。根据我们试图提取的对象的类别,该过程变得更加复杂:感兴趣的对象的典型大小是多少?我们将使用什么类型的矢量几何来表示提取的特征——点、线、多边形或 3D 多面体等?

移动点云分割

让我们看看第一部分,移动 LiDAR 点云的分割,即为云中的每个点分配一个类值,如 Building、Tree、Pole 等。

传统上,使用深度学习,首先要担心的是获得足够数量的优质样本来训练神经网络。在这种情况下,我们谈论的是分类(标记)点云,其中属于建筑物的点具有相应的建筑物分类值。

我们在这些实验中使用的 CycloMedia 数据有两种形式:(未标记的)移动点云本身以及与之同步的 360 度定向图像。

360 度定向图像,立方投影的 4 面。

与影像同步的 360 度移动点云。请注意,随着与传感器的距离增加,点密度下降的速度有多快。移动点云中点密度的波动是此类数据的挑战之一。

由于图像和点云的获取是同时进行的,相机和激光雷达传感器的视域是相同的,光栅的 RGB 像素值可以投影到点上,更加丰富了点云的语义:在此之后,每个 3D 点也填充了 RGB 值。

从 360 度图像投影的具有 RGB 颜色的点云。

具有投影 RGB 值的同一点云,从街道向南看。请注意数据中的空白,其中最前沿的树木阻挡了建筑物对 LiDAR 传感器的可见性。这种数据间隙是移动点云中的另一个挑战,神经网络需要学习如何处理。

数据质量看起来不错,CycloMedia 在多个国家和环境中具有重要的覆盖范围。这次我们关注荷兰城市,特别是一组来自 Schiedam 市的 500 个移动点云。为了进行彻底的测试,还将使用来自洛杉矶、芝加哥和阿姆斯特丹的点云。

现在,训练数据:不知何故,我们需要用感兴趣的类别来标记点云,例如道路、路边、建筑物、树、交通灯等,并且要训练神经网络,需要大量这样的示例。不幸的是,在真正的 3D 空间中手动标记点云是一项艰巨的任务……但可能会有不同的选择,这也是定向图像可能提供帮助的地方。

这个想法很简单:我们已经知道如何将 RGB 颜色从图像投影到点云,对吧?因此,让我们在图像之上绘制语义掩码,然后将这些掩码作为分类代码投影到点云上,就是这样!(在以下实验中,2D 语义掩码是手动绘制的,但理论上可以借助传统实例或语义分割卷积神经网络(如Mask R-CNNUNet)从原始定向图像生成语义掩码,这将进一步减少体力劳动量。

在图像顶部手动绘制的语义掩码。如您所见,它们并不完美:树面具没有跟随每片叶子,并非所有建筑物都被数字化(左侧和中心),或者右侧电线杆的上部完全缺失。

具有通过将 2D 语义掩码投影到点上分配的分类值的相同点云。请注意由投影机制引起的建筑物墙壁上的树“光晕”等错误分类伪影。

生成的点分类并不完美,并且有许多错误分配的标签,例如,看一下图像右侧它们后面建筑物上的树“光晕”。嗯……这样的点云分类方法甚至可以用于训练分割神经网络吗?如果可以,有什么限制?

建筑物

一旦标记了 500 个单独的移动点云的整个数据集(使用了 80 个不同的对象类),我们总共得到了大约 1.8B 个标记点——这是一个很好的开始试验的大小。

整个1.8B 合并点云中每几个顶级类的点数。20% 的移动点云被归类为建筑物。

由分配的分类值着色的移动点云。这里的建筑点是灰色的,树木 - 棕色,汽车 - 绿色等。

毫不奇怪,我们从训练集中最普遍的类之一开始——建筑物,它占约 3.62 亿点或整个数据集的约 20%。

在这里以及在接下来的实验中,我们使用了我们已经成功试验过的PointCNN神经网络架构(基于 TensorFlow 的实现),将其应用于机载点云分类。

之前,我们讨论了 PointCNN 期望输入点云被划分为体素的方式,但这是使用机载 LiDAR 数据,从质量的角度来看要优越得多。

这是移动点云的第一个问题:这里的点密度波动很大:从传感器附近的每平方米 30K+(!)到几乎没有几个点/平方米。距离传感器仅约 100 米。通常,在这种情况下,我们需要一个更大的训练集来训练一个密度不变的模型,并且由于我们这里没有,我们决定将训练体素限制为仅点密度高于 4 点/平方的那些体素.m.,面积为 2,500 平方米。每个体素的 XY 横截面。

另一种选择可能是在合并的点云上训练网络(其中所有 360 度 LiDAR 快照被合并到一个点云中,然后重新进行训练和测试),但早期的实验表明,在采用的数据标记方法下,水平合并点云中分类值中的噪声会导致模型收敛性较差。因此,我们决定继续使用原始的移动点云进行训练和推理。

电线杆上附有交通灯。请注意合并的点云有多嘈杂:交通信号灯上的绿色(树类)和红色(建筑类)错误标记的点。

我们为保持低自变量数量而采取的另一个步骤是将所有其他类合并为一个类,即模型仅在两个类上进行训练:建筑和其他。

由于构建点邻域往往相当大,我们修改了 PointCNN 架构,使其具有明显更大的第一层,因此它具有更大的感受野(在卷积网络方面),并从PointCNN 的作者提出的原文:


#config for two-class detector of Buildings, training on the original LAS_CONCOLIDATED point cloud

num_class = 2

sample_num = 12288 #for a better visibility of large neighborhoods

batch_size = 12

num_epochs = 8096 * 6

label_weights = []
for c in range(num_class):
label_weights.append(1.0)

learning_rate_base = 0.001
decay_steps = 20000
decay_rate = 0.7
learning_rate_min = 1e-6

step_val = 500

weight_decay = 0.0

jitter = 0.05
jitter_val = 0.0

rotation_range = [0, math.pi, 0, 'u']
rotation_range_val = [0, 0, 0, 'u']
rotation_order = 'rxyz'

scaling_range = [0.05, 0.05, 0.05, 'g']
scaling_range_val = [0, 0, 0, 'u']

sample_num_variance = 1 / 8
sample_num_clip = 1 / 4

x = 8

xconv_param_name = ('K', 'D', 'P', 'C', 'links')
xconv_params = [dict(zip(xconv_param_name, xconv_param)) for xconv_param in
[(12, 1, -1, 16 * x, []),
(16, 1, 768, 32 * x, []),
(16, 2, 384, 64 * x, []),
(16, 2, 128, 96 * x, [])]]

with_global = True

xdconv_param_name = ('K', 'D', 'pts_layer_idx', 'qrs_layer_idx')
xdconv_params = [dict(zip(xdconv_param_name, xdconv_param)) for xdconv_param in
[(16, 2, 3, 2),
(16, 1, 2, 1),
(12, 1, 1, 0)]]

fc_param_name = ('C', 'dropout_rate')
fc_params = [dict(zip(fc_param_name, fc_param)) for fc_param in
[(16 * x, 0.0),
(16 * x, 0.7)]]

sampling = 'fps'

optimizer = 'adam'
epsilon = 1e-3

data_dim = 6 #training on XYZRGB
use_extra_features = True
with_normal_feature = False
with_X_transformation = True
sorting_method = None

keep_remainder = True

使用如此大的感受野训练 batch_size 为 12 需要 GPU 上的大量内存:在我们的案例中,我们使用了具有 32GB VRAM 的 NVIDIA Quadro GV100 卡。

在对 PointCNN 进行 150,000 次迭代训练后,我们在测试集上获得了可观的结果:

Building 类的 Precision、Recall 和 F1 分数表明,PointCNN 模型很好地捕捉了建筑物类的语义。

从测试集中:深红色的点被 PointCNN 模型分类为建筑物。

树木

16% 的移动点云是树。

树木(此处为棕色):各种树种的树冠密度不同;彼此靠近的树木可能有重叠的树冠。

我们想要尝试的下一个类是 Trees。几乎 16% 的标记点也很好地代表了Trees ( vegeting_high ) 类,但其中许多被错误分类,因为光晕被投射到它们后面的任何其他对象上。此外,树比建筑物具有更高的可变性和更复杂的点邻域几何特性。

同样,为了简单起见,我们训练了一个 PointCNN 模型来区分两个类别,这次是:树和其他。

与用于检测建筑物的 PointCNN 架构类似,用于定义每个通道分析的邻域大小的sample_num配置参数设置为 12,288 个点。

在对模型进行 10 万次迭代训练后,我们再次取得了不错的效果:

考虑到训练和测试集中错误分类点的数量,总体 F1 得分很高。

我们决定在美国两个地点的点云上测试 Tree-trained 模型:洛杉矶和芝加哥。对于洛杉矶,结果非常好,包括棕榈树的标签(在荷兰没有那么多棕榈树生长,模型是根据数据训练的):

PointCNN 模型,在荷兰数据集上训练,在加利福尼亚州洛杉矶标记树点(红色)。

在芝加哥,也发现了树木,但质量稍差——一个合理的解释是,芝加哥点云是在冬季记录的,当时树叶要么是棕色的,要么被雪覆盖,甚至已经消失。由于树点上有不同的 RGB 值,模型很难将它们与学习模式匹配,导致精度低于洛杉矶:


好消息是,要处理季节问题,因为它几乎总是发生在深度学习中,我们只需要更多数据来训练模型以更全面地改变树冠颜色。

红绿灯

看起来树,类似于建筑物,是在移动点云中标记的相对容易的一类对象......并且通过将 2D 语义掩码投影到点云上来创建训练集也适用于此。但是树木和建筑物是大物体,所以现在的问题是——我们能否在嘈杂的城市环境中检测和标记较小尺寸的物体,比如交通信号灯?

荷兰的红绿灯形状和大小各不相同,它们可以连接到垂直或水平杆上,也可以挂在悬索上。

这个来自阿姆斯特丹的测试点云中有五个红绿灯。

这个区域有八个红绿灯。嘈杂的“社区”:你可以看到来自经过的火车和汽车、架空电线、人等的噪音。

这看起来已经是一个复杂的案例,但在我们开始训练另一个 PointCNN 模型之前,让我们先检查一下我们在红绿灯的训练集中有什么。

分类为 TrafficLight 的点数约为 580,000,仅占整个数据集的 0.032%——如果我们谈论的是传统的分类任务,这是一个不成比例的小数量和巨大的类不平衡。作为附加措施,为了补偿类不平衡,在将点云划分为体素的阶段,我们决定丢弃任何不包含至少 30 个 TrafficLight 类点的体素(XY 体素横截面在这里保持不变——2,500 平方米)。

我们对 PointCNN 架构进行了另一项修改,我们默认使用原始的ShapeNet-Parts(E) 架构,该架构具有较小的感受野,但在解码器端有一个带有跳过连接器的附加层:


#config for two-class detector of traffic lights in Netherlands, training on the original LAS_CONCOLIDATED point cloud

num_class = 2

sample_num = 2048

batch_size = 32

num_epochs = 8096 * 6

label_weights = []
for c in range(num_class):
label_weights.append(1.0)

learning_rate_base = 0.001
decay_steps = 20000
decay_rate = 0.7
learning_rate_min = 1e-6

step_val = 500

weight_decay = 0.0

jitter = 0.0
jitter_val = 0.0

rotation_range = [0, math.pi/32., 0, 'u']
rotation_range_val = [0, 0, 0, 'u']
rotation_order = 'rxyz'

scaling_range = [0.0, 0.0, 0.0, 'g']
scaling_range_val = [0, 0, 0, 'u']

sample_num_variance = 1 / 8
sample_num_clip = 1 / 4

x = 16

xconv_param_name = ('K', 'D', 'P', 'C', 'links')
xconv_params = [dict(zip(xconv_param_name, xconv_param)) for xconv_param in
[(8, 1, -1, 16 * x, []),
(12, 2, 768, 16 * x, []),
(16, 2, 384, 32 * x, []),
(16, 6, 128, 64 * x, [])]]

with_global = True

xdconv_param_name = ('K', 'D', 'pts_layer_idx', 'qrs_layer_idx')
xdconv_params = [dict(zip(xdconv_param_name, xdconv_param)) for xdconv_param in
[(16, 6, 3, 2),
(12, 6, 2, 1),
(8, 6, 1, 0),
(8, 4, 1, 0)]]

fc_param_name = ('C', 'dropout_rate')
fc_params = [dict(zip(fc_param_name, fc_param)) for fc_param in
[(16 * x, 0.0),
(16 * x, 0.7)]]

sampling = 'fps'

optimizer = 'adam'
epsilon = 1e-3

data_dim = 6 #training on XYZRGB
use_extra_features = True
with_normal_feature = False
with_X_transformation = True
sorting_method = None

keep_remainder = True


我们对模型进行了超过 300K 的迭代训练,但在 100K 之后不久就没有在测试集上获得任何显着的 F1-score 改进——在训练、验证和测试集中有如此多的噪音,F1-score 并不是最好的指标。

TrafficLights 类的质量指标在大约 10 万次迭代后不久就停止了改进。

如您所见,这些值表明需要改进,但测试预测的可视化看起来可以接受:

红色标记是由模型标记为属于 TrafficLight 类的点簇。

这看起来像是一个可行的数据集,在下面详述的两个 GIS 处理管道的帮助下,可以将其转换为传统的矢量特征,以进行进一步的 GIS 分析。

但是有一个问题——由于交通信号灯由原始标记数据集中的少量 LiDAR 点表示,火车——测试拆分实际上具有显着的空间重叠。发生这种情况是因为我们正在对单个移动点云进行训练,CycloMedia 沿着车辆轨迹每隔 5m 收集一次移动点云,这导致在训练和测试集中捕获相同的交通信号灯,但只是从不同的角度来看. 对于准确的质量评估来说不是很好。

为了更好地评估训练模型的质量,我们从另一个位置(阿姆斯特丹的 Rijnstraat 社区)获取了一些移动点云。不过,Rijnstraat 的数据并未分类,因此,为了计算此处的指标,我们直观地识别了该区域的所有交通信号灯并进行了推理。然后将生成的带标签的 LiDAR 点转换为 GIS 点要素——每个 LiDAR 点集群的一个 GIS 点要素被标记为 TrafficLight。现在,通过将提取的点特征与视觉识别的交通信号灯进行比较,我们可以计算质量指标:

DBScan 提取的点特征与 Rijnstraat 测试区域中真实交通信号灯的质量指标。

从上面可以看出,31 个红绿灯中有 21 个是从 Rijnstraat 测试集中正确提取的——召回率约为 68%。尽管如此,精度仍然很低,因为从识别出的总共 52 个红绿灯中,只有 21 个与实际情况相符。

在重新标记的点云上训练的红绿灯

那么,需要提高红绿灯分类性能的原因是什么,我们可以做些什么来让事情变得更好呢?首先,当然是添加更多的训练数据。但是,如果这不是一个选项,还能做什么呢?

我们目前正在探索的一个想法是借助 PointCNN 模型本身清理训练数据:还记得前面提到的“树晕”效应吗?学习性质和重现这种光晕比学习构建点邻域的典型几何特性要复杂得多,因为前者来自将 2D 语义掩码投影到移动点云上的分类算法,并且至少考虑了四件事:LiDAR传感器位置、最前沿对象、背景位置以及最前沿对象类的语义掩码的典型缺陷。因此,人们可以预期,对于 PointCNN,了解典型建筑物的外观会更容易,而在其上复制光晕效果会更难,对吧?一个快速的实验实际上证实了这个假设:

原始点云在背景建筑上有更明确的树晕。通过使用在建筑物上训练的 PointCNN 模型重新标记该点云,建筑物墙壁上错误分类的树点的数量显着减少。模型未确认的原始建筑点将从结果中删除。

同样,我们可以使用之前在树上训练过的另一个 PointCNN 模型重新标记训练集,从而进一步减少错误分类的树点的数量。

以 RGB 显示的综合点云 (1),由投影 2D 掩码产生的原始分类 (2),以及由相应的 PointCNN 模型重新标记建筑物(深红色)和树(绿色)类产生的分类 (3)。请注意后者的噪音水平如何较低,即交通信号灯和电线杆上错误分类的建筑物和树点的数量较少。

我们希望将 PointCNN 模型作为低通滤波器应用于原始训练集将提高分类质量,特别是对于交通信号灯等较小尺寸的对象。这个方向的实验正在进行中,与在原始点云上训练的模型相比,Rijnstraat 的第一次测试已经显示出明显更好的性能:

使用在点云上训练的 TrafficLight PointCNN 模型在 300K 迭代时获得更好的整体 F1 分数,这些模型由之前在 Building 和 Tree 类上训练的模型重新标记。

指定用于点云分类的工作流的第一部分到此结束。现在让我们谈谈从分类点云中提取矢量特征……

使用栅格分析和机器学习管道进行矢量特征提取

对于工作流的第二部分,我们将使用 ArcGIS Pro 试验两个 GIS 处理管道,这些管道输入洛杉矶树木的标记点云,以及荷兰斯希丹和阿姆斯特丹部分地区的交通信号灯。这些处理管道的目标如下:


  1. 提取洛杉矶树冠的矢量多边形,包括树冠位置、平方英尺、高度和半径属性。

  2. 提取荷兰 Schiedam 和阿姆斯特丹交通信号灯的矢量点。

第一个处理管道光栅化,然后矢量化标记的点云,并使用一系列 GIS 处理工具来清理矢量多边形。第二个处理管道将标记的点云向量化,然后使用无监督机器学习算法 DBSCAN 将点簇与噪声区分开来。下面将使用洛杉矶郊区的树冠数据详细讨论这两种方法。

栅格管道

标记的点云(LAS 格式)首先被组织成一个 LAS 数据集,这是一种文件格式,它引用磁盘上的 LAS 文件,并允许对 LiDAR 点云数据进行高效的显示、可视化和 QA/QC。然后对 LiDAR 数据进行过滤以仅包含感兴趣的类别(例如“树木”或“交通灯”,然后将这些过滤后的点转换为栅格,像元大小约为平均点间距的 4 倍。


过滤后的 LiDAR 点云仅显示洛杉矶郊区的树分类点。树分类点占点云中 3350 万个点的约 13%。

光栅化 LiDAR 点云。

然后将栅格转换为矢量多边形格式,并执行一系列处理步骤以清理数据并导出属性。这些包括:


1. 根据指定的平方英尺去除小多边形和孔。由用户根据其特定的分析问题和数据特征来确定此标准。

2. 添加属性字段以计算周长/面积比和半径

  • 周长/面积比 = 多边形长度 / 多边形面积

  • 半径 = 多边形长度(周长的代理)/ 2*π

3. 去除长条或任何具有高周长/面积比的多边形。多边形越紧凑和圆形,周长/面积比越小。同样,由用户决定最适合其案例研究的标准。


左:数据清理前的矢量多边形。右图:数据清理后的矢量多边形。

光栅处理管道。

用于自动化栅格管道的 ArcGIS Pro 任务。

机器学习管道

在第二个处理管道中,标记点云中的树分类点首先转换为 multipoints,这是一种矢量几何格式,其中每个特征(多点)由一个或多个点组成。为了执行以下步骤,多点几何被分解为单点,这样每个特征代表一个矢量点。

树分类的 LiDAR 点云转换为多点,然后分解为单点。

由于单个矢量点的数量庞大(例如,洛杉矶数据约为 450 万个点),因此采取了一些措施来减少数据集的大小,从而使后续的 GIS 处理变得高效。我们尝试的一种减少数据集大小的方法是随机删除一定百分比的点,这是使用以下步骤执行的:


  • 向点数据集添加新属性字段

  • 在新属性字段中计算一个 0-1 范围内的随机浮点数

  • 查询大于指定值(例如 0.90)的随机数,这将选择 10% 的数据点用于进一步处理。请注意,由用户根据他们的分析问题和数据特征来确定要删除多少数据。

使用我们随机选择的数据子集,处理管道的下一步是机器学习步骤。为此,我们使用了 ArcGIS Pro 的基于密度的聚类工具,该工具实现了无监督机器学习算法,用于检测聚类点模式并将它们与空或稀疏的点模式分离。这些算法仅根据点的空间位置和与相邻点的距离来识别集群,并产生一个输出,其中每个点都被标记为集群的成员或噪声。

基于密度的聚类工具包括三种用于检测点簇的算法:定义距离 (DBSCAN)、自调整 (HDBSCAN) 和多尺度 (OPTICS)。有关这些算法如何工作以及它们如何相互比较的详细信息,请参阅 ArcGIS Pro 帮助文章基于密度的聚类的工作原理。

尽管我们对所有这三种算法都进行了试验,但我们使用 DBSCAN 获得了最佳性能和结果。DBSCAN 需要两个用户指定的参数。每个聚类的最小要素参数指定组成有意义的聚类所需的最小点数。小于此大小的所有点分组都被视为噪声。最佳实践是根据您的具体分析问题设置此值,并且可能需要用户确定代表感兴趣集群的最小点分组。DBSCAN 的第二个必需参数是搜索距离,它本质上是一个搜索截止距离,必须将指定的最小数量的特征定位在该距离内,才能将其视为集群的一部分。

DBSCAN 是基于密度的聚类中实现的三种算法中最快的一种,当用户知道理想的搜索距离可能是多少时,它最有用。与每个集群的最小特征参数一样,由用户决定其特定案例研究和数据特征的最佳值。

使用 DBSCAN 的基于密度的聚类结果。较大的彩色点表示集群成员,较小的黄色点表示稀疏噪声。

基于密度的聚类的输出为每个点分配一个聚类 ID,其中 -1 的聚类 ID 表示噪声。因此,我们执行属性查询以选择所有不等于 -1 的点,然后在每个集群周围生成最小边界多边形。指定的几何类型是一个凸包,它创建包围每个簇的最小凸多边形。ArcGIS Pro 最小边界几何工具有一个组选项参数,允许用户指定一个属性字段来对生成的多边形进行分组,从而有效地为每个集群创建一个边界多边形。

结果显示每个集群周围的最小边界多边形。

机器学习管道的最后一步包括添加属性字段、计算周长/面积比和半径等属性,以及清理小的非紧凑多边形。多边形清理步骤的具体标准取决于具体的分析问题和数据特征。有关这些步骤的详细信息,请参阅本文的栅格管道部分。

机器学习管道。

用于自动化机器学习管道的 ArcGIS Pro 任务。

树高呢?

如本文本节开头所述,矢量特征提取工作流程的主要目标之一是为每个树冠生成有用的属性。在前面的步骤中,我们已经生成了树冠面积和半径的属性,但现在我们开始生成树高。

LiDAR 点云不仅提供关于点分类的属性(如上述用于提取树多边形的管道),还包括云中每个点相对于平均海平面的高度信息,可用于创建高- 质量高程栅格。有几个众所周知的工作流程可用于从 LiDAR 创建这些高程表面。以下步骤详细介绍了用于创建裸地数字高程模型 (DEM)、数字地表模型 (DSM) 和标准化数字地表模型 (nDSM) 的处理流程。

在本文前面详述的每个 PointCNN 实验中,神经网络模型都经过训练以区分两个类别:感兴趣的类别,如树木或交通信号灯(类别代码 1),以及代表所有其他景观的“其他”类别特征(类代码 0)。然而,为了创建裸露的地球 DEM,我们缺少一个重要的点云属性——地面。我们将使用 ArcGIS Pro Classify LAS Ground工具将地面分类添加到点云中。

在区分地面和非地面时,分类 LAS 地面工具会考虑所有 LiDAR 点(标记为保留或重叠的点除外),但只能将分类为 0、1 或 2 的点指定为地面。因此,我们的第一步是将所有感兴趣的类重新分配给另一个类代码。对于树木,我们使用 ArcGIS Pro Change LAS Class Codes工具将感兴趣的类别(树木 - 类别代码 1)重新分配给类别代码 5,这是用于高植被的行业标准 LiDAR 分类代码。

Classify LAS Ground 工具提供三种地面检测方法,使用哪一种方法取决于感兴趣区域的地形变化。我们只尝试了标准和保守的方法,因为激进的方法不太适合异质的城市地区。在洛杉矶研究区,STANDARD 和 CONSERVATIVE 方法分别将大约 62% 和 60% 的非植被点分类为地面。因为我们可以忽略这两种方法之间的差异,所以接下来的所有步骤都使用标准方法中的地面分类。

现在点云具有地面属性,我们过滤掉所有其他类代码并将其输入到 ArcGIS Pro LAS 数据集转栅格工具中。此工具中的关键参数是插值类型。在创建裸地 DEM 时,建议使用三角插值类型和自然邻域插值方法,因为这种参数组合执行地面高度的真实插值并创建平滑的输出表面。真正的插值是填充树木、建筑物和其他非地面特征留下的大量地面空隙的最佳方法。

数字高程模型 (DEM)。高程值以美国英尺为单位。

我们需要创建的下一个表面是数字表面模型 (DSM),它是一个栅格,表示树冠和建筑物等表面特征的高度。这里需要注意的是,“地表特征的高度”是指特征顶部的实际高度加上它们所在的地面高度。换句话说,510 英尺的树冠高度值并不意味着这棵树有 510 英尺高;这可能意味着高于平均海平面的高度为 500 英尺,而树高 10 英尺。

创建 DSM 的处理步骤类似于 DEM 的处理步骤,但是我们不对分类代码应用任何过滤器。我们将点云输入到 LAS 数据集转栅格工具中,但对 DSM 使用不同的插值类型参数。创建 DSM 时,建议使用具有最大像元分配的分箱插值类型,因为这种参数组合会使生成的栅格偏向于更高的海拔。与 DEM 不同,我们不需要在此处执行真正的插值,因为 DSM 中包含树木和建筑物,因此空隙不是什么大问题。

数字表面模型 (DSM)。高程值以美国英尺为单位。

创建 DEM 和 DSM 后,最后一步是执行简单的图像差分以创建归一化数字表面模型 (nDSM)。此步骤缓解了 DSM 高度值是实际地表要素高度加上裸地高程高度的问题。DEM 是从 DSM 中减去的,它有效地将地面高程归零并仅保持表面要素相对于地面的高程。

归一化数字表面模型 (nDSM)。高程值以美国英尺为单位。

曲面创建管道。

用于自动化表面创建管道的 ArcGIS Pro 任务。

这部分管道的最后一步是将 nDSM 高程值提取到由上述栅格和机器学习管道生成的树多边形中。这是通过在 nDSM 上覆盖树冠多边形并使用 ArcGIS Pro 的区域统计表来提取每个多边形内的栅格单元的汇总统计数据来实现的。出于我们的目的,我们提取了每个多边形内的最小、最大和平均树冠高度。由于此工具输出一个表格,因此必须将其连接回树冠多边形,并可选择转换为点以进行进一步的可视化和分析。

覆盖在 nDSM 上的树冠多边形。

树冠多边形属性表突出显示 MAX 字段,即最大树冠高度。

高度提取管道。

结果:树冠

对于洛杉矶树冠示例,我们测试了栅格和机器学习管道。栅格管道提取了 73 个单独的树位置,而机器学习管道产生了 102 个单独的树位置。DBSCAN 的每个集群的最小特征和搜索距离参数分别指定为每个集群 100 个特征和 5 英尺,并根据对数据的视觉探索来选择代表有意义的树或灌木的最小点集群。

在比较管道时,73 个(约 70%)个单独的树位置中有 52 个是两个管道之间的完全匹配。在 10 个实例中,栅格管道识别出一棵树冠,而机器学习方法识别出同一位置的两棵或三棵树。还有 10 个实例,其中光栅管道在一个位置识别出两个单独的树冠,而在同一位置使用机器学习管道仅识别出一个。在 1 个实例中,光栅管道识别出树冠而机器学习管道没有,而在 22 个实例中,机器学习管道识别出树冠而光栅管道没有。

洛杉矶地区的最终地图,显示了由栅格(黄色)和机器学习(粉红色)管道确定的树冠位置。

两条管道之间的精确匹配示例(光栅黄色、机器学习粉色),高度值提取并以 2D 和 3D 显示。请注意两条管道之间多边形形状的差异。

光栅管道(黄色)识别两个树冠及其相关高度值的示例,而机器学习管道(粉红色)在该位置仅识别一个。

光栅管道(黄色)识别一棵树冠及其相关高度值的示例,而机器学习管道(粉红色)识别该位置的三棵单独的树。

总体而言,两条管道在从移动 LiDAR 点云数据中识别单个树冠位置及其高度方面产生了有希望且具有可比性的初步结果。然而,光栅管道可以更真实地表示树冠的实际形状,因此是用于提取具有这些大小和形状特征的对象的推荐管道。

结果:红绿灯

我们还在荷兰的几个城市测试了两条带有红绿灯标记的移动点云的管道。如本文开头的数据描述部分所述,红绿灯点云中存在明显的类不平衡,在下表中突出显示了三个不同的位置:


交通
研究区域 LiDAR 点灯点数 百分比
-------------- ------------ -- ---------- ----------
Schiedam, NL 42,205,232 70,060 0.17%阿姆斯特丹, NL 136,682,054 401 0.0003% Rijnstraat (阿姆斯特丹), NL 188,645,529 1,620 0.0009%

示例显示了荷兰 Schiedam(左)和阿姆斯特丹(右)的一个路段中的单个交通灯标记的 LiDAR 点。

由于此类不平衡,栅格管道无法有效提取单个交通点。在某些情况下,三个或四个 LiDAR 点代表一个交通信号灯,并且在对这些点进行光栅化时,创建的单个像素太小且噪声太大而无法使用。因此,我们使用 DBSCAN 将交通信号灯提取集中在机器学习管道上。

为 DBSCAN 选择的参数再次基于对数据的视觉检查,我们在其中发现了代表交通信号灯的最小点簇。对于 Schiedam 研究区域,我们选择了每个聚类的最小特征值 10,而阿姆斯特丹的两个研究区域都使用了每个聚类的最小特征值 2。所有三个荷兰研究区域的搜索距离参数都是 2 米。

尽管机器学习管道中的步骤与洛杉矶树冠分析中使用的步骤基本相同,但我们不必执行数据缩减步骤。与洛杉矶树多点数据集(包含超过 450 万个爆炸矢量点)不同,荷兰的三个研究区域都没有包含超过 70,000 个爆炸矢量点。

对结果的初步 3D 视觉检查表明了有希望的结果。下图中的黄色球点是PointCNN将LiDAR点标记为红绿灯的位置,机器学习管道提取了一个红绿灯点特征。

显示正确提取的交通灯点特征(黄色球体)的示例,显示相对于移动 LiDAR 点云。

还有几个有趣的例子,PointCNN 将 LiDAR 点标记为交通信号灯,但机器学习管道实际上将这些区域分离为噪声。这使我们能够从其他高而细的特征(例如路标、树木和灯杆)中描绘出实际的交通信号灯。

示例显示由 DBSCAN(红色锥体)识别为噪声的 PointCNN 标记的交通信号灯,相对于移动 LiDAR 点云显示。

讨论

上面的两个 GIS 处理管道是我们使用开箱即用的 GIS 工具和工作流程从 PointCNN 标记的移动 LiDAR 点云中提取有意义的矢量特征的初步实验。两条管道均使用ArcGIS Pro Tasks实现自动化,因此可在不同的研究区域和不同的感兴趣对象中重复。值得注意的是,尽管这些管道是自动化的并且可以利用数据驱动的算法,但我们不能完全忽视人为因素。分析师在做出决策时仍然必须考虑他们的分析问题和数据的特征,特别是在数据清理步骤和 DBSCAN 算法的参数化方面。

使用哪个管道的决定还取决于分析问题和数据的特征。在我们的案例中,洛杉矶树冠的大小和形状非常适合栅格管道,因为栅格化树冠 LiDAR 点为每个树的位置创建了良好的初始足迹。另一方面,红绿灯 LiDAR 点的类别不平衡和极小的空间足迹更有利于机器学习工作流程,特别是因为 DBSCAN 能够直接处理矢量点数据,并设置所需的最小点数成为集群的一部分。

在结束本文之前,我们想留下一些与最终产品相关的大图项目作为思考的食粮。在栅格和机器学习管道中,输入是移动 LiDAR 点云形式的真实 3D地理空间数据,而输出是 2D 矢量点或多边形。毫无疑问,有许多 GIS 用例可以利用这些 2D 数据集及其属性来进行额外的空间分析和可视化。但是,也可能存在对真正的 3D 输出形式感兴趣的用例和客户,这可以利用 3 维点云中极高的细节和粒度。在未来的工作中,我们将更详细地探索“最终产品”这个问题,并相应地调整处理管道。

最后

在这篇文章中,我们介绍了一个使用深度神经网络和机器学习从原始点云中提取各种对象类别的有趣实验:讨论了一种借助 2D 语义掩码和同步定向图像快速分类点云的简单方法创建大型训练集、设置和训练 PointCNN 模型、基于 Raster 的提取和 DBScan 聚类算法、去噪。

甚至令我们惊讶的是,上述使用语义掩码创建的训练集的实验表明,这种移动点云标记方法适用于教 PointCNN 模型即使是像交通信号灯这样的小尺寸对象。

我们认为上述工作流程显示出巨大的潜力,可以降低收集适合成熟 GIS 分析的高保真 2D 和 3D 矢量特征的成本和时间,并最终让我们和我们的用户更接近可用的“数字双”模型。



- END -


一种深度学习的无人机影像道路自动提取方法
ArcGIS Pro与FME结合深度学习提取正射影像兴趣点
张新长教授:遥感大数据深度学习和信息精准提取研究与应用
ArcGIS Pro中使用深度学习的高分辨率土地覆盖制图
明长城全线实景三维数据采集与利用

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存