主要内容

激光雷达点云的语义分割使用SqueezeSegV2深度学习网络

这个例子展示了如何训练SqueezeSegV2语义分割网络组织的三维激光雷达点云数据。

SqueezeSegV2 [1)是一种卷积神经网络(CNN)执行端到端语义分割的一个有组织的激光雷达点云。这个示例中所示的训练过程需要二维球面投影图像作为输入到深度学习网络。

这个示例使用PandaSet Hesai和规模的数据集[2]。PandaSet包含4800无组织的激光雷达点云扫描的各种城市通过Pandar 64传感器捕获的场景。数据集提供了42个不同类别的语义分割标签包括汽车,道路,行人。

激光雷达数据集下载

这个示例使用PandaSet的一个子集,包含2560预处理组织点云。每个点云被指定为64 - 1856矩阵。相应的地面真理包含语义细分为12类标签。点云存储在PCD格式,和地面真理PNG格式的数据存储。数据集的大小是5.2 GB。执行这段代码下载数据集。

url =“https://ssd.mathworks.com/金宝appsupportfiles/lidar/data/Pandaset_LidarData.tar.gz”;outputFolder = fullfile (tempdir,“Pandaset”);lidarDataTarFile = fullfile (outputFolder,“Pandaset_LidarData.tar.gz”);如果~存在(lidarDataTarFile“文件”mkdir (outputFolder);disp (“下载Pandaset激光雷达数据(5.2 GB)……”);websave (lidarDataTarFile、url);解压(lidarDataTarFile outputFolder);结束%检查焦油。gz文件下载,但不是未压缩的。如果(~存在(fullfile (outputFolder“激光雷达”),“文件”))& & (~ (fullfile (outputFolder,存在“semanticLabels”),“文件”)解压(lidarDataTarFile outputFolder);结束lidarData = fullfile (outputFolder,“激光雷达”);labelsFolder = fullfile (outputFolder,“semanticLabels”);

根据您的网络连接,下载过程可能需要一些时间。MATLAB®代码中止执行,直到下载过程完成。或者,您可以下载数据集使用web浏览器本地磁盘,然后提取Pandaset_LidarData文件夹中。的Pandaset_LidarData包含激光雷达,长方体semanticLabels文件夹,点云,分别长方体标签和语义标签的信息。用你从网上下载的文件,更改outputFolder变量在代码下载文件的位置。

这个例子的训练过程是组织点云。示例显示如何将无组织的组织点云,看到的无组织的组织转换使用球面投影点云

下载Pretrained网络

下载pretrained网络避免等待培训完成。如果你想训练网络,设置doTraining变量来真正的

doTraining = false;pretrainedNetURL =“https://ssd.mathworks.com/金宝appsupportfiles/lidar/data/trainedSqueezeSegV2PandasetNet.zip”;如果~ doTraining downloadPretrainedSqueezeSegV2Net (outputFolder pretrainedNetURL);结束
下载pretrained模型(5 MB)……

准备培训资料

载激光雷达点云和类标签

使用helperTransformOrganizedPointCloudToTrainingData金宝app支持功能,附在本例中,生成训练数据从激光雷达点云。函数使用点云数据创建五频输入图像。每个训练图像指定为64 - 1856 - 5数组:

  • 每个图像的高度是64像素。

  • 每张图片的宽度为1856像素。

  • 每张图片有五个频道。五个通道指定点云的三维坐标,强度,和范围: r = x 2 + y 2 + z 2

训练数据的可视化表示。

生成五频训练图像。

imagesFolder = fullfile (outputFolder,“图片”);helperTransformOrganizedPointCloudToTrainingData (lidarData imagesFolder);
预处理数据100%完成

五频图像保存为垫的文件。

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

创造我mageDatastore和pixelLabelDatastore

创建一个imageDatastore提取和存储二维球面图像的五通道使用imageDatastore和helperImageMatReader支持函数,这是一个定制垫文件阅读器。金宝app这个函数是附加到这个例子作为支持文件。金宝app

imd = imageDatastore (imagesFolder,“FileExtensions”,“.mat”,“ReadFcn”,@helperImageMatReader);

创建一个数据存储使用像素标签pixelLabelDatastore从像素标签图像存储pixel-wise标签。对象映射每个像素标签类名。在这个例子中,植被、地面、道路、道路标记,人行道上,汽车,卡车,其他车辆,行人、道路障碍,标志,建筑感兴趣的对象;其他所有像素的背景。指定这些类和一个唯一的标签ID分配给每个类。

一会= [“未标记的”“植物”“地面”“路”“路标”“人行道”“汽车”“卡车”“OtherVehicle”“行人”“RoadBarriers”“迹象”“建筑”];numClasses =元素个数(类名);%指定标签id从1到类的数量。labelIDs = 1: numClasses;一会,pxds = pixelLabelDatastore (labelsFolder labelIDs);

加载和显示一个标签图像通过覆盖在相应的使用强度图像helperDisplayLidarOverlaidImage函数,定义的金宝app支持功能这个例子。

%点云(通道1、2和3的位置,4频道是强度、范围和通道5)。我=读(imd);labelMap =阅读(pxds);图;helperDisplayLidarOverlaidImage(我labelMap{1},类名);标题(“地面实况”);

准备培训,验证集和测试集

使用helperPartitionLidarSegmentationDataset金宝app支持函数,在这个例子中,将数据分为训练,验证集和测试集。你可以把训练数据根据指定的百分比trainingDataPercentage。把剩下的数据验证和测试数据是2:1。的默认值trainingDataPercentage0.7

[imdsTrain, imdsVal imdsTest、pxdsTrain pxdsVal, pxdsTest] =pxds helperPartitionLidarSegmentationDataset (imd,“trainingDataPercentage”,0.75);

使用结合函数结合像素标签和图像数据存储的培训和验证数据。

trainingData =结合(imdsTrain pxdsTrain);validationData =结合(imdsVal pxdsVal);

数据增加

数据增加用于提高网络精度通过随机改变原始数据在训练。通过使用数据,您可以添加更多的各种训练数据而不必实际增加标记训练样本的数量。

增加训练数据使用变换函数与自定义指定的预处理操作helperAugmentData函数,定义的金宝app支持功能这个例子。这个函数随机翻转多通道二维图像在水平方向上和相关的标签。应用数据增加训练数据集。

augmentedTrainingData =变换(trainingData @ (x) helperAugmentData (x));

定义网络体系结构

创建一个标准SqueezeSegV2 [1网络使用squeezesegv2Layers函数。在SqueezeSegV2网络编码器子网由FireModules穿插max-pooling层。这种安排先后输入图像的分辨率降低。此外,SqueezeSegV2网络使用焦损失函数来减轻不平衡类的分布对网络的影响精度。更多细节关于如何使用焦损失函数的语义分割,明白了focalLossLayer

执行该代码创建一个层图,可用于训练网络。

inputSize = (64 1856 5);lgraph = squeezesegv2Layers (inputSize,numClasses,“NumEncoderModules”4“NumContextAggregationModules”2);

使用analyzeNetwork(深度学习工具箱)函数显示一个交互式可视化的网络体系结构。

analyzeNetwork (lgraph);

指定培训选项

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

maxEpochs = 30;initialLearningRate = 1 e - 3;miniBatchSize = 8;l2reg = 2的军医;选择= trainingOptions (“亚当”,“InitialLearnRate”initialLearningRate,“L2Regularization”l2reg,“MaxEpochs”maxEpochs,“MiniBatchSize”miniBatchSize,“LearnRateSchedule”,“分段”,“LearnRateDropFactor”,0.1,“LearnRateDropPeriod”10“ValidationData”validationData,“阴谋”,“训练进步”,“VerboseFrequency”,20);

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

列车网络的

通过设置网络你可以训练自己doTraining参数真正的。如果你训练网络,您可以使用一个CPU或GPU。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU的金宝app支持版本(并行计算工具箱)。否则,加载一个pretrained网络。

如果doTraining[网,信息]= trainNetwork (trainingData、lgraph选项);其他的负载(fullfile (outputFolder“trainedSqueezeSegV2PandasetNet.mat”),“净”);结束

预测结果测试点云

使用训练网络预测结果在测试点云分割结果并显示。首先,读五频输入图像和预测标签使用训练网络。

作为一个叠加显示的图分割。

我=读(imdsTest);predictedResult = semanticseg(我,净);图;helperDisplayLidarOverlaidImage(我predictedResult类名);标题(“语义分割结果”);

使用helperDisplayLabelOverlaidPointCloud函数,定义的金宝app支持功能的这个例子中,显示在点云分割结果。

图;helperDisplayLabelOverlaidPointCloud(我predictedResult);视图(60)(39.2 - 90.0);标题(“语义分割结果对点云”);

评估网络

使用evaluateSemanticSegmentation函数来计算语义细分指标的测试集的结果。

outputLocation = fullfile (tempdir,“输出”);如果~存在(outputLocation“dir”mkdir (outputLocation);结束pxdsResults = semanticseg (imdsTest净,“MiniBatchSize”4“WriteLocation”outputLocation,“详细”、假);指标= evaluateSemanticSegmentation (pxdsResults pxdsTest,“详细”、假);

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

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

metrics.DataSetMetrics
ans =表1×5_______ GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU MeanBFScore * * *…………0.89724 0.61685 - 0.54431 0.81806 - 0.74537

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

metrics.ClassMetrics
ans =13×3表准确性借据MeanBFScore ________ _________⒈无标号的地面植被0.94 0.9005 0.99911 0.77873 0.64819 0.95466 0.69019 0.59089 0.60657路人行道路标0.94045 0.83663 0.99084 0.37802 0.34149 0.77073 0.7874 0.65668 0.93687汽车卡车0.9334 0.81065 0.95448 0.30352 0.27401 0.37273 0.64397 0.58108 0.47253 OtherVehicle行人RoadBarriers 0.26214 0.20896 0.45918 0.23955 0.21971 0.19433 0.94891 0.85117 0.96929 0.17276 0.15613 0.44275建筑迹象

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

金宝app支持功能

增加数据的函数

helperAugmentData函数随机翻转球面图像在水平方向上和相关的标签。

函数= helperAugmentData(输入)%应用随机水平翻转。=细胞(大小(输入));%随机水平翻转五频图像和像素标签。我=输入{1};深圳=大小(I);tform = randomAffine2d (“XReflection”,真正的);tform溃败= affineOutputView(深圳,“BoundsStyle”,“centerOutput”);{1}= imwarp (tform,我“OutputView”,溃败);{2}= imwarp (tform inp {2},“OutputView”,溃败);结束

函数显示激光雷达地图叠加在二维球面图像分割

helperDisplayLidarOverlaidImage功能覆盖语义分割图的强度通道二维球面图像。功能也会自动覆盖图像更好的可视化。

函数helperDisplayLidarOverlaidImage (lidarImage labelMap,类名)% helperDisplayLidarOverlaidImage (lidarImage labelMap,类名)%显示覆盖的图像。lidarImage五频激光雷达输入。% labelMap包含像素标签和标签的类名是一个数组%的名字。%从激光雷达图像读取通道强度。intensityChannel = uint8 (lidarImage (:,:, 4));%加载激光雷达彩色地图。提出= helperPandasetColorMap;%覆盖强度图像的标签。B = labeloverlay (intensityChannel labelMap,“Colormap”提出,“透明”,0.4);%调整更好的可视化。B = imresize (B,“规模”(3 - 1),“方法”,“最近的”);imshow (B);helperPixelLabelColorbar(提出,类名);结束

函数显示激光雷达分割地图覆盖在三维点云

helperDisplayLabelOverlaidPointCloud功能覆盖组织三维点云分割结果。

函数predictedResult helperDisplayLabelOverlaidPointCloud(我)predictedResult % helperDisplayLabelOverlaidPointCloud(我)%显示覆盖pointCloud对象。我是5个渠道组织%输入图像。predictedResult包含像素标签。ptCloud = pointCloud(我(:,:1:3),“强度”,我(::4));提出= helperPandasetColorMap;B =predictedResult labeloverlay (uint8 (ptCloud.Intensity),“Colormap”提出,“透明”,0.4);电脑= pointCloud (ptCloud.Location,“颜色”,B);图;ax = pcshow (pc);集(ax,“XLim”(-70 70),“YLim”70年[-70]);变焦(ax, 3.5);结束

函数定义激光雷达Colormap

helperPandasetColorMap函数定义了colormap所使用的激光雷达数据集。

函数提出= helperPandasetColorMap提出= [[30 30 30);%无标号(255 0);%的植被(255 150 255);%的地面(255 0 255);%的道路(255 0 0);%路标(90 150);%人行道(245 150 100);%的车(250 80 100);%的卡车60 30 [150];%其他车辆(255 255 0];%行人[0 200 255);%道路障碍(170 100 150);%的迹象[30 30 255]];%的建筑提出255 = cmap. /;结束

函数显示像素标签Colorbar

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

函数一会helperPixelLabelColorbar(提出)colormap (gca,提出);% colorbar添加到当前的图。c = colorbar (“对等”甘氨胆酸,);%为刻度线使用类名。c。TickLabels =一会;numClasses =大小(类名,1);%中心标记标签。c。蜱虫= 1 / (numClasses * 2): 1 / numClasses: 1;%去除刻度线。c。TickLength = 0;结束

下载Pretrained函数模型

downloadPretrainedSqueezeSegV2Net功能下载pretrained模型。

函数downloadPretrainedSqueezeSegV2Net (outputFolder pretrainedNetURL) preTrainedMATFile = fullfile (outputFolder,“trainedSqueezeSegV2PandasetNet.mat”);preTrainedZipFile = fullfile (outputFolder,“trainedSqueezeSegV2PandasetNet.zip”);如果~存在(preTrainedMATFile“文件”)如果~存在(preTrainedZipFile“文件”)disp (“下载pretrained模型(5 MB)……”);websave (preTrainedZipFile pretrainedNetURL);结束解压缩(preTrainedZipFile outputFolder);结束结束

引用

[1],Bichen Xuanyu周,Sicheng赵,翔宇悦,库尔特·Keutzer。“SqueezeSegV2:改进的模型结构和无监督领域适应Road-Object从激光雷达点云分割。“在)举行2019机器人与自动化国际会议上(“国际机器人与自动化会议”,4376 - 82。加拿大蒙特利尔,QC: IEEE 2019。https://doi.org/10.1109/ICRA.2019.8793495

[2]Hesai和规模。PandaSet。https://scale.com/open-datasets/pandaset