主要内容

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

这个例子展示了如何训练一个PointPillars网络来检测点云中的对象。

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

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

下载激光雷达数据集

本例使用PandaSet的一个子集,其中包含2560个预处理过的有组织点云。每点云覆盖 360 o ,并指定为64 × 1856矩阵。点云以PCD格式存储,其对应的地面真值数据存储在PandaSetLidarGroundTruth.mat文件。该文件包含三个类的3-D包围盒信息,它们是car、truck和pedestrian。数据集大小为5.2 GB。

使用helperDownloadPandasetData助手函数,在本例末尾定义。

doTraining = false;outputFolder = fullfile (tempdir,“Pandaset”);lidarURL=[“https://ssd.mathworks.com/万博1manbetxsupportfiles/lidar/data/”...“Pandaset_LidarData.tar.gz”];helperDownloadPandasetData (outputFolder lidarURL);

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

加载数据

使用。创建文件数据存储来从指定的路径加载PCD文件pcread函数。

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

装载汽车和卡车物体的三维包围盒标签。

gtPath = fullfile (outputFolder,“长方体”“PandaSetLidarGroundTruth.mat”);data =负载(gtPath“lidarGtLabels”);标签= timetable2table (data.lidarGtLabels);boxLabels =标签(:2:3);

显示全视图点云。

图ptld = read(lidarData);ax = pcshow (ptCld.Location);集(ax,“XLim”50 [-50],“YLim”, 40 [-40]);变焦(ax, 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函数,作为支持文件附加到本例中:万博1manbetx

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

  • 选择指定的ROI内的框标签gridParams

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

控件显示裁剪的点云和地面真值框标签helperDisplay3DBoxesOverlaidPointCloud在示例末尾定义的helper函数。

电脑= croppedPointCloudObj {1};gtLabelsCar = processedLabels.Car {1};gtLabelsTruck = processedLabels.Truck {1};helperDisplay3DBoxesOverlaidPointCloud (pc。位置、gtLabelsCar...“绿色”gtLabelsTruck,“洋红”“裁剪点云”);

重置(lidarData);

创建培训数据存储对象

将数据集分割为训练集和测试集。选取70%的数据进行网络训练,其余数据进行评估。

rng (1);shuffledIndices = randperm(大小(processedLabels, 1));idx = floor(0.7 * length(shuffledIndices));trainData = croppedPointCloudObj (shuffledIndices (1: idx):);testData = croppedPointCloudObj (shuffledIndices (idx + 1:结束):);trainLabels = processedLabels (shuffledIndices (1: idx):);testLabels = processedLabels (shuffledIndices (idx + 1:结束):);

为了方便地访问数据存储,请使用saveptCldToPCD辅助函数,作为支持文件附加到本示例中。万博1manbetx你可以设置writefile"错误的”如果您的培训数据保存在一个文件夹中,并且由万博1manbetxpcread函数。

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

使用创建文件数据存储fileDatastore来加载PCD文件pcread函数。

像= fileDatastore (dataLocation,“ReadFcn”@ (x) pcread (x));

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

bds = boxLabelDatastore (trainLabels);

使用结合函数将点云和三维边界框标签组合到单个数据存储中进行培训。

cds=联合收割机(lds、bds);

数据增加

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

在使用增强之前读取并显示点云helperDisplay3DBoxesOverlaidPointCloud辅助函数,在示例的最后定义。

augData =阅读(cds);augptCld = augData {1};augLabels = augData {1,2};augClass = augData {1,3};labelsCar = augLabels (augClass = =“汽车”:);labelsTruck = augLabels (augClass = =“卡车”:);helperDisplay3DBoxesOverlaidPointCloud (augptCld。位置、labelsCar“绿色”...labelsTruck,“洋红”“之前数据增强”);

重置(cds);

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

一会= {“汽车”“卡车”};sampleLocation = fullfile (tempdir,“GTsamples”);[sampledGTData,指数]= sampleGroundTruthObjectsFromLidarData (cd,一会,...“MinPoints”, 20岁,“sampleLocation”,样本位置);

使用augmentGroundTruthObjectsToLidarData辅助函数,作为支持文件附加到这个例子中,它随机向每个点云添加固定数量的car和truck类对象万博1manbetx。使用变换函数将地面真实值和自定义数据增强应用于训练数据。

numObjects = (10,10);addsaugmented = transform(cd,@(x) augmentGroundTruthObjectsToLidarData(x,...sammagnitdata、索引、类名、numObjects);

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

  • 沿着x轴随机翻转

  • 随机缩放5%

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

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

cdsAugmented=变换(cdsAugmented,@(x)扩充数据(x));

显示增强的点云和地面真相增强的方框使用helperDisplay3DBoxesOverlaidPointCloud辅助函数,在示例的最后定义。

augData =阅读(cdsAugmented);augptCld = augData {1};augLabels = augData {1,2};augClass = augData {1,3};labelsCar = augLabels (augClass = =“汽车”:);labelsTruck = augLabels (augClass = =“卡车”:);helperDisplay3DBoxesOverlaidPointCloud (augptCld。位置、labelsCar“绿色”...labelsTruck,“洋红”数据增加的);

重置(cdsAugmented);

创建pointcolumns对象检测器

使用pointPillarsObjectDetector函数自动创建一个pointcolumns对象检测网络。PointPillars网络使用PointNet网络的简化版本,它将支柱特性作为输入。对于每个支柱特征,网络应用线性层,然后是批处理归一化和ReLU层。最后,网络在通道上应用最大池操作来获得高级编码特征。这些编码后的特征被分散到原来的支柱位置,以创建一个伪图像。然后,该网络使用一个二维卷积主干处理伪图像,然后使用不同的SSD检测头来预测三维包围盒及其类。

在pointcolumns检测器中显示的pointcolumns网络如下图所示。

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

pointPillarsObjectDetector函数要求您指定几个参数化PointPillars网络的输入:

  • 类名

  • 锚箱

  • 点云范围

  • 体素的大小

  • 突出柱子数目

  • 每根柱子的点数

定义突出柱子的数量。P=12000;定义每根柱子的点数。N = 100;从训练数据中估计锚盒。anchorBoxes = calculateAnchorsPointPillars (trainLabels);一会= trainLabels.Properties.VariableNames;定义pointcolumns检测器。探测器= pointPillarsObjectDetector (anchorBoxes pointCloudRange,类名,...“VoxelSize”voxelSize,“NumPillars”、磷、“NumPointsPerPillar”N);

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

训练点支柱对象检测器

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

使用CPU或GPU训练检测器。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU支万博1manbetx持情况(并行计算工具箱)。若要自动检测是否有可用的GPU,请设置执行环境“汽车”.如果你没有GPU,或者不想使用GPU进行训练,请设置执行环境“cpu”.为了确保使用GPU进行训练,设置执行环境“图形”

executionEnvironment =“汽车”如果canUseParallelPool dispatchInBackground = true;其他的dispatchInBackground = false;结束选择= trainingOptions (“亚当”...“阴谋”“没有”...“MaxEpochs”现年60岁的...“MiniBatchSize”3....“GradientDecayFactor”, 0.9,...“SquaredGradientDecayFactor”, 0.999,...“LearnRateSchedule”“分段”...“InitialLearnRate”, 0.0002,...“LearnRateDropPeriod”15岁的...“LearnRateDropFactor”, 0.8,...“ExecutionEnvironment”executionEnvironment,...“DispatchInBackground”dispatchInBackground,...“BatchNormalizationStatistics”“移动”...“ResetInputNormalization”假的,...“CheckpointPath”, tempdir);

使用列车点柱探测器函数来训练pointcolumns对象检测器doTraining是真的。否则,加载预先训练过的检测器。

如果doTraining[检测器,info] = trainPointPillarsObjectDetector(cdsAugmented,检测器,options);其他的pretrainedDetector =负载(“pretrainedPointPillarsDetector.mat”“探测器”);探测器= pretrainedDetector.detector;结束

生成检测

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

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

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

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

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

使用测试集评估探测器

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

numInputs = 50;%从长方体标签生成旋转的矩形。bds = boxLabelDatastore (testLabels (1: numInputs,:));groundTruthData = transform(bds,@(x) createRotRect(x));%设置阈值。nmsPositiveIoUThreshold = 0.5;confidenceThreshold = 0.25;detectionResults =检测(探测器,testData (1: numInputs,:)...“阈值”, confidenceThreshold);%转换为旋转矩形格式计算指标i = 1:height(detectionResults) box = detectionResults. boxes {i};detectionResults。盒子我{}=盒(:,(1、2、4、5、7]);结束指标= evaluateDetectionAOS (detectionResults groundTruthData,...nmsPositiveIoUThreshold);disp(指标(:,1:2))
《超能美联社  _______ _______ 汽车卡车0.89735 - 0.89735 0.758 - 0.758

辅助函数

函数helperDownloadPandasetData (outputFolder lidarURL)%从给定URL下载数据集到输出文件夹。LIDARDatarFile=fullfile(输出文件夹,“Pandaset_LidarData.tar.gz”);如果~存在(lidarDataTarFile“文件”mkdir (outputFolder);disp (“正在下载PandaSet激光雷达驱动数据(5.2 GB)……”);websave (lidarDataTarFile lidarURL);解压(lidarDataTarFile outputFolder);结束%解压缩文件。如果(~exist(fullfile)(outputFolder,“激光雷达”),“dir”))...& & (~ (fullfile (outputFolder,存在“长方体”),“dir”))untar(LIDARDatar文件,输出文件夹);结束结束函数helperDisplay3DBoxesOverlaidPointCloud (ptCld labelsCar carColor,...labelsTruck、truckColor titleForFigure)%显示点云与不同颜色的包围盒%的类。图;ax = pcshow (ptCld);showShape (“长方体”labelsCar,“父”ax,“不透明度”, 0.1,...“颜色”carColor,“线宽”, 0.5);持有;展示(“长方体”labelsTruck,“父”ax,“不透明度”, 0.1,...“颜色”truckColor,“线宽”, 0.5);标题(titleForFigure);变焦(ax, 1.5);结束

工具书类

[1] Lang, Alex H., Sourabh Vora, Holger Caesar, Lubing Zhou, Jiong Yang, Oscar Beijbom。PointPillars:用于点云对象检测的快速编码器在2019 IEEE/CVF计算机视觉与模式识别会议(CVPR),12689-12697。美国加利福尼亚州长滩:IEEE,2019年。https://doi.org/10.1109/CVPR.2019.01298

[2] 和声和音阶,潘达塞特。https://scale.com/open-datasets/pandaset