主要内容

增强点云数据用于深度学习

这个例子演示了在基于深度学习的工作流中处理点云数据时,如何设置一个基本的随机数据增强管道。在使用深度学习时,数据增强几乎总是理想的,因为它有助于减少训练期间的过拟合,并可以为原始训练数据中可能无法很好地表示的数据转换类型增加鲁棒性。

导入点云数据

dataPath公司= downloadSydneyUrbanObjects (tempdir);dsTrain = loadSydneyUrbanObjectsData (dataPath公司);dataOut =预览(dsTrain)
dataOut =1×2单元阵列{1×1 pointCloud}{(四轮驱动)}

数据存储dsTrain产生一个pointCloud对象和每个观察的关联标量分类标签。

图pcshow (dataOut {1});标题(dataOut {2});

定义增加管道

数据存储的转换函数是定义扩充管道的方便工具。

dsAugmented =变换(dsTrain @augmentPointCloud);

augmentPointCloud函数如下所示,应用随机旋转,均匀尺度,x轴和y轴上的随机反射,每个点抖动随机到每个观察使用randomAffine3d函数来构造随机仿射变换和pctransform函数将这些转换应用于每个输入点云。

dataOut =预览(dsAugmented)
dataOut =1×2单元阵列{1×1 pointCloud}{(四轮驱动)}

直观地检查训练数据的任何增强所产生的数据总是一个好主意,以确保数据看起来像预期的那样。下面的点云与之前显示的相同,但是添加了随机仿射扭曲和每个点抖动。

图pcshow (dataOut {1});标题(dataOut {2});

由此产生的TransformedDatastoredsAugmented可以传递到深度学习的功能包括trainNetwork预测,分类用于训练和推理。

金宝app支持功能

函数datasetPath = downloadSydneyUrbanObjects (dataLoc)如果nargin == 0 dataLoc = pwd();结束dataLoc =字符串(dataLoc);url =“http://www.acfr.usyd.edu.au/papers/data/”;name =“sydney-urban-objects-dataset.tar.gz”;如果~ (fullfile (dataLoc,存在“sydney-urban-objects-dataset”),“dir”) disp (“下载悉尼城市对象数据集…”);解压(fullfile (url,姓名),dataLoc);结束datasetPath = dataLoc.append (“sydney-urban-objects-dataset”);结束函数ds = loadSydneyUrbanObjectsData (datapath公司、折叠)% loadSydneyUrbanObjectsData数据存储与点云和%悉尼城市对象数据集的关联分类标签。% ds = loadSydneyUrbanObjectsData(datapath)构造一个数据存储%表示悉尼城市的点云和相关类别%对象数据集。输入,数据路径,是一个字符串或字符数组%表示悉尼城市对象的根目录路径%的数据集。% ds = loadSydneyUrbanObjectsData(___,折叠)可选允许控件中包含的所需折叠的%规格%输出ds。例如,[1 2 4]指定您想要第一个,%数据集的第二和第四次折叠。默认值:[1 2 3 4]。如果Nargin < 2 fold = 1:4;结束datapath公司=字符串(datapath公司);路径= fullfile (datapath公司,“对象”, filesep);%现在,在数据存储中包含所有的折叠foldNames {1} = importdata (fullfile (datapath公司,“折叠”“fold0.txt”));foldNames {2} = importdata (fullfile (datapath公司,“折叠”“fold1.txt”));foldNames {3} = importdata (fullfile (datapath公司,“折叠”“fold2.txt”));foldNames {4} = importdata (fullfile (datapath公司,“折叠”“fold3.txt”));名称= foldNames(折叠);名称= vertcat(名字{:});fullFilenames = append(路径、名称);ds = fileDatastore (fullFilenames,“ReadFcn”@extractTrainingData,“FileExtensions”“。斌”);结束函数dataOut = extractTrainingData(fname) [pointData,intensity] = readbin(fname);[~、名称]= fileparts(帧);name =字符串(名称);名称= extractBefore(名称、“。”);labelNames = [“四轮驱动”“台”“自行车”“自行车”...“建筑”“公共汽车”“汽车”“自行车”“挖土机”“行人”“支柱”...“极”“职位”“摩托车”“ticket_machine”“traffic_lights”“traffic_sign”...“预告片”“垃圾”“树”“卡车”“树干”“伞”“哑巴”“范”“植物”];标签=分类(名称、labelNames);dataOut = {pointCloud (pointData“强度”、强度),标签};结束函数(pointData、强度)= readbin(帧)% readbin悉尼城市对象二进制数据的读取点和强度数据%的文件。% names = ['t','intensity','id',…% ' x ', ' y ', ' z ',……%“方位”、“范围”、“pid”)% format = ['int64', 'uint8', 'uint8',…% 'float32', 'float32',…% 'float32', 'float32', 'int32']fid = fopen(帧,“r”);c = onCleanup(@() fclose(fid));fseek(支撑材10 1);从开始位置移动到第一个X点位置10个字节X =从文件中读(fid,正无穷,“单一”, 30);fseek (fid, 14日1);Y =从文件中读(fid,正无穷,“单一”, 30);fseek(支撑材,18岁,1);Z =从文件中读(fid,正无穷,“单一”, 30);fseek(支撑材8 1);强度=从文件中读(fid,正无穷,“uint8”33);pointData = [X, Y, Z];结束函数dataOut = augmentPointCloud(data) ptCloud = data{1};标签={2}数据;%对Z轴进行随机旋转。tform = randomAffine3d (“旋转”,@() deal([0 0 1],360*兰特),“规模”[0.98, 1.02],“XReflection”,真的,“YReflection”,真正的);%绕z轴随机旋转ptCloud = pctransform (ptCloud tform);%对点云中的每个点应用抖动amountOfJitter = 0.01;numPoints =大小(ptCloud.Location, 1);D = 0(大小(ptCloud.Location),“喜欢”, ptCloud.Location);D (: 1) = diff (ptCloud.XLimits) *兰德(numPoints, 1);D (:, 2) = diff (ptCloud.YLimits) *兰德(numPoints, 1);D (: 3) = diff (ptCloud.ZLimits) *兰德(numPoints, 1);D = amountOfJitter。* D;ptCloud = pctransform (ptCloud D);dataOut = {ptCloud、标签};结束