主要内容

在多个信号中自动化地面标签

此示例显示如何使用该示例如何同时自动标记多个信号地面真理贴标机应用程序和自动凝视算法界面。在该示例中使用的自动化算法基于使用相机到LIDAR校准参数的相应图像帧中的车辆的标签位置来估计点云帧中的车辆的标签位置。

地面真相贴标程序应用程序

良好的地面真理数据对于开发驾驶算法并评估其性能至关重要。但是,创建丰富和多样化的注释驾驶数据,需要大量的时间和资源。地面真理贴标应用程序使这个过程有效。您可以使用此应用程序作为标记车道边界,车辆边界框和视觉系统感兴趣对象的完整手动注释工具。但是,手动标签需要大量的时间和资源。此应用程序还提供了一个框架,用于创建算法以扩展和自动化标记过程。您可以创建和使用算法以快速标记整个数据集,然后使用更高效,更短的手动验证步骤跟踪。您还可以编辑自动化步骤的结果,以考虑自动化算法可能错过的具体场景。

该示例描述了创建一种算法,该算法可用于地面真实贴标程序应用程序,以自动检测图像中的车辆,并使用相机到激光脉冲校准参数估计它们在对应点云中的位置。

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

为了检测图像中的车辆,自动化算法使用预先训练的聚合通道特征(ACF)车辆检测器,车辆.预览算法如何通过加载样品图像和ACF车辆检测器,检测图像中的车辆以及在图像中的车辆周围插入2-D边界箱的工作作用。

%加载来自垫文件的数据并提取图像。data = load(fullfile(toolboxdir('lidar'),'lidardata''LCC''bboxgt.mat'));我= data.im;%加载用于车辆的预制探测器。探测器=车辆levedetectoracf('前后视图');%检测车辆并显示边界框。[imbboxes,〜] =检测(探测器,i);iout = insertshape(我,'矩形',imbboxes,'行宽'4);数字imshow(iout)标题('检测到的车辆'

图包含轴。具有标题检测到的车辆的轴包含类型图像的对象。

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

估算点云中车辆的三维边界盒

为了从图像帧中的相应检测到的车辆中估算点云帧中的车辆,算法使用Bboxcameratolidar.(LIDAR工具箱)功能。此功能使用LIDAR-CAMERA校准参数来估算基于2-D边界框的三维边界框。要估算边界框,该功能将作为输入内部相机参数,cameraIntrinsics和相机到激光器刚性转换,rigid3d.

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

%提取点云。ptCloud = data.pc;%提取内部相机参数。内在= data.cameraparams;%提取相机到LIDAR刚性转换。tform = data.camtolidar;%估计点云中的边界框。pcbboxes = bboxcameratolidar(imbboxes,ptcloud,内在,tform);%显示点云中的绑定框。图AX = PCShow(PTCloud.Location);showshape('长方体'pcBboxes,'父母',斧头,“不透明度”,0.1,'颜色',[0.06 1.00 1.00],'行宽',0.5)持有缩放(AX,1.5)标题(点云中的估计边界框')举行离开

图包含轴。点云中标题估计边界框的轴包含类型分散的对象。

准备多功能车辆探测器自动化课程

要将多功能车辆探测器算法纳入地面真实贴标程序应用程序的自动化工作流程,构建一个从抽象基类继承的类,Vision.Labeler.AutomationalGorithm..此基类定义了应用程序用于配置和运行自定义算法的方法的属性和签名。地面真实贴标程序应用程序提供了一种获取初始自动化类模板的便捷方式。有关详细信息,请参阅创建标签自动化算法.这MultiSignalVehicleDetectorClass是基于此模板,并为您提供了一种即时使用自动化类,用于在点云中的图像和车辆边界框估计中的车辆检测。课程的评论概述了实现每个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包含核心算法的自定义属性。

%----------------------------------------------------------------%步骤2:定义用于管理算法执行的属性。属性%selectentlabelname选择的标签名称%所选标签的名称。通过算法检测的车辆将分配此变量名称。SelectentLabelname%探测器检测器%普里托运车检测器,类别%ACFObjectDetector的对象。探测器%车辆销售器型号的售货员型号%净化车辆探测器模型的名称。vehiclemodelname ='全视图';%重叠阈值重叠阈值%阈值用于消除参考边界框周围的重叠边界框,在0和1之间。%边界框重叠比率分母'ratiotype'被设置为%'min'。重叠= 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处理函数定义。

第一个功能,金宝app支持ispultisignalautomation.检查算法支持多个信号。金宝app对于多功能车辆检测器,您可以加载图像和点云信号,因此成功被设置为真正的

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

下一个功能,CheckSignalType.检查自动化仅支持适当类型的信号。金宝app多目标车辆检测器必须支持类型的信号金宝app图像PointCloud,因此此版本的功能检查两种信号类型。

函数ISValid = CheckSignalType(SignalType)%仅视频/图像序列和点云信号数据%是有效的。IsValid = Any(signaltype == vision.labeler.loading.signaltype.image)&& ...任何(signaltype == vision.labeler.loading.signaltype.pointCloud);结尾

下一个功能,核对标准义法,检查仅启用适当类型的标签是否有自动化。对于图像和点云信号中的车辆检测,您只需检查类型的类型矩形/长方体已启用,因此此版本的功能检查类型标签。

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

下一个功能,筛选,检查仅选择一个ROI标签定义来自动化。

函数ISREADY = checkstrup(Algobj,〜)%是有一个选择的ROI标签定义来自动化吗?Isready =〜isempty(allobj.selectedlabeldefinitions);结尾

接下来,这是setserstDialog.函数获取并修改步骤2中定义的属性。此API调用允许您创建一个对话框,当用户单击时打开设置按钮在自动化标签。要创建此对话框,请使用对话框创建模态窗口的函数询问用户指定cameraIntrinsics对象和rigid3d.目的。这多功能性鼻腔切除阵列方法包含用于设置的代码,也添加了输入验证步骤。

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

步骤4指定执行函数。这初始化函数根据应用程序中已有的标签填充初始算法状态MultiSignalVehicleDetector班级,这初始化已自定义功能以存储所选标签定义的名称,并加载预制的ACF车辆检测器并将其保存到探测器财产。

函数初始化(algobj,〜)%存储所选标签定义的名称。使用此%名称来标记检测到的车辆。algobj.selectedlabelname = algobj.selectedLabeldefinitions.name;%用预磨料模型初始化车辆检测器。Algobj.detector =车辆levledetectoracf(allobj.vehiclemodelname);结尾

接下来,这是跑步功能定义了此自动化类的核心车辆检测算法。这跑步对图像和点云序列的每个帧调用函数,并希望自动化类返回一组标签。这跑步功能在MultiSignalVehicleDetector包含先前描述的逻辑,用于检测图像帧中的2-D车辆边界框并在点云帧中估计3-D车辆边界框。

autoLabels = run(algObj, I) % autoLabels一个单元格数组的长度与%信号的数量相同。autoLabels =细胞(大小(我,1),1);%获取Image帧和PointCloud帧的索引。if isa(I{1,1},"pointCloud") pcIdx = 1;imIdx = 2;else imIdx = 1;pcIdx = 2;end %检测图像帧上的边框。select dbboxes = detectVehicle(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中使用MultiSignal车辆探测器自动化类

上一节中描述的属性和方法是在的MultiSignalVehicleDetector自动算法类文件。要在应用程序中使用此类:

创建文件夹结构+ Vision / +贴标程序在当前文件夹下需要,并将自动类复制到其中。

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

下载点云序列(PCD)和图像序列。出于插图目的,该示例使用从欧姆斯特OS1激光雷达传感器和从安装在自助车辆上的正面相机的高速公路上收集的WPI LIDAR数据。执行以下代码块以在临时文件夹中下载并保存LIDAR和图像数据。根据您的Internet连接,下载过程可能需要一些时间。代码暂停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)结束

出于说明目的,该示例仅使用WPI映像序列的子集,来自帧920-940。要将图像子集加载到应用程序中,将图像复制到文件夹中。

%创建新文件夹并复制图像。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);结尾

地面真相贴标程序应用程序支持装载PCD或PLY文件的点云序金宝app列。将下载的点云数据保存到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

如所提到的,校准信息预计以内在和外在(刚性变换)参数的形式激光雷达和相机校准(LIDAR工具箱).加载相机内部,存储在一个中cameraIntrinsics对象,以及相机到LIDAR刚性变换,存储在一个中rigid3d.对象,到工作区。此示例中的WPI数据被校准,并且内在和外在(相机到LIDAR转换)参数保存在垫文件中。

数据=加载(Fullfile(ToolboxDir('lidar'),'lidardata','lcc','bboxgt.mat'));cameraparams = data.cameraparams;Camtolidar = data.camtolidar;

打开地面真相贴标程序应用程序。

imageageR = fullfile(tempdir,'wpi_imagedata','imagedatasquence');pointclouddir = fullfile(tempdir,'wpi_lidardata','lidardatasequence');地下标签

在App ToolStrip上,选择进口接着添加信号.在“添加/删除信号”窗口中,加载图像序列。

  1. 源类型图像序列

  2. 浏览图像序列文件夹,该文件夹位于所指定的位置imageDir变量。

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

在App ToolStrip上,选择进口接着添加信号.在“添加/删除信号”窗口中,加载点云序列。

  1. 源类型点云序列

  2. 的指定位置浏览点云序列文件夹pointclouddir.变量。

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

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

在里面ROI标签选项卡在左窗格中,单击标签,并使用名称定义ROI标签车辆和一种类型的矩形/长方体,如这里所示。(可选)选择颜色,然后单击好吧

选择两个信号进行自动化。在这一点标签选项卡,选择算法接着选择信号,并选择两个信号。点击好吧

在下面选择算法中,选择刷新列表.然后,选择算法接着多功能车辆探测器.如果没有看到此选项,请验证当前工作文件夹是否包含一个文件夹+ Vision / +贴标程序,文件名为MultiSignalvehicledetectorman.在里面。

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

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

  1. 在这一点自动化选项卡,单击设置

  2. 在这一点Lidar-to-Camera校准参数选项卡,单击从工作区导入相机内部内部

  3. 导入内部相机参数,Cameraparams.,来自Matlab工作区。点击好吧

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

  1. 在这一点激光到相机校准参数选项卡,单击从工作区导入相机到激光器转换

  2. 导入转换,Camtolidar.,来自Matlab工作区。点击好吧

根据需要修改额外的车辆探测器设置,然后单击好吧.然后,在自动化选项卡,单击跑步.所创建的算法在序列的每帧上执行并通过使用该帧检测车辆车辆标签类型。应用程序完成自动化运行后,使用滑块或箭头键滚动序列以定位帧,其中自动化算法标记为不正确。通过调整检测到的边界框或添加新的边界框来手动调整结果。

在对整个序列的检测到的车辆边界框满意时,请单击接受.然后,您可以继续手动调整标签或将已标记的ground truth导出到MATLAB工作区。

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

也可以看看

应用

功能

对象

相关的话题