主要内容

使用激光雷达探测、分类和跟踪车辆

该示例通过使用安装在自助车辆上的LIDAR传感器捕获的LIDAR点云数据来说明如何检测,分类和跟踪车辆。在该示例中使用的LIDAR数据从高速公路驾驶场景中记录。在此示例中,分段点云数据以确定使用的对象类别PointSeg网络。具有交互式多模型滤波器的联合概率数据关联(JPDA)跟踪器用于跟踪检测到的车辆。

概述

感知模块在实现具有ADAS系统的车辆充分的自治方面发挥着重要作用。LIDAR和Camera是感知工作流程中的基本传感器。LIDAR擅长提取对象的精确深度信息,而相机会产生对对象分类有用的环境的丰富和详细信息。

此示例主要包括以下部分:

  • 地面平面分割

  • 语义分割

  • 定向边界盒装

  • 跟踪面向边界框

该流程图概述了整个系统。

加载数据

激光雷达传感器以有组织格式或无组织格式生成点云数据。本例中使用的数据是使用Ouster OS1激光雷达传感器收集的。这种激光雷达产生有组织的点云,有64条水平扫描线。点云数据由三个通道组成,代表X- ,y-, 和Z.- 积分的控制。每个通道的大小为64-1024。使用辅助功能helperdownloaddata.要下载数据并将其加载到Matlab®工作区中。

笔记:此下载可能需要几分钟。

[ptclouds,pretrosdmodel] = helperdownloaddata;

地面平面分割

此示例采用混合方法使用segmentgroundfromlidardata.(电脑视觉工具箱)PCFitplane.(电脑视觉工具箱)功能。首先,估计使用的接地平面参数segmentgroundfromlidardata.功能。估计的接地平面沿着车辆的方向分成条带,以便使用该平面,使用PCFitplane.每个条带上的功能。这种混合方法以分段的方式强大地适合地面平面并处理点云中的变化。

负载点云ptcloud = ptclouds {1};定义裁剪点云的ROIxlimit = [-30,30];Ylimit = [-12,12];zlimit = [-3,15];roi = [xlimit,ylimit,zlimit];%提取地面平面[非地,地面] = alerextractground(Ptcloud,ROI);图;pcshowpair(非地,地面);传奇({'\ color {white} nomground''\ color {white}地面'},'地点'“东北朝”);

语义细分

这个例子使用掠夺PointSeg网络模型。PointSeg是一个端到端的实时语义细分网络,用于汽车,卡车和背景等对象类。来自网络的输出是屏蔽图像,每个像素按其类标记为标记。此掩码用于在点云中过滤不同类型的对象。网络的输入是五声道图像,即x,y,z,强度和范围。有关网络或如何培训网络的更多信息,请参阅使用POINSEG深度学习网络的LIDAR点云语义分割(激光雷达工具箱)例子。

准备输入数据

HelperPreparedata.函数从加载的点云数据生成五个通道数据。

加载并可视化一个样本框架帧= helperPrepareData (ptCloud);图;次要情节(5、1、1);显示亮度图像(帧(:,:1));标题(“X频道”);子图(5,1,2);ImageC(帧(:,:,2));标题('y频道');子图(5,1,3);ImagesC(帧(:,:,3));标题('z频道');子图(5,1,4);ImagesC(帧(:,:,4));标题('强度频道');次要情节(5、1、5);显示亮度图像(帧(::5));标题('范围频道');

从加载的预先训练的网络运行一帧的前向推断。

如果〜存在('网''var')net = pretratemodel.net;结尾%定义类类= [“背景”“汽车”“卡车”];%定义颜色贴图LIDARCOLORMAP = [0.98 0.98 0.00%未知0.01 0.01 0.01汽车%绿色0.01 0.01 0.98摩托车%蓝色颜色];向前跑传球pxdsresults = semanticseg(帧,网);具有分段输出的%覆盖强度图像segmentedImage = labeloverlay (uint8(帧(:,:,4)),pxdsResults,'colormap',lidarcolormap,'透明度',0.5);%显示结果图;imshow(semmentedimage);HelperpixellabelColorbar(LidarColormap,课程);

使用生成的语义掩码过滤包含卡车的点云。类似地,其他类的过滤点云。

Truckindices = PXDSResults =='卡车';TruckPointCloud = Select(非地,Truckindices,'输出'“全部”);%裁剪点云以更好地显示croppedPtCloud =选择(ptCloud findPointsInROI (ptCloud roi));croppedTruckPtCloud =选择(truckPointCloud findPointsInROI (truckPointCloud roi));%显示地面和非地点图;pcshowpair(croppedptcloud,croppedtruckptcloud);传奇({'\ color {white} nonvehicle''\ color {white}车'},'地点'“东北朝”);

聚类和包围盒拟合

在提取不同对象类的点云后,通过应用欧几里德聚类来培养对象PCSEGDIST.(电脑视觉工具箱)功能。为了将属于一个单个群集的所有点分组,作为群集获得的点云用作非应点的生长区域的种子点。使用findnearestneighbors.(电脑视觉工具箱)循环循环的功能以种植该区域。提取的簇用L形边界盒安装在L形边界盒中pcfitcuboid.(激光雷达工具箱)功能。当从自上而下的视图中看到,这些车辆的簇类似于字母L的形状。此功能有助于估计车辆的方向。面向边界盒拟合有助于估计对象的标题角度,这在路径规划和交通操纵流量之类的应用中有用。

也可以通过在每个方向上找到最小和最大空间范围来计算簇的长方体边界。然而,该方法在估计检测到的车辆的方向时失败。两种方法之间的差异如图所示。

[标签,numflusters] = pcsegdist(creadpedtruckptcloud,1);%定义长方体参数Params = Zeros(0,9);为了clusterIndex = 1:numflusters ptsincluster = labels == clusterIndex;PC = SELECT(CROMPEDTRUCKPTCLOUD,PTSINCLUSTER);位置= pc.location;xl =(max(location(:,1)) -  min(位置(:,1)));YL =(MAX(位置(:,2)) -  min(位置(:,2)));zl =(max(location(:,3)) -  min(位置(:,3)));%过滤小边界框如果尺寸(位置,1)*尺寸(位置,2)> 20 &&任何(任何(pc.location))&& xl> 1 && yl> 1 indices = zeros(0,1);ObjectPtCloud = PointCloud(位置);为了i = 1:尺寸(位置,1)SeedPoint =位置(I,:);索引(最终+ 1)= Findnearestneighbors(非地,种子点,1);结尾%删除重叠索引索引=唯一(索引);%适合定向边界框Model = PCFitCuboid(选择(非基础,索引));参数(结束+ 1,:) = model.parameters;结尾结尾%显示点云和检测到的边界框图;pcshow(crocpedptcloud.location,crocpedptcloud.location(:,3));showshape('长方体',params,“颜色”“红色的”“标签”“卡车”);

可视化设置

使用HelperlidarobjectDetectionDisplay.类以可视化一个窗口中的完整工作流程。可视化窗口的布局分为以下部分:

  1. LIDAR系列图像:点云图像在2-D中作为范围图像

  2. 分段图像:检测到从具有强度图像或数据的第四频道覆盖的语义分段网络生成的标签

  3. 定向包围盒检测:带有定向包围盒的三维点云

  4. 顶视图:点云的顶视图与定向边界框

display = helperlidarobjectdetectiondisplay;

遍历数据

HelperlidarobjectDetection.类是封装上述各节中提到的所有分割、聚类和包围盒拟合步骤的包装器。使用finddetections.提取检测到的对象的功能。

%初始化LIDAR对象检测器Lidardetector = Helperlidarobjecdetector('模型',网,'xlimits',xlimit,......'ylimit',ylimit,'Zlimit',Zlimit);%准备5-D LIDAR数据InputData = HelperPreparedata(Ptclouds);%设置随机数发生器以进行可重复的结果。S = rng (2018);%初始化显示初始化阶段(显示);numframes = numel(inputdata);为了数= 1:numFrames获取当前数据输入= inputData {count};RangeImage =输入(:,:5);LIDAR数据的%extact边界框[绑定盒,CoolarPtCloud,PointLabels] = DetectBbox(LidAdgetector,输入);用彩色点云更新显示updatePointCloud(显示,CoundStCloud);%更新边界框updateBoundingBox()边界框(显示、大小);%更新分段图像updateSegmentedImage(显示、pointLabels rangeImage);rawingow('limitrate');结尾

跟踪面向边界框

在本例中,您将使用联合概率数据关联(JPDA)跟踪器。的时间步DT.设置为0.1秒,因为数据集在10 Hz捕获。跟踪器中使用的状态空间模型基于具有参数的多维模型, [ X y Z. ϕ L. W. H ] 。有关如何在LIDAR数据中跟踪边界框的更多详细信息,请参阅用激光雷达追踪车辆:从点云到轨迹表例子。在此示例中,使用该类信息使用ObjectAttributes财产的objectDetection对象。创建新曲目时,过滤初始化功能使用辅助功能定义Helpermulticlassinitimmfilter使用检测的类设置对象的初始尺寸。这有助于跟踪器通过轨道的适当尺寸来调整边界框测量模型。

用这些参数建立一个JPDA跟踪器对象。

分配= [10 100];%分配阈值;Confthreshold = [7 10];历史记录的%确认阈值Delthreshold = [2 3];历史逻辑的%删除阈值kc = 1e-5;每单位音量%假警报速率%IMM滤波器初始化功能filterinitfcn = @helpermulticlassinitimmfilter;%具有IMM滤波器的联合概率数据关联跟踪器追踪= trackerJPDA ('filterinitializationfcn'filterInitFcn,......'tracklogic''历史'......'AssignmentThreshold',指派,......“ClutterDensity”,kc,......'确认察觉'confThreshold,......“DeletionThreshold”,德拉什德,'初始化察觉',0);AllTracks = struct([]);时间= 0;dt = 0.1;%定义测量噪声measnoise = blkdiag(0.25 *眼睛(3),25,眼睛(3));numtracks = zeros(numframes,2);

检测到的对象被组装为单元数组ObjectDetection.(自动驾驶工具箱)物体使用的Helperssembordetections.功能。

display = helperlidarobjectdetectiondisplay;初始化阶段(显示);为了count = 1:numframes time = time + dt;获取当前数据输入= inputData {count};RangeImage =输入(:,:5);LIDAR数据的%extact边界框[绑定盒,CoolarPtCloud,PointLabels] = DetectBbox(LidAdgetector,输入);%将边界框组装到ObjectDetections中检测= HelperAsseMbordetections(边界箱,测量,时间);对跟踪器的%通过检测如果〜Isempty(检测)%更新跟踪器[确认有限公司,追求等待请,AllTracks,Info] =跟踪器(检测,时间);numtracks(count,1)= numel(确认有限公司);结尾用彩色点云更新显示updatePointCloud(显示,CoundStCloud);%更新分段图像updateSegmentedImage(显示、pointLabels rangeImage);如果曲目不为空,则更新显示如果〜isempty(确认贸易)更新(显示,确认托架);结尾rawingow('limitrate');结尾

总结

此示例显示了如何检测和分类LIDAR数据上有面向边界框的车辆。您还学习了如何使用IMM滤波器跟踪具有多个类信息的对象。通过添加更多培训数据,可以进一步提高语义分割结果。

金宝app支持功能

HelperPreparedata.

功能multiChannelData = helperPrepareData(输入)%创建5通道数据作为x,y,z,强度和范围来自POINTCLOUD的大小64×1024-y-5的百分比。如果ISA(输入,'细胞')numframes = numel(输入);multichanneldata = cell(1,numframes);为了i = 1:numframes inputdata =输入{i};x = inputData.Location(::,1);y = inputdata.location(:,:,2);z = inputData.Location(:,:3);强度= inputData.Intensity;范围= sqrt(x。^ 2 + y。^ 2 + z。^ 2);multichanneldata {i} = cat(3,x,y,z,强度,范围);结尾别的x = input.Location (:,: 1);y = input.Location (:: 2);z = input.Location (:,:, 3);强度= input.Intensity;范围= sqrt(x。^ 2 + y。^ 2 + z。^ 2);multiChannelData = cat(3, x, y, z,强度,范围);结尾结尾

Pixellabelolorbar.

功能一会helperPixelLabelColorbar(提出)%添加一个颜色条到当前轴。颜色栏被格式化%以显示带有颜色的类名。Colormap(GCA,CMAP)%将彩色键添加到当前数字。c = colorbar (“对等”,GCA);%使用刻度线的类名称。c.TickLabels =一会;numClasses =大小(提出,1);%中心打勾标签。C.Ticks = 1 /(Numclasses * 2):1 / numclasses:1;%删除刻度线。c.ticklength = 0;结尾

ververextractground.

功能[ptcloudnonground,ptcloudground] = alpherextractground(Ptcloudin,Roi)%裁剪点云idx = findPointsInROI (ptCloudIn roi);电脑=选择(ptCloudIn idx,'输出'“全部”);%使用分段平面配件获得地面平面的索引[Ptcloudground,IDX] =分段平面(PC,ROI);nongroundidx = true(大小(pc.location,[1,2]));nongroundidx(IDX)= false;ptcloudnonground = select(pc,nongroundidx,'输出'“全部”);结尾功能[Traceplane,IDX] =分段平面(PTCloudin,ROI)地面indedsidx =......segmentgregchfromlidardata(ptcloudin,......'expationangledelta'5,'InitialElevationangle'15);groundPC =选择(ptCloudIn groundPtsIdx,'输出'“全部”);%划分3个区域的x轴segmentLength = (roi(2) - roi(1))/3;x1 = [roi(1),roi(1) + segmentLength];x2 = [x1(2),x1(2) + segmentLength];x3 = [x2(2),x2(2) + segmentLength];roi1 = (x1, roi(3:结束));roi2 = (x2, roi(3:结束));roi3 = [x3, roi(3:结束)];idxBack = findPointsInROI (groundPC roi1);idxCenter = findPointsInROI (groundPC roi2);idxForward = findPointsInROI (groundPC roi3);%打破前后点云ptback = select(groundpc,Idxback,'输出'“全部”);ptforward = select(groundpc,idxforward,'输出'“全部”);[~, inliersForward] = planeFit (ptForward);[~, inliersBack] = planeFit (ptBack);idx = [inliersForward;idxCenter;inliersBack];groundPlane = select(ptCloudIn, idx,'输出'“全部”);结尾功能[平面,inlinersidx] = Planefit(Ptcloudin)[〜,InlinerSidx,〜] = PCFitplane(Ptcloudin,1,[0,0,1]);平面= SELECT(PTCLoudin,INLINERSIDX,'输出'“全部”);结尾

Helperssembordetections.

功能MyDetections = HelperAsseMbordections(Bboxes,MoreNoise,时间戳)%组装边界框作为ObjectDetection的单元格阵列MyDetections = Cell(大小(Bboxes,1),1);为了i = 1:大小(bboxes,1)classid = bboxes(i,端);lidarmodel = [bboxes(i,1:3),bboxes(i,端1),bboxes(i,4:6)];%要避免跟踪器直接确认,ClassID被传递为%ObjectAttributes。MyDetections {i} = ObjectDetection(时间戳,......Lidarmodel','MeasurementNoise'......麻疹,'ObjectAttributes'结构('班级号',班级号));结尾结尾

helperdownloaddata.

功能[Lidardata,pretrosataModel] = HelperDownLoadData Outporfolder = FullFile(Tempdir,'wpi');URL =.“https://ssd.mathworks.com/金宝appsupportfiles/lidar/data/lidarSegmentationAndTrackingData.tar.gz”;lidardatatarfile = fullfile(outputfolder,'lidarsmentationandtrackingdata.tar.gz');如果〜存在(LidardataTarfile,'文件'mkdir (outputFolder);websave (lidarDataTarFile、url);解压(lidarDataTarFile outputFolder);结尾%检查tar.gz文件是否已下载,但未解压如果~ (fullfile (outputFolder,存在'wpi_lidardata.mat'),'文件')Untar(LidardataTarfile,Outputfolder);结尾%加载LIDAR数据Data = Load(FullFile(OutputFolder,'highwaydata.mat'));lidardata = data.ptclouddata;%下载净化模型URL =.'https://ssd.mathwands.com/金宝appsupportfiles/lidar/data/pretraypointsegmodel.mat';modelfile = fullfile(outputfolder,'pretraypointsegmodel.mat');如果〜存在(模块,'文件') websave (modelFile url);结尾pretratemodel = load(fullfile(outputfolder,'pretraypointsegmodel.mat'));结尾

参考文献

[1]萧张,温达徐,志宇洞和约翰M. Dolan,“使用激光扫描仪的汽车检测高效L形拟合”,IEEE智能车辆研讨会,2017年6月

[2]王,王,施,P. yun,L. Tai和M. Liu,“PoinseG:基于3D LIDAR点云的实时语义分割,”Arxiv预印迹:1807.06288,2018。