主要内容

使用点柱自动标记车辆检测的地面真实值

此示例显示了如何使用中的预训练点目标检测网络在点云中自动检测车辆激光雷达贴标机.在本例中,使用自动算法用于在激光雷达贴标机应用程序中自动贴标的界面。

激光雷达贴标机应用程序

良好的地面真实数据对于开发自动驾驶算法和评估性能至关重要。但是,创建和维护多样化、高质量和标记的数据集需要付出巨大的努力。激光雷达贴标机应用程序提供了一个框架,使用自动算法接口。你可以创建一个自定义算法,并在应用程序中使用它来标记你的整个数据集。您还可以编辑结果,以考虑算法错过的具有挑战性的场景。

在这个例子中,你:

  • 使用预先训练好的PointPillars对象检测网络来检测类中的对象“汽车”

  • 创建一个可以在Lidar Labeler应用程序中使用的自动化算法,使用PointPillars网络自动标记点云中的车辆。

使用点柱网络检测车辆

使用预先训练的PointPillars目标检测网络检测点云中的车辆。这个网络经过训练,可以检测点云中的车辆。有关如何亲自培训PointPillars网络的信息,请参见使用PointPillars深度学习的激光雷达三维目标检测.网络性能取决于网络的泛化程度。当网络应用于看不见的数据时,它可能不能很好地执行。迭代地将自定义训练数据引入到学习过程中,可以提高在相似数据集上的学习性能。

下载PointPillars网络,它是在WPI数据集上训练的。

pretrainedNetURL ='https://ssd.mathworks.com/金宝appsupportfiles/lidar/data/trainedPointPillars.zip'; preTrainedMATFile=fullfile(tempdir,“trainedPointPillarsNet.mat”); preTrainedZipFile=fullfile(tempdir,“trainedPointPillars.zip”);如果~exist(preTrainedMATFile,“文件”)如果~exist(预训练Zipfile,“文件”) disp ('下载预训练检测器(8.3 MB)…');websave(preTrainedZipFile,pretrainedNetURL);结束解压缩(preTrainedZipFile tempdir);结束

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

通过以下步骤,使用网络检测点云中的车辆。

  • 将包含帮助器函数的文件夹添加到搜索路径。

  • 读点云从利多卡因

  • 指定锚定框,它们是格式为{长度、宽度、高度、z中心、偏航角}的预定义边界框。

  • 指定网格参数,将全视图点云裁剪为前视图,格式为{{xMin,伊明,zMin}, {xMax,yMax,zMax}, {xStep,伊斯特普,dsFactor}, {Xn,伊恩}}在哪里Xn=圆(((xMax-xMin) /xStep))及伊恩=圆(((yMax-伊明) /伊斯特普)).

  • 指定检测到的对象的标签名称。

  • 指定置信阈值以仅使用置信分数高于此值的检测。

  • 指定重叠阈值以消除重叠检测。

  • 根据每个柱子的点数(N)选择突出的柱子(P)。

  • 设置executionEnvironment

  • 使用helperCropFrontViewFromLidarData辅助函数,作为支持文件附加到此示例,用于裁剪点云。金宝app

  • 使用生成点柱检测辅助函数从添加的搜索路径中获取边界框。

  • 显示带有边界框的点云。

添加文件夹到路径。目录(fullfile (matlabroot,“例子”,“深度学习共享”,“主要”));%加载预训练网络。pretrainedNet=负载(preTrainedMATFile);%加载点云。ptCloud=pcread(完整文件(toolboxdir(“激光雷达”),“利达达达”,“公路场景,pcd”));%锚箱。anchorBoxes ={{3.9, 1.6, 1.56, -3.6, 0},{3.9, 1.6, 1.56, -3.6,π/ 2}};%裁剪参数。gridParams={0.0,-39.68,-5.0},{69.12,39.68,5.0},{0.16,0.16,2.0},{432496};%检测到的对象的标签名称。一会= {“汽车”};%的信心门槛。confidenceThreshold = 0.45;%重叠阈值。overlapThreshold = 0.1;%突出柱子的数量。P = 12000;%每根柱子的点数。N=100;%设置执行环境。执行环境=“自动”;裁剪点云的前视图。processedPointCloud=helperCropFrontViewFromLidarData(ptCloud,gridParams);%检测边界框。[box, ~, ~] = generatePointPillarDetections(pretrainedNet.net, processedPointCloud,...锚点框、gridParams、类名、信心阈值、,...重叠阈值,P, N, executionEnvironment);%在点云上显示检测结果。图ax=pcshow(processedPointCloud.Location);展示(“长方体”箱,“父”,斧头,“不透明度”,0.1,“颜色”,“红色”,“线宽”,0.5)保持缩放(ax,1.5)标题(“在点云上检测到车辆”)

准备激光雷达车辆探测器自动化班

为激光雷达车辆探测器算法构建一个自动化类。类继承自vision.labeler.AutomationAlgorithm抽象基类。基类定义应用程序用于配置和运行自定义算法的方法的属性和签名。激光雷达贴标机应用程序提供初始自动化类模板。有关更多信息,请参阅创建标签的自动化算法.这个LidarVehicleDetector类基于此模板,并为点云中的车辆检测提供了一个随时可用的自动化类。类的注释概述了实现每个API调用所需的基本步骤。

算法属性

步骤1包含定义算法的名称和描述以及使用算法的方向的属性。

% ---------------------------------------------------------------------- % 步骤1:定义所需的属性描述算法。这%包括名称、描述和用户指示。properties(Constant) % Name算法名称%指定算法名称的字符向量。Name = '激光雷达车辆探测器';% Description Algorithm Description %字符向量,指定算法的简短描述。Description = '使用PointPillars网络检测点云中的车辆';% UserDirections Algorithm Usage Directions字符向量的单元格数组,指定算法用户使用算法时要遵循的方向。UserDirections = {['ROI标签定义选择:选择一个'…“要标注的ROI定义”],……['Run:按Run运行自动化算法。 '], ... ['Review and Modify: Review automated labels over the interval ', ... 'using playback controls. Modify/delete/add ROIs that were not ' ... 'satisfactorily automated at this stage. If the results are ' ... 'satisfactory, click Accept to accept the automated labels.'], ... ['Change Settings and Rerun: If automated results are not ' ... 'satisfactory, you can try to re-run the algorithm with ' ... 'different settings. To do so, click Undo Run to undo ' ... 'current automation run, click Settings, make changes to Settings,' ... 'and press Run again.'], ... ['Accept/Cancel: If the results of automation are satisfactory, ' ... 'click Accept to accept all automated labels and return to ' ... 'manual labeling. If the results of automation are not ' ... 'satisfactory, click Cancel to return to manual labeling ' ... 'without saving the automated labels.']}; end

自定义属性

步骤2包含核心算法所需的自定义属性。

% --------------------------------------------------------------------- % 第二步:定义您想要使用的属性在算法执行%。properties % SelectedLabelName %所选标签的名称。算法%检测到的车辆被赋给这个变量名。% PretrainedNetwork保存预训练的pointcolumns dlnetwork。PretrainedNetwork %沿x,y和z轴的点云范围,用于将全视图点云裁剪为前视图点云。这些参数指导计算传递给网络的输入[xn,yn]的大小。% xMin = 0.0;% x轴上最小值。% yMin = -39.68;% y轴最小值。 % zMin = -5.0; % Minimum value along Z-axis. % xMax = 69.12 % Maximum value along X-axis. % yMax = 39.68; % Maximum value along Y-axis. % zMax = 5.0; % Maximum value along Z-axis. % xStep = 0.16; % Resolution along X-axis. % yStep = 0.16; % Resolution along Y-axis. % dsFactor = 2.0; % Downsampling factor. % Dimensions for the pseudo-image calculated as % round(((xMax - xMin) / xStep));. % Xn = 432; % Yn = 496; % GridParams % Parameter used to crop full-view point cloud to front-view, % defined as {{xMin,yMin,zMin}, {xMax,yMax,zMax}, % {xStep,yStep,dsFactor}, {Xn,Yn}}; GridParams = {{0.0,-39.68,-5.0}, {69.12,39.68,5.0}, {0.16,0.16,2.0}, {432,496}} % AnchorBoxes % Predefined bounding box dimensions based on the classes to % detect, defined in the format {length, width, height, % z-center, yaw angle} AnchorBoxes = {{3.9, 1.6, 1.56, -1.78, 0}, {3.9, 1.6, 1.56, -1.78, pi/2}}; % P % Number of prominent pillars. P = 12000; % N % Number of points per pillar. N = 100; % ExecutionEnvironment % Set the execution environment. ExecutionEnvironment = "auto"; % ConfidenceThreshold % Specify the confidence threshold to use only detections with % confidence scores above this value. ConfidenceThreshold = 0.45; % OverlapThreshold % Specify the overlap threshold to remove overlapping detections. OverlapThreshold = 0.1; end

函数定义

步骤3处理函数定义。

这个checkSignalType功能检查信号数据是否支持自动化。金宝app激光雷达车辆探测器支持类型信号金宝appPointCloud

只有点云信号数据对激光雷达车辆%探测器算法有效。isValid = (signalType == vision.label .loading. signalType . pointcloud);结束

这个checkLabelDefinition功能检查标签定义是否适用于自动化。激光雷达车辆检测器需要长方体标签类型。

函数isValid=checkLabelDefinition(~,labelDef)%Lidar%车辆检测器算法仅长方体ROI标签定义有效。isValid=labelDef.Type==labelType.cuboid;结束

这个checkSetup函数检查是否为自动化选择了ROI标签定义。

函数isReady = checkSetup(algObj) %是否有一个选择的ROI标签定义要自动化。isReady = ~ isempty (algObj.SelectedLabelDefinitions);结束

这个settingsDialog函数获取并修改步骤2中定义的属性。此API调用允许您创建一个对话框,当您单击设置中的图标自动化选项卡。要创建此对话框,请使用对话框函数快速创建一个简单的模态窗口,可选地修改置信度和重叠阈值。这个lidarVehicleDetectorSettings方法包含设置和输入验证步骤的代码。

函数设置dialog (algObj) %调用对话框,带有修改%阈值和置信度阈值的选项。lidarVehicleDetectorSettings (algObj)结束

执行函数

步骤4指定执行函数初始化函数根据应用程序中的现有标签填充初始算法状态初始化函数的执行步骤如下:

  • 存储所选标签定义的名称。

  • 将包含helper函数的文件夹添加到搜索路径中。

  • 从加载预训练的点目标检测网络坦普迪尔保存到预训练网络财产。

函数initialize(algObj,~) %存储选定标签定义的名称。使用这个%名称来标记检测到的车辆。algObj。挑选edLabelName = algObj.SelectedLabelDefinitions.Name; % Add the folder containing helper functions to the search path. addpath(fullfile(matlabroot,'examples','deeplearning_shared','main')) % Point to tempdir, where pretrainedNet was downloaded. preTrainedMATFile = fullfile(tempdir,'trainedPointPillarsNet.mat'); assert(exist(preTrainedMATFile,'file'), ... sprintf(['File : %s does not exists \n Download Pretrained PointPillars ' ... 'network with the link provided in the example'],preTrainedMATFile)); pretrainedNet = load(preTrainedMATFile); algObj.PretrainedNetwork = pretrainedNet.net; end

这个函数定义此自动化类的核心激光雷达车辆检测器算法为点云序列的每一帧调用函数,并期望automation类返回一组标签。您可以将算法扩展到网络所训练的任何类别。在本例中,请限制网络检测类的对象车辆的

函数autoLabels=run(algObj,pointCloud)bBoxes=[];对于i=1:2,如果i==2%,则将点云旋转180度。θ=π;rot=[cos(thetha)sin(thetha)0;..-sin(thetha)cos(thetha)0;..01];trans=[0,0,0];tform=rigid3d(旋转、平移);点云=pctransform(点云,tform);结束%裁剪点云的前视图。processedPointCloud=helperCropFrontViewFromLidarData(pointCloud,…algObj.GridParams);%使用PointPillars网络检测车辆。[box,~,~]=generatePointPillarDetections(algObj.PretrainedNetwork,…processedPointCloud,algObj.AnchorBoxes,algObj.GridParams,{algObj.SelectedLabelName},algObj.ConfidenceThreshold,…algObj.overlaverthreshold,algObj.P,algObj.N,algObj.ExecutionEnvironment);if~isempty(box)if i==2 box(:,1)=-box(:,1);框(:,2)=-框(:,2);框(:,9)=-框(:,9);结束bBoxes=[bBoxes;box];如果~isempty(bBoxes)%在车辆检测器检测到的边界框位置添加自动标签,类型为长方体,名称为所选标签的%。autoLabels.Name=algObj.SelectedLabelName;autoLabels.Type=labelType.Cuboid;自动标签。位置=b框;else自动标签=[];结束

这个终止函数处理自动化完成后所需的任何清理或拆除。这个算法不需要任何清理,所以函数是空的。

在应用程序中使用激光雷达车辆检测器自动化类

上一节中描述的属性和方法在中实现LidarVehicleDetector自动化算法类文件。在应用程序中使用类。

首先,创建文件夹结构+视觉/ +贴标签机当前文件夹下需要,并将自动化类复制到其中。

mkdir('+vision/+labeler');copyfile(完整文件(matlabroot,'examples','lidar','main','LidarVehicleDetector.m'),…'+vision/+labeler');

下载点云序列(PCD)和图像序列。为便于说明,本例使用了从驱逐OS1激光雷达传感器在公路上收集的WPI激光雷达数据。执行以下代码块以下载激光雷达数据并将其保存在临时文件夹中。根据您的internet连接,下载过程可能需要一些时间。该代码暂停MATLAB®的执行il下载过程已完成。或者,您可以使用web浏览器将数据集下载到本地磁盘并提取文件。

将点云序列下载到临时位置。

利达鲁尔//www.tatmou.com/supportf金宝appiles/lidar/data/WPI_LidarData.tar.gz“;lidarDataFolder=fullfile(tempdir,'WPI_LidarData',filesep);lidardatafile=lidarDataFolder+“WPI_LidarData.tar.gz”;if~exist(lidarDataFolder)mkdir(lidarDataFolder)end if~exist(lidardatafile,'file')disp('下载WPI激光雷达驱动数据(760MB)…');websave(lidardatafile,lidarURL);untar(lidardatafile,lidarDataFolder);end%检查lidar tar.gz文件是否已下载,但未解压缩。如果~存在(fullfile(lidarDataFolder,'WPI_LidarData.mat'),'file')untar(lidardatafile,lidarDataFolder);end

Lidar Labeler应用程序支持PCD金宝app或PLY文件组成的点云序列的加载。将下载的点云数据保存到PCD文件中。本例仅使用WPI点云数据的一个子集,从帧920到940。

%加载下载的激光雷达数据到工作区。负载(fullfile (lidarDataFolder WPI_LidarData.mat),“lidarData”);lidarData =重塑(lidarData,大小(lidarData,2),1);%创建新文件夹并将激光雷达数据写入PCD文件。pcdDataFolder = lidarDataFolder + "lidarData";如果存在(pcdDataFolder, 'dir') mkdir(fullfile(lidarDataFolder,'lidarData'));end disp('保存WPI激光雷达驱动数据到PCD文件…');for i = 920:940 filename = strcat(fullfile(lidarDataFolder,'lidarData',filesep),…num2str(我,“% 06.0 f”)、“.pcd”);我pcwrite (lidarData{},文件名); end

打开激光雷达标签应用程序并加载点云序列。

pointCloudDir = fullfile(lidarDataFolder, 'lidarData');lidarLabeler (pointCloudDir);

ROI标签选项卡,单击标签.定义一个带有名称的ROI标签车辆长方体.你可以选择一种颜色。点击好吧

在下面选择算法中,选择刷新列表.然后,选择算法>激光雷达车辆探测器. 如果未看到此选项,请验证当前工作文件夹是否有名为的文件夹+视觉/ +贴标签机,文件名为激光雷达车辆检测器在里面。

点击自动化. 该应用程序为所选信号打开一个自动化会话,并显示使用该算法的方向。

点击设置,并在打开的对话框中,根据需要修改参数,然后单击好吧

点击.所创建的算法在序列的每一帧上执行,并使用车辆标签类型。应用程序完成自动运行后,使用滑块或箭头键滚动序列,以找到自动算法标记错误的帧。使用缩放、平移和三维旋转选项查看和旋转点云。通过调整检测到的边界框或添加新的边界框,手动调整结果。

当您对整个序列中检测到的车辆边界框感到满意时,单击接受.然后,您可以继续手动调整标签或将已标记的ground truth导出到MATLAB工作区。

您可以使用本例中描述的概念来创建您自己的自定义自动化算法,并扩展应用程序的功能。

辅助函数

helperCropFrontViewFromLidarData

函数processedData=helperCropFrontViewFromLidarData(ptCloud,gridParams)函数裁剪点云的前视图%设置点云的限制。[行,列]=find(ptCloud.Location(:,:,1)...&ptCloud.Location(:,:,1)>gridParams{1,1}{1}...& ptCloud.Location(:,:,2) < gridParams{1,2}{2}...& ptCloud.Location(:,:,2) > gridParams{1,1}{2}...&ptCloud.Location(:,:,3)...&ptCloud.Location(:,:,3)>gridParams{1,1}{3});ptCloud=选择(ptCloud、行、列、,“输出大小”,“全部”); finalPC=移除有效点(ptCloud);processedData=最终的LPC;结束