主要内容

使用PointPillars深度学习的激光雷达三维目标检测

此示例显示如何在点云中培训用于对象检测的尖峰网络。

激光雷达点云数据可以通过多种激光雷达传感器获取,包括Velodyne®、Pandar和Ouster传感器。这些传感器可以捕捉场景中物体的三维位置信息,这对自动驾驶和增强现实的许多应用都很有用。然而,由于每个目标数据的稀疏性、目标遮挡和传感器噪声,用点云数据训练鲁棒检测器是具有挑战性的。深度学习技术已经被证明可以通过直接从点云数据中学习稳健的特征表示来解决许多这些挑战。PointPillars是一种用于三维物体检测的深度学习技术[1.].PointPillars网络使用与PointNet类似的架构,从称为柱子的稀疏点云中提取密集、健壮的特征,然后使用一个带有改进的SSD对象检测网络的2d深度学习网络来估计联合3d包围盒、方向和类预测。

此示例使用pandaset [2.]数据集的Hesai和Scale。PandaSet包含使用Pandar64传感器捕获的8240个城市场景的无组织激光雷达点云扫描。该数据集为18个不同的对象类提供了3-D包围盒标签,包括汽车、卡车和行人。

下载LIDAR数据集

此示例使用包含2560个预处理有组织点云的PANDASET子集。每个点云覆盖 360 o ,并指定为64 × 1856矩阵。点云以PCD格式存储,其对应的地面真值数据存储在PandaSetLidarGroundTruth.mat文件。该文件包含三个类的3-D边界框信息,即汽车,卡车和行人。数据集的大小为5.2 GB。

属性从给定的URL下载Pandaset数据集helperDownloadPandasetData辅助函数,在本例的最后定义。

doTraining=false;outputFolder=fullfile(tempdir,“潘达塞特”);lidarURL = ['https://ssd.mathworks.com/金宝appsupportfiles/lidar/data/'......'pandaset_lidardata.tar.gz'];HelperdownloadPandasetData(outputFolder,Lidarurl);

根据您的Internet连接,下载过程可能需要一些时间。代码暂停MATLAB®执行,直到下载过程完成。或者,您可以使用Web浏览器将数据设置为本地磁盘并提取文件。如果你这样做,改变输出文件夹变量更改为下载文件的位置。

加载数据

创建文件数据存储区以使用指定路径加载PCD文件p作用

路径= fullfile (outputFolder,激光雷达的);lidarData = fileDatastore(路径,“ReadFcn”,@(x)pcread(x));

装载汽车和卡车物体的3-D边界盒标签。

gtPath = fullfile (outputFolder,'长方体','pandasetlidargroundtruthmat');data =负载(gtPath'lidargtlabels');Labels=timetable2table(data.lidarGtLabels);boxLabels=Labels(:,2:3);

显示全视图点云。

图ptCld=读取(lidarData);ax=pcshow(ptCld.位置);设置(ax,“XLim”50 [-50],“YLim”,[ -  40 40]);变焦(斧头,2.5);轴

重置(lidarData);

预处理数据

PANDASET数据包括全视线云。对于此示例,使用标准参数将全视点云裁剪到前视点云[1.].这些参数确定传递给网络的输入的大小。沿X,Y和Z轴选择较小的点云,有助于检测更靠近原点的对象,并且还降低了网络的整体培训时间。

xMin=0.0;沿x轴的%最小值。ymin = -39.68;沿y轴的%最小值。zmin = -5.0;%沿Z轴的最小值。xMax = 69.12;沿x轴的最大值%。yMax=39.68;% y轴上的最大值。zMax = 5.0;沿z轴的%最大值。xStep = 0.16;沿x轴的分辨率。yStep = 0.16;沿y轴的分辨率。dsFactor=2.0;%将采样因素。%计算伪图像的尺寸。xn = round(((xmax  -  xmin)/ xstep));yn = round(((ymax  -  ymin)/ ystep));定义点云参数。yMin pointCloudRange = [xMin xMax, yMax, zMin, zMax);voxelSize = [xStep, yStep];

使用cropFrontViewFromLidarDataHelper函数,作为支持文件附加到本例中:金宝app

  • 从输入全视点云裁剪前视图。

  • 选择ROI中指定的框标签格里克朗

[croppedPointCloudObj, processedLabels] = cropFrontViewFromLidarData (......lidarData、boxLabels pointCloudRange);
处理数据100%完成

控件显示裁剪的点云和地面真值框标签HelperDisplay3DBoxerAidePointCloud在示例的最后定义的辅助函数。

pc=croppedPointCloudObj{1,1};gtLabelsCar=processedLabels.Car{1};gtLabelsTruck=processedLabels.Truck{1};HelperDisplay3BoxesOverlaidPointCloud(pc.Location,gtLabelsCar,......“绿色”gtLabelsTruck,“红色”,“裁剪点云”);

重置(lidarData);

创建用于培训的数据存储对象

将数据集分为培训和测试集。选择70%的数据以培训网络以及其余的评估。

rng(1);ShuffledDices=randperm(大小(processedLabels,1));idx=floor(0.7*长度(ShuffledDices));trainData=croppedPointCloudObj(ShuffledDices(1:idx),:);testData=croppedPointCloudObj(ShuffledDices(idx+1:end),:);trainLabels=processedLabels(ShuffledDices:1:idx),:);testLabels=processedLabels=processedLabels(idx+1:end),:);

这样您就可以轻松访问数据存储,通过使用使用的PCD文件将培训数据保存为PCD文件saveptcldtopcd.辅助函数,附加到此示例作为支持文件。金宝app你可以设置writefile假“如果您的培训数据保存在一个文件夹中,并且由金宝appp作用

writefiles = true;datalocation = fullfile(outputfolder,“InputData”);[trainData,trainLabels]=saveptCldToPCD(trainData,trainLabels,......dataLocation, writefile);
处理数据100%完成

使用。创建文件数据存储fileDatastore要加载PCD文件,请使用p作用

lds=文件数据存储(数据位置,“ReadFcn”,@(x)pcread(x));

使用创建一个盒标签数据存储Boxlabeldata商店用于加载3-D边界框标签。

BDS = BoxLabeldAtastore(TrainLabels);

使用结合函数将点云和3-D包围盒标签合并到一个用于训练的数据存储中。

cd =结合(摩门教,bds);

数据扩充

本例使用了地面真值数据增强和其他一些全局数据增强技术,为训练数据和相应的框添加更多的多样性。有关在使用激光雷达数据的三维物体检测工作流程中使用的典型数据增强技术的更多信息,请参见利用深度学习的LIDAR对象检测的数据增强

使用中读取并显示点云使用HelperDisplay3DBoxerAidePointCloud助手函数,在示例末尾定义。。

augData=read(cds);augptCld=augData{1,1};augLabels=augData{1,2};augClass=augData{1,3};labelsCar=augLabels(augClass==“汽车”:);Labelstruck =奥古拉标签(奥格拉斯=='卡车':);Helperdisplay3dboxesoverlaidPointCloud(奥古斯特·普利.Location,Labelscar,“绿色”,......标签车,“红色”,“数据扩充前”);

重置(CD);

使用sampleGroundTruthObjectsFromLidarData辅助函数,作为支持文件附加到本示例中,用于从训练数据中提取所有地面真值边界框。金宝app

一会= {“汽车”,'卡车'};sampleLocation=fullfile(tempdir,“GTsamples”)[SamAssigntData,Indexs]=来自LidarData的SampleGroundTruthObject(CD,类名,......'minpoints', 20岁,“sampleLocation”, sampleLocation);

使用增加地面目标至地面数据助手函数,作为支持文件附于本示例,用于向每个点云随机添加固定数量的car和truck类对象金宝app变换函数将地面真实值和自定义数据增强应用到训练数据。

numObjects = (10,10);addsaugmented = transform(cd,@(x) augmentGroundTruthObjectsToLidarData(x,......sampledGTData指数,一会,numObjects));

此外,对每个点云应用以下数据增强。

  • 沿x轴随机翻转

  • 随机缩放5%

  • 从[-pi/4, pi/4]沿z轴随机旋转

  • 分别沿x、y和z轴随机平移[0.2、0.2、0.1]米

cdsAugmented = transform(cdsAugmented,@(x) augmentData(x));

使用HelperDisplay3DBoxerAidePointCloud辅助函数,在示例的最后定义。

augData =阅读(cdsAugmented);augptCld = augData {1};augLabels = augData {1,2};augClass = augData {1,3};labelsCar = augLabels (augClass = =“汽车”:);Labelstruck =奥古拉标签(奥格拉斯=='卡车':);Helperdisplay3dboxesoverlaidPointCloud(奥古斯特·普利.Location,Labelscar,“绿色”,......标签车,“红色”,'数据增强后');

重置(CDS-ummented);

创建pointcolumns对象检测器

使用点柱目标探测器函数自动创建PointPillars对象检测网络。PointPillars网络使用简化版的PointNet网络,该网络以支柱特征作为输入。对于每个支柱特征,网络应用线性层,然后是批量标准化层和ReLU层。最后,网络应用最大池操作通过通道获得高级编码特征。这些编码特征分散回原始支柱位置以创建伪图像。然后,网络使用二维卷积主干和各种SSD检测头处理伪图像,以预测三维边界盒及其类别。

点柱检测器中的点柱网络如下图所示。

您可以使用深网络设计师(深度学习工具箱)创建图中所示的网络。

这个点柱目标探测器功能要求您指定参数化PointPillars网络的多个输入:

  • 类名

  • 锚箱

  • 点云的范围

  • 体素大小

  • 突出的支柱数量

  • 每根柱子的点数

%定义突出的支柱数量。P = 12000;%定义每支柱的点数。n = 100;从训练数据中估计锚盒。anchorBoxes = calculateAnchorsPointPillars (trainLabels);一会= trainLabels.Properties.VariableNames;定义pointcolumns检测器。探测器= PointpillarsObjectDetector(Pointcroudrange,ClassNames,Chandorboxes,......'voxelsize',毒素,“NumPillars”,p,“NumPointsPerPillar”,n);

如果需要对PointPillars网络体系结构进行更多的控制,您可以手动设计网络。有关更多信息,请参见设计PointPillars网络。

列车点目标探测器

使用指定网络训练参数trainingOptions.集“CheckpointPath”到一个临时位置,以便在训练过程中保存部分训练过的检测器。如果训练被中断,您可以从保存的检查点恢复训练。

使用CPU或GPU训练检测器。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU通金宝app过发布支持(并行计算工具箱).若要自动检测您是否有可用的GPU,请设置executionEnvironment“汽车”.如果你没有GPU,或者不想使用GPU进行训练,请设置executionEnvironment“cpu”.确保使用GPU进行培训,设置executionEnvironment“图形”

执行环境=“汽车”如果CanUseCallallPool DispartinBackground = True;其他的dispatchInBackground = false;终止选择= trainingOptions ('亚当',......“情节”,“没有”,......“MaxEpochs”,60,......'minibatchsize',3,......“梯度衰减因子”, 0.9,......“SquaredGradientDecayFactor”,0.999,......'shownrateschedule',“分段”,......“初始学习率”,0.0002,......“LearnRateDropPeriod”15,......“LearnRateDropFactor”,0.8,......“执行环境”executionEnvironment,......“DispatchInBackground”,调度背景,......“BatchNormalizationStatistics”,'移动',......“ResetInputNormalization”假的,......“CheckpointPath”, tempdir);

使用trainPointPillarsObjectDetector如果培训Pointpillars对象探测器的功能溺爱是真的。否则,加载预先训练过的检测器。

如果doTraining[detector,info]=TrainPointPillarObjectDetector(CDS分段,检测器,选项);其他的pretrainedDetector =负载(“预训练点柱检测器。垫”,“探测器”);探测器= pretroseddetector.detector;终止

生成检测

使用经过训练的网络检测测试数据中的对象:

  • 从测试数据中读取点云。

  • 在测试点云上运行检测器以获得预测的边界框和置信度分数。

  • 用边框显示点云HelperDisplay3DBoxerAidePointCloud辅助函数,在示例的最后定义。

ptCloud=testData{45,1};gtLabels=testLabels(45,:);%指定仅使用的检测的置信阈值%置信度得分高于此值。信心阈值=0.5;[框、分数、标签]=检测(检测器、云端、,'临界点', confidenceThreshold);boxlabelsCar(标签' = = =框“汽车”:);boxlabelsTruck(标签' = = =框'卡车':);%在点云上显示预测。helperDisplay3DBoxesOverlaidPointCloud (ptCloud。位置、boxlabelsCar“绿色”,......Boxlabelstruck,“红色”,“预测边界框”);

使用测试集评估检测器

在大量点云数据上评估经过训练的目标检测器,以测量性能。

numinputs = 50;%从长方体标签生成旋转矩形。bds = boxLabelDatastore (testLabels (1: numInputs,:));groundTruthData = transform(bds,@(x) createRotRect(x));%设置阈值。NMSPositiveOutThreshold=0.5;置信阈值=0.25;检测结果=检测(检测器,测试数据(1:numInputs,:),......'临界点', confidenceThreshold);%转换为旋转矩形格式以计算度量对于i = 1:height(detectionResults) box = detectionResults. boxes {i};detectionResults。盒子我{}=盒(:,(1、2、4、5、7]);终止度量=评估的检测AOS(检测结果、地面数据、,......nmspositiveiouthreshold);DISP(指标(:,1:2))
《超能美联社  _______ _______ 汽车卡车0.89735 - 0.89735 0.758 - 0.758

辅助功能

函数HelperdownloadPandasetdata(outputfolder,lidarurl)%将数据集从给定URL下载到输出文件夹。lidarDataTarFile = fullfile (outputFolder,'pandaset_lidardata.tar.gz');如果~存在(lidarDataTarFile'文件'mkdir (outputFolder);disp ('下载Pandaset Lidar驾驶数据(5.2 GB)......');websave (lidarDataTarFile lidarURL);解压(lidarDataTarFile outputFolder);终止%解压文件。如果(~存在(fullfile (outputFolder激光雷达的),“dir”))......& & (~ (fullfile (outputFolder,存在'长方体'),“dir”)解压(lidarDataTarFile outputFolder);终止终止函数helperDisplay3DBoxesOverlaidPointCloud (ptCld labelsCar carColor,......labelsTruck、truckColor titleForFigure)%显示具有不同颜色边界框的点云,以显示不同颜色的点云%的类。数字;AX = PCSHOW(PTCLD);showshape('长方体',labelscar,“父”,斧头,“不透明度”,0.1,......“颜色”carColor,'行宽',0.5);保持;showshape('长方体'labelsTruck,“父”,斧头,“不透明度”,0.1,......“颜色”truckColor,'行宽', 0.5);标题(titleForFigure);变焦(ax, 1.5);终止

参考文献

[1] Lang,Alex H.,Sourabh Vora,Holger Caesar,Lubing Zhou,Jiong Yang和Oscar Beijbom.“点柱:用于点云目标检测的快速编码器”,摘自2019 IEEE/CVF计算机视觉与模式识别会议(CVPR), 12689 - 12697。美国加州长滩:IEEE, 2019。https://doi.org/10.1109/cvpr.2019.01298

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