主要内容

代码生成的激光雷达点云分割网络

这个例子展示了如何生成CUDA®墨西哥人代码为激光雷达深度学习网络的语义分割。这个示例使用pretrained SqueezeSegV2[1]网络能段组织激光雷达点云属于3类(背景,,卡车)。信息在网络的训练过程,明白了激光雷达点云的语义分割使用SqueezeSegV2深度学习网络(激光雷达工具箱)。生成的墨西哥人代码以点云作为输入并执行预测使用的点云DAGNetwork对象SqueezeSegV2网络。

第三方的先决条件

要求

这个示例中生成CUDA墨西哥人,有以下第三方的要求。

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

可选

等non-MEX构建静态、动态库或可执行文件,这个例子有以下额外的需求。

验证GPU环境

验证编译器和库设置正确,运行这个示例使用coder.checkGpuInstall(GPU编码器)函数。

envCfg = coder.gpuEnvConfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

分割网络

SqueezeSegV2是卷积神经网络(CNN)为组织的语义分割设计激光雷达点云。深encoder-decoder分割网络训练一套激光雷达数据和导入MATLAB®推理。在SqueezeSegV2,编码器的卷积层子网由穿插max-pooling层。这种安排先后输入图像的分辨率降低。转置卷积的解码器子网由一系列层,先后增加输入图像的分辨率。此外,SqueezeSegV2网络减轻了缺失数据的影响,包括上下文聚合模块(摄像头)。凸轮是一种卷积子网与filterSize价值[7],骨料上下文信息从一个更大的接受域,使网络的鲁棒性缺失的数据。SqueezeSegV2网络在这个例子中是训练段分属于3类(背景、汽车和卡车)。

有关培训的更多信息语义分割网络MATLAB®使用Mathworks激光雷达数据集,明白了激光雷达点云的语义分割使用PointSeg深度学习网络(激光雷达工具箱)

下载pretrained SqueezeSegV2网络。

网= getSqueezeSegV2Net ();
下载pretrained SqueezeSegV2 (2 MB)…

DAG网络包含238层,包括卷积,ReLU,和批归一化层和输出层焦损失。显示一个交互式可视化的深度学习网络体系结构,使用analyzeNetwork函数。

analyzeNetwork(净);

squeezesegv2_predict入口点函数

squeezesegv2_predict.m入口点函数,在这个例子中,将点云作为输入,并在其上执行预测通过使用保存在深度学习网络SqueezeSegV2Net.mat文件。加载的网络对象的函数SqueezeSegV2Net.mat文件到一个持续的变量mynet和重用持久变量预测在随后的电话。

类型(“squeezesegv2_predict.m”);
函数= squeezesegv2_predict () % # codegen %持久对象mynet用于加载DAG网络对象。在%第一次调用这个函数,构造持久对象和%设置。只有在函数被调用时,随后的时期,%重用相同的对象调用预测输入,从而避免网络重构和%重新加载对象。% 2020年版权MathWorks公司持久mynet;如果isempty (mynet) mynet = coder.loadDeepLearningNetwork (“SqueezeSegV2Net.mat”);结束%通过在输入=预测(mynet,);

生成CUDA墨西哥人代码

生成CUDA墨西哥人的代码squeezesegv2_predict.m入口点函数,创建一个GPU代码配置对象为一个墨西哥人的目标和目标语言设置为c++。使用coder.DeepLearningConfig(GPU编码器)函数创建一个CuDNN深度学习配置对象,并将其分配给DeepLearningConfigGPU代码配置对象的属性。运行codegen命令,指定一个输入(64、1024、5)的大小。这个值的大小对应于SqueezeSegV2网络的输入层。

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

生成c++代码利用了NVIDIA的CUDA TensorRT库,在代码中指定coder.DeepLearningConfig (“tensorrt”)而不是coder.DeepLearningConfig (“cudnn”)

信息如何生成深度学习网络的墨西哥人代码英特尔®处理器,明白了代码生成与MKL-DNN深度学习网络(MATLAB编码器)

准备数据

在MATLAB®加载一个有组织的测试点云。将点云转换成五频图像预测。

ptCloud = pcread (“ousterLidarDrivingData.pcd”);I = pointCloudToImage (ptCloud);%检查转换数据
名字大小字节我64 x1024x5 327680 uint8类属性

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

可视化图像的强度通道。

intensityChannel =我(::4);图;imshow (intensityChannel);标题(“强度图像”);

数据上运行生成的墨西哥人

调用squeezesegv2_predict_mex在五频图像。

predict_scores = squeezesegv2_predict_mex(我);

predict_scores变量是一个三维矩阵,有三个通道对应pixel-wise预测分数为每个类。计算通道通过使用最大预测分数pixel-wise标签

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

覆盖强度通道图像的分割标签和显示分割区域。调整分段输出,并添加一个colorbar更好的可视化。

类= [“背景”“汽车”“卡车”];提出= lidarColorMap ();SegmentedImage = labeloverlay (intensityChannel argmax,“ColorMap”,提出);SegmentedImage = imresize (SegmentedImage,“规模”(2 - 1),“方法”,“最近的”);图;imshow (SegmentedImage);N =元素个数(类);蜱虫= 1 / (N * 2): 1 / N: 1;colorbar (“TickLabels”cellstr(类),“滴答”蜱虫,“TickLength”0,“TickLabelInterpreter”,“没有”);colormap城市规划机构(cmap)标题(的语义分割结果);

点云上运行生成的墨西哥人代码序列

读取一个输入点云序列。序列包含10个组织pointCloud框架使用一个下台OS1激光雷达传感器收集。输入数据有一个身高64,宽1024,所以每个pointCloud对象的大小64 - - 1024。

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

设置不同的颜色来可视化逐点标签不同阶层的利益。

%将红色的汽车。carClassCar = 0 (64、1024、3“uint8”);carClassCar (:: 1) = 255 * 1 (64、1024、“uint8”);%的蓝色适用于卡车。truckClassColor = 0 (64、1024、3“uint8”);truckClassColor (:: 3) = 255 * 1 (64、1024、“uint8”);%应用颜色灰色背景。backgroundClassColor = 153 * (64、1024、3“uint8”);

设置pcplayer功能属性来显示和输出序列的预测。读取输入序列逐帧,使用模型检测感兴趣的类。

xlimits = 120.0 [0];ylimits = (-80.7 - 80.7);zlimits = [-8.4 27];球员= pcplayer (xlimits ylimits zlimits);集(get (player.Axes,“父”),“单位”,“归一化”,“outerposition”,(0 0 1 1));变焦(get (player.Axes,“父”),2);集(player.Axes,“XColor”,“没有”,“YColor”,“没有”,“ZColor”,“没有”);i = 1:元素个数(inputData) ptCloud = inputData {};%将点云转换成五频图像预测。I = pointCloudToImage (ptCloud);%调用squeezesegv2_predict_mex 5-channel形象。predict_scores = squeezesegv2_predict_mex(我);%的数字输出值转换为分类标签。[~,predictedOutput] = max (predict_scores [], 3);predictedOutput =分类(1:3,predictedOutput类);%从标签中提取指标。carIndices = predictedOutput = =“汽车”;truckIndices = predictedOutput = =“卡车”;backgroundIndices = predictedOutput = =“背景”;%为每个类提取点云。carPointCloud =选择(ptCloud carIndices,“OutputSize”,“全部”);truckPointCloud =选择(ptCloud truckIndices,“OutputSize”,“全部”);backgroundPointCloud =选择(ptCloud backgroundIndices,“OutputSize”,“全部”);%填充颜色不同的类。carPointCloud。颜色= carClassCar;truckPointCloud。颜色= truckClassColor;backgroundPointCloud。颜色= backgroundClassColor;%合并并添加所有的点云处理类信息。coloredCloud = pcmerge (carPointCloud, truckPointCloud, 0.01);coloredCloud = pcmerge (coloredCloud, backgroundPointCloud, 0.01);%查看输出。视图(球员,coloredCloud);drawnow;结束

辅助函数

在这个例子中使用的辅助函数。

类型pointCloudToImage.m
函数图像= pointCloudToImage (ptcloud) % pointCloudToImage将组织三维点云5-channel % 2 d图像。形象= ptcloud.Location;图像(::4)= ptcloud.Intensity;rangeData = iComputeRangeData(图像(:,:1)、图像(:,:2),图片(:,:,3));图像(::5)= rangeData;% uint8演员。形象= uint8(图片);结束% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -函数rangeData = iComputeRangeData xChannel, yChannel, zChannel rangeData =√(xChannel * xChannel + yChannel。* yChannel + zChannel。* zChannel);结束
类型lidarColorMap.m
提出= lidarColorMap()函数提出=[0.00 0.00 0.00%背景0.98 - 0.00 0.00%汽车卡车0.00 0.00 0.98%);结束

引用

[1],Bichen Xuanyu周,Sicheng赵,翔宇悦,库尔特·Keutzer。“SqueezeSegV2:改进的模型结构和无监督领域适应Road-Object从激光雷达点云分割。“预印本,提交2018年9月22日。http://arxiv.org/abs/1809.08495。