激光雷达目标检测使用Complex-YOLO v4网络
这个例子展示了如何训练Complex-YOLO v4网络对点云进行目标检测。
Complex-YOLO [1)对激光雷达目标检测方法是有效的,因为这直接作用于鸟瞰图RGB转换从云的地图。在这个例子中,使用Complex-YOLO方法,你火车YOLO v4(意思2网络预测二维框位置和取向的鸟瞰图。然后项目二维位置以及方向预测到生成的3 d点云边界框周围感兴趣的对象。
激光雷达数据集下载
这个示例使用PandaSet数据集的一个子集(3],其中包含2560预处理组织点云。每个点云覆盖360度视图和被指定为64 - 1856矩阵。点云存储在PCD格式和数据存储在相应的地面真理PandaSetLidarGroundTruth.mat
文件。三个类的文件包含3 d边界框信息,汽车,卡车,和行人。数据集的大小是5.2 GB。
从给定的URL下载PandaSet数据集使用helperDownloadPandasetData
helper函数,定义在这个例子。
outputFolder = fullfile (tempdir,“Pandaset”);lidarURL = [“https://ssd.mathworks.com/万博1manbetxsupportfiles/lidar/data/”…“Pandaset_LidarData.tar.gz”];helperDownloadPandasetData (outputFolder lidarURL);
根据您的网络连接,下载过程可能需要一些时间。MATLAB®代码中止执行,直到下载过程完成。或者,您可以下载数据集到您的本地磁盘使用您的web浏览器并提取文件。如果你这样做,改变outputFolder
变量在代码下载文件的位置。下载文件包含激光雷达
,长方体
,semanticLabels
文件夹,其中包含点云,分别长方体标签信息和语义标签信息。
下载Pretrained模型
这个例子实现了两个变量的复杂YOLO v4意思对象探测器:
complex-yolov4-pandaset
——标准复杂YOLO v4意思网络训练鸟瞰图生成PandaSet点云的数据集tiny-complex-yolov4-pandaset
——轻量级复杂YOLO v4意思网络训练鸟瞰图PandaSet的图像生成的点云数据集
pretrained网络训练三个对象类:汽车、卡车和行人。
modelName =“tiny-complex-yolov4-pandaset”;mdl = downloadPretrainedComplexYOLOv4 (modelName);网= mdl.net;
加载数据
创建一个数据存储的文件加载纤毛运动使用的文件从指定的路径pcread
(计算机视觉工具箱)函数。
路径= fullfile (outputFolder,激光雷达的);lidarData = fileDatastore(路径,“ReadFcn”@ (x) pcread (x));
加载3 d边界框标签的汽车,卡车,和行人对象。
gtPath = fullfile (outputFolder,“长方体”,“PandaSetLidarGroundTruth.mat”);data =负载(gtPath“lidarGtLabels”);标签= timetable2table (data.lidarGtLabels);boxLabels =标签(:,2:结束);
显示全视图点云。
读图ptCld = (lidarData);ax = pcshow (ptCld.Location);集(ax,“XLim”50 [-50],“YLim”,40 [-40]);变焦(ax, 2.5);轴从;
从点云数据创建鸟瞰图图像
全视图的PandaSet数据由点云。对于这个示例,作物全视图点云,将它们转换为一个鸟瞰图图像使用标准的参数。这些参数确定的大小输入传递到网络。选择一个较小范围的点云沿x、y和z轴帮助你检测对象接近原点。
xMin = -25.0;xMax = 25.0;yMin = 0.0;yMax = 50.0;zMin = -7.0;zMax = 15.0;
定义的维度鸟瞰图的形象。你可以设置任何维度鸟瞰图但形象preprocessData
helper函数调整它,网络输入的大小。对于这个示例,网络输入大小是608 - 608。
bevHeight = 608;bevWidth = 608;
发现网格分辨率。
gridW = (yMax - yMin) / bevWidth;gridH = (xMax - xMin) / bevHeight;
定义网格参数。
yMin gridParams = {{xMin, xMax, yMax, zMin, zMax}, {bevWidth, bevHeight}, {gridW, gridH}};
将训练数据转换为鸟瞰图图像通过使用transformPCtoBEV
辅助功能,附加到这个例子作为支持文件。万博1manbetx你可以设置writefile
来假
如果你的训练数据已经存在outputFolder
。
writefile = true;如果writefile transformPCtoBEV (lidarData boxLabels、gridParams outputFolder);结束
创建数据存储对象进行训练
创建一个数据存储加载鸟瞰图图像。
dataPath公司= fullfile (outputFolder,“BEVImages”);imd = imageDatastore (dataPath公司);
创建一个数据存储加载地面真理盒子。
labelPath = fullfile (outputFolder,“长方体”,“BEVGroundTruthLabels.mat”);负载(labelPath“processedLabels”);建筑物= boxLabelDatastore (processedLabels);
删除的数据没有从训练数据标签。
(imd,建筑物)= removeEmptyData (imd,建筑物);
将数据集分为训练集训练网络和测试集来评估网络。使用60%的数据训练集,其余的用于测试. .
rng (0);shuffledIndices = randperm(大小(imds.Files, 1));地板idx =(0.6 *长度(shuffledIndices));
把图像数据存储分为训练集和测试集。
imdsTrain =子集(imd, shuffledIndices (1: idx));imdsTest =子集(imd, shuffledIndices (idx + 1:结束);
把盒子标签数据存储分成训练集和测试集。
bldsTrain =子集(建筑物,shuffledIndices (1: idx));bldsTest =子集(建筑物,shuffledIndices (idx + 1:结束);
结合图片和盒子标签数据存储。
trainData =结合(imdsTrain bldsTrain);testData =结合(imdsTest bldsTest);
使用validateInputDataComplexYOLOv4
辅助功能,附加到这个例子作为支持文件,检测:万博1manbetx
样品与无效的图像格式或包含nan
边界框包含0,nan,正无穷,还是空的
缺失或noncategorical标签。
边界框的值必须是有限的和积极的,不能nan。他们也必须在图像边界内积极的高度和宽度。
validateInputDataComplexYOLOv4 (trainData);validateInputDataComplexYOLOv4 (testData);
训练数据进行预处理
预处理的训练数据为培训做准备。的preprocessData
helper函数,列出的例子,以下操作适用于输入数据。
调整网络输入的图像的大小。
规模的图像像素范围(0 - 1)。
集
isRotRect
来真正的
返回矩形旋转。
networkInputSize = (608 608 3);isRotRect = true;preprocessedTrainingData =变换(trainData @(数据)preprocessData(数据、networkInputSize isRotRect));
阅读训练数据预处理。
data =阅读(preprocessedTrainingData);
显示一个图像的边界框。
我={1 1}数据;bbox ={1,2}数据;标签={1,3}数据;helperDisplayBoxes (bbox,标签);
重置数据存储。
重置(preprocessedTrainingData);
修改Pretrained Complex-YOLO V4网络
Complex-YOLO V4网络使用锚箱从训练数据估计有更好的初始估计相应的数据集的类型,帮助网络学习预测准确的箱子。
首先,因为训练图像大小不同,使用的变换
函数来进行预处理的训练数据,调整图像大小相同。
指定锚的数量:
complex-yolov4-pandaset模型
——指定9锚tiny-complex-yolov4-pandaset模型
——指定6锚
再现性,设置随机种子。估计锚箱使用estimateAnchorBoxes
函数。你可以设置isRotRect
假,因为所需的旋转角度不是估计锚的边界框。关于锚箱的更多信息,请参阅“指定锚箱”一节开始使用YOLO v4意思(计算机视觉工具箱)。
rng (0) isRotRect = false;trainingDataForEstimation =变换(trainData @(数据)preprocessData(数据、networkInputSize isRotRect));numAnchors = 6;[anchorBoxes, meanIoU] = estimateAnchorBoxes (trainingDataForEstimation numAnchors)
anchorBoxes =6×222 63年51 10 11日23 58 26 25 54 16 23
meanIoU = 0.7951
配置pretrained模型训练使用configureComplexYOLOV4
函数。这个函数配置的探测头YOLO v4意思模型预测角回归以及边界盒、客体性得分,得分和分类。
这个函数返回一个修改后的层图,网络输出的名字,重新排序锚盒子,和面具选择锚锚箱盒用于检测到正面。锚箱的大小分配给一个检测头的大小对应于特征映射的输出检测。函数重新排列了锚箱这样的大锚盒子被分配到低分辨率的特征图和小锚箱与高分辨率的特征图谱。
%培训指定要使用的类名。一会= {“汽车”“卡车”“Pedestrain”};[净,networkOutputs anchorBoxes] = configureComplexYOLOv4(网,一会,anchorBoxes modelName);
指定培训选项
指定这些训练选项。
时代的数量设置为90。
将小批量大小设置为8。稳定的培训与高等教育率是可能的,当使用更高的小批量大小。设置这个值取决于可用的内存。
设置学习速率为0.001。
预热期设置为1000次迭代。它有助于稳定梯度在更高的学习速率。
将L2正则化因子设置为0.001。
指定惩罚阈值为0.5。检测重叠小于0.5与地面真理处罚。
初始化的速度梯度为[],也就是个用来存储的速度梯度。
maxEpochs = 90;miniBatchSize = 8;learningRate = 0.001;warmupPeriod = 1000;l2Regularization = 0.001;penaltyThreshold = 0.5;速度= [];
火车模型
火车在GPU上,如果一个是可用的。使用GPU需要并行计算工具箱™和CUDA NVIDIA GPU®®启用。支持设备的信息,请参阅万博1manbetxGPU计算的需求(并行计算工具箱)。
使用minibatchqueue
函数把训练数据预处理分割成批量的支持功能万博1manbetxcreateBatchData
定义的例子,返回这批图片和边界框结合各自的类id。更快提取培训、批量数据的设置dispatchInBackground
来真正的
使用并行池。
minibatchqueue
自动检测GPU是否可用。如果你没有一个GPU或不想使用一个训练,设置OutputEnvironment
参数cpu
。
如果canUseParallelPool dispatchInBackground = true;其他的dispatchInBackground = false;结束mbqTrain = minibatchqueue (preprocessedTrainingData 2…“MiniBatchSize”miniBatchSize,…“MiniBatchFcn”@(图片,盒子,标签)createBatchData(图片,盒子,标签,类名),…“MiniBatchFormat”,(“SSCB”,”“),…“DispatchInBackground”dispatchInBackground,…“OutputCast”,(”“,“替身”]);
使用支持函数创建培训进度图万博1manbetxconfigureTrainingProgressPlotter。
最后,指定自定义训练循环。每一次迭代:
读取的数据
minibatchqueue
。如果它没有更多的数据,重置minibatchqueue
和洗牌。评估模型梯度使用
dlfeval
和modelGradients
万博1manbetx支持函数,列出在这个例子。应用权重衰减系数的梯度正则化更健壮的培训。
确定基于迭代使用的学习速率
piecewiseLearningRateWithWarmup
万博1manbetx支持功能。更新
净
参数使用sgdmupdate
函数。更新
状态
网络与移动平均线的参数。显示学习速率,全损,个人损失(箱损失、对象损失和类损失)为每个迭代。使用这些值来解释各自的损失如何改变在每个迭代中。例如,突然激增箱损失几个迭代意味着预测包含正值或nan。
更新培训进展阴谋。
你可以终止培训如果失去浸透几个时代。
doTraining = false;如果doTraining迭代= 0;%为学习速率创建次要情节和mini-batch损失。无花果=图;[lossPlotter, learningRatePlotter] = configureTrainingProgressPlotter(图);%的定制培训循环。为时代= 1:maxEpochs重置(mbqTrain);洗牌(mbqTrain);而(hasdata (mbqTrain)) =迭代+ 1;[XTrain, YTrain] =下一个(mbqTrain);%计算模型使用dlfeval和梯度和损失% modelGradients函数。(渐变、州lossInfo) = dlfeval (@modelGradients,净、XTrain YTrain, anchorBoxes, penaltyThreshold, networkOutputs);%应用L2正规化。梯度= dlupdate (@ (g, w) g + l2Regularization * w,渐变net.Learnables);%确定当前的学习速率值。currentLR = piecewiseLearningRateWithWarmup(迭代,时代、learningRate warmupPeriod, maxEpochs);%更新使用个网络可学的参数优化。(净、速度)= sgdmupdate(净、渐变速度,currentLR);%更新dlnetwork的状态参数。网。=状态;%显示进展。如果国防部(迭代,10)= = 1 displayLossInfo(时代、迭代、currentLR lossInfo);结束%绘制新的点更新培训。updatePlots (lossPlotter learningRatePlotter、迭代、currentLR lossInfo.totalLoss);结束结束其他的网= mdl.net;anchorBoxes = mdl.anchorBoxes;结束
找到最优训练选项hyperparameter席卷范围的值,使用深层网络设计师应用程序。
评估模型
计算机视觉工具箱™提供了对象探测器评价函数来测量常见的指标,如平均精度(evaluateDetectionAOS
)矩形旋转。下面的例子使用了平均方向相似性度量(代谢)。氖是测量探测器性能的指标检测旋转矩形。这个度量提供了一个数字,它整合了探测器的能力做出正确的分类(精度)和探测器的能力找到所有相关对象(回忆)。
%创建一个表来保存边界框,返回的分数,和标签%的探测器。结果=表(“大小”[0 3],…“VariableTypes”,{“细胞”,“细胞”,“细胞”},…“VariableNames”,{“盒子”,“分数”,“标签”});%在图像上运行探测器测试集和收集结果。重置(testData)而hasdata (testData)%读取数据存储和图像。data =阅读(testData);形象={1 1}数据;%运行探测器。executionEnvironment =“汽车”;(bboxes、分数、标签)= detectComplexYOLOv4(净、图像、anchorBoxes一会,executionEnvironment);%收集结果。台=表({bboxes},{},{}标签,“VariableNames”,{“盒子”,“分数”,“标签”});结果=[结果;(资源);结束%评估对象探测器使用的平均精度指标。testData指标= evaluateDetectionAOS(结果)
指标=3×5表《超能美联社OrientationSimilarity精密召回____ ____ _____________________售予售予车0.83079 - 0.90904{7339×1双}{7339×1双}{7339×1双}卡车0.46622 - 0.48079{1134×1双}{1134×1双}{1134×1双}Pedestrain 0.6626 - 0.72495{3439×1双}{3439×1双}{3439×1双}
使用训练Complex-YOLO V4检测对象
使用网络对象检测。
%读取数据存储。重置(testData)数据=阅读(testData);%的形象。我={1 1}数据;%运行探测器。executionEnvironment =“汽车”;(bboxes、分数、标签)= detectComplexYOLOv4 (anchorBoxes,净,我一会,executionEnvironment);%显示输出。图helperDisplayBoxes(我bboxes标签);
检测框转移到一个点云使用transferbboxToPointCloud
辅助功能,附加到这个例子作为支持文件。万博1manbetx
lidarTestData =子集(lidarData shuffledIndices (idx + 1:结束);ptCld =阅读(lidarTestData);[ptCldOut, bboxCuboid] = transferbboxToPointCloud (bboxes、gridParams ptCld);helperDisplayBoxes (ptCldOut、bboxCuboid、标签);
万博1manbetx支持功能
模型梯度
这个函数modelGradients
作为输入Complex-YOLO v4网络,mini-batch的输入数据XTrain
与相应的地面实况盒子YTrain
,指定惩罚阈值。它返回的梯度对可学的参数净
,相应的mini-batch损失信息,当前批的状态。
的modelGradients
函数计算的总损失和梯度通过执行这些操作。
从输入批生成预测图像使用
complexYOLOv4Forward
方法。对后处理收集CPU上的预测。
转换的预测Complex-YOLO v4网格单元坐标边界框坐标与地面实况数据允许简单的比较。
生成目标损失计算通过使用预测和地面实况数据转换。生成目标边界框的位置(x, y,宽度、高度、偏航),对象的信心,和类的概率。看到支持函数万博1manbetx
generateComplexYOLOv4Targets
。计算均方误差预测的边界框坐标与目标框使用支持功能万博1manbetx
bboxOffsetLoss
定义的例子。计算预测对象的二进制叉信心得分目标对象有信心使用支持功能万博1manbetx
objectnessLoss
定义的例子。计算二叉叉的预测与目标使用支持函数类的对象万博1manbetx
classConfidenceLoss
定义的例子。计算出总损失损失的总和。
计算梯度可学的对总损失。
函数(梯度、状态信息)= modelGradients(净,XTrain YTrain,锚、penaltyThreshold networkOutputs) inputImageSize =大小(XTrain 1:2);%收集地面真理CPU的后处理。YTrain =收集(extractdata (YTrain));%从网络中提取的预测。[YPredCell、州]= complexYOLOv4Forward(网络,XTrain networkOutputs,锚);%收集CPU的激活后加工和提取dlarray数据。gatheredPredictions = cellfun(@收集、YPredCell (: 1:8)“UniformOutput”、假);gatheredPredictions = cellfun (@ extractdata gatheredPredictions,“UniformOutput”、假);%将预测从网格单元坐标框坐标。tiledAnchors = generateTiledAnchorsComplexYolov4 (gatheredPredictions(:, 2:5),锚);gatheredPredictions (:, 2:5) = applyAnchorBoxOffsetsComplexYolov4 (tiledAnchors, gatheredPredictions (:, 2:5) inputImageSize);%从地面实况数据生成目标预测。[boxTarget, objectnessTarget classTarget、objectMaskTarget boxErrorScale] = generateComplexYOLOv4Targets (gatheredPredictions、YTrain inputImageSize,锚,penaltyThreshold);%计算损失。boxLoss = bboxOffsetLoss (YPredCell (: [2 3 9 10 6 7]), boxTarget, objectMaskTarget, boxErrorScale);objLoss = objectnessLoss (YPredCell (: 1), objectnessTarget, objectMaskTarget);clsLoss = classConfidenceLoss (YPredCell (:, 8), classTarget, objectMaskTarget);totalLoss = boxLoss + objLoss + clsLoss;信息。boxLoss = boxLoss;信息。objLoss = objLoss;信息。clsLoss = clsLoss; info.totalLoss = totalLoss;%的梯度计算可学的有关损失。梯度= dlgradient (totalLoss net.Learnables);结束
损失函数
计算均方误差边界框的位置。
函数boxLoss = bboxOffsetLoss (boxPredCell boxDeltaTarget、boxMaskTarget boxErrorScaleTarget) lossX =总和(cellfun (@ (a, b, c, d) mse (a。* c。* d b。* c。* d), boxPredCell (: 1), boxDeltaTarget (: 1), boxMaskTarget (: 1), boxErrorScaleTarget));有损=总和(cellfun (@ (a, b, c, d) mse (a。* c。* d b。* c。* d), boxPredCell (:, 2), boxDeltaTarget (:, 2), boxMaskTarget (: 1), boxErrorScaleTarget));lossW =总和(cellfun (@ (a, b, c, d) mse (a。* c。* d b。* c。* d), boxPredCell (:, 3), boxDeltaTarget (:, 3), boxMaskTarget (: 1), boxErrorScaleTarget));lossH =总和(cellfun (@ (a, b, c, d) mse (a。* c。* d b。* c。* d), boxPredCell (:, 4), boxDeltaTarget (:, 4), boxMaskTarget (: 1), boxErrorScaleTarget));lossYaw1 =总和(cellfun (@ (a, b, c, d) mse (a。* c。* d b。* c。* d), boxPredCell (:, 5), boxDeltaTarget (:, 5), boxMaskTarget (: 1), boxErrorScaleTarget));lossYaw2 =总和(cellfun (@ (a, b, c, d) mse (a。* c。* d b。* c。* d), boxPredCell (:, 6), boxDeltaTarget (:, 6), boxMaskTarget (: 1), boxErrorScaleTarget));boxLoss = lossX +损耗+ lossW + lossH + lossYaw1 + lossYaw2;结束
计算类的二进制叉丧失信心得分。
函数clsLoss = classConfidenceLoss (classPredCell classTarget boxMaskTarget) clsLoss =总和(cellfun (@ (a, b, c) crossentropy (c。*, * c, b。“TargetCategories”,“独立”)、classPredCell classTarget boxMaskTarget (:, 3)));结束
损失计算二叉叉的客体性得分。
函数objLoss = objectnessLoss (objectnessPredCell objectnessDeltaTarget boxMaskTarget) objLoss =总和(cellfun (@ (a, b, c) crossentropy (c。*, * c, b。“TargetCategories”,“独立”)、objectnessPredCell objectnessDeltaTarget boxMaskTarget (:, 2)));结束
数据进行预处理
函数data = preprocessData(数据、targetSize isRotRect)%改变图像的大小和规模在0和1之间的像素。同时规模%相应的边界框。为2 = 1:尺寸数据(数据,1)I = {ii, 1};imgSize =大小(I);%将一个单通道的输入图像转换成三个渠道。如果元素个数(imgSize) < 3 I = repmat(我,1,1,3);结束bboxes = {ii, 2}数据;我= im2single (imresize(我targetSize (1:2)));规模= targetSize (1:2)。/ imgSize (1:2);bboxes = bboxresize (bboxes、规模);如果~ isRotRect bboxes = bboxes (:, 1:4);结束数据(ii, 1:2) ={我bboxes};结束结束函数[XTrain, YTrain] = createBatchData(数据、groundTruthBoxes groundTruthClasses一会)%返回沿着XTrain批尺寸和图片相结合%规范化边框连接YTrain classIDs。%连接图像沿批维度。XTrain =猫(4、数据{:1});%获得类id和类名称。一会= repmat({分类(类名)},大小(groundTruthClasses));[~,classIndices] = cellfun (@ (a, b) ismember (a、b), groundTruthClasses,一会,“UniformOutput”、假);%附加标签索引和训练图像尺寸按比例缩小的边界框%和创建一个单一单元阵列的响应。combinedResponses = cellfun (@ (bbox, classid) [bbox, classid], groundTruthBoxes, classIndices,“UniformOutput”、假);len = max (cellfun (@ (x)大小(x, 1), combinedResponses));paddedBBoxes = cellfun (@ (v) padarray (v, [len-size (v, 1), 0], 0,“职位”)、combinedResponses“UniformOutput”、假);YTrain =猫(4,paddedBBoxes {: 1});结束
学习速率调度功能
函数currentLR = piecewiseLearningRateWithWarmup(迭代,时代、learningRate warmupPeriod, numEpochs)% piecewiseLearningRateWithWarmup函数计算电流%学习速率基于迭代数。持续的warmUpEpoch;如果迭代< = warmupPeriod%的学习速率增加预热阶段的迭代次数。currentLR = learningRate *((迭代/ warmupPeriod) ^ 4);warmUpEpoch =时代;elseif迭代> = < warmUpEpoch warmupPeriod & &时代+地板(0.6 * (numEpochs-warmUpEpoch))%预热阶段后,保持学习速率常数如果剩余数量的时代还不到60%。currentLR = learningRate;elseif时代> = warmUpEpoch +地板(0.6 * (numEpochs-warmUpEpoch)) & & <时代warmUpEpoch +地板(0.9 * (numEpochs-warmUpEpoch))%如果剩余数量的时代但不超过60%% 90%以上,学习速率乘以0.1。currentLR = learningRate * 0.1;其他的%如果仍然有超过90%的时代,用学习% 0.01。currentLR = learningRate * 0.01;结束结束
效用函数
函数[lossPlotter, learningRatePlotter] = configureTrainingProgressPlotter (f)%创建一个次要情节显示丧失和学习速率。图(f);clf次要情节(2,1,1);ylabel (学习速率的);包含(“迭代”);learningRatePlotter = animatedline;次要情节(2,1,2);ylabel (“全损”);包含(“迭代”);lossPlotter = animatedline;结束函数displayLossInfo(时代、迭代,currentLR lossInfo)%显示损失信息为每个迭代。disp (”时代:“+时代+”|迭代:“+迭代+“|学习速率:“+ currentLR +…”|全损:“+双(收集(extractdata (lossInfo.totalLoss))) +…“|盒子损失:“+双(收集(extractdata (lossInfo.boxLoss))) +…“|对象损失:“+双(收集(extractdata (lossInfo.objLoss))) +…“|类损失:“+双(收集(extractdata (lossInfo.clsLoss))));结束函数updatePlots (lossPlotter learningRatePlotter、迭代、currentLR totalLoss)%更新丧失和学习速率的情节。addpoints (lossPlotter、迭代、双(extractdata(收集(totalLoss))));addpoints (learningRatePlotter迭代,currentLR);drawnow结束函数helperDisplayBoxes (obj bboxes、标签)%显示图像和点云的盒子。图如果~ isa (obj,“pointCloud”=)imshow (obj)形状“矩形”;其他的pcshow (obj.Location);形状=“长方体”;结束showShape(形状,bboxes(标签= =“汽车”:)…“颜色”,“绿色”,“线宽”,0.5);在;showShape(形状,bboxes(标签= =“卡车”:)…“颜色”,“红色”,“线宽”,0.5);showShape(形状,bboxes(标签= =“Pedestrain”:)…“颜色”,“黄色”,“线宽”,0.5);持有从;结束函数helperDownloadPandasetData (outputFolder lidarURL)%从给定的URL下载数据集的输出文件夹。lidarDataTarFile = fullfile (outputFolder,“Pandaset_LidarData.tar.gz”);如果~存在(lidarDataTarFile“文件”mkdir (outputFolder);disp (“下载PandaSet激光雷达驾驶数据(5.2 GB)……”);websave (lidarDataTarFile lidarURL);解压(lidarDataTarFile outputFolder);结束%提取文件。如果(~存在(fullfile (outputFolder激光雷达的),“dir”))…& & (~ (fullfile (outputFolder,存在“长方体”),“dir”)解压(lidarDataTarFile outputFolder);结束结束
引用
[1]西门,马丁,Stefan Milz卡尔道歉,Horst-Michael恶心。“Complex-YOLO:实时3 d对象检测点云”。ArXiv: 1803.06199 (Cs),2018年9月24日。https://arxiv.org/abs/1803.06199。
[2]Bochkovskiy阿列克谢,Chien-Yao王,鸿源马克廖。“YOLOv4:最优目标检测的速度和准确性”。ArXiv: 2004.10934 (Cs,套),2020年4月22日。https://arxiv.org/abs/2004.10934。
[3]PandaSet是由Hesai和规模下吗cc -, - 4.0许可证。