主要内容

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

这个例子展示了如何为激光雷达语义分割的深度学习网络生成CUDA®MEX代码。这个例子使用了一个预先训练的SqueezeSegV2[1]网络,它可以分割有组织的激光雷达点云,这些点云属于三类(背景,卡车)。有关网络培训程序的信息,请参阅LIDAR点云语义分割使用SCREEZESEGV2深层学习网络.生成的MEX代码以点云为输入,并使用Dagnetwork.SqueezeSegvv2网络的对象。

第三方先决条件

要求

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

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

可选的

对于非mex构建,如静态、动态库或可执行文件,本例有以下附加要求。

验证GPU环境

要验证编译器和运行此示例的库是否正确设置,请使用coder.checkGpuInstall(GPU编码器)功能。

envcfg = coder.gpuenvconfig(“主机”);envcfg.deeplibtarget =.'cudnn';envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

分割网络

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

有关使用Mathworks激光雷达数据集在MATLAB®中训练语义分割网络的更多信息,请参见使用POINSEG深度学习网络的LIDAR点云语义分割

下载经过预先训练的SqueezeSegV2网络。

网= getSqueezeSegV2Net ();
下载普里雷德雷斯ZeezeEgvv2(2 MB)......

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

分析(网);

squeezesegv2_predict.入学点函数

squeezesegv2_predict.m.附加到此示例的入口点函数将点云作为输入,通过使用保存的深度学习网络对其执行预测SqueezeSegV2Net.mat文件。该函数加载网络对象SqueezeSegV2Net.mat文件到持久变量中yeNet.并在后续预测调用中重用持久变量。

类型('screezesegvv2_predict.m');
一个持久化对象mynet被用来加载DAG网络对象。在第一次调用该函数时,将构造持久对象并设置%。当该函数随后被调用时,相同的对象将被重用%以调用预测输入,从而避免重新构建和%重新加载网络对象。% Copyright 2020 The MathWorks, Inc. persistent mynet;如果是空的(mynet) mynet = code . loaddeeplearningnetwork ('SqueezeSegV2Net.mat');End % pass in input out = predict(mynet,in);

生成CUDA MEX代码

为此生成CUDA MEX代码squeezesegv2_predict.m.入口点函数,为MEX目标创建GPU代码配置对象,并将目标语言设置为C ++。使用编码器。DeeplearningConfig(GPU编码器)功能创建一个CUDNN.深度学习配置对象并将其分配给DeeplearningConfigGPU代码配置对象的属性。跑过Codegen.命令,指定输入大小为[64,1024,5]。这个值对应于SqueezeSegV2网络的输入层的大小。

cfg = coder.gpuconfig('mex');cfg.targetlang =.'c ++';cfg.deeplearningconfig = coder.deeplearningconfig('cudnn');Codegen.-Config.CFG.squeezesegv2_predict.-  args.{ONE(64,1024,5,'UINT8')}-报告
代码成功:查看报告

要生成CUDA C ++代码,该代码利用了NVIDIA TENRT库,请在代码中指定Coder.deeplearningconfig('tensorrt')代替Coder.DeeplearningConfig('CUDNN')

有关如何在英特尔®处理器上生成深度学习网络的MEX代码的信息,请参阅基于MKL-DNN的深度学习网络代码生成(MATLAB编码器)

准备数据

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

ptCloud = pcread (“ousterLidarDrivingData.pcd”);i = pointcloudtoimage(ptcloud);%检查转换数据谁是一世
名称大小字节类属性i 64x1024x5 327680 uint8

图像有五个通道。这(x,y,z)点坐标包括前三个通道。第四通道包含LIDAR强度测量。第五频道包含计算为的范围信息 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);

将分割后的标签叠加在强度通道图像上,显示分割后的区域。调整分段输出的大小,并添加颜色条,以获得更好的可视化效果。

类= [“背景”“汽车”“卡车”];cmap = lidarcolormap();segmentedimage = labeloverlay(InthenseShannel,Argmax,'colormap',提出);SegmentedImage = imresize (SegmentedImage,'规模',[2 1],'方法''最近');数字;imshow(semmentedimage);n = numel(类);蜱= 1 /(n * 2):1 / n:1;彩色杆('ticklabels',cellstr(类),'蜱',蜱虫,'ticklength',0,'ticklabelinterpreter''没有任何');colormap城市规划机构(cmap)标题('语义分割结果');

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

读取输入点云序列。该序列包含10个组织pointcloud.使用Ouster OS1 LIDAR传感器收集的框架。输入数据的高度为64和宽度为1024,因此每个PointCloud对象的尺寸为64到1024。

外部='highwayscenedata.mat'%加载工作区中的数据。加载(数据文件);

设置不同的颜色来可视化不同兴趣类别的点方向标签。

%将颜色涂抹于汽车。Carclasscar = Zeros(64,1024,3,'uint8');Carclasscar(:,:,1)= 255 *那些(64,1024,'uint8');%将颜色蓝色涂抹到卡车上。Truckclasscolor = Zeros(64,1024,3,'uint8');TruckClassColor(:,:,3)= 255 *那些(64,1024,'uint8');%将颜色灰色应用于背景。backgroundClassColor = 153*ones(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);set(player.axes,'xcolor''没有任何''ycolor''没有任何''zcolor''没有任何');为了i = 1: numel(inputData) ptCloud = inputData{i};%转换点云到五声道图像进行预测。i = pointcloudtoimage(ptcloud);%在5通道映像上调用squeezesegv2_predict_mex。predict_cometes = screezesegv2_predict_mex(i);%将数值输出值转换为分类标签。[〜,predigeOutput] = max(predict_scores,[],3);predigeOutput =分类(predigeOutput,1:3,类);%从标签中提取索引。Carindices = predigeOutput =='车';Truckindices = PredigeOutput =='卡车';backgressionIndices = predigeOutput =='背景'%提取每个类的点云。carpointcloud = select(ptcloud,carindices,'输出'“全部”);TruckPointCloud = Select(Ptcloud,Truckindices,'输出'“全部”);BackgroundsPointCloud = Select(PTCloud,BackgroundIndices,'输出'“全部”);%将颜色填充到不同的类别。CarpointCloud.Color = Carclasscar;TruckPointCloud.Color = TruckclassColor;BackgroundPointCloud.Color = backgroundClassColor;%合并并使用类信息添加所有已加工点云。COMENTCLOUD = PCMerge(CarpointCloud,TruckPointCloud,0.01);COMENTCLOUD = PCMerge(CornCloud,BackgroundPointCloud,0.01);%查看输出。查看(播放器,彩色);粗暴;结尾

辅助功能

在此示例中使用的辅助功能遵循。

类型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]吴,比辰,宣扬周,浙城赵,湘雅悦,和库尔特凯兹。“Screezesegv2:改进了LIDAR点云的道路对象分割的模型结构和无监督域适应。”预印刷品,2018年9月22日提交.thth://arxiv.org/abs/1809.08495。