主要内容

激光雷达三维物体探测使用PointPillars深度学习

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

激光雷达点云数据可以获得各种激光雷达传感器,包括调速发电机®,Pandar,下台传感器。这些传感器获取关于对象的3 d位置信息在一个场景,这是有用的对于许多应用程序在自动驾驶和增强现实。然而,训练健壮的探测器与点云数据是很困难的,因为每个对象数据的稀疏,物体遮挡,和传感器噪声。深度学习技术已被证明应对这些挑战通过学习健壮的特性表征直接从点云数据。一个三维物体的深度学习技术检测PointPillars [1]。PointNet使用类似的架构,PointPillars网络提取密集,健壮的特性从稀疏的点云叫柱子,然后使用一个二维深度学习网络修改SSD对象检测网络估计联合3 d边界框,方向,和类的预测。

激光雷达数据集下载

这个示例使用的一个子集PandaSet [2],其中包含2560预处理组织点云。每个点云覆盖 360年 o 看,并被指定为64 - 1856矩阵。点云存储在PCD格式和数据存储在相应的地面真理PandaSetLidarGroundTruth.mat文件。三个类的文件包含3 d边界框信息,汽车,卡车,和行人。数据集的大小是5.2 GB。

从给定的URL下载Pandaset数据集使用helperDownloadPandasetDatahelper函数,定义在这个例子。

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

根据您的网络连接,下载过程可能需要一些时间。MATLAB®代码中止执行,直到下载过程完成。或者,您可以下载数据集到您的本地磁盘使用您的web浏览器并提取文件。如果你这样做,改变outputFolder变量在代码下载文件的位置。下载的文件包含激光雷达,长方体semanticLabels文件夹,点云,分别长方体标签和语义标签的信息

加载数据

创建一个数据存储的文件加载纤毛运动使用的文件从指定的路径pcread(计算机视觉工具箱)函数。

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

加载3 d边界框标签的汽车和卡车的对象。

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

显示全视图点云。

读图ptCld = (lidarData);ax = pcshow (ptCld.Location);集(ax,“XLim”50 [-50],“YLim”,40 [-40]);变焦(ax, 2.5);轴;

重置(lidarData);

数据进行预处理

全视图的PandaSet数据由点云。对于这个示例,作物全视图点云前视图点云使用标准的参数(1]。这些参数确定的大小输入传递到网络。选择一个较小的点云范围沿着x, y, z轴检测对象接近的起源。这也降低了整体网络的训练时间。

xMin = 0.0;%最小值沿轴。yMin = -39.68;%最小值沿轴。zMin = -5.0;%最小值沿z轴。xMax = 69.12;%最大值沿轴。yMax = 39.68;%最大值沿轴。zMax = 5.0;%最大值沿z轴。xStep = 0.16;%决议沿轴。yStep = 0.16;%决议沿轴。dsFactor = 2.0;%将采样因素。%计算假象的维度。Xn =圆(((xMax - xMin) / xStep));Yn =圆(((yMax - yMin) / yStep));%定义点云参数。pointCloudRange = [xMin xMax yMin yMax zMin zMax);voxelSize = [xStep yStep];

使用cropFrontViewFromLidarData辅助功能,附加到这个例子作为支持文件,:金宝app

  • 作物的前视图输入全视图点云。

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

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

显示出现点云与地面真理盒标签使用helperDisplay3DBoxesOverlaidPointCloudhelper函数定义的例子。

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

重置(lidarData);

创建数据存储对象进行训练

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

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

这样你可以很容易地访问数据存储,将训练数据保存为PCD文件使用saveptCldToPCD辅助功能,附加到这个例子作为支持文件。金宝app你可以设置writefile错误的”如果你的训练数据是保存在一个文件夹,并支持的金宝apppcread(计算机视觉工具箱)函数。

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);

使用结合函数将点云三维边界框标签到一个数据存储进行训练。

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

数据增加

这个示例使用地面实况数据增加和其他几个全局数据增强技术来增加更多种类的训练数据和相应的盒子。有关典型数据的更多信息增强技术用于三维物体检测与激光雷达数据工作流,看到激光雷达目标检测的数据对应使用深度学习(激光雷达工具箱)

阅读和增加使用前显示一个点云helperDisplay3DBoxesOverlaidPointCloudhelper函数,定义的例子。

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

重置(cds);

使用sampleLidarData函数示例3 d边界框从训练数据和相应的点。

一会= {“汽车”,“卡车”};sampleLocation = fullfile (outputFolder,“GTsamples”);[ldsSampled, bdsSampled] = sampleLidarData (cd,一会,“MinPoints”,20岁,“详细”假的,“WriteLocation”,sampleLocation);cdsSampled =结合(ldsSampled bdsSampled);

使用pcBboxOversample随机函数来添加一个固定数量的汽车和卡车类对象到每一个点云。使用变换功能应用地面真理和自定义数据对应的训练数据。

numObjects = 10 [10];cdsAugmented =变换(cd, @ (x) pcBboxOversample (x, cdsSampled,一会,numObjects));

这些额外的数据增强技术适用于每一个点云。

  • 沿着x轴随机翻转

  • 随机比例5%

  • 随机旋转沿z轴从(-π/ 4,π/ 4)

  • 随机翻译(0.2,0.2,0.1)米沿着x, y,和z轴

cdsAugmented =变换(cdsAugmented @ (x) augmentData (x));

显示一个增广点云与地面实况增强框使用helperDisplay3DBoxesOverlaidPointCloud定义的helper函数的例子。

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

重置(cdsAugmented);

创建PointPillars对象探测器

使用pointPillarsObjectDetector(激光雷达工具箱)函数创建一个PointPillars对象检测网络。PointPillars网络上更多的信息,请参阅开始使用PointPillars(激光雷达工具箱)

图中显示了PointPillars对象探测器的网络体系结构。您可以使用深层网络设计师应用程序创建一个PointPillars网络。

pointPillarsObjectDetector(激光雷达工具箱)函数需要您指定几个输入参数化PointPillars网络:

  • 类名

  • 锚箱

  • 点云的范围

  • 体素的大小

  • 一些知名的柱子

  • 分支柱

%定义突出的柱子的数量。P = 12000;%定义分柱的数量。N = 100;

估计锚箱从训练数据使用calculateAnchorsPointPillars辅助功能,附加到这个例子作为支持文件。金宝app

anchorBoxes = calculateAnchorsPointPillars (trainLabels);一会= trainLabels.Properties.VariableNames;

定义PointPillars探测器。

探测器= pointPillarsObjectDetector (anchorBoxes pointCloudRange,类名,“VoxelSize”voxelSize,“NumPillars”、磷、“NumPointsPerPillar”N);

火车Pointpillars对象探测器

指定网络训练参数使用trainingOptions函数。集“CheckpointPath”到一个临时位置,使储蓄的部分训练过程中训练有素的探测器。如果训练是中断,你可以从保存的检查点恢复训练。

使用一个CPU或GPU训练检测器。使用GPU需要并行计算工具箱™和CUDA NVIDIA GPU®®启用。有关更多信息,请参见GPU的金宝app支持版本(并行计算工具箱)。自动检测你是否有空GPU,集executionEnvironment“汽车”。如果你没有一个GPU,或不希望使用一个用于培训,集executionEnvironment“cpu”。为了确保培训使用GPU,集executionEnvironment“图形”

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);

使用trainPointPillarsObjectDetector(激光雷达工具箱)函数训练PointPillars对象探测器doTraining是“真正的”。否则,加载一个pretrained探测器。

如果doTraining[探测器,信息]= trainPointPillarsObjectDetector (cdsAugmented、探测器、期权);其他的pretrainedDetector =负载(“pretrainedPointPillarsDetector.mat”,“探测器”);探测器= pretrainedDetector.detector;结束

生成检测

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

  • 阅读测试的点云数据。

  • 运行上的探测器测试点云获取分数预测边框和信心。

  • 显示的点云边界框使用helperDisplay3DBoxesOverlaidPointCloud定义的helper函数的例子。

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

评估探测器使用测试集

评估培训对象探测器在大量的点云数据测量性能。

numInputs = 50;%从长方体生成矩形旋转标签。bds = boxLabelDatastore (testLabels (1: numInputs,:));groundTruthData =变换(bds, @ (x) createRotRect (x));%设置阈值。nmsPositiveIoUThreshold = 0.5;confidenceThreshold = 0.25;detectionResults =检测(探测器,testData (1: numInputs,:)“阈值”,confidenceThreshold);%将边界框转换成旋转矩形格式和计算%的评价指标。i = 1:高度(detectionResults)盒= detectionResults.Boxes {};detectionResults。盒子我{}=盒(:,(1、2、4、5、7]);结束指标= evaluateDetectionAOS (detectionResults groundTruthData,nmsPositiveIoUThreshold);disp(指标(:,1:2))
《超能美联社_________汽车卡车0.89666 - 0.89666 0.76047 - 0.76047

辅助函数

函数helperDownloadPandasetData (outputFolder lidarURL)%从给定的URL下载数据集的输出文件夹。lidarDataTarFile = fullfile (outputFolder,“Pandaset_LidarData.tar.gz”);如果~存在(lidarDataTarFile“文件”mkdir (outputFolder);disp (“下载PandaSet激光雷达驾驶数据(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,“父”ax,“不透明度”,0.1,“颜色”carColor,“线宽”,0.5);持有;showShape (“长方体”labelsTruck,“父”ax,“不透明度”,0.1,“颜色”truckColor,“线宽”,0.5);标题(titleForFigure);变焦(ax, 1.5);结束

引用

[1]朗,亚历克斯·H。,Sourabh Vora, Holger Caesar, Lubing Zhou, Jiong Yang, and Oscar Beijbom. "PointPillars: Fast Encoders for Object Detection From Point Clouds." In2019年IEEE / CVF计算机视觉与模式识别会议(CVPR), 12689 - 12697。美国长滩,CA: IEEE 2019。https://doi.org/10.1109/CVPR.2019.01298

[2]Hesai和规模。PandaSet。https://scale.com/open-datasets/pandaset