主要内容

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

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

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

本例使用来自Hesai和Scale的pandset数据集[2].pandset包含4800张使用Pandar 64传感器捕获的各种城市场景的无组织激光雷达点云扫描图。该数据集提供了42个不同类别的语义分割标签,包括汽车、道路和行人。

下载激光雷达数据集

本例使用了pandset的一个子集,其中包含2560个经过预处理的有组织点云。每个点云都指定为64 × 1856的矩阵。对应的ground truth包含12个类的语义分割标签。点云以PCD格式存储,地面真实数据以PNG格式存储。数据集的大小为5.2 GB。执行以下代码下载数据集。

url =“https://ssd.mathworks.com/supportfiles/lidar/data/Pandaset_LidarData.tar.gz”;outputFolder = fullfile (tempdir,“Pandaset”);lidarDataTarFile = fullfile (outputFolder,“Pandaset_LidarData.tar.gz”);如果~存在(lidarDataTarFile“文件”mkdir (outputFolder);disp (“下载熊猫激光雷达驾驶数据(5.2 GB)…”);websave (lidarDataTarFile、url);解压(lidarDataTarFile outputFolder);结束检查是否下载了tar.gz文件,但未解压。如果(~存在(fullfile (outputFolder“激光雷达”),“文件”))...& & (~ (fullfile (outputFolder,存在“semanticLabels”),“文件”)解压(lidarDataTarFile outputFolder);结束lidarData = fullfile (outputFolder,“激光雷达”);labelsFolder = fullfile (outputFolder,“semanticLabels”);

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

本例的训练过程是针对有组织的点云的。有关演示如何将无组织点云转换为有组织点云的示例,请参见利用球面投影的点云无组织到有组织的转换

下载Pretrained网络

下载预先训练的网络,以避免不得不等待训练完成。如果您想训练网络,请设置doTraining变量来真正的

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

为培训准备数据

加载激光雷达点云和类标签

使用helperTransformOrganizedPointCloudToTrainingData支持函数,附在这个示例中,用于从激光雷达点云生成训练数据。该函数使用点云数据创建五通道输入图像。每个训练图像都指定为64 × 1856 × 5数组:

  • 每张图片的高度是64像素。

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

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

下面是训练数据的可视化表示。

Grouped.png

生成五通道训练图像。

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

五通道图像被保存为MAT文件。

处理过程可能需要一些时间。该代码暂停MATLAB®的执行,直到处理完成。

创造我mageDatastore和pixelLabelDatastore

创建一个imageDatastore利用imageDatastore和helperImageMatReader支持的自定义MAT文件读取器功能,对二维球面图像的五通道进行提取和存储。这个函数作为支持文件附加到这个示例中。

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

使用创建像素标签数据存储pixelLabelDatastore从像素标签图像中存储像素级标签。对象将每个像素标签映射到一个类名。在本例中,植被、地面、道路、道路标记、人行道、汽车、卡车、其他车辆、行人、道路屏障、标志和建筑物是感兴趣的对象;所有其他像素都是背景。指定这些类并为每个类分配唯一的标签ID。

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

方法将其中一个标记的图像叠加到相应的强度图像上,从而加载并显示该图像helperDisplayLidarOverlaidImage函数中定义的支持功能部分。

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

准备培训、验证和测试集

使用helperPartitionLidarSegmentationDataset支持函数(附在本例中)将数据分为训练集、验证集和测试集。属性指定的百分比拆分培训数据trainingDataPercentage.将其余数据按2:1的比例划分为验证和测试数据。的默认值trainingDataPercentage0.7

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

使用结合函数将像素标签和用于训练和验证数据的图像数据存储结合起来。

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

数据增加

数据增强是通过训练过程中对原始数据的随机变换来提高网络精度的一种方法。通过使用数据增强,您可以为训练数据添加更多的多样性,而不必实际增加标记训练样本的数量。

方法来扩充训练数据变换方法指定的自定义预处理操作helperAugmentData函数中定义的支持功能部分。该函数在水平方向上随机翻转多通道二维图像和相关标签。只对训练数据集应用数据增强。

augmentedTrainingData = transform(trainingData,@(x) helperAugmentData(x));

定义网络体系结构

创建标准的SqueezeSegV2 [1使用squeezesegv2Layers函数。在SqueezeSegV2网络中,编码器子网络由穿插着最大池化层的firemodule组成。这种排列顺序依次降低了输入图像的分辨率。另外,SqueezeSegV2网络使用焦损失函数用来减轻类分布不平衡对网络精度的影响。有关如何在语义分割中使用焦点损失函数的详细信息,请参见focalLossLayer

执行这段代码来创建可用于训练网络的层图。

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

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

analyzeNetwork (lgraph);

指定培训选项

使用Adam优化算法训练网络。使用trainingOptions(深度学习工具箱)函数指定超参数。

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设备。有关支持的设备的信息,请参见GPU计算的需求(并行计算工具箱).否则,加载一个预先训练的网络。

如果doTraining [net,info] = trainNetwork(trainingData,lgraph,options);其他的负载(fullfile (outputFolder“trainedSqueezeSegV2PandasetNet.mat”),“净”);结束

预测测试点云的结果

利用训练过的网络在测试点云上预测结果并显示分割结果。首先,读取一个五通道输入图像,并使用训练过的网络预测标签。

显示图形的分割作为一个覆盖。

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

使用helperDisplayLabelOverlaidPointCloud函数中定义的支持功能部分,以显示点云上的分割结果。

图;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,“详细”、假);

您可以使用交叉-并集(IoU)度量来度量每个类的重叠量。

evaluateSemanticSegmentation函数返回整个数据集、单个类和每个测试图像的指标。要查看数据集级别的指标,请使用指标。DataSetMetrics财产。

指标。DataSetMetrics
ans =表1×5GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU MeanBFScore  ______________ ____________ _______ ___________ ___________ 0.89724 0.61685 0.54431 0.81806 0.74537

数据集指标提供了网络性能的高级概述。要查看每个类对总体性能的影响,请使用指标。ClassMetrics财产。

指标。ClassMetrics
ans =13×3表精度IoU平均bfscore ________ _______ ___________未标记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.65668 0.95473卡车0.30352 0.27401 0.37273其他车辆0.64397 0.58108 0.47253行人0.26214 0.20896 0.45918路障0.23955 0.21971 0.19433标志0.17276 0.15613 0.44275建筑物0.94891 0.85117 0.96929

虽然总体的网络性能很好,但是一些类的类度量像路标而且卡车表示需要更多的训练数据以获得更好的性能。

支持功能

增加数据的函数

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,类名)% helperdisplaylidaroveraidimage (lidarImage, labelMap, classNames)%显示叠加图像。lidarImage是一个五通道激光雷达输入。% labelMap包含像素标签,classNames是标签数组%的名字。从激光雷达图像读取强度通道。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。的位置,“颜色”, B);图;ax = pcshow (pc);集(ax,“XLim”(-70 70),“YLim”70年[-70]);变焦(ax, 3.5);结束

函数定义激光雷达色度图

helperPandasetColorMap函数定义激光雷达数据集使用的色彩图。

函数cmap = helperPandasetColorMap cmap = [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. /;结束

函数显示像素标签颜色条

helperPixelLabelColorbar函数向当前轴添加一个颜色条。颜色栏被格式化为显示带有颜色的类名。

函数一会helperPixelLabelColorbar(提出)colormap (gca,提出);向当前图形添加颜色条。c = colorbar (“对等”甘氨胆酸,);使用类名作为标记。c.TickLabels =一会;numClasses =大小(类名,1);%中心勾号标签。c.Ticks = 1 / (numClasses * 2): 1 / numClasses: 1;去除标记。c.TickLength = 0;结束

函数下载预训练模型

downloadPretrainedSqueezeSegV2Net函数下载预训练的模型。

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

参考文献

[1]吴碧晨,周宣宇,赵思成,岳翔宇,Kurt Keutzer。SqueezeSegV2:改进的模型结构和无监督域自适应,用于从激光雷达点云中分割道路目标。在2019机器人与自动化国际会议(ICRA), 4376 - 82。加拿大蒙特利尔QC: IEEE, 2019。https://doi.org/10.1109/ICRA.2019.8793495

Hesai和Scale。PandaSet。https://scale.com/open-datasets/pandaset

Baidu
map