使用点柱自动标记车辆检测的地面真相
这个例子展示了如何在点云中使用预训练的车辆检测自动化pointPillarsObjectDetector
在激光雷达贴标签机.该示例使用AutomationAlgorithm
接口激光雷达贴标签机应用程序自动标记。
激光雷达标签应用程序
良好的地面真实数据对自动驾驶算法的开发和性能评估至关重要。但是,创建和维护一个多样化的、高质量的、带标签的数据集需要大量的工作。的激光雷达贴标签机应用程序提供了一个框架来自动标记过程AutomationAlgorithm
接口。你可以创建一个自定义算法,并在应用程序中使用它来标记你的整个数据集。您还可以编辑结果,以适应算法遗漏的任何具有挑战性的场景。
在这个例子中,你:
使用训练有素的
pointPillarsObjectDetector
检测类的对象“汽车”
.创建一个自动化算法,您可以在激光雷达贴标签机应用程序使用PointPillars对象检测器自动在点云中标记车辆。
使用PointPillars对象检测器检测车辆
使用预先训练的PointPillars对象检测器在点云中检测车辆。有关如何训练pointcolumns网络的信息,请参见基于pointcolumns深度学习的激光雷达三维物体检测的例子。您可以通过在训练网络时迭代地使用自定义训练数据来改进网络性能。
使用预先训练的物体检测器来检测车辆:
读取点云。
在点云上运行检测器来检测边界框。
用边界框显示点云。
%装载预先训练的检测器。预训练检测器=负载(“pretrainedPointPillarsDetector.mat”,“探测器”);检测器=预训练检测器.检测器;读点云。ptCloud = pcread(“PandasetLidarData.pcd”);检测边界框。[bboxes,~,~] = detect(探测器,ptCloud);在点云上显示检测结果。图ax = pcshow(ptCloud.Location);showShape (“长方体”bboxes,“父”ax,“不透明度”, 0.1,“颜色”,“绿色”,“线宽”, 0.5)在变焦(ax, 2.5)标题(“点云上检测到的车辆”)
准备激光雷达车辆探测器自动化课程
构造一个激光雷达车辆探测器算法的自动化类。类继承自lidar.labeler.AutomationAlgorithm
抽象基类。基类为应用程序用来配置和运行自定义算法的方法定义属性和签名。的激光雷达贴标签机App提供了一个初始自动化类模板。有关更多信息,请参见创建自动标记算法.的LidarVehicleDetector
类基于此模板,并为您提供一个随时可用的自动化类,用于在点云中检测车辆。类的注释概述了实现每个API调用所需的基本步骤。
算法性能
步骤1包含定义算法的名称和描述以及使用算法的方向的属性。
% ---------------------------------------------------------------------- % 步骤1:定义所需的属性描述算法。此%包括名称、描述和用户说明。properties(Constant) % Name算法名称%指定算法名称的字符向量。名称= '激光雷达车辆探测器';% Description算法描述%字符向量,指定算法的简短描述。Description = '使用预先训练的PointPillars对象检测器在点云中检测车辆。';%字符向量的单元格数组,指定%算法用户在使用算法时遵循的方向。UserDirections = {['ROI标签定义选择:选择其中一个'…“待标记的ROI定义”],……['运行:按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所选标签的%名称。算法%检测到的车辆被分配这个变量名。SelectedLabelName % PretrainedDetector % PretrainedDetector保存预先训练的pointcolumns对象%检测器。PretrainedDetector % confidence threshold %指定置信度阈值,以便只使用置信度评分高于此值的检测。ConfidenceThreshold = 0.45;结束
函数定义
步骤3处理函数定义。
的checkSignalType
函数检查信号数据是否支持自动化。激光雷达车辆探测器支持该类型的信号PointCloud
.
只有点云信号数据对Lidar Vehicle %探测器算法有效。isValid = (signalType == vision.label .loading. signalType . pointcloud);结束
的checkLabelDefinition
函数检查标签定义是否为自动化的适当类型。激光雷达车辆探测器要求长方体
标签类型。
只有长方体ROI标签定义对Lidar %车辆探测器算法有效。isValid = labelDef。类型== labeltype . cubid;结束
的checkSetup
函数检查是否为自动化选择了ROI标签定义。
是否有一个选定的ROI标签定义要自动化。isReady = ~isempty(algObj.SelectedLabelDefinitions);结束
的settingsDialog
函数获取并修改步骤2中定义的属性。该API调用允许创建一个对话框,该对话框在单击设置的图标。自动化选项卡。要创建此对话框,请使用对话框
函数快速创建一个简单的模态窗口,可选地修改置信度阈值。的lidarVehicleDetectorSettings
方法包含设置和输入验证步骤的代码。
调用带有修改置信阈值选项的对话框。lidarVehicleDetectorSettings (algObj)结束
执行函数
步骤4指定执行函数。的初始化
函数根据应用程序中现有的标签填充初始算法状态初始化
函数执行以下步骤:
存储所选标签定义的名称。
加载预先训练的pointPillarsObjectDetector并将其保存到
PretrainedDetector
财产。
存储所选标签定义的名称。使用此%名称标记检测到的车辆。algObj。选择edLabelName = algObj.SelectedLabelDefinitions.Name; % Load the pretrained pointPillarsObjectDetector. pretrainedDetector = load('pretrainedPointPillarsDetector.mat','detector'); algObj.PretrainedDetector = pretrainedDetector.detector; end
的运行
函数定义了这个自动化类的核心激光雷达车辆探测器算法。的运行
函数为点云序列的每一帧调用,并期望自动化类返回一组标签。您可以将算法扩展到网络训练的任何类别。在这个例子中,网络检测类的对象车辆的
.
function autoLabels = run(algObj,ptCloud) bBoxes = [];对于i = 1:2,如果i == 2%,将点云旋转180度。θ = 180;Trans = [0,0,0];Tform = rigidtform3d([0 0 theta], trans);ptCloud = pctransform(ptCloud,tform);使用预先训练的检测器检测边界框。[box,~,~] = detect(algObj.)PretrainedDetector,ptCloud, ... "Threshold",algObj.ConfidenceThreshold); if ~isempty(box) if i == 2 box(:,1) = -box(:,1); box(:,2) = -box(:,2); box(:,9) = -box(:,9); end bBoxes = [bBoxes;box]; end end if ~isempty(bBoxes) % Add automated labels at bounding box locations detected % by the vehicle detector, of type Cuboid and with the name % of the selected label. autoLabels.Name = algObj.SelectedLabelName; autoLabels.Type = labelType.Cuboid; autoLabels.Position = bBoxes; else autoLabels = []; end end
的终止
函数处理自动化完成后所需的任何清理或拆卸。之后调用此函数运行
在指定的间隔内或算法停止运行后的最后一帧被调用。LidarVehicleDetector
算法不需要重置它的任何参数,因此函数为空。
在App中使用激光雷达车辆探测器自动化类
实现前面定义的属性和方法LidarVehicleDetector
自动化算法类文件。中的类激光雷达贴标签机应用程序。
首先,创建文件夹结构+激光雷达/ +贴标签机
在当前文件夹下,并将自动化类复制到路径中。
mkdir(“+激光雷达/ +贴标签机”);拷贝文件(fullfile (matlabroot“例子”,“激光”,“主要”、“LidarVehicleDetector.m”),…“+激光雷达/ +贴标签机”);
下载点云序列(PCD)。为了便于说明,本示例使用来自Hesai和Scale [1].pandset包含使用Pandar 64传感器捕获的各种城市场景的点云扫描。执行以下代码块下载激光雷达数据并将其保存在临时文件夹中。根据您的网络连接情况,下载过程可能需要一些时间。该代码暂停MATLAB®的执行,直到下载过程完成。或者,您可以使用web浏览器将数据集下载到您的本地磁盘并解压缩文件。
将点云序列下载到临时位置。
outputFolder = fullfile(tempdir,' pandset ');lidarDataTarFile = fullfile(outputFolder,'Pandaset_LidarData.tar.gz');if ~exist(lidarDataTarFile,'file') mkdir(outputFolder);disp('正在下载Pandaset Lidar驾驶数据(5.2BG)…');Component = 'lidar';filename = 'data/Pandaset_LidarData.tar.gz';lidarDataTarFile = matlab.internal.examples.downloadSupportFile(component,filename);解压(lidarDataTarFile outputFolder);检查是否下载了tar.gz文件,但未解压。if ~exist(fullfile(outputFolder,'Lidar'),'file') untar(lidarDataTarFile,outputFolder); end
打开激光雷达贴标签机App并加载点云序列。
pointCloudDir = fullfile(outputFolder,'Lidar');lidarLabeler (pointCloudDir);
App显示点云数据和时间范围如下图所示。
在ROI标签选项卡,单击标签.用名称定义一个ROI标签车辆
和长方体
.您可以选择一种颜色。点击好吧.
这个例子在pandset点云帧的子集上运行算法。指定应用程序运行算法的时间间隔,从0到15秒。在结束时间盒子。范围滑块和文本框设置为0到15秒。该应用程序显示和应用自动化算法只在帧上的这个间隔。
下选择算法中,选择刷新列表.然后,点击选择算法并选择激光雷达车辆探测器.如果没有看到此选项,请验证当前工作文件夹是否有一个名为+激光雷达/ +贴标签机
,文件名为LidarVehicleDetector.m
在里面。
点击自动化.该应用程序为选定的信号打开一个自动化会话,并显示使用算法的指令。
点击设置,在弹出的对话框中修改参数,单击好吧.
点击运行.该应用程序在序列的每一帧上运行算法,并通过使用车辆
标签类型。在应用程序完成自动化运行后,您可以使用滑块或方向键滚动序列,以可视化结果或分段标签。使用缩放、平移和3-D旋转选项来查看和旋转点云。您可以通过调整检测到的边界框或添加新的边界框来手动调整结果。
当你对整个序列中检测到的车辆边界框感到满意时,单击接受.然后,您可以继续手动调整标签或将标记的地面真值导出到MATLAB工作区。
您可以使用本例中描述的概念来创建您自己的自定义自动化算法并扩展应用程序的功能。
参考文献
Hesai和Scale。PandaSet。https://scale.com/open-datasets/pandaset