主要内容

航空激光雷达的语义分割使用PointNet + +深度学习

这个例子展示了如何训练PointNet + +深学习网络上执行语义分割航空激光雷达数据。

激光雷达数据从机载激光扫描系统用于获得应用,如地形测绘、城市建模、生物量测量和灾害管理。语义分割,从这些数据中提取有意义的信息,需要一个过程,每个点的点云都指定了一个惟一的类标签。

在本例中,您的火车PointNet + +网络执行语义分割利用地球代顿带注释的激光雷达扫描(山谷)的数据集1]。密集的数据集包含了场景,标签天线激光雷达数据来自城市,郊区、农村,和商业的设置。数据集提供了语义细分标签等8类建筑,汽车,卡车,波兰人、电线、栅栏、地面和植被。

山谷数据加载

山谷数据集包含40航空激光雷达数据的场景。40的场景,29日场景用于培训和剩下的11个场景用于测试。每个像素的数据有一个类标签。上的说明山谷网站数据下载到指定的文件夹dataFolder变量。创建文件夹来存储训练和测试数据。

dataFolder = fullfile (' / local-ssd / vancha vancha_data /山谷”,“山谷”);trainDataFolder = fullfile (dataFolder,“dales_las”,“火车”);testDataFolder = fullfile (dataFolder,“dales_las”,“测试”);

从训练数据预览一个点云。

lasReader = lasFileReader (fullfile (trainDataFolder5080 _54435.las));[pc, attr] = readPointCloud (lasReader“属性”,“分类”);标签= attr.Classification;%只选择带安全标签的数据。电脑=选择(pc、标签~ = 0);标签=标签(标签~ = 0);一会= [“地面”“植物”“汽车”“卡车”“电线”“篱笆”“两极”“建筑”];图;ax = pcshow (pc.Location、标签);helperLabelColorbar (ax,类名);标题(“点云覆盖语义标签”);

数据进行预处理

山谷中的每个点云数据集占地500————500米,比典型的覆盖面积大得多的地面激光雷达点云。高效内存处理,将点云分成小,通过使用一个非重叠块blockedPointCloud对象。

定义块尺寸使用blockSize参数。中的每个点云数据集的大小不同,设置z维的块为了避免块创建沿着z轴。

blocksize =(51 51正);

创建一个matlab.io.datastore.FileSet对象收集所有训练数据点云文件。

fs = matlab.io.datastore.FileSet (trainDataFolder);

创建一个blockedPointCloud对象使用文件集对象。

bpc = blockedPointCloud (fs, blocksize);

注:处理可能需要一些时间。MATLAB®代码中止执行,直到处理完成。

使用helperCalculateClassWeights辅助功能,附加到这个例子作为支持文件,计算点分布在所有训练数据集的类。金宝app

numClasses =元素个数(类名);(重量、maxLabel maxWeight] = helperCalculateClassWeights (fs, numClasses);

创建数据存储对象进行训练

创建一个blockedPointCloudDatastore对象使用阻塞点云,bpc来训练网络。

ldsTrain = blockedPointCloudDatastore (bpc);

指定标签id从1到类的数量。

labelIDs = 1: numClasses;

预览并显示点云。

ptcld =预览(ldsTrain);图;pcshow (ptcld.Location);标题(“剪裁点云”);

加快培训,设定一个固定数量的分。

numPoints = 8192;

转换数据,使其符合网络的输入层,使用helperTransformToTrainData函数,定义在这个例子。按照以下步骤应用转换。

  • 提取点云和相应的标签。

  • Downsample点云,指定数量的标签,numPoints

  • 正常的点云区间[0 1]。

  • 将点云转换和相应的标签,以让它们兼容网络的输入层。

ldsTransformed =变换(ldsTrain @ (x,信息)helperTransformToTrainData (x,信息,numPoints labelIDs,类名),“IncludeInfo”,真正的);阅读(ldsTransformed)
ans =1×2单元阵列{8192×3双}{8192×1分类}

定义PointNet + +模型

PointNet + +是一个流行的神经网络用于语义分割无组织的激光雷达点云。语义分割将三维点云中的每个点与一个类标签,如汽车、卡车、地面,或植被。有关更多信息,请参见开始使用PointNet + +

定义PointNet + +建筑使用pointnetplusLayers函数。

lgraph = pointnetplusLayers (numPoints 3 numClasses);

处理class-imbalance山谷数据集,加权熵的损失pixelClassificationLayer使用函数。这将惩罚网络更多的如果一个点属于一个类较低体重分类错误。

%替代与pixelClassificationLayer FocalLoss层。larray = pixelClassificationLayer (“名字”,“SegmentationLayer”,“ClassWeights”,重量、“类”类名);lgraph = replaceLayer (lgraph,“FocalLoss”,larray);

指定培训选项

使用一个大坝优化算法来训练网络。使用trainingOptions(深度学习工具箱)函数来指定hyperparameters。

learningRate = 0.0005;l2Regularization = 0.01;numEpochs = 20;miniBatchSize = 16;learnRateDropFactor = 0.1;learnRateDropPeriod = 10;gradientDecayFactor = 0.9;squaredGradientDecayFactor = 0.999;选择= trainingOptions (“亚当”,“InitialLearnRate”learningRate,“L2Regularization”l2Regularization,“MaxEpochs”numEpochs,“MiniBatchSize”miniBatchSize,“LearnRateSchedule”,“分段”,“LearnRateDropFactor”learnRateDropFactor,“LearnRateDropPeriod”learnRateDropPeriod,“GradientDecayFactor”gradientDecayFactor,“SquaredGradientDecayFactor”squaredGradientDecayFactor,“阴谋”,“训练进步”,“ExecutionEnvironment”,“图形”);

注意:减少miniBatchSize值来控制内存使用培训。

火车模型

训练网络,设置doTraining参数真正的。否则,加载一个pretrained网络。来训练网络,您可以使用CPU或GPU。使用GPU需要并行计算工具箱™和CUDA NVIDIA GPU®®启用。有关更多信息,请参见GPU计算的需求(并行计算工具箱)

doTraining = false;如果doTraining%火车ldsTransformed数据存储上的网络使用% trainNetwork函数。(网络,信息)= trainNetwork (ldsTransformed、lgraph选项);其他的%加载pretrained网络。负载(“pointnetplusTrained”,“净”);结束

段空中点云

执行测试点云分割,首先创建一个blockedPointCloud对象,然后创建一个blockedPointCloudDatastore对象。

应用相似变换用于训练数据,测试数据:

  • 提取点云和相应的标签。

  • Downsample指定数量的点云,numPoints

  • 正常的点云区间[0 1]。

  • 将点云转换为让它兼容网络的输入层。

tbpc = blockedPointCloud (fullfile (testDataFolder5080 _54470.las),blocksize);tbpcds = blockedPointCloudDatastore (tbpc);

定义numNearestNeighbors半径downsampled找到最近的点的点云密集的点云中的每个点和有效地进行插值。

numNearestNeighbors = 20;半径= 0.05;

Initiailize空预测的占位符。

labelsDensePred = [];

这个测试点云上执行推理计算预测标签。插入预测标签,标签密集的点云获取预测。在重叠迭代过程块和预测使用的标签pcsemanticsegf津津有味。

hasdata (tbpcds)%读取块与块信息。ptCloudDense =阅读(tbpcds);%使用helperDownsamplePoints函数,在这个例子作为一个%的金宝app支持文件,提取的downsampled点云%密集的点云。ptCloudSparse = helperDownsamplePoints (ptCloudDense {1}, [], numPoints);%使用helperNormalizePointCloud函数,在这个例子中一样%的支持金宝app文件,正常点云在0和1之间。ptCloudSparseNormalized = helperNormalizePointCloud (ptCloudSparse);ptCloudDenseNormalized = helperNormalizePointCloud (ptCloudDense {1});%使用helperTransformToTestData函数,在这个定义%的示例中,将点云转换为一个单元阵列和排列%的点云,让它兼容的输入层%的网络。ptCloudSparseForPrediction = helperTransformToTestData (ptCloudSparseNormalized);%得到预测的输出。labelsSparsePred = pcsemanticseg (ptCloudSparseForPrediction {1},网,“OutputType”,“uint8”);%使用helperInterpolate函数,在这个例子作为一个%的金宝app支持文件,计算密集的点云的标签,%利用稀疏的点云和标签预测在稀疏的点云。interpolatedLabels = helperInterpolate (ptCloudDenseNormalized,ptCloudSparseNormalized、labelsSparsePred numNearestNeighbors,半径,maxLabel numClasses);%连接块的预测标签。labelsDensePred = vertcat (labelsDensePred interpolatedLabels);结束
开始平行池(parpool)使用过程的概要文件…连接到平行池(工人数量:6)。

为了更好地可视化,只显示一块推断从点云数据。

图;ax = pcshow (ptCloudDense {1} .Location, interpolatedLabels);轴;helperLabelColorbar (ax,类名);标题(“点云覆盖检测语义标签”);

评估网络

对测试数据进行评估,测试点的标签云。测试数据的标签已经在前一步预测。因此,迭代点云的重叠块和提取地面真理标签。

初始化目标标签占位符。

labelsDenseTarget = [];

循环块点云数据存储和获取地面实况标签。

重置(tbpcds);hasdata (tbpcds)%读取块与块信息。[~,infoDense] =阅读(tbpcds);%提取块的标签信息。labelsDense = infoDense.PointAttributes.Classification;%连接目标块的标签。labelsDenseTarget = vertcat (labelsDenseTarget labelsDense);结束

使用evaluateSemanticSegmentation函数来计算语义细分指标的测试集的结果。目标和预测标签之前计算和存储在labelsDensePredlabelsDenseTarget变量分别。

confusionMatrix = segmentationConfusionMatrix(双(labelsDensePred),双(labelsDenseTarget),“类”1:numClasses);指标= evaluateSemanticSegmentation ({confusionMatrix},一会,“详细”、假);

你可以测量的重叠量每个类使用intersection-over-union(借据)指标。

evaluateSemanticSegmentation函数返回指标对整个数据集,单独的类,每个测试图像。在数据集级别指标,使用metrics.DataSetMetrics财产。

metrics.DataSetMetrics
ans =1×4表_______ _________ ___________ GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU * * * 0.93771 0.6691 0.54486 0.89091

数据集的度量提供了一个网络性能的高级概述。看到每一个类对整体性能的影响,检查每一个类使用的指标metrics.ClassMetrics财产。

metrics.ClassMetrics
ans =8×2表准确性借据说地面植被0.9942 - 0.94533 0.10772 - 0.088377 0.7154 - 0.40561 0.86256 - 0.83汽车卡车电线围栏0.74916 - 0.6945 0.93155 - 0.89556 0.58334 - 0.25323 0.40889 - 0.2463波兰人建筑

虽然整体网络性能很好,类等几类指标卡车表明,需要更多的训练数据更好的性能。

金宝app支持功能

helperLabelColorbar函数添加一个colorbar当前轴。colorbar格式化显示类名和颜色。

函数helperLabelColorbar (ax,类名)% Colormap原始类。提出= [[0 0 255];(255 0);(255 192 203);(255 255 0];(255 0 255);(255 165 0];(139 0 150);[255 0 0]];提出255 = cmap. /;提出=提出(1:元素个数(类名):); colormap(ax,cmap);% colorbar添加到当前的图。c = colorbar (ax);c。颜色=' w ';%中心蜱虫标签和使用类名来刻度线。numClasses =大小(类名,1);c。蜱虫= 1:1:numClasses;c。TickLabels =一会;%去除刻度线。c。TickLength = 0;结束

helperTransformToTrainData函数执行这些转换的输入数据集:

  • 提取点云和相应的标签。

  • Downsample点云,指定数量的标签,numPoints

  • 正常的点云区间[0 1]。

  • 将点云转换和相应的标签,以让它们兼容网络的输入层。

函数[cellout, dataout] = helperTransformToTrainData(数据、numPoints信息,labelIDs一会)如果~ iscell数据(数据)={数据};结束numObservations =大小(数据,1);cellout =细胞(numObservations, 2);dataout =细胞(numObservations, 2);i = 1: numObservations分类= info.PointAttributes .Classification;%使用helperDownsamplePoints函数,在这个例子作为一个%的金宝app支持文件,提取一个downsampled点云及其标签%从密集的点云。[ptCloudOut, labelsOut] = helperDownsamplePoints(数据{1},我,分类、numPoints);%密集的点云的空间范围和稀疏的点%的云一样。限制= [ptCloudOut.XLimits; ptCloudOut.YLimits;ptCloudOut.ZLimits];ptCloudSparseLocation = ptCloudOut.Location;:ptCloudSparseLocation(1:2) =限制(:1:2)';ptCloudSparseUpdated = pointCloud (ptCloudSparseLocation,“强度”ptCloudOut.Intensity,“颜色”ptCloudOut.Color,“正常”,ptCloudOut.Normal);%使用helperNormalizePointCloud函数,在这个例子中一样%的支持金宝app文件,正常点云在0和1之间。ptCloudOutSparse = helperNormalizePointCloud (ptCloudSparseUpdated);cellout{我1}= ptCloudOutSparse.Location;%排列输出。cellout{我2}=排列(分类(labelsOut labelIDs,类名),[1 3 2]);%总输出。dataout{我1}= ptCloudOutSparse;dataout{我2}= labelsOut;结束结束

helperTransformToTestData函数将点云转换为一个单元阵列和排列点云的尺寸使其兼容网络的输入层。

函数data = helperTransformToTestData(数据)如果~ iscell数据(数据)={数据};结束numObservations =大小(数据,1);i = 1: numObservations tmp ={我1}.Location数据;数据{1}= tmp;结束结束

引用

[1]瓦尼,尼娜,Vijayan k . Asari和奎因Graehling。“山谷:大型航空激光雷达数据集语义分割。”ArXiv: 2004.11985 (Cs,统计)2020年4月14日。https://arxiv.org/abs/2004.11985

[2]气,查尔斯·R。,Li Yi, Hao Su, and Leonidas J. Guibas. "PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space."ArXiv: 1706.02413 (Cs),2017年6月7日。https://arxiv.org/abs/1706.02413