主要内容

利用激光雷达标记器实现激光雷达点云语义分割的自动地真值标记

的预先训练的语义分割网络,演示如何在点云中自动进行语义标记激光雷达贴标签机在本例中,您可以使用AutomationAlgorithm类中自动标记激光雷达贴标签机应用程序。

激光雷达贴标签机应用

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

在这个例子中,你:

  • 使用预训练的SqueezeSegV2语义分割网络对三维组织的点云进行分割。

  • 创建一个自动化算法,您可以在激光雷达贴标签机应用程序自动分割植被,地面,道路,道路标记,人行道,汽车,卡车,其他车辆,行人,道路屏障,标志和建筑体素在点云使用SqueezeSegV2网络。

利用SqueezeSegV2网络分段点云

使用预训练的SqueezeSegV2网络分割点云。有关如何自己训练SqueezeSegV2网络的信息,请参见基于SqueezeSegV2深度学习网络的激光雷达点云语义分割.这个预先训练的网络是针对有组织的点云的。有关如何将无组织点云转换为有组织点云的信息,请参见利用球面投影的点云无组织到有组织的转换

下载Pretrained网络

下载经过预先训练的SqueezeSegV2网络,它已经在pandset数据集上进行了训练。

outputFolder = fullfile (tempdir,“Pandaset”);preTrainedMATFile = fullfile (outputFolder,“trainedSqueezeSegV2PandasetNet.mat”);preTrainedZipFile = fullfile (outputFolder,“trainedSqueezeSegV2PandasetNet.zip”);如果~存在(preTrainedMATFile“文件”如果~存在(preTrainedZipFile“文件”) disp (下载预训练模型(5mb)…);组件=“激光雷达”;文件名=“数据/ trainedSqueezeSegV2PandasetNet.zip”;preTrainedZipFile = matlab.internal.examples.downloadSupportFile(组件,文件名);结束解压缩(preTrainedZipFile outputFolder);结束

下载激光雷达数据集

下载PandaSet数据集,并将激光雷达数据保存到Pandaset临时文件夹中的文件夹。注意,数据集的大小是5.2 GB,代码暂停MATLAB®的执行,直到下载过程完成。为了避免在下载期间暂停MATLAB的执行,您可以将数据集下载到本地磁盘,然后提取文件。

lidarDataTarFile = fullfile (outputFolder,“Pandaset_LidarData.tar.gz”);如果~存在(lidarDataTarFile“文件”) disp (“下载熊猫激光雷达驾驶数据(5.2GB)…”);组件=“激光雷达”;文件名=“数据/ Pandaset_LidarData.tar.gz”;lidarDataTarFile = matlab.internal.examples.downloadSupportFile(组件,文件名);解压(lidarDataTarFile outputFolder);结束检查是否下载了tar.gz文件,但未解压。如果~ (fullfile (outputFolder,存在“激光雷达”),“文件”)解压(lidarDataTarFile outputFolder);结束

基于点云的分割结果预测

使用训练过的网络来预测点云上的结果,步骤如下:

加载预训练的网络。outputFolder = fullfile (tempdir,“Pandaset”);负载(fullfile (outputFolder“trainedSqueezeSegV2PandasetNet.mat”),“净”);读点云。ptCloud = pcread (fullfile (outputFolder“激光雷达”“0001.纤毛运动”));将点云转换为5通道图像。我= helperPointCloudToImage (ptCloud);%预测分割结果。predictedResult = semanticseg (im,净);在点云上显示语义分割结果。helperDisplayLabelOverlaidPointCloud (im, predictedResult);查看([39.2 90.0 60])title(“基于点云的语义分割结果”

准备激光雷达语义分割自动化课程

为激光雷达语义分割算法构造一个自动化类。类继承自lidar.labeler.AutomationAlgorithm抽象基类。基类为应用程序用来配置和运行自定义算法的方法定义属性和签名。的激光雷达贴标签机App提供了一个初始自动化类模板。有关更多信息,请参见创建自动标记算法.的LidarSemanticSegmentation类基于此模板,并为您提供了一个随时可用的自动化类,用于在点云中进行语义分割。类的注释概述了实现每个API调用所需的基本步骤。

算法性能

首先,定义确定算法名称和描述的属性,以及使用算法的方向。

% ----------------------------------------------------------------------步骤1:定义描述算法的必要属性。这%包括名称、描述和用户说明。属性(常数)% Name算法名称指定算法名称的字符向量。Name =“激光雷达的语义分割”算法描述指定算法的简短描述的字符向量。描述='使用SqueezeSegV2网络分割点云'算法使用方向指定方向的字符向量的单元格数组%算法用户遵循使用算法。UserDirections = {(“ROI标签定义选择:选择其中之一”...“要贴上标签的投资回报率定义”),...“运行:按Run运行自动化算法。”...“检查和修改:检查间隔内的自动标签”...“使用播放控制。修改/删除/添加非roi...”这句话在现阶段已经圆满地自动化了。如果结果是...'满意,点击Accept接受自动标签。'),...“接受/取消:如果自动化的结果令人满意,”...'点击接受接受所有自动标签并返回'...“手动标记。如果自动化的结果不是...'满意,点击取消返回手动贴标签'...“不用保存自动标签。”]};结束

自定义属性

接下来,定义核心算法所需的自定义属性。

% ---------------------------------------------------------------------步骤2:定义您想在算法期间使用的属性。%执行。属性% AllCategories% AllCategories保存默认的'unlabelled', 'Vegetation',%“地面”,“路”,“路标”,“人行道”、“汽车”,“卡车”,“其他车辆”、“行人”、“道路障碍”、“标志”,“建筑物”类别类型。AllCategories = {“未标记的”};% PretrainedNetwork% PretrainedNetwork保存预训练的SqueezeSegV2网络。PretrainedNetwork结束

函数定义

对于第三步,定义用于检查有效数据和标签定义的函数。

checkSignalType函数检查信号数据是否支持自动化。激光雷达语义分割算法支持类型信号PointCloud

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

checkLabelDefinition函数检查标签定义是否为自动化的适当类型。激光雷达的语义分割算法需要体素标签类型。

函数= checkLabelDefinition(algObj, labelDef)只有Voxel ROI标签定义对激光雷达有效%语义分割算法。isValid = labelDef。类型= = lidarLabelType.Voxel;如果isValid algObj。AllCategories{结束+ 1}= labelDef.Name;结束结束

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

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

执行函数

指定执行函数。的初始化函数根据应用程序中现有的标签填充初始算法状态初始化函数加载预先训练的语义分割网络并将其保存到PretrainedNetwork属性。

函数初始化(algObj ~)加载预先训练的SqueezeSegV2语义分割网络。。outputFolder = fullfile (tempdir,“Pandaset”);pretrainedSqueezeSeg =负载(fullfile (outputFolder“trainedSqueezeSegV2PandasetNet.mat”));将网络存储在该对象的'PretrainedNetwork'属性中。algObj。PretrainedNetwork = pretrainedSqueezeSeg.net;结束

运行函数定义了这个自动化类的核心激光雷达语义分割算法。算法调用运行点云序列的每一帧的函数。该函数期望自动化类返回一组标签。您可以将算法扩展到网络训练的任何类别。对于本例的目的,将网络限制为对类别的体素进行分割植被地面路标人行道上汽车卡车其他车辆行人障碍迹象,建筑

函数autoLabels = run(algObj, pointCloud)设置包含默认类别的类别矩阵“未标记”、“植被”、“地面”、“道路”、“道路标记”,“人行道”,“汽车”,“卡车”,“其他车辆”,“行人”,' roadbarrier '和'Signs'。autoLabels =分类(0(大小(pointCloud.Location, 1),大小(pointCloud.Location 2)),...0:12 algObj.AllCategories);将输入点云转换为五通道图像。。I = helperPointCloudToImage (pointCloud);%预测分割结果。predictedResult = semanticseg(我algObj.PretrainedNetwork);autoLabels (:) = predictedResult;结束

终止函数处理自动化完成后所需的任何清理或拆卸。该算法不需要任何清理,因此函数为空。

在App中使用激光雷达语义分割自动化类

控件中实现的属性和方法LidarSemanticSegmentation自动化算法类文件用激光雷达贴标签机,你必须将算法导入应用程序。

首先,创建文件夹结构+激光雷达/ +贴标签机,并将自动化类复制到其中。

mkdir (“+激光雷达/ +贴标签机”);拷贝文件(fullfile (matlabroot,“例子”激光雷达的“主要”“LidarSemanticSegmentation.m”),...“+激光雷达/ +贴标签机”);

接下来,打开激光雷达贴标签机app并加载pandset点云序列。

pointCloudDir = fullfile (outputFolder,激光雷达的);lidarLabeler (pointCloudDir);

AutomateSemanticSegmentationDisplaySignal.png

ROI标签选项卡,单击标签.定义12个具有名称的ROI标签植被地面路标人行道上卡车OtherVehicle行人RoadBarriers迹象,建筑,标签类型体素.您可以选择标签的颜色。点击好吧

为了便于演示,本示例在pandset点云帧的子集上运行算法。选择要标记的时间范围。中输入0指定数据集的前15秒开始时间盒子和15在结束时间盒子。在范围滑块上出现一对红色标志,指示所选的时间间隔。该应用程序只显示这个区间的信号帧,并将自动化算法应用到这个区间。

AutomateSemanticSegmentationFrameRange.png

选择算法中,选择刷新列表.然后,选择算法>激光雷达语义分割.如果没有看到此选项,请验证当前工作文件夹是否有一个名为+激光雷达/ +贴标签机,文件名为LidarSemanticSegmentation.m在里面。

点击自动化.该应用程序打开一个自动化会话,并显示使用算法的说明。

AutomateSemanticSegmentationAutomationSession.png

点击运行.所创建的算法在指定序列的每一帧上执行,并将点分割到植被地面路标人行道上卡车OtherVehicle行人RoadBarriers迹象建筑类别。在应用程序完成自动化运行后,使用滑块或方向键滚动序列,以定位自动化算法标记错误的点的任何帧。使用缩放、平移和3-D旋转选项来查看和旋转点云。通过添加或删除体素注释手动调整结果。

AutomateSemanticSegmentationResult.png

支持功能

helperDisplayLabelOverlaidPointCloud函数将分割结果覆盖在三维组织的点云上。

函数predictedResult helperDisplayLabelOverlaidPointCloud(我)在点云对象上覆盖标签。predictedResult % helperDisplayLabelOverlaidPointCloud(我)%显示覆盖的pointCloud对象。我是5个频道组织的%输入图像。predictedResult包含像素标签。ptCloud = pointCloud(我(:,:1:3),强度=我(:,:,4));提出= helperPandasetColorMap;B =...labeloverlay(uint8(ptCloud.Intensity),predictedResult,Colormap = cmap,Transparency = 0.4);电脑= pointCloud (ptCloud。位置、颜色= B);ax = pcshow (pc);集(ax, XLim = (-70 70), YLim =[-70 - 70])变焦(ax, 3.5)结束

helperPandasetColorMap函数定义激光雷达数据集使用的色彩图。

函数cmap = helperPandasetColorMap cmap = [30 30 30];%无标号(255 0);%的植被(255 150 255);%的地面(237 117 32);%的道路(255 0 0);%路标(90 150);%人行道(255 255 30);%的车(245 150 100);%的卡车60 30 [150];%其他车辆(255 255 0];%行人[0 200 255);%道路障碍(170 100 150);%的迹象(255 0 255)];%的建筑提出255 = cmap. /;结束

helperPointCloudToImage函数将点云转换为五通道图像。

函数形象= helperPointCloudToImage (ptcloud)% helperPointCloudToImage将点云转换为五通道图像形象= ptcloud.Location;图像(::4)= ptcloud.Intensity;rangeData = iComputeRangeData(图像(:,:1)、图像(:,:2),图片(:,:,3));图像(::5)= rangeData;指数= isnan(图片);图像(指数)= 0;结束函数rangeData = iComputeRangeData(xChannel,yChannel,zChannel) rangeData = sqrt(xChannel.*xChannel+yChannel.*yChannel+zChannel.*zChannel);结束
Baidu
map