基于深度学习的激光雷达目标检测数据增强
这个例子展示了如何在使用激光雷达数据的三维物体检测工作流程中执行典型的数据增强技术。
激光雷达物体检测方法预测感兴趣物体周围的三维边界框。数据增强方法可以帮助您避免训练时的过拟合问题,并提高检测精度。这个例子涵盖了全局增强和局部增强技术:全局增强应用于场景的整个点云,而局部增强技术只应用于场景中属于单个对象的点。
加载数据
将此示例附加的ZIP文件解压缩到临时目录。ZIP文件包含sampleWPIPointClouds
文件夹,包含点云和sampleWPILabels.mat
保存基本真理标签的文件。
解压缩(“sampleWPIPointClouds.zip”, tempdir);dataLocation = fullfile (tempdir,“sampleWPIPointClouds”);
方法创建文件数据存储以加载PCD文件pcread
函数。
像= fileDatastore (dataLocation,“ReadFcn”@ (x) pcread (x));
创建一个框标签数据存储来加载3-D接地真理边界框。
负载(“sampleWPILabels.mat”,“trainLabels”) bds = boxLabelDatastore(trainLabels);
使用结合
函数将点云和三维边界框合并到一个单一的数据存储中。
cd =结合(摩门教,bds);
从数据存储和显示器中读取点云和相应的地面真值标签。
inputData =阅读(cds);ptCloud = inputData {1};gtLabels = inputData {1,2};图;ax = pcshow (ptCloud.Location);
在点云上绘制3-D边界框。
showShape (“长方体”,父母= ax gtLabels透明度= 0.1,...颜色=“绿色”线宽= 0.5);轴在;变焦(ax, 2);
重置(cds);
全局数据增加
当数据集中的点云几乎没有变化时,使用全局数据增强技术。全局技术将转换应用到整个点云并生成新的点云样本。它对所有对应的基础真值框应用相同的变换。以下四种常用的全局数据增强技术[1].
随机旋转
随机缩放
随机的翻译
随机抛
旋转点云
沿指定的角度范围内随机旋转点云和3-D边界框z设在。通过这样做,您可以模拟数据点,例如车辆转弯。典型的旋转范围是45 [-45]
度。
为再现性设置随机种子。
rng (1);
定义旋转的最小和最大偏航角。
minYawAngle = -45;maxYawAngle = 45;
定义存放点云的网格大小。
gridSize = [32 32 32];
定义点云内感兴趣区域的界限。
axisLimits = [-100 100];
为仿射转换创建一个输出视图。
官样文章= imref3d (gridSize axisLimits、axisLimits axisLimits);
从指定的偏航角范围内计算一个随机角度。
θ = minYawAngle + rand*(maxYawAngle-minYawAngle);
创建旋转点云和3-D边界框的转换。
tform = randomAffine3d (“旋转”@()协议([0,0,1],θ));tform = affinetform3d (tform.A);
将转换应用于点云。
ptCloudTransformed = pctransform (ptCloud tform);
对3d边界框应用相同的变换。
gtLabelsTranformed = bboxwarp (gtLabels tform官样文章);
显示旋转的点云和地面真理框。
图;ax₁= pcshow (ptCloudTransformed.Location);showShape (“长方体”gtLabelsTranformed,父母= ax₁,透明度= 0.1,...颜色=“绿色”线宽= 0.5);轴在;变焦(ax₁,2);
大规模点云
在指定的缩放范围内随机缩放点云和三维边界框。典型的缩放范围是(0.95 - 1.05)
.该示例使用的范围(0.5 - 0.7)
为了更好的可视化。
创建一个转换来缩放点云和3-D边界框。
tform = randomAffine3d(Scale=[0.5 0.7]);tform = affinetform3d (tform.A);
将转换应用于点云。
ptCloudTransformed = pctransform (ptCloud tform);
对3d边界框应用相同的变换。
gtLabelsTranformed = bboxwarp (gtLabels tform官样文章);
显示缩放点云和地面真相框。
图;ax2 = pcshow (ptCloudTransformed.Location);showShape (“长方体”,父母= ax2 gtLabelsTranformed透明度= 0.1,...颜色=“绿色”线宽= 0.5);轴在;变焦(ax2, 2);
将点云
随机翻译点云和三维边界框沿x -,y -,z -指定范围内的坐标轴。
创建转换来转换点云和3-D边界框。
tform = randomAffine3d(XTranslation=[0 0.2],...YTranslation = 0.2 [0],...ZTranslation = 0.1 [0]);tform = affinetform3d (tform.A);
将转换应用于点云。
ptCloudTransformed = pctransform (ptCloud tform);
对3d边界框应用相同的变换。
gtLabelsTranformed = bboxwarp (gtLabels tform官样文章);
显示翻译后的点云和地面真理框。
图;ax3 = pcshow (ptCloudTransformed.Location);showShape (“长方体”,父母= ax3 gtLabelsTranformed透明度= 0.1,...颜色=“绿色”线宽= 0.5);轴在;变焦(ax3 2);
沿着轴翻转
沿随机翻转点云和3d边界框y设在。不要沿着x -轴,作为边界框注释提供在相机视野中。
创建一个转换来翻转点云和3d边界框。
tform = randomAffine3d (YReflection = true);tform = affinetform3d (tform.A);
将转换应用于点云。
ptCloudTransformed = pctransform (ptCloud tform);
使用助手函数对3d边界框应用相同的转换flipBbox
,作为支持文件附加到本示例中。
gtLabels = flipBbox (gtLabels tform);
显示翻转的点云和地面真理框。
图;大举裁员= pcshow (ptCloudTransformed.Location);showShape (“长方体”gtLabels,父母=大举裁员,不透明度= 0.1,...颜色=“绿色”线宽= 0.5);轴在;变焦(大举裁员,2);
地面真相数据增强
地面真相数据增强是一种技术,在训练时,将随机选择的来自数据存储或另一个点云的地面真相框引入当前点云[1].使用这种方法,您可以增加每个点云的地面真相框的数量,并模拟不同环境中的对象。为了避免物理上不可能的结果,您对要添加的样本和当前点云的地面真值框执行碰撞测试。当数据集中存在类不平衡时,可以使用这种增强技术。
使用sampleLidarData
函数从数据存储中采样3-D边界框和对应的点。您可以使用minPoints
并将过滤后的样本存储在指定的位置sampleLocation
.
一会= {“汽车”};minPoints = 20;sampleLocation = fullfile (tempdir,“GTSamples”);[ldsSampled, bdsSampled] = sampleLidarData (cd,一会,MinPoints = MinPoints,...WriteLocation = sampleLocation Verbose = false);cdsSampled =结合(ldsSampled bdsSampled);
使用pcBboxOversample
函数从类“car”随机向点云增加固定数量的对象。使用定义输出点云中的对象总数totalObjects
.
totalObjects = 5;cdsAugmented =变换(cd, @ (x) pcBboxOversample (x, cdsSampled,一会,totalObjects));
显示点云和地面真相增强框。
augData =阅读(cdsAugmented);augptCld = augData {1};augLabels = augData {1,2};图;ax5 = pcshow (augptCld.Location);showShape (“长方体”,父母= ax5 augLabels透明度= 0.1,...颜色=“绿色”线宽= 0.5);轴在;变焦(ax5 2);
本地数据增加
局部数据增强仅对点云中的地面真值框内的点应用增强[1].点云的其余部分保持不变。
读取点云和相应的地面真值标签。
重置(cds);inputData =阅读(cds);ptCloud = inputData {1};gtLabels = inputData {1,2};gtLabelsTransformed = 0(大小(gtLabels));为i = 1:size(gtLabels,1) labelParams = gtLabels(i,:);centroidLoc = labelParams (1:3);模型= cuboidModel (labelParams);指数= findPointsInsideCuboid(模型、ptCloud);numPointsInside =大小(指标,1);
使用助手函数从原始点云中分离地面真值点removeIndicesFromPointCloud
,作为支持文件附加到本示例中。
updatedPtCloud = removeIndicesFromPtCloud (ptCloud、指标);cubPtCloud =选择(ptCloud、指标);将分离的点云移到原点。numPoints = cubPtCloud.Count;shiftRange = 1。* repmat (centroidLoc numPoints [1]);cubPtCloud = pctransform (cubPtCloud shiftRange);定义旋转的最小和最大偏航角。minYawAngle = -45;maxYawAngle = 45;从指定的偏航角范围内计算一个随机角度。θ = minYawAngle + rand*(maxYawAngle - minYawAngle);创建旋转、转换和缩放的转换%点云和3d边界框。tform = randomAffine3d (“旋转”,@() deal([0 0 1],theta),...规模= (0.95 - 1.05),...XTranslation = 0.2 [0],...YTranslation = 0.2 [0],...ZTranslation = 0.1 [0]);tform = affinetform3d (tform.A);对3-D边界框应用转换。。labelParams(1,1:3) = labelParams(1,1:3) - centroidLoc;labelParamsTransformed = bboxwarp (labelParams tform官样文章);计算转换后的框与%原始的地面真值框,将它们转换为旋转的矩形%格式,定义为[xcenter,ycenter,宽度,高度,偏航]。overlapRatio = bboxOverlapRatio (labelParamsTransformed(:,(1、2、4、5、9]),...gtLabels(:,(1、2、4、5、9)));[maxOverlapRatio, maxOverlapIdx] = max(overlapRatio);检查是否有任何转换框与地面真相重叠。%的盒子。如果(maxOverlapRatio >) && (maxOverlapIdx ~= i) shiftRange = -1.*shiftRange;cubPtCloud = pctransform (cubPtCloud shiftRange);updatedPtCloud = pccat ([updatedPtCloud cubPtCloud]);gtLabelsTransformed(我,1)= labelParams;其他的cubPtCloudTransformed = pctransform (cubPtCloud tform);shiftRange = 1。* shiftRange;cubPtCloudTransformed = pctransform (cubPtCloudTransformed shiftRange);updatedPtCloud = pccat ([updatedPtCloud cubPtCloudTransformed]);: gtLabelsTransformed(我)= labelParamsTransformed;结束gtLabelsTransformed(i,1:3) = gtLabelsTransformed(i,1:3) + centrroidloc;ptCloud = updatedPtCloud;结束
显示点云和增强的地面真相框。
图;ax6 = pcshow (updatedPtCloud.Location);showShape (“长方体”,父母= ax6 gtLabelsTransformed透明度= 0.1,...颜色=“绿色”线宽= 0.5);轴在;变焦(ax6 2);
重置(cds);
参考文献
哈纳,马丁,戴登新,亚历山大·利尼格,和卢克·范古尔。基于激光雷达的三维物体检测的量化数据增强。预印本,提交2020年4月3日。https://arxiv.org/abs/2004.01643.