使用机器学习从移动LiDAR点云中提取对象
本文作者: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 和图像的独特组合。
在这篇文章中,我们将依靠移动点云作为高保真和精确地理参考矢量特征的来源,并将利用同步的定向图像来展示一种标记训练所需的大量移动点云的有效技术深度神经网络。
工作流程
一般来说,对象提取工作流程看起来很简单:
使用深度神经网络将点云分割(分类)为感兴趣的对象类别,即为点云的每个点分配一个类别值,
使用两个 GIS 处理管道之一(一个基于栅格,一个基于机器学习)来提取矢量特征及其属性。
……但是,正如它经常发生的那样,困难在细节上。根据我们试图提取的对象的类别,该过程变得更加复杂:感兴趣的对象的典型大小是多少?我们将使用什么类型的矢量几何来表示提取的特征——点、线、多边形或 3D 多面体等?
移动点云分割
让我们看看第一部分,移动 LiDAR 点云的分割,即为云中的每个点分配一个类值,如 Building、Tree、Pole 等。
传统上,使用深度学习,首先要担心的是获得足够数量的优质样本来训练神经网络。在这种情况下,我们谈论的是分类(标记)点云,其中属于建筑物的点具有相应的建筑物分类值。
我们在这些实验中使用的 CycloMedia 数据有两种形式:(未标记的)移动点云本身以及与之同步的 360 度定向图像。
由于图像和点云的获取是同时进行的,相机和激光雷达传感器的视域是相同的,光栅的 RGB 像素值可以投影到点上,更加丰富了点云的语义:在此之后,每个 3D 点也填充了 RGB 值。
数据质量看起来不错,CycloMedia 在多个国家和环境中具有重要的覆盖范围。这次我们关注荷兰城市,特别是一组来自 Schiedam 市的 500 个移动点云。为了进行彻底的测试,还将使用来自洛杉矶、芝加哥和阿姆斯特丹的点云。
现在,训练数据:不知何故,我们需要用感兴趣的类别来标记点云,例如道路、路边、建筑物、树、交通灯等,并且要训练神经网络,需要大量这样的示例。不幸的是,在真正的 3D 空间中手动标记点云是一项艰巨的任务……但可能会有不同的选择,这也是定向图像可能提供帮助的地方。
这个想法很简单:我们已经知道如何将 RGB 颜色从图像投影到点云,对吧?因此,让我们在图像之上绘制语义掩码,然后将这些掩码作为分类代码投影到点云上,就是这样!(在以下实验中,2D 语义掩码是手动绘制的,但理论上可以借助传统实例或语义分割卷积神经网络(如Mask R-CNN或UNet)从原始定向图像生成语义掩码,这将进一步减少体力劳动量。)
生成的点分类并不完美,并且有许多错误分配的标签,例如,看一下图像右侧它们后面建筑物上的树“光晕”。嗯……这样的点云分类方法甚至可以用于训练分割神经网络吗?如果可以,有什么限制?
建筑物
一旦标记了 500 个单独的移动点云的整个数据集(使用了 80 个不同的对象类),我们总共得到了大约 1.8B 个标记点——这是一个很好的开始试验的大小。
毫不奇怪,我们从训练集中最普遍的类之一开始——建筑物,它占约 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 次迭代训练后,我们在测试集上获得了可观的结果:
树木
我们想要尝试的下一个类是 Trees。几乎 16% 的标记点也很好地代表了Trees ( vegeting_high ) 类,但其中许多被错误分类,因为光晕被投射到它们后面的任何其他对象上。此外,树比建筑物具有更高的可变性和更复杂的点邻域几何特性。
同样,为了简单起见,我们训练了一个 PointCNN 模型来区分两个类别,这次是:树和其他。
与用于检测建筑物的 PointCNN 架构类似,用于定义每个通道分析的邻域大小的sample_num配置参数设置为 12,288 个点。
在对模型进行 10 万次迭代训练后,我们再次取得了不错的效果:
我们决定在美国两个地点的点云上测试 Tree-trained 模型:洛杉矶和芝加哥。对于洛杉矶,结果非常好,包括棕榈树的标签(在荷兰没有那么多棕榈树生长,模型是根据数据训练的):
在芝加哥,也发现了树木,但质量稍差——一个合理的解释是,芝加哥点云是在冬季记录的,当时树叶要么是棕色的,要么被雪覆盖,甚至已经消失。由于树点上有不同的 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 并不是最好的指标。
如您所见,这些值表明需要改进,但测试预测的可视化看起来可以接受:
这看起来像是一个可行的数据集,在下面详述的两个 GIS 处理管道的帮助下,可以将其转换为传统的矢量特征,以进行进一步的 GIS 分析。
但是有一个问题——由于交通信号灯由原始标记数据集中的少量 LiDAR 点表示,火车——测试拆分实际上具有显着的空间重叠。发生这种情况是因为我们正在对单个移动点云进行训练,CycloMedia 沿着车辆轨迹每隔 5m 收集一次移动点云,这导致在训练和测试集中捕获相同的交通信号灯,但只是从不同的角度来看. 对于准确的质量评估来说不是很好。
为了更好地评估训练模型的质量,我们从另一个位置(阿姆斯特丹的 Rijnstraat 社区)获取了一些移动点云。不过,Rijnstraat 的数据并未分类,因此,为了计算此处的指标,我们直观地识别了该区域的所有交通信号灯并进行了推理。然后将生成的带标签的 LiDAR 点转换为 GIS 点要素——每个 LiDAR 点集群的一个 GIS 点要素被标记为 TrafficLight。现在,通过将提取的点特征与视觉识别的交通信号灯进行比较,我们可以计算质量指标:
从上面可以看出,31 个红绿灯中有 21 个是从 Rijnstraat 测试集中正确提取的——召回率约为 68%。尽管如此,精度仍然很低,因为从识别出的总共 52 个红绿灯中,只有 21 个与实际情况相符。
在重新标记的点云上训练的红绿灯
那么,需要提高红绿灯分类性能的原因是什么,我们可以做些什么来让事情变得更好呢?首先,当然是添加更多的训练数据。但是,如果这不是一个选项,还能做什么呢?
我们目前正在探索的一个想法是借助 PointCNN 模型本身清理训练数据:还记得前面提到的“树晕”效应吗?学习性质和重现这种光晕比学习构建点邻域的典型几何特性要复杂得多,因为前者来自将 2D 语义掩码投影到移动点云上的分类算法,并且至少考虑了四件事:LiDAR传感器位置、最前沿对象、背景位置以及最前沿对象类的语义掩码的典型缺陷。因此,人们可以预期,对于 PointCNN,了解典型建筑物的外观会更容易,而在其上复制光晕效果会更难,对吧?一个快速的实验实际上证实了这个假设:
同样,我们可以使用之前在树上训练过的另一个 PointCNN 模型重新标记训练集,从而进一步减少错误分类的树点的数量。
我们希望将 PointCNN 模型作为低通滤波器应用于原始训练集将提高分类质量,特别是对于交通信号灯等较小尺寸的对象。这个方向的实验正在进行中,与在原始点云上训练的模型相比,Rijnstraat 的第一次测试已经显示出明显更好的性能:
指定用于点云分类的工作流的第一部分到此结束。现在让我们谈谈从分类点云中提取矢量特征……
使用栅格分析和机器学习管道进行矢量特征提取
对于工作流的第二部分,我们将使用 ArcGIS Pro 试验两个 GIS 处理管道,这些管道输入洛杉矶树木的标记点云,以及荷兰斯希丹和阿姆斯特丹部分地区的交通信号灯。这些处理管道的目标如下:
提取洛杉矶树冠的矢量多边形,包括树冠位置、平方英尺、高度和半径属性。
提取荷兰 Schiedam 和阿姆斯特丹交通信号灯的矢量点。
第一个处理管道光栅化,然后矢量化标记的点云,并使用一系列 GIS 处理工具来清理矢量多边形。第二个处理管道将标记的点云向量化,然后使用无监督机器学习算法 DBSCAN 将点簇与噪声区分开来。下面将使用洛杉矶郊区的树冠数据详细讨论这两种方法。
栅格管道
标记的点云(LAS 格式)首先被组织成一个 LAS 数据集,这是一种文件格式,它引用磁盘上的 LAS 文件,并允许对 LiDAR 点云数据进行高效的显示、可视化和 QA/QC。然后对 LiDAR 数据进行过滤以仅包含感兴趣的类别(例如“树木”或“交通灯”,然后将这些过滤后的点转换为栅格,像元大小约为平均点间距的 4 倍。
然后将栅格转换为矢量多边形格式,并执行一系列处理步骤以清理数据并导出属性。这些包括:
1. 根据指定的平方英尺去除小多边形和孔。由用户根据其特定的分析问题和数据特征来确定此标准。
2. 添加属性字段以计算周长/面积比和半径
周长/面积比 = 多边形长度 / 多边形面积
半径 = 多边形长度(周长的代理)/ 2*π
3. 去除长条或任何具有高周长/面积比的多边形。多边形越紧凑和圆形,周长/面积比越小。同样,由用户决定最适合其案例研究的标准。
左:数据清理前的矢量多边形。右图:数据清理后的矢量多边形。
机器学习管道
在第二个处理管道中,标记点云中的树分类点首先转换为 multipoints,这是一种矢量几何格式,其中每个特征(多点)由一个或多个点组成。为了执行以下步骤,多点几何被分解为单点,这样每个特征代表一个矢量点。
由于单个矢量点的数量庞大(例如,洛杉矶数据约为 450 万个点),因此采取了一些措施来减少数据集的大小,从而使后续的 GIS 处理变得高效。我们尝试的一种减少数据集大小的方法是随机删除一定百分比的点,这是使用以下步骤执行的:
向点数据集添加新属性字段
在新属性字段中计算一个 0-1 范围内的随机浮点数
查询大于指定值(例如 0.90)的随机数,这将选择 10% 的数据点用于进一步处理。请注意,由用户根据他们的分析问题和数据特征来确定要删除多少数据。
使用我们随机选择的数据子集,处理管道的下一步是机器学习步骤。为此,我们使用了 ArcGIS Pro 的基于密度的聚类工具,该工具实现了无监督机器学习算法,用于检测聚类点模式并将它们与空或稀疏的点模式分离。这些算法仅根据点的空间位置和与相邻点的距离来识别集群,并产生一个输出,其中每个点都被标记为集群的成员或噪声。
基于密度的聚类工具包括三种用于检测点簇的算法:定义距离 (DBSCAN)、自调整 (HDBSCAN) 和多尺度 (OPTICS)。有关这些算法如何工作以及它们如何相互比较的详细信息,请参阅 ArcGIS Pro 帮助文章基于密度的聚类的工作原理。
尽管我们对所有这三种算法都进行了试验,但我们使用 DBSCAN 获得了最佳性能和结果。DBSCAN 需要两个用户指定的参数。每个聚类的最小要素参数指定组成有意义的聚类所需的最小点数。小于此大小的所有点分组都被视为噪声。最佳实践是根据您的具体分析问题设置此值,并且可能需要用户确定代表感兴趣集群的最小点分组。DBSCAN 的第二个必需参数是搜索距离,它本质上是一个搜索截止距离,必须将指定的最小数量的特征定位在该距离内,才能将其视为集群的一部分。
DBSCAN 是基于密度的聚类中实现的三种算法中最快的一种,当用户知道理想的搜索距离可能是多少时,它最有用。与每个集群的最小特征参数一样,由用户决定其特定案例研究和数据特征的最佳值。
基于密度的聚类的输出为每个点分配一个聚类 ID,其中 -1 的聚类 ID 表示噪声。因此,我们执行属性查询以选择所有不等于 -1 的点,然后在每个集群周围生成最小边界多边形。指定的几何类型是一个凸包,它创建包围每个簇的最小凸多边形。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 时,建议使用三角插值类型和自然邻域插值方法,因为这种参数组合执行地面高度的真实插值并创建平滑的输出表面。真正的插值是填充树木、建筑物和其他非地面特征留下的大量地面空隙的最佳方法。
我们需要创建的下一个表面是数字表面模型 (DSM),它是一个栅格,表示树冠和建筑物等表面特征的高度。这里需要注意的是,“地表特征的高度”是指特征顶部的实际高度加上它们所在的地面高度。换句话说,510 英尺的树冠高度值并不意味着这棵树有 510 英尺高;这可能意味着高于平均海平面的高度为 500 英尺,而树高 10 英尺。
创建 DSM 的处理步骤类似于 DEM 的处理步骤,但是我们不对分类代码应用任何过滤器。我们将点云输入到 LAS 数据集转栅格工具中,但对 DSM 使用不同的插值类型参数。创建 DSM 时,建议使用具有最大像元分配的分箱插值类型,因为这种参数组合会使生成的栅格偏向于更高的海拔。与 DEM 不同,我们不需要在此处执行真正的插值,因为 DSM 中包含树木和建筑物,因此空隙不是什么大问题。
创建 DEM 和 DSM 后,最后一步是执行简单的图像差分以创建归一化数字表面模型 (nDSM)。此步骤缓解了 DSM 高度值是实际地表要素高度加上裸地高程高度的问题。DEM 是从 DSM 中减去的,它有效地将地面高程归零并仅保持表面要素相对于地面的高程。
这部分管道的最后一步是将 nDSM 高程值提取到由上述栅格和机器学习管道生成的树多边形中。这是通过在 nDSM 上覆盖树冠多边形并使用 ArcGIS Pro 的区域统计表来提取每个多边形内的栅格单元的汇总统计数据来实现的。出于我们的目的,我们提取了每个多边形内的最小、最大和平均树冠高度。由于此工具输出一个表格,因此必须将其连接回树冠多边形,并可选择转换为点以进行进一步的可视化和分析。
结果:树冠
对于洛杉矶树冠示例,我们测试了栅格和机器学习管道。栅格管道提取了 73 个单独的树位置,而机器学习管道产生了 102 个单独的树位置。DBSCAN 的每个集群的最小特征和搜索距离参数分别指定为每个集群 100 个特征和 5 英尺,并根据对数据的视觉探索来选择代表有意义的树或灌木的最小点集群。
在比较管道时,73 个(约 70%)个单独的树位置中有 52 个是两个管道之间的完全匹配。在 10 个实例中,栅格管道识别出一棵树冠,而机器学习方法识别出同一位置的两棵或三棵树。还有 10 个实例,其中光栅管道在一个位置识别出两个单独的树冠,而在同一位置使用机器学习管道仅识别出一个。在 1 个实例中,光栅管道识别出树冠而机器学习管道没有,而在 22 个实例中,机器学习管道识别出树冠而光栅管道没有。
总体而言,两条管道在从移动 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%
由于此类不平衡,栅格管道无法有效提取单个交通点。在某些情况下,三个或四个 LiDAR 点代表一个交通信号灯,并且在对这些点进行光栅化时,创建的单个像素太小且噪声太大而无法使用。因此,我们使用 DBSCAN 将交通信号灯提取集中在机器学习管道上。
为 DBSCAN 选择的参数再次基于对数据的视觉检查,我们在其中发现了代表交通信号灯的最小点簇。对于 Schiedam 研究区域,我们选择了每个聚类的最小特征值 10,而阿姆斯特丹的两个研究区域都使用了每个聚类的最小特征值 2。所有三个荷兰研究区域的搜索距离参数都是 2 米。
尽管机器学习管道中的步骤与洛杉矶树冠分析中使用的步骤基本相同,但我们不必执行数据缩减步骤。与洛杉矶树多点数据集(包含超过 450 万个爆炸矢量点)不同,荷兰的三个研究区域都没有包含超过 70,000 个爆炸矢量点。
对结果的初步 3D 视觉检查表明了有希望的结果。下图中的黄色球点是PointCNN将LiDAR点标记为红绿灯的位置,机器学习管道提取了一个红绿灯点特征。
还有几个有趣的例子,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 -