主要内容

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

此示例示出了如何培养3-d一个SqueezeSegV2语义分割网络组织激光雷达点云数据。

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

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

下载LIDAR数据集

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

URL =.'https://ssd.mathwands.com/万博1manbetxsupportfiles/lidar/data/pandaset_lidardata.tar.gz';outputFolder =完整文件(TEMPDIR,“Pandaset”);lidarDataTarFile = fullfile (outputFolder,'Pandaset_LidarData.tar.gz');如果〜存在(lidarDataTarFile,'文件')MKDIR(输出文件);DISP('下载Pandaset Lidar驾驶数据(5.2 GB)......');websave (lidarDataTarFile、url);解压(lidarDataTarFile outputFolder);结束%检查tar.gz文件是否已下载,但不是未压缩。如果(〜存在(fullfile(outputfolder,'lidar'),'文件')))......&&(〜存在(完整文件(outputFolder,'semanticlabels'),'文件'))Untar(LidardataTarfile,OutputFolder);结束lidardata = fullfile(outputfolder,'lidar');labelsFolder = fullfile (outputFolder,'semanticlabels');

根据你的网络连接,下载过程可能需要一些时间。代码暂停MATLAB®执行,直到下载过程完成。或者,您可以使用web浏览器将数据集下载到本地磁盘,然后提取Pandaset_LidarData文件夹中。要使用从网上下载的文件,请更改导出目录变量的代码下载的文件的位置。

此示例的培训过程是有组织的点云。有关展示如何转换未组织到有组织点云的示例,请参阅使用球面投影组织零云的转换来组织转换

下载掠夺网络

下载预先训练的网络,以避免等待训练完成。如果你想训练网络,设置doTraining变量到真的

dotraining = false;PretrateNeturl =.......'https://ssd.mathworks.com/万博1manbetxsupportfiles/lidar/data/trainedSqueezeSegV2PandasetNet.zip'如果〜dotrain downloadpretratedsqueezesegv2net(outputfolder,pretrowneturl);结束

准备培训数据

加载LIDAR点云和类标签

使用helperTransformOrganizedPointCloudToTrainingData万博1manbetx支持功能,附加到此示例,从激光雷云生成培训数据。该函数使用点云数据来创建五个通道输入图像。每个训练图像被指定为64-by-1856-by-5阵列:

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

  • 每个图像的宽度是1856像素。

  • 每个图像有五个通道。所述五个信道指定的点云,强度的3-d的坐标和范围: r x 2 + y 2 + z 2

培训数据的视觉表示。

生成五通道训练图像。

imagesFolder =完整文件(outputFolder,'图片');HelperTransformorganizedPointCloudtotRainingData(Lidardata,Imagefolder);
预处理数据100%完成

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

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

我创建Magedatastore.和P.ixelLabelDatastore

创建一个imageageAtastore.使用ImageageAtastore和HelperimageMatreader支持功能提取和存储二维球形图像的五个通道,这是一个自定义垫文件读取器。万博1manbetx此函数附加到该示例中作为支持文件。万博1manbetx

imd = imageDatastore (imagesFolder,......'fileextensions''。垫'......“ReadFcn”,@helperimagematreader);

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

ClassNames = [“未标记”“植物”“地面”“路”“路标”“人行道”“车”“卡车”“OtherVehicle”“行人”“RoadBarriers”“迹象”“建筑”];numclasses = numel(classnames);%指定为1标签ID来的类的数量。labelIDs = 1: numClasses;pxds = pixelLabelDatastore(labelsFolder, classNames, labelid);

控件加载并显示其中一个标签图像,将其覆盖在相应的强度图像上Helperdisplaylidaroverlaidimage.功能,定义万博1manbetx支持功能这个例子的一部分。

%点云(通道1,2和3是位置,通道4用于强度,并且通道5用于范围)。我=读(IMDS);LabelMap =读取(PXD);图;Helperdisplaylidaroverlaidimage(i,labelmap {1,1},classnames);标题('真相');

准备培训,验证和测试集

使用helperPartitionLidarSegmentationDataset万博1manbetx支撑功能,安装于本实施例中,分割数据为训练,验证和测试集。您可以根据指定的百分比分割训练数据trainingDataPercentage.划分数据的其余部分以2:1的比率成的验证和测试数据。默认值trainingDataPercentage0.7

[IMDStrain,IMDSVAL,IMDSTEST,PXDSTRAIN,PXDSVAL,PXDSTEST] =......HelperpartitionLidarsemationDataset(IMDS,PXD,'trainingdataperceace',0.75);

使用结合将像素标签和图像数据存储组合起作用培训和验证数据的功能。

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

数据增加

数据增强用于通过在培训期间随机转换原始数据来提高网络精度。通过使用数据增强,您可以为培训数据添加更多品种而实际上必须增加标记的训练样本的数量。

通过使用使用培训数据来增加培训数据转变自定义预处理操作函数指定由helperAugmentData功能,定义万博1manbetx支持功能这个例子的一部分。此函数在水平方向随机翻转多通道二维图像和相关标签。仅对训练数据集应用数据增强。

augmentedTrainingData =变换(trainingData,@(X)helperAugmentData(X));

定义网络架构

创建标准挤压ZESEGV2 [1]网络通过使用Squeezesegv2镶嵌功能。在SqueezEseGvv2网络中,编码器子网由散布带有MAX池层的FireModules组成。这种布置连续地降低输入图像的分辨率。此外,SqueezeSegv2网络使用重点损失函数来缓解不平衡类分布对网络精度的影响。有关如何在语义分割中使用焦损函数的更多详细信息,请参阅focalLossLayer

执行此代码以创建可用于培训网络的图层图。

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

使用分析(深学习工具箱)功能显示网络架构的交互式可视化。

analyzeNetwork (lgraph);

指定培训选项

使用一个培训网络的优化算法。使用培训选项函数指定超参数。

maxEpochs = 30;initialLearningRate = 1E-3;miniBatchSize = 8;l2reg = 2E-4;选项=培训选项('亚当'......'italllearnrate'initialLearningRate,......'L2Regularization'l2reg,......'maxepochs',maxepochs,......'minibatchsize',miniBatchSize,......'shownrateschedule''分段'......'学习ropfactor', 0.1,......'学习ropperiod'10,......'vightationdata',validationdata,......“阴谋”'培训 - 进步'......'verbosefrequency'20);

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

列车网络的

您可以通过设置来培训网络doTraining争论真的.如果您培训网络,可以使用CPU或GPU。使用GPU需要并行计算工具箱™和支持的GPU设备。万博1manbetx有关支持设备的信息,请参阅万博1manbetxGPU通万博1manbetx过发布支持(并行计算工具箱).否则,加载备用网络。

如果doTraining [净,信息] = trainNetwork(trainingData,lgraph,选项);别的负载(完整文件(outputFolder,'trainedSqueezeSegV2PandasetNet.mat'),“净”);结束

预测测试点云的结果

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

以分段为叠加显示该图。

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

使用helperDisplayLabelOverlaidPointCloud功能,定义万博1manbetx支持功能此示例的部分,在点云上显示分段结果。

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

评估网络

使用evaluateSemanticSegmentation从测试集结果中计算语义分段度量的功能。

OpertalLocation = FullFile(Tempdir,“输出”);如果~存在(outputLocation'dir')MKDIR(输出分配);结束pxdsresults = semanticseg(IMDST,NET,......'minibatchsize',4,......“WriteLocation”,输出位置,......'verbose'、假);metrics = evaluateSemanticSegmentation(pxdsResults, pxdsTest,'verbose'、假);

可以使用交叉点过联盟(IOU)公制测量每类的重叠量。

evaluateSemanticSegmentation函数返回整个数据集、单个类和每个测试映像的度量值。要在数据集级别查看度量标准,请使用metrics.datasetmetrics.财产。

metrics.datasetmetrics.
ans =.1×5表GlobalAccuracy意味着意思是Meaniou Reightiou含义______________________________________________ 0.61685 0.81806 0.81806 0.81806 0.81806 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 OtherVehicle 0.64397 0.58108 0.47253步行0.26214 0.20896 0.45918 RoadBarriers 0.23955 0.21971 0.19433标志0.17276 0.15613 0.44275 0.94891建筑0.85117 0.96929

虽然整体网络性能还是不错的,对于某些类的类指标,如路线标志卡车表明更好的性能需要更多的培训数据。

万博1manbetx支持功能

增加数据的函数

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

功能Out = HelperaugmentData(InP)%应用随机水平翻转。OUT = CELL(大小(INP));%随机翻转五通道图像和像素水平地标签。I = INP {1};SZ =尺寸(I);tform = ronstaffine2d('XReflection',真正的);tform溃败= affineOutputView(深圳,'裸机'“centerOutput”);{1} = imwarp(i,tform,'OutputView',击溃);{2} = imwarp(Inp {2},tform,'OutputView',击溃);结束

函数来显示雷达分割地图的覆盖在2-d天球图像

Helperdisplaylidaroverlaidimage.功能覆盖在2-D球面图像的强度通道上的语义分割图。该功能还调整重叠图像的大小以获得更好的可视化。

功能Helperdisplaylidaroverlaidimage(Lidarimage,LabelMap,ClassNames)在强度图像上覆盖标签。%helperDisplayLidarOverlaidImage(lidarImage,标记图,类名)%显示重叠图像。Lidarimage是一个五通道的激光雷达输入​​。% labelMap包含像素标签,classNames是一个标签数组%名称。%从LIDAR图像中读取强度通道。intensityChannel = UINT8(lidarImage(:,:,4));%加载LIDAR颜色图。提出= helperPandasetColorMap;%覆盖强度图像上的标签。b = labeloverlay(IntenseyChannel,LabelMap,'colormap'提出,'透明度',0.4);%调整大小以便更好的可视化。b = imresize(b,'规模'(3 - 1),'方法''最近');imshow(b);Helperpixellabelolorbar(CMAP,ClassNames);结束

在3-D点云上显示LIDAR分段映射的功能

helperDisplayLabelOverlaidPointCloud功能覆盖在3-d有组织的点云的分割结果。

功能helperDisplayLabelOverlaidPointCloud(I,predictedResult)%helperDisplayLabelOverlaidPointCloud覆盖层标签在点云对象。%helperDisplayLabelOverlaidPointCloud(I,predictedResult)%显示覆盖的pointCloud对象。I是组织的5个渠道%输入图像。predictedResult包含像素标签。ptcloud = pointcloud(i(::,1:3),'强度',I(:,:,4));提出= helperPandasetColorMap;B =......Labeloperlay(UINT8(PTCLoud.ILTESSITES),PredightERGERERER,'colormap'提出,'透明度',0.4);PC =点云(ptCloud.Location,'颜色',b);图;AX = PCSHOW(PC);套(斧头,'xlim',[ -  70 70],“YLim”,[ -  70 70]);变焦(斧头,3.5);结束

函数定义激光雷达色图

HelperpandasetColormap.函数定义激光雷达数据集使用的颜色图。

功能CMAP = HelperPandasetColorMap CMAP = [[30,30,30];%无标号[0,255,0];%植被(255、150、255);% 地面[255,0,255];% 路(255, 0, 0);%道路标记[90,30,150];%人行道[245150100];% 车(250、80、100);%的卡车[150,60,30];%其他车辆[255,255,0];% 行人[0,200,255];%道路障碍[170,100,150];%标志[30,30,255]];% 建筑cmap = cmap./255;结束

函数显示像素标签颜色栏

helperPixelLabelColorbar功能增加了彩条到当前轴线。该彩条的格式显示与颜色的类名称。

功能helperPixelLabelColorbar(cmap, classNames) colormap(gca, cmap);%将颜色栏添加到当前图形。c =彩色杆('同伴',GCA);%用途类名的刻度线。C.Ticklabels = ClassNames;numclasses = size(classnames,1);%Center Tick标签。C.Ticks = 1 /(Numclasses * 2):1 / numclasses:1;%删除刻度线。c.ticklength = 0;结束

功能下载预训练模式

DownloadPretrySqueezeseGv2Net.功能下载预训练的模式。

功能downloadPretrainedSqueezeSegV2Net(outputFolder,pretrainedNetURL)preTrainedMATFile =完整文件(outputFolder,'trainedSqueezeSegV2PandasetNet.mat');preTrainedZipFile = fullfile (outputFolder,“trainedSqueezeSegV2PandasetNet.zip”);如果~存在(preTrainedMATFile'文件'如果~存在(preTrainedZipFile'文件')disp('下载佩带的型号(5 MB)......');websave (preTrainedZipFile pretrainedNetURL);结束解压(preTrainedZipFile,outputFolder);结束结束

参考

[1]吴,比辰,宣扬周,浙城赵,湘雅悦,和库尔特凯兹。“Screezesegv2:改进了LIDAR点云的道路对象分割的模型结构和无监督域适应。”在2019年机器人和自动化国际会议(ICRA),4376-82。蒙特利尔,QC,加拿大:IEEE,2019年。https://doi.org/10.1109/ICRA.2019.8793495

[2] Hesa​​i和Scale。Pandaset。https://scale.com/open-datasets/pandaset.