主要内容

LIDAR点云语义分割使用SCREEZESEGV2深层学习网络

此示例显示如何在3-D组织的LIDAR点云数据上训练挤压群种语义分段网络。

squeezesegv2 [1]是用于执行有组织的激光雷云的端到端语义分割的卷积神经网络(CNN)。本例中所示的培训程序需要2-D球面投影图像作为深度学习网络的输入。

此示例使用来自Hesai和Scale的PANDASET数据集[2]。PANDASET包含使用PANDAR 64传感器捕获的各种城市场景的4800个未组织的LIDAR点云扫描。数据集提供了42种不同课程的语义分段标签,包括汽车,道路和行人。

下载LIDAR数据集

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

URL =.'https://ssd.mathwands.com/金宝appsupportfiles/lidar/data/pandaset_lidardata.tar.gz';outputfolder = fullfile(tempdir,'pandaset');lidardatatarfile = fullfile(outputfolder,'pandaset_lidardata.tar.gz');如果〜存在(LidardataTarfile,'文件')MKDIR(输出文件);DISP('下载Pandaset Lidar驾驶数据(5.2 GB)......');Websave(LidardataTarfile,URL);Untar(LidardataTarfile,Outputfolder);结尾%检查tar.gz文件是否已下载,但不是未压缩。如果(〜存在(fullfile(outputfolder,'lidar'),'文件')))......&&(〜存在(fullfile(outputfile,'semanticlabels'),'文件'))Untar(LidardataTarfile,OutputFolder);结尾lidardata = fullfile(outputfolder,'lidar');labelsfolder = fullfile(outputfolder,'semanticlabels');

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

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

下载掠夺网络

下载佩带的网络以避免等待培训完成。如果您想培训网络,请设置用圆形变量到真的

dotraining = false;PretrateNeturl =.......'https://ssd.mathwands.com/金宝appsupportfiles/lidar/data/trountsqueezesegv2pandasetnet.zip';如果〜dotrain downloadpretratedsqueezesegv2net(outputfolder,pretrowneturl);结尾

准备培训数据

加载LIDAR点云和类标签

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

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

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

  • 每个图像都有五个频道。五个通道指定了点云,强度的3-D坐标和范围: R. = X 2 + y 2 + Z. 2

培训数据的视觉表示。

生成五频道培训图像。

Imagefolder = fullfile(outputfolder,'图片');HelperTransformorganizedPointCloudtotRainingData(Lidardata,Imagefolder);
预处理数据100%完成

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

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

创建I.Magedatastore.和P.ixellabeldatastore.

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

imds = imageageataStore(imagesfolder,......'fileextensions''。垫'......'readfcn',@helperimagematreader);

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

ClassNames = [“未标记”“植被”“地面”“路”“路线标志”“人行道”“车”“卡车”“别人”“行人”“跑道”“迹象”“建筑物”];numclasses = numel(classnames);%从1到类中的标签ID指定标签ID。labelids = 1:numclasses;pxds = pixellabeldataStore(Labelsfolder,ClassNames,LabelIds);

通过将相应的强度图像覆盖在相应的强度图像上覆盖并显示其中一个标记的图像之一Helperdisplaylidaroverlaidimage.功能,定义金宝app支持功能这个例子的一部分。

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

准备培训,验证和测试集

使用HelperpartitionLidarsementDationDataset.金宝app支持函数,附加到此示例,将数据拆分为培训,验证和测试集。您可以根据所指定的百分比拆分培训数据TrainingDataPerceage。将其余数据分为2:1的比率与验证和测试数据。默认值TrainingDataPerceage0.7

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

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

TrainingData =联合(IMDStrain,PXDStrain);validationData =组合(IMDSVAL,PXDSVAL);

数据增强

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

通过使用使用培训数据来增加培训数据转变功能与定制预处理操作指定HelperaugmentData.功能,定义金宝app支持功能这个例子的一部分。该函数随机地在水平方向上翻转多通道2-D图像和相关标签。仅将数据增强应用于培训数据集。

AugmentedTrainingData = Transform(TrainingData,@(x)HelperaugmentData(x));

定义网络架构

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

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

InputSize = [64 1856 5];Lgraph = SqueezeSegv2Layers(输入,......numfrasses,'numencodermodules',4,'numcontextaggregationmodules',2);

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

分析(LAPHAGH);

指定培训选项

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

maxepochs = 30;InitialLearningrate = 1E-3;minibatchsize = 8;l2reg = 2e-4;选项=培训选项('亚当'......'italllearnrate',initiallearningrate,......'L2Regularization',l2reg,......'maxepochs',maxepochs,......'minibatchsize',小匹马,......'shownrateschedule''分段'......'学习ropfactor',0.1,......'学习ropperiod'10,......'vightationdata',validationdata,......'plots''培训 - 进步'......'verbosefrequency'20);

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

火车网络

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

如果DOTRAINT [NET,INFO] = TRAINNETWORK(TrainingData,LGraph,选项);别的load(fullfile(outputfolder,'trousicsqueezesegvv2pandasetnet.mat'),'网');结尾

预测测试点云的结果

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

以分段为叠加显示该图。

我=读(IMDSTEST);predictedresult = semanticseg(i,net);数字;Helperdisplaylidaroverlaidimage(I,PredightErteResult,ClassNames);标题('语义分割结果');

使用HelperdisplaylabelabellaidPointPloud.功能,定义金宝app支持功能此示例的部分,在点云上显示分段结果。

数字;HelperdisplaylabeloverlaidPointCloud(I,PredightErteResult);查看([39.2 90.0 60]);标题('语义分割结果是点云');

评估网络

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

OpertalLocation = FullFile(Tempdir,'输出');如果〜存在(输出,'dir')MKDIR(输出分配);结尾pxdsresults = semanticseg(IMDST,NET,......'minibatchsize',4,......'writeelocation',输出位置,......'verbose', 错误的);metrics = evaluateManticStogation(pxdsresults,pxdstest,'verbose', 错误的);

您可以使用交叉联盟(IOU)度量来衡量每个类的重叠量。

评估评估函数返回各个类别的整个数据集的度量,以及每个测试图像。要在数据集级别查看指标,请使用metrics.datasetmetrics.财产。

metrics.datasetmetrics.
ans =.1×5表GlobalAccuracy意味着意思是Meaniou Reightiou含义______________________________________________ 0.61685 0.81806 0.81806 0.81806 0.81806 0.81806 0.74537

数据集指标提供了网络性能的高级概述。要查看每个类对整体性能的影响,请使用中断每个课程的指标指标.Classmetrics.财产。

指标.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

虽然整体网络性能都很好,但某些课程的课程指标路线标志卡车表明更好的性能需要更多的培训数据。

金宝app支持功能

函数来增加数据

HelperaugmentData.功能随机翻转球面图像和水平方向的相关标签。

功能Out = HelperaugmentData(InP)%施加随机水平翻转。OUT = CELL(大小(INP));%随机翻转五沟道图像和像素标签水平。i = inp {1};sz =尺寸(i);tform = ronstaffine2d('Xreflection',真的);rut = AffineOutputView(SZ,TForm,'裸机''centeroutput');{1} = imwarp(i,tform,'OutputView',溃败);{2} = imwarp(Inp {2},tform,'OutputView',溃败);结尾

显示LIDAR分割图的功能覆盖在2-D球面图像上

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

功能Helperdisplaylidaroverlaidimage(Lidarimage,LabelMap,ClassNames)%HelperDisplayLidaroverLaidImage覆盖强度图像上的标签。%HelperdisplayLidaroverlaidImage(Lidarimage,LabelMap,ClassNames)%显示重叠图像。Lidarimage是一个五通道的激光雷达输入​​。%LabelMap包含像素标签,ClassNames是一个标签数组%名称。%从LIDAR图像中读取强度通道。INTENESHANNEL = UINT8(LIDARIMAGE(:,:,4));%加载LIDAR颜色图。CMAP = HelperPandasetColorMap;%覆盖强度图像上的标签。b = labeloverlay(IntenseyChannel,LabelMap,'colormap',cmap,'透明度',0.4);%调整大小以便更好地可视化。b = imresize(b,'规模',[3 1],'方法''最近');imshow(b);Helperpixellabelolorbar(CMAP,ClassNames);结尾

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

HelperdisplaylabelabellaidPointPloud.函数覆盖分割结果,在3-D组织点云上产生。

功能HelperdisplaylabeloverLaidPointCloud(I,PredightErteResult)%helperdisplaylabeloverlaidPointCloud叠加标签在点云对象。%helperdisplaylabeloverlaidPointCloud(I,PredightErteResult)%显示覆盖的PointCloud对象。我是组织的5个频道%输入图像。predightedResult包含像素标签。ptcloud = pointcloud(i(::,1:3),'强度',我(::,4));CMAP = HelperPandasetColorMap;B =......Labeloperlay(UINT8(PTCLoud.ILTESSITES),PredightERGERERER,'colormap',cmap,'透明度',0.4);PC = pointcloud(ptcloud.location,'颜色',b);数字;AX = PCSHOW(PC);套(斧头,'xlim',[ -  70 70],'ylim',[ -  70 70]);变焦(斧头,3.5);结尾

函数来定义LIDAR ColorMap

HelperpandasetColormap.函数定义LIDAR数据集使用的ColorMap。

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

函数显示像素标签颜色栏

Helperpixellabelcololorbar.功能将彩色键添加到当前轴。格式化彩色键以显示颜色的类名。

功能Helperpixellabelolorbar(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.功能下载佩带的模型。

功能DownloadPretringSqueezesegv2Net(OutputFolder,PretRateNeturl)pretRateMatFile = FullFile(OutputFolder,'trousicsqueezesegvv2pandasetnet.mat');pretrayzipfile = fullfile(outputfolder,'trousicsqueezesegvvv2pandasetnet.zip');如果〜存在(pretratematfile,'文件'如果〜存在(pretrowzipfile,'文件')disp('下载佩带的型号(5 MB)......');WebSave(PretRateZipFile,PretRateNeturl);结尾解压缩(PretRateZipfile,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.