主要内容

使用LIDAR检测,分类和跟踪车辆

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

概要

感知模块在ADAS系统实现车辆全自主驾驶中起着重要作用。激光雷达和相机是感知工作流程中必不可少的传感器。激光雷达善于提取目标的精确深度信息,而相机则能产生丰富而详细的环境信息,有助于目标分类。

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

  • 地面平面分割

  • 语义细分

  • 有向包围盒拟合

  • 跟踪面向边界框

流程图给出了整个系统的概览。

加载数据

LIDAR传感器以有组织的格式或未组织格式生成点云数据。使用OuSter OS1 LIDAR传感器收集在此示例中使用的数据。这款激光乐队生成有组织点云,具有64条水平扫描线。点云数据由三个通道组成,代表x- ,y- - - - - -,z- 积分的控制。每个通道的大小为64-1024。使用辅助功能helperdownloaddata.要下载数据并将其加载到Matlab®工作区中。

注意:此下载可能需要几分钟。

[ptclouds,pretrosdmodel] = helperdownloaddata;

地面平面分割

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

%加载点云ptcloud = ptclouds {1};%定义裁剪点云的投资回报率xLimit = (-30, 30);yLimit = (-12, 12);zLimit =(3、15);投资回报率= [xLimit、yLimit zLimit];提取地平面[非地,地面] = alerextractground(Ptcloud,ROI);图;pcshowpair(非地,地面);传奇({'\ color {white} nomground''\ color {white}地面'},'位置'“northeastoutside”);

语义细分

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

准备输入数据

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

%加载和可视化样本框架Frame = HelperPreparedata(Ptcloud);图;子图(5,1,1);ImagesC(帧(:,:,1));标题('x频道');子图(5,1,2);ImageC(帧(:,:,2));标题(“Y”频道);子图(5,1,3);ImagesC(帧(:,:,3));标题('z频道');子图(5,1,4);ImageC(帧(:,:,4));标题('强度频道');子图(5,1,5);ImageC(帧(:,:,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 =选择(nonGround truckIndices,“OutputSize”'完全');%裁剪点云以更好地显示croppedptcloud = select(ptcloud,findpointsinroi(ptcloud,Roi));crampedtruckptcloud = select(truckpointcloud,findpointsinroi(truckpointcloud,Roi));显示地面和非地面点图;pcshowpair (croppedPtCloud croppedTruckPtCloud);传奇({'\ color {white} nonvehicle'“{白}\颜色车”},'位置'“northeastoutside”);

聚类和边界盒配件

在提取不同对象类的点云后,通过应用欧几里德聚类来培养对象PCSEGDIST.函数。为了将属于一个聚类的所有点进行分组,将得到的聚类点云作为非地点生长区域的种子点。使用findnearestneighbors.循环循环的功能以种植该区域。提取的簇用L形边界盒安装在L形边界盒中pcfitcuboid.函数。从上至下的角度看,这些车群的形状类似于字母L。这个特性有助于估计车辆的方向。有向包围盒拟合有助于估计目标的航向角,在路径规划和交通机动等应用中非常有用。

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

[标签,numflusters] = pcsegdist(creadpedtruckptcloud,1);%定义长方体参数params = 0 (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)));%过滤小边界框如果size(location,1)*size(location,2) > 20 && any(any(pc.Location)) && xl > 1 && yl > 1 indices = 0 (0,1);objectPtCloud = pointCloud(位置);i = 1:尺寸(位置,1)SeedPoint =位置(I,:);索引(最终+ 1)= Findnearestneighbors(非地,种子点,1);结束%删除重叠索引索引=唯一(索引);%适合定向边界框模型= pcfitcuboid(选择(nonGround,指数));参数(+ 1,:)= model.Parameters;结束结束%显示点云和检测到的包围框图;pcshow (croppedPtCloud.Location croppedPtCloud.Location (:, 3));showShape ('长方体',params,“颜色”“红色”“标签”“卡车”);

可视化设置

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

  1. 激光雷达距离图像:点云图像作为二维距离图像

  2. 分割图像:将语义分割网络与强度图像或数据的第四通道叠加,生成检测到的标签

  3. 定向边界框检测:3-D点云,具有面向边界框

  4. 俯视图:具有方向包围框的点云的俯视图

display = helperlidarobjectdetectiondisplay;

循环通过数据

helperLidarObjectDetection类是包装器封装上述部分中提到的所有分段,聚类和边界盒的拟合步骤。使用finddetections.提取检测到的对象的功能。

初始化激光雷达物体探测器lidarDetector = helperLidarObjecDetector ('型号',网,'xlimits',xlimit,......“YLimit”yLimit,'Zlimit',Zlimit);%准备5-D LIDAR数据InputData = HelperPreparedata(Ptclouds);%设置随机数发生器以进行可重复的结果。S = RNG(2018);%初始化显示initializeDisplay(显示);numFrames =元素个数(inputData);count = 1:numframes%获取当前数据输入= inputData {count};RangeImage =输入(:,:5);LIDAR数据的%extact边界框,边界框((大小)coloredPtCloud pointLabels] = detectBbox (lidarDetector、输入);%用彩色点云更新显示updatePointCloud(显示,CoundStCloud);%更新边界框UpdateBoundingBox(显示,绑定框);%更新分段图像updateSegmentedImage(显示、pointLabels rangeImage);rawingow(“limitrate”);结束

跟踪面向边界框

在此示例中,您使用联合概率数据关联(JPDA)跟踪器。时间步骤dt设置为0.1秒,因为数据集在10 Hz捕获。跟踪器中使用的状态空间模型基于具有参数的多维模型, x y z φ. l w h .有关如何在LIDAR数据中跟踪边界框的更多详细信息,请参阅使用LIDAR跟踪车辆:从点云到跟踪列表(传感器融合和跟踪工具箱)示例。在此示例中,使用该类信息使用ObjectAttributes.财产的财产ObjectDetection对象.创建新曲目时,过滤初始化功能使用辅助功能定义helperMultiClassInitIMMFilter使用检测的类设置对象的初始尺寸。这有助于跟踪器通过轨道的适当尺寸来调整边界框测量模型。

使用这些参数设置JPDA Tracker对象。

分配= [10 100];%分配阈值;confThreshold = [7 10];历史记录的%确认阈值Delthreshold = [2 3];历史逻辑的%删除阈值Kc = 1 e-5;每单位音量%假警报速率%IMM滤波器初始化功能filterinitfcn = @helpermulticlassinitimmfilter;%具有IMM滤波器的联合概率数据关联跟踪器跟踪器= trackerjpda(“FilterInitializationFcn”,filterinitfcn,......“TrackLogic”“历史”......“AssignmentThreshold”,指派,......'Clutterdention',kc,......“ConfirmationThreshold”,施法,......'deletionthreshold'delThreshold,'初始化察觉',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边界框,边界框((大小)coloredPtCloud pointLabels] = detectBbox (lidarDetector、输入);将边界框组装到objectDetections中,边界框(检测= helperAssembleDetections(大小)measNoise、时间);对跟踪器的%通过检测如果~ 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 × 5的%。如果ISA(输入,“细胞”) numFrames = nummel (input);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,强度,范围);结束结束

pixelLabelColorbar

功能Helperpixellabelcolorbar(CMAP,ClassNames)%将彩色条添加到当前轴。彩色键格式化了%以与颜色显示类名。Colormap(GCA,CMAP)%将彩色键添加到当前数字。c =彩色杆('同伴',GCA);%使用刻度线的类名称。C.Ticklabels = ClassNames;numclasses = size(cmap,1);%Center Tick标签。C.Ticks = 1 /(Numclasses * 2):1 / numclasses:1;%删除刻度线。c.ticklength = 0;结束

ververextractground.

功能[ptcloudnonground,ptcloudground] = alpherextractground(Ptcloudin,Roi)%裁剪点云idx = findpointsinroi(ptcloudin,roi);PC = SELECT(PTCLOUDIN,IDX,“OutputSize”'完全');使用分段平面拟合得到地面指数[ptCloudGround, idx] = piecewisePlaneFitting (pc, roi);nonGroundIdx = true(大小(pc.Location [1, 2]));nonGroundIdx (idx) = false;nonGroundIdx ptCloudNonGround =选择(个人电脑,“OutputSize”'完全');结束功能[Traceplane,IDX] =分段平面(PTCloudin,ROI)地面indedsidx =......segmentgregchfromlidardata(ptcloudin,......'expationangledelta',5,'InitialElevationangle'15);地面= SELECT(PTCLOUDIN,地面,“OutputSize”'完全');%划分3个区域的x轴SegmentLength =(ROI(2) -  ROI(1))/ 3;X1 = [ROI(1),ROI(1)+ SegmentLength];x2 = [x1(2),x1(2)+ secment length];x3 = [x2(2),x2(2)+ secment length];ROI1 = [X1,ROI(3:END)];ROI2 = [X2,ROI(3:结束)];ROI3 = [X3,ROI(3:END)];idxback = findpointsinroi(groundpc,roi1);idxcenter = findpointsinroi(groundpc,roi2);idxforward = findpointsinroi(groundpc,roi3);%打破前后点云ptBack =选择(groundPC idxBack,“OutputSize”'完全');ptForward =选择(groundPC idxForward,“OutputSize”'完全');[〜,inliersforward] =平面图(Ptforward);[〜,inliersback] = Planefit(第回复);idx = [inliersforward;IdxCenter;inliersback];GroundPlane = SELECT(PTCLoudin,IDX,“OutputSize”'完全');结束功能[平面,inlinersidx] = Planefit(Ptcloudin)[〜,InlinerSidx,〜] = PCFitplane(Ptcloudin,1,[0,0,1]);平面= SELECT(PTCLoudin,INLINERSIDX,“OutputSize”'完全');结束

Helperssembordetections.

功能MyDetections = HelperAsseMbordections(Bboxes,MoreNoise,时间戳)%组装边界框作为ObjectDetection的单元格阵列mydetections =细胞(大小(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{我}= objectDetection(时间戳,......lidarModel’,'MeasurementNoise'......麻疹,“ObjectAttributes”,struct(“ClassID”classid));结束结束

helperdownloaddata.

功能[Lidardata,pretrosataModel] = HelperDownLoadData Outporfolder = FullFile(Tempdir,批发价格指数的);url ='https://ssd.mathwands.com/金宝appsupportfiles/lidar/data/lidarsementationandtrackingdata.tar.gz';lidarDataTarFile = fullfile (outputFolder,“lidarSegmentationAndTrackingData.tar.gz”);如果〜存在(LidardataTarfile,'文件')MKDIR(输出文件);Websave(LidardataTarfile,URL);Untar(LidardataTarfile,Outputfolder);结束%检查tar.gz文件是否已下载,但没有未压缩如果〜存在(FullFile(OutputFolder,“WPI_LidarData.mat”),'文件')解压(lidarDataTarFile outputFolder);结束%加载激光雷达数据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(Modelofile,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。