此示例显示如何为LIDAR语义分割生成深度学习网络的CUDA®MEX代码。此示例使用佩带的挤压ZeeSgvv2 [1]网络,该网络可以分段为属于三个类的组织激光雷云(背景,车, 和卡车).有关网络培训程序的信息,请参见基于SqueezeSegV2深度学习网络的激光雷达点云语义分割(LIDAR工具箱).生成的MEX代码将点云作为输入执行,并使用该点云执行预测DAGNetwork
对象用于SqueezeSegV2网络。
此示例生成CUDA MEX并具有以下第三方要求。
CUDA使NVIDIA®GPU和兼容的驱动程序启用。
对于诸如静态,动态库或可执行文件的非MEX构建,此示例具有以下附加要求。
nvidia工具包。
nvidia cudnn图书馆。
英伟达TensorRT图书馆。
编译器和库的环境变量。有关详细信息,请参见第三方硬件和设置先决条件产品s manbetx 845.
要验证运行此示例的编译器和库是否正确设置,请使用Coder.CheckGPuInstall.
函数。
envcfg = coder.gpuenvconfig('主持人');envCfg。DeepLibTarget ='cudnn';envcfg.deepcodegen = 1;Envcfg.quiet = 1;Coder.CheckGpuInstall(Envcfg);
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代码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)点坐标包括前三个通道。第四个通道包含激光雷达强度测量。第五个通道包含范围信息,计算为 .
可视化图像的强度通道。
INTENESHANNEL = I(:,:,4);图;imshow(IntenseyChannel);标题('强度图像');
调用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)标题('语义分割结果');
读取输入点云序列。该序列包含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。