主要内容

自动化地面真相标记跨多个信号

这个示例演示了如何通过使用地面真理贴标机应用程序和AutomationAlgorithm接口。本例中使用的自动化算法利用相机到激光雷达的校准参数,根据车辆在相应图像帧中的标签位置估计车辆在点云帧中的标签位置。

地面真相标签应用程序

良好的地面真实数据对于开发驾驶算法和评估其性能至关重要。然而,创建一组丰富多样的带注释的驾驶数据需要大量的时间和资源。Ground Truth Labeler应用程序使这个过程变得高效。您可以使用这个应用程序作为一个完全手工标注工具,以标记车道边界,车辆边界盒,和其他物体的视觉系统感兴趣的。然而,手动标签需要大量的时间和资源。这个应用程序还提供了一个框架来创建扩展和自动化标签过程的算法。您可以创建并使用算法来快速标记整个数据集,然后使用更有效、更短的手动验证步骤进行后续操作。您还可以编辑自动化步骤的结果,以考虑自动化算法可能错过的具有挑战性的场景。

本示例描述了创建一个算法,该算法可用于Ground Truth Labeler应用程序,自动检测图像中的车辆,并使用相机到激光雷达校准参数估计它们在相应点云中的位置。

使用ACF车辆检测器检测车辆

为了检测图像中的车辆,自动化算法使用预先训练的聚合通道特征(ACF)车辆检测器,vehicleDetectorACF.通过加载一个样本图像和ACF车辆检测器,检测图像中的车辆,并在图像中的车辆周围插入2d包围盒,预览算法是如何工作的。

%从垫文件中加载数据并提取图像。data =负载(fullfile (toolboxdir (激光雷达的),'lidardata''LCC''bboxgt.mat'));我= data.im;装载预先训练过的车辆检测器。探测器= vehicleDetectorACF ('前后视图');%检测车辆并显示边界框。[imBboxes,~] =检测(检测器,I);Iout = insertShape(我“矩形”,imbboxes,“线宽”,4);图imshow(iout)标题(检测到车辆的

图中包含一个轴对象。标题为Detected Vehicles的轴对象包含一个类型为image的对象。

如果您有可用的相机校准信息,可以通过从检测中过滤误报的误报来改善该检测器。的单目相机的视觉感知示例介绍如何创建佩带的车辆检测器并配置使用校准单眼摄像机配置来检测车辆边界框。

估计点云中车辆的三维包围盒

为了从图像帧中的相应检测到的车辆中估计点云帧中的车辆,算法使用Bboxcameratolidar.(激光雷达工具箱)函数。该函数利用激光相机标定参数在二维包围盒的基础上估计三维包围盒。为了估计边界框,该函数将摄像机的固有参数作为输入,cameraIntrinsics以及相机到激光器刚性转换,rigid3d.

预览算法如何通过加载与图像对应的点云,估计点云中的车辆的三维界限,并在点云中插入车辆周围的边界框。

%提取点云。ptCloud = data.pc;提取相机固有参数。intrinsic = data.cameraParams;%提取相机到激光雷达的刚性变换。tform = data.camToLidar;%估计点云中的边界框。pcbboxes = bboxcameratolidar(imbboxes,ptcloud,内在,tform);%显示点云中的绑定框。figure ax = pcshow(ptCloud.Location);showShape ('长方体'pcBboxes,“父”ax,“不透明度”, 0.1,“颜色”(0.06 1.00 1.00),“线宽”, 0.5)变焦(ax, 1.5)标题(“点云中的估计边界框”)举行

图中包含一个轴对象。在点云中,标题为“估计边界盒”的轴对象包含一个散点类型的对象。

准备多信号车辆检测器自动化课程

为了将多信号车辆检测器算法集成到Ground Truth Labeler应用程序的自动化工作流中,构造一个继承自抽象基类的类,vision.labeler.AutomationAlgorithm.此基类定义了应用程序用于配置和运行自定义算法的方法的属性和签名。地面真相贴标程序应用程序提供了获取初始自动化类模板的便捷方式。有关详细信息,请参阅创建标签的自动化算法.的多功能阶层兴奋剂类基于此模板,并为您提供了一个随时可用的自动化类,用于图像中的车辆检测和点云中的车辆包围盒估计。类的注释概述了实现每个API调用所需的基本步骤。

步骤1包含定义算法的名称和描述以及使用算法的方向的属性。

% ---------------------------------------------------------------------- % 步骤1:定义所需的属性描述算法,%,包括名称、描述和UserDirections。properties(Constant) % Name算法名称%指定算法名称的字符向量。Name = '多信号车辆检测器';% Description算法描述%字符向量,指定算法的简短描述。Description =['使用ACF车辆检测器检测车辆'…'图像和估计他们在点云。'];% UserDirections算法使用方向%字符向量的单元格数组,指定算法用户要遵循的方向。UserDirections ={['选择一个矩形ROI标签'…'标签对象为Vehicle。'],……['点击设置并打开激光雷达摄像机校准'… 'Parameters tab, load the cameraIntrinsics and rigid3d ' ... 'objects from the workspace.'], ... ['Specify additional parameters under Settings.'], ... ['Click Run to detect vehicles in each image and point cloud.'], ... ['Review automated labels manually. You can modify, delete ', ... 'and add new labels.'], ... ['If you are not satisfied with the results, click Undo ' ... 'Run. Click Settings to modify algorithm settings and click ', ... 'Run again.'] ... ['When you are satisfied with the results, click Accept and ', ... 'return to manual labeling.']}; end

步骤2包含核心算法的自定义属性。

% --------------------------------------------------------------------- % 第二步:定义属性被用来管理算法执行。properties % SelectedLabelName选中标签名称%选中标签的名称。算法检测到的车辆将被赋给这个变量名。%检测器检测器%预先训练的车辆检测器,一个类别为% acfobject检测器的对象。Detector % VehicleModelName车辆检测器型号%预训练车辆检测器型号。VehicleModelName =“众目睽睽”;%重叠阈值重叠阈值%用于消除重叠边界框的阈值。边界框重叠比例分母'RatioType'被设置为% 'Min'。OverlapThreshold = 0.45;% ScoreThreshold分类评分阈值%用于拒绝检测分数低的检测的阈值。 ScoreThreshold = 20; % ConfigureDetector Detection configuration flag % Boolean value that determines whether the detector is % configured using monoCamera sensor. ConfigureDetector = false; % SensorObj monoCamera sensor % Monocular camera sensor object, monoCamera, used to configure % the detector. A configured detector runs faster and can % potentially result in better detections. SensorObj = []; % SensorStr monoCamera sensor variable name % Character vector specifying the monoCamera object variable name % used to configure the detector. SensorStr = ''; % VehicleWidth Vehicle width % Vehicle width used to configure the detector, specified as % [minWidth, maxWidth], which describes the approximate width of the % object in world units. VehicleWidth = [1.5 2.5]; % VehicleLength Vehicle length % Vehicle length used to configure the detector, specified as % [minLength, maxLength] vector, which describes the approximate % length of the object in world units. VehicleLength = []; % IntrinsicsObj Camera intrinsics % cameraIntrinsics object, which represents a projective % transformation from camera to image coordinates. IntrinsicsObj = []; % IntrinsicsStr cameraIntrinsics variable name % cameraIntrinsics object variable name. IntrinsicsStr = ''; % ExtrinsicsObj Camera-to-lidar rigid transformation % rigid3d object representing the 3-D rigid geometric transformation % from the camera to the lidar. ExtrinsicsObj = []; % ExtrinsicsStr rigid3d variable name % Camera-to-lidar rigid3d object variable name. ExtrinsicsStr = ''; % ClusterThreshold Clustering threshold for two adjacent points % Threshold specifying the maximum distance between two adjacent points % for those points to belong to the same cluster. ClusterThreshold = 1; end

步骤3处理函数定义。

第一个函数,金宝appsupportsMultisignalAutomation检查算法是否支持多个信号。金宝app对于多信号车辆检测器,你同时加载图像和点云信号,所以成功被设置为真正的

function success = 金宝appsupportsMultisignalAutomation(~) %支持MultiSignal。成功= true;结束

接下来的函数,checkSignalType检查是否只支持适当类型的信号进行自动化。金宝app多信号车辆检测器必须支持类型信号金宝app图像PointCloud,所以这个版本的函数检查两种信号类型。

只有视频/图像序列和点云信号数据%有效。isValid = any(signalType == vision.label .loading. signalType . image) &&…任何(signalType = = vision.labeler.loading.SignalType.PointCloud);结束

接下来的函数,checkLabelDefinition,检查只有适当类型的标签是否启用自动化。对于图像和点云信号中的车辆检测,您只需检查类型的类型矩形/长方体是启用的,所以这个版本的函数检查类型的标签。

只有矩形/长方体的ROI标签定义对%车辆检测器有效。isValid = (labelDef。= = labelType类型。长方体||labelDef.Type == labelType.Rectangle); end

接下来的函数,筛选,检查仅选择一个ROI标签定义来自动化。

是否有一个选择的ROI标签定义要自动化?isReady = ~ isempty (algObj.SelectedLabelDefinitions);结束

接下来,settingsDialog函数获取并修改步骤2中定义的属性。这个API调用允许您创建一个对话框,当用户单击设置按钮在自动化选项卡。要创建此对话框,请使用对话框函数创建一个模态窗口,以要求用户指定cameraIntrinsics对象和rigid3d.对象。的multiSignalVehicleDetectorSettings方法包含设置的代码,并添加输入验证步骤。

函数SettingsDialog(Algobj)%调用对话框输入摄像机内在机构和%摄像机到LIDAR刚性转换和选择%预磨损模型的选项,重叠阈值,检测得分%阈值和聚类阈值。可选地,输入%校准的单纸传感器以配置检测器。MultiSignalvehicledEtectorsettings(Algobj);结束

步骤4指定执行函数。的初始化函数根据应用程序中已有的标签填充初始算法状态多功能阶层兴奋剂类,初始化函数存储选定标签定义的名称,并加载预训练的ACF车辆检测器并将其保存到探测器财产。

函数initialize(algObj, ~) %存储选定标签定义的名称。使用这个%名称来标记检测到的车辆。algObj。选择edLabelName = algObj.SelectedLabelDefinitions.Name; % Initialize the vehicle detector with a pretrained model. algObj.Detector = vehicleDetectorACF(algObj.VehicleModelName); end

接下来,函数定义了这个自动化类的核心车辆检测算法。的函数为图像和点云序列的每一帧调用,并期望自动化类返回一组标签。的函数多功能阶层兴奋剂包含前面描述的用于检测图像帧中的二维车辆包围盒和估计点云帧中的三维车辆包围盒的逻辑。

函数autolabels =运行(algobj,i)%autolabels长度的单元阵列与%信号的数量相同。Autolabels = Cell(大小(I,1),1);%获取图​​像和PointCloud帧的索引。如果是(i {1,1},“pointcloud”)pcidx = 1;imidx = 2;否则imidx = 1;pcidx = 2;终端%检测图像帧上的边界框。SelectentBboxes =侦探(Algobj,i {imidx,1});点云帧上的%估计边界框。 if ~isempty(selectedBboxes) % Store labels from the image. imageLabels = struct('Type', labelType.Rectangle, ... 'Name', algObj.SelectedLabelDefinitions.Name, ... 'Position', selectedBboxes); autoLabels{imIdx, 1} = imageLabels; % Remove the ground plane for the point cloud. groundPtsIndex = segmentGroundFromLidarData(I{pcIdx,1}, ... "ElevationAngleDelta", 15, "InitialElevationAngle", 10); nonGroundPts = select(I{pcIdx,1}, ~groundPtsIndex); % Predict 3-D bounding boxes. pcBboxes = bboxCameraToLidar(selectedBboxes, nonGroundPts, algObj.IntrinsicsObj, ... algObj.ExtrinsicsObj, "ClusterThreshold", algObj.ClusterThreshold); % Store labels from the point cloud. if(~isempty(pcBboxes)) pcLabels = struct('Type', labelType.Cuboid,... 'Name', algObj.SelectedLabelDefinitions.Name,... 'Position', pcBboxes); autoLabels{pcIdx, 1} = pcLabels; else autoLabels{pcIdx, 1} = {}; end else autoLabels{imIdx, 1} = {}; autoLabels{pcIdx, 1} = {}; end end

最后,终止函数处理自动化完成后所需的任何清理或拆除。这个算法不需要任何清理,所以函数是空的。

函数终止(〜)结束

在App中使用多信号车辆检测器自动化类

上一节中描述的属性和方法是实施的多功能阶层兴奋剂自动化算法类文件。要在应用程序中使用这个类:

创建文件夹结构+视觉/ +贴标签机,并将自动化类复制到其中。

mkdir(“+视觉/ +贴标签机”);拷贝文件(fullfile (matlabroot“例子”,“驾驶”,“主要”,“MultiSignalVehicleDetector.m”),…“+视觉/ +贴标签机”);

下载点云序列(PCD)和图像序列。为了说明目的,本示例使用Ouster OS1激光雷达传感器在高速公路上收集的WPI激光雷达数据,以及安装在ego车辆上的前置摄像头收集的WPI图像数据。执行以下代码块下载并将激光雷达和图像数据保存在临时文件夹中。根据你的网络连接,下载过程可能需要一些时间。代码暂停MATLAB®执行,直到下载过程完成。或者,您可以使用web浏览器将数据集下载到本地磁盘并提取文件。

将图像序列下载到一个临时位置。

imageURL = ' //www.tatmou.com金宝app/supportfiles/lidar/data/WPI_ImageData.tar.gz ';imageDataFolder = fullfile(tempdir, 'WPI_ImageData',filesep);imageDataTarFile = imageDataFolder + "WPI_ImageData.tar.gz";if ~exist(imageDataFolder,'dir') mkdir(imageDataFolder) end if ~exist(imageDataTarFile, 'file') disp('正在下载WPI镜像驱动数据(225mb)…');websave (imageDataTarFile imageURL);解压(imageDataTarFile imageDataFolder);end %检查是否下载了image tar.gz文件,但没有解压。如果存在(fullfile(imageDataFolder,'imageData'),'dir') untar(imageDataTarFile, imageDataFolder)结束

出于演示的目的,本示例仅使用帧920-940中的WPI图像序列的一个子集。要将图像子集加载到应用程序中,请将图像复制到一个文件夹中。

%创建新文件夹并复制图像。imDataFolder = imageDataFolder + "imageDataSequence";如果~存在(imDataFolder“dir”)mkdir (imDataFolder);End for I = 920: 940 filename = strcat(num2str(I,'%06.0f'),'.jpg');源= fullfile (imageDataFolder imageData,文件名);目的地= fullfile (imageDataFolder, imageDataSequence,文件名);拷贝文件(来源、目的地)

将点云序列下载到一个临时位置。

lidarURL = ' //www.tatmou.com金宝app/supportfiles/lidar/data/WPI_LidarData.tar.gz ';lidarDataFolder = fullfile (tempdir WPI_LidarData, filesep);lidarDataTarFile = lidarDataFolder + "WPI_LidarData.tar.gz";if ~exist(lidarDataFolder) mkdir(lidarDataFolder) end if ~exist(lidarDataTarFile, 'file') disp('正在下载WPI Lidar驱动数据(760 MB)…');websave (lidarDataTarFile lidarURL);解压(lidarDataTarFile lidarDataFolder);end %检查lidar tar.gz文件是否已下载,但未解压。如果存在~ (fullfile (lidarDataFolder WPI_LidarData.mat),“文件”)解压(lidarDataTarFile lidarDataFolder);结束

Ground Truth Labeler应用支持PCD或P金宝appLY文件组成的点云序列的加载。将下载的点云数据保存到PCD文件中。出于说明的目的,在本例中,只保存帧920-940中的WPI点云数据的一个子集。

%加载下载的激光雷达数据到工作区。负载(fullfile (lidarDataFolder WPI_LidarData.mat),“lidarData”);lidarData =重塑(lidarData、大小(lidarData, 2), 1);%创建新文件夹并将激光雷达数据写入PCD文件。pcdDataFolder = lidarDataFolder + "lidarDataSequence";如果存在(pcdDataFolder, 'dir') mkdir(fullfile(lidarDataFolder,'lidarDataSequence'));end disp('保存WPI激光雷达驱动数据到PCD文件…');for i = 920:940 filename = strcat(fullfile(lidarDataFolder,'lidarDataSequence',filesep),…num2str(我,“% 06.0 f”)、“.pcd”);我pcwrite (lidarData{},文件名); end

校准信息应以内参数和外参数(刚性变换)的形式出现激光雷达和相机校准(激光雷达工具箱).装入相机内部,存储在cameraIntrinsics对象,以及相机到激光雷达的刚性转换,存储在rigid3d.对象指向工作区。本例中的WPI数据经过校准,内部和外部(相机到激光雷达转换)参数保存在MAT文件中。

data =负载(fullfile (toolboxdir(激光雷达),‘lidardata’,‘lcc’,' bboxGT.mat '));cameraParams = data.cameraParams;camToLidar = data.camToLidar;

打开Ground Truth Labeler应用。

imageDir = fullfile(tempdir, 'WPI_ImageData', 'imageDataSequence');pointCloudDir = fullfile(tempdir, 'WPI_LidarData', 'lidarDataSequence');groundTruthLabeler

在应用程序工具条上,选择进口然后添加信号.在“添加/删除信号”窗口中,加载图像序列。

  1. 源类型图像序列

  2. 控件指定的位置上浏览图像序列文件夹imageDir多变的。

  3. 使用默认时间戳,单击添加来源.图像序列文件夹,ImagemageataUly.,添加到信号源表中。

在应用程序工具条上,选择进口然后添加信号.在“添加/删除信号”窗口中,加载点云序列。

  1. 源类型点云序列

  2. 浏览点云序列文件夹,该文件夹位于所指定的位置pointCloudDir多变的。

  3. 使用默认时间戳,单击添加来源.点云序列文件夹,lidarDataSequence,添加到信号源表中。

点击好吧将信号导入应用程序。要并排查看信号,在标签选项卡上,单击显示网格,并以1 × 2的网格显示信号。

ROI标签选项卡,单击标签,定义名称为的ROI标签车辆还有一种矩形或长方体,如下所示。选择一种颜色,然后单击好吧

选择两个信号进行自动化。在这方面标签选项卡上,选择算法然后选择信号,并选择两个信号。点击好吧

在下面选择算法中,选择刷新列表.然后,选择算法然后Multisignal车辆检测器.如果没有看到此选项,请验证当前工作文件夹是否有一个名为+视觉/ +贴标签机,文件名为MultiSignalveHicledetectorm.在里面。

点击自动化.该应用程序为选定的信号打开一个自动化会话,并显示使用算法的方向。

将内部相机参数加载到自动化会话中。

  1. 在这方面自动化选项卡上,单击设置

  2. 在这方面Lidar-to-Camera校准参数选项卡上,单击从工作区中导入相机内部特性

  3. 导入内部相机参数,cameraParams,从MATLAB工作空间。点击好吧

将相机到激光雷达转换加载到自动化会话。

  1. 在这方面LIDAR到相机校准参数选项卡上,单击从工作区导入相机到激光雷达的转换

  2. 导入转换,Camtolidar.,从MATLAB工作空间。点击好吧

根据需要修改附加的车辆检测器设置并单击好吧.然后,在自动化选项卡上,单击.所创建的算法在序列的每一帧上执行,并使用车辆标签类型。在应用程序完成自动化运行后,使用滑块或方向键滚动序列,以定位自动化算法标记错误的帧。手动调整结果通过调整检测到的包围盒或添加新的包围盒。

一旦你对整个序列检测到的车辆包围盒感到满意,点击接受.然后,您可以继续手动调整标签或将标记的地面真相导出到MATLAB工作区。

您可以使用本例中描述的概念来创建您自己的自定义多信号自动化算法,并扩展应用程序的功能。

另请参阅

应用

功能

对象

相关的话题