主要内容

LIDAR点云分割网络的代码生成

此示例显示如何为LIDAR语义分割生成深度学习网络的CUDA®MEX代码。此示例使用佩带的挤压ZeeSgvv2 [1]网络,该网络可以分段为属于三个类的组织激光雷云(背景, 和卡车).有关网络培训程序的信息,请参见基于SqueezeSegV2深度学习网络的激光雷达点云语义分割(LIDAR工具箱).生成的MEX代码将点云作为输入执行,并使用该点云执行预测DAGNetwork对象用于SqueezeSegV2网络。

第三方先决条件

必需的

此示例生成CUDA MEX并具有以下第三方要求。

  • CUDA使NVIDIA®GPU和兼容的驱动程序启用。

可选

对于诸如静态,动态库或可执行文件的非MEX构建,此示例具有以下附加要求。

验证GPU环境

要验证运行此示例的编译器和库是否正确设置,请使用Coder.CheckGPuInstall.函数。

envcfg = coder.gpuenvconfig('主持人');envCfg。DeepLibTarget ='cudnn';envcfg.deepcodegen = 1;Envcf​​g.quiet = 1;Coder.CheckGpuInstall(Envcf​​g);

分段网络

Squeezesegv2是一个卷积神经网络(CNN),专为有组织的激光脉云的语义分割而设计。它是一个深度编码器解码器分割网络,在LIDAR数据集上培训并导入MATLAB®以推动。在SqueezEseGv2中,编码器子网由卷积图层组成,它散布在最大池层。这种布置连续地降低输入图像的分辨率。解码器子网由一系列转换卷积层组成,其连续增加输入图像的分辨率。此外,SqueezeSegv2网络通过包括上下文聚合模块(CAM)来缓解缺失数据的影响。凸轮是卷积子网,其值为值[7,7],其聚合来自更大的接收字段的上下文信息,这提高了网络的稳健性到缺少数据。该示例中的SqueezESEGV2网络培训到属于三个类(背景,汽车和卡车)的分段点。

有关使用Mathworks Lidar DataSet在Matlab®中培训语义分段网络的更多信息,请参阅基于PointSeg深度学习网络的激光雷达点云语义分割(LIDAR工具箱)

下载佩带的SqueezESEGv2网络。

net = getsqueezesegv2net();
下载普里雷德雷斯ZeezeEgvv2(2 MB)......

DAG网络包含238层,包括卷积,Relu和批量归一化层,以及焦损输出层。要显示深度学习网络架构的交互式可视化,请使用分析(深度学习工具箱)函数。

analyzeNetwork(净);

squeezesegv2_predict入口点函数

squeezesegv2_predict.m.本例附带的入口点函数以点云为输入,利用存储在的深度学习网络对点云进行预测squeezesegv2net.mat.文件。该函数加载网络对象squeezesegv2net.mat.文件到持久变量中mynet并在后续预测调用中重用持久变量。

类型(“squeezesegv2_predict.m”);
函数OUT = SCREEZESEGV2_PREDICT(in)%#codegen%持久对象mynet用于加载DAG网络对象。在%第一次调用此函数时,构建持久对象并%设置。当该函数称为后续时间时,相同的对象是%重复呼叫在输入上的预测,从而避免重建和%重新加载网络对象。%Copyright 2020 MathWorks,Inc。持久性MyNet;如果是isempty(mynet)mynet = coder.loaddeeplearningnetwork('scriezesegv2net.mat');输入OUT中的最终%通过=预测(MYNET,IN);

生成CUDA MEX代码

的CUDA MEX代码squeezesegv2_predict.m.入口点函数,为MEX目标创建GPU代码配置对象,并将目标语言设置为C ++。使用coder.deeplearningconfig功能创建一个CuDNN的深度学习配置对象,并将其分配给DeeplearningConfig图形处理器代码配置对象的属性。运行codegen命令,指定[64,1024,5]的输入大小。该值对应于挤压符号的输入层的大小。

cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg.deeplearningconfig = coder.deeplearningconfig('cudnn');codegen配置cfgsqueezesegv2_predictarg游戏{(64、1024、5、uint8)}-报告
代码生成成功:查看报告

要生成CUDA C ++代码,该代码利用了NVIDIA TENRT库,请在代码中指定coder.DeepLearningConfig(“tensorrt”)而不是coder.DeepLearningConfig(“cudnn”)

有关如何在Intel®处理器上为深度学习网络生成MEX代码的信息,请参阅MKL-DNN的深度学习网络代码生成

准备数据

在MATLAB®中加载一个有组织的测试点云。将点云转换为五通道图像进行预测。

ptcloud =缺陷('outerlidardrivingdata.pcd');I = pointCloudToImage (ptCloud);%检查转换数据
名称大小字节类属性i 64x1024x5 327680 uint8

图像有五个通道。的(x, y, z)点坐标包括前三个通道。第四个通道包含激光雷达强度测量。第五个通道包含范围信息,计算为 r x 2 + y 2 + z 2

可视化图像的强度通道。

INTENESHANNEL = I(:,:,4);图;imshow(IntenseyChannel);标题('强度图像');

在数据上运行生成的MEX

调用squeezesegv2_predict_mex.在五声道图像上。

predict_cometes = screezesegv2_predict_mex(i);

predict_cometes.变量是一个三维矩阵,其具有与每个类的像素 - 明智的预测分数对应的三个通道。通过使用最大预测分数来计算频道以获取像素天线标签

[〜,argmax] = max(predict_scores,[],3);

覆盖强度信道图像上的分段标签并显示分段区域。调整分段输出的大小并添加彩色键以获得更好的可视化。

类= [“背景”“车”“卡车”];提出= lidarColorMap ();SegmentedImage = labeloverlay (intensityChannel argmax,'colormap',cmap);segmentedimage = imresize(semmentedimage,'规模',[2 1],'方法''最近');图;imshow (SegmentedImage);N =元素个数(类);蜱虫= 1 / (N * 2): 1 / N: 1;colorbar ('ticklabels',cellstr(类),'蜱'蜱虫,'ticklength',0,“TickLabelInterpreter”'没有任何');Colormap(CMAP)标题('语义分割结果');

在点云序列上运行生成的MEX代码

读取输入点云序列。该序列包含10个组织pointcloud.使用Ouster OS1激光雷达传感器采集的帧。输入数据的高度为64,宽度为1024,因此每个pointCloud对象的大小为64 * 1024。

datafile =“highwaySceneData.mat”%加载工作区中的数据。负载(功能);

设置不同的颜色,可视化不同类别的点心标签。

给汽车涂上红色。Carclasscar = Zeros(64,1024,3,“uint8”);carClassCar(:,: 1) = 255*ones(64, 1024, 1)“uint8”);将蓝色应用于卡车。Truckclasscolor = Zeros(64,1024,3,“uint8”);TruckClassColor(:,:,3)= 255 *那些(64,1024,“uint8”);给背景添加灰色。backgroundclasscolor = 153 * =(64,1024,3,“uint8”);

设定pcplayer函数属性以显示序列和输出预测。通过帧读取输入序列帧并使用模型检测感兴趣的类。

xlimits = [0 120.0];ylimits = [-80.7 80.7];zlimits = [-8.4 27];Player = PCPlayer(xlimits,ylimits,zlimits);set(get(player.axes,“父”),'单位'“归一化”'offormosition',[0 0 1 1]);缩放(get(player.axes,“父”), 2);集(球员。轴,“XColor”'没有任何''ycolor''没有任何''zcolor''没有任何');i = 1:numel(inputdata)ptcloud = inputdata {i};%将点云转换为五通道图像进行预测。I = pointCloudToImage (ptCloud);%呼叫Squeezesegv2_predict_mex在5通道图像上。predict_cometes = screezesegv2_predict_mex(i);%将数值输出值转换为分类标签。[~, predictedOutput] = max (predict_scores [], 3);predictedOutput = categorical(predictedOutput, 1:3, classes);%从标签中提取索引。Carindices = predigeOutput =='车';Truckindices = PredigeOutput =='卡车';backgrounddindices = predictedOutput ==“背景”为每个类提取一个点云。carPointCloud = select(ptCloud, carIndices,“OutputSize”'满的');truckPointCloud = select(ptCloud, truckIndices,“OutputSize”'满的');BackgroundsPointCloud = Select(PTCloud,BackgroundIndices,“OutputSize”'满的');%填充颜色到不同的类。CarpointCloud.Color = Carclasscar;TruckPointCloud.Color = TruckclassColor;BackgroundPointCloud.Color = backgroundClassColor;%合并并添加所有处理过的带有类信息的点云。colorred = pcmerge(carPointCloud, truckPointCloud, 0.01);coloredCloud = pcmerge(coloredCloud, backgroundPointCloud, 0.01);%查看输出。查看(播放器,彩色);粗暴;结束

辅助功能

下面是本示例中使用的helper函数。

类型pointcloudtoimage.m.
函数映像= PointCloudToImage(PTCloud)%PointCloudToImage将组织的3-D点云转换为5通道%2-D图像。image = ptcloud.location;图像(:,:,4)= ptcloud.ILTENS;Rangedata = IcomputerangData(图像(:,:,1),图像(:,2),图像(:,3));图像(:,:,5)=范围;%投放给uint8。图像= UINT8(图像);结尾 % -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  ----------------------函数范围= icomputerangedata(xchannel,ychannel,zhannel)rangedata = sqrt(xchannel。* xchannel + ychannel。* ychannel+ Zchannel。* Zchannel);结束
类型LidarColorMap.m.
功能CMAP = LIDARCORORMAP()CMAP = [0.00 0.00 0.00%背景0.98 0.00 0.00%CAR 0.00 0.0 0.98%卡车];结束

参考

[1]吴碧晨,周旋宇,赵思成,岳翔宇,库尔特·库泽。“从激光雷达点云分割道路目标的改进模型结构和无监督域适应”。预印本,2018年9月22日提交。http://arxiv.org/abs/1809.08495。

另请参阅

功能

对象

相关话题