主要内容

自动化地面实况标记跨多个信号

这个例子展示了如何自动标记多个信号同时使用地面实况贴标签机应用程序和AutomationAlgorithm接口。这个示例中使用的自动化算法估计车辆的标签位置点云框架基于车辆的标签位置对应的图像帧使用camera-to-lidar校准参数。

地面真理贴标签机应用

良好的地面实况数据是至关重要的发展推动算法和评估他们的表现。然而,创建一套丰富多样的带注释的驾驶数据需要大量的时间和资源。地面真理贴标签机应用使得这个过程有效。您可以使用这个程序作为一种完全人工注释工具标记车道边界,车辆边界框,视觉系统和其他感兴趣的对象。然而,手动标签需要大量的时间和资源。这个程序还提供了一个框架来创建算法扩展和自动标记的过程。您可以创建和使用算法快速标签整个数据集,然后跟随它更高效,更短的手动验证步骤。你也可以编辑的结果自动化一步占了自动化算法具有挑战性的场景,可能会错过。

这个例子描述了创建一个算法,可以用于地面真理贴标签机应用图像中自动检测车辆,估计他们的位置在对应的点云使用camera-to-lidar校准参数。

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

检测的车辆图像,自动化算法使用pretrained总通道特性(ACF)车辆检测器,vehicleDetectorACF。预览该算法工作原理通过加载一个示例图像和ACF车辆检测器,检测车辆图像中,插入二维边界框周围的车辆图像中。

%加载垫的数据文件和提取图像。data =负载(fullfile (toolboxdir (激光雷达的),“lidardata”,低成本航空的,“bboxGT.mat”));我= data.im;%为车辆装载pretrained探测器。探测器= vehicleDetectorACF (“front-rear-view”);%检测车辆和显示边框。[imBboxes ~] =检测(探测器,我);Iout = insertShape(我“矩形”imBboxes,“线宽”4);图imshow (Iout)标题(检测到车辆的)

图包含一个坐标轴对象。坐标轴对象与标题检测到车辆包含一个类型的对象的形象。

如果你有相机校正信息,可以通过过滤改善这种检测器检测的假阳性。的视觉感知使用单眼相机例子描述了如何创建一个pretrained车辆检测器和配置它来检测车辆边界框使用校准单眼相机配置。

估计三维汽车点云的边界框

来估计车辆的点云框架从相应的检测到车辆的图像帧,该算法使用bboxCameraToLidar(激光雷达工具箱)函数。这个函数使用lidar-to-camera校准参数估计基于二维边界框的3 d边界框。估计边界框,函数作为输入的内在相机参数,cameraIntrinsics一个camera-to-lidar刚性变换,rigid3d

预览如何通过加载算法的工作原理相对应的点云图像,估计三维点云边界框的车辆,和周围的边界框插入汽车点云。

%提取点云。ptCloud = data.pc;%提取内在相机参数。intrinsic = data.cameraParams;%提取camera-to-lidar刚性变换。tform = data.camToLidar;%估算点云的边界框。pcBboxes = bboxCameraToLidar (imBboxes、ptCloud intrinsic tform);%显示点云的边界框。图ax = pcshow (ptCloud.Location);showShape (“长方体”pcBboxes,“父”ax,“不透明度”,0.1,“颜色”(0.06 1.00 1.00),“线宽”,0.5)变焦(ax, 1.5)标题(“估计点云的边界框)举行

图包含一个坐标轴对象。坐标轴对象与标题估计在点云边界框包含一个散射类型的对象。

集成Multisignal车辆检测器算法在地面真理贴标签机

将multisignal车辆检测器算法的自动化工作流地面实况贴标签机应用,构造一个类继承自抽象基类,vision.labeler.AutomationAlgorithm。这个基类定义属性和签名方法,配置和运行的应用程序使用自定义算法。地面真理贴标签机应用程序提供了一种方便的方法来获得一个初始自动化类模板。有关详细信息,请参见为标签创建自动化算法。的MultiSignalVehicleDetector类是基于这个模板和为你提供了一个现成的自动化类车辆检测在图像和车辆在点云边界框估计。评论类的轮廓实现每个API调用所需的基本步骤。

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

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %步骤1:定义所需的属性描述算法,%,包括名称、描述和UserDirections。属性(常数)%名称算法名称%特征向量算法指定的名称。Name = ' Multisignal车辆检测器;%描述算法描述%字符向量指定算法的简短描述。描述=[使用ACF车辆检测器检测车辆的……“形象和估计他们在点云。”);% % UserDirections算法使用方向单元阵列特征向量为%算法用户指定的方向。UserDirections ={(“选择一个矩形的ROI标签”……对象作为车辆的标签。'],……(点击设置和激光雷达相机校正的…… '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:定义属性被用来管理算法执行。属性% SelectedLabelName选中的标签名称%选择标签的名称。车辆检测算法将%被分配这个变量的名字。SelectedLabelName %探测器探测器% Pretrained车辆检测器,% acfObjectDetector类的一个对象。探测器% VehicleModelName车辆检测器模型名称% pretrained车辆探测器模型的名称。VehicleModelName =“众目睽睽”;% OverlapThreshold重叠阈值%阈值用于消除重叠边界框%在参考边界框,在0和1之间。%边界框重叠比率的分母,“RatioType”,设置为%“分钟”。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处理函数定义。

第一个函数,万博1manbetxsupportsMultisignalAutomation,检查算法支持多个信号。万博1manbetxmultisignal车辆检测器,加载图像和点云信号成功被设置为真正的

函数成功= supportsMulti万博1manbetxsignalAutomation支持MultiSignal (~) %。成功= true;结束

接下来的函数,checkSignalType,检查支持的信号适当类型的自动化。万博1manbetxmultisignal车辆检测器必须支持的信号类型万博1manbetx图像PointCloud,所以这个版本的功能检查两种信号类型。

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

接下来的函数,checkLabelDefinition检查,只有适当的类型的标签支持自动化。车辆检测在图像和点云信号,你检查,只有标签的类型矩形/长方体是启用的,所以这个版本的功能检查类型的标签。

函数isValid = checkLabelDefinition (~, labelDef) %只有矩形或长方体ROI标签定义为%车辆检测器是有效的。isValid = (labelDef。= = labelType类型。长方体||labelDef.Type == labelType.Rectangle); end

接下来的函数,checkSetup检查,只有一个ROI自动选择标签定义。

函数isReady = checkSetup (algObj ~) %有一个选定的ROI标签定义自动化吗?isReady = ~ isempty (algObj.SelectedLabelDefinitions);结束

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

函数settingsDialog (algObj) %调用对话框输入相机intrinsic和% camera-to-lidar刚性变换和选项选择% pretrained模型,重叠的阈值,检测分数%的阈值,和聚类阈值。可选地,输入%校准monoCamera传感器配置探测器。multiSignalVehicleDetectorSettings (algObj);结束

步骤4指定的执行功能。的初始化基于现有的填充函数算法的初始状态标签的应用。MultiSignalVehicleDetector类,初始化功能已定制的存储选择的名称标签定义和加载pretrained ACF车辆检测器,并将其保存到探测器财产。

函数初始化(algObj ~) %存储选中的标签定义的名称。使用此%的名字标签检测到车辆。algObj。SelectedLabelName = algObj.SelectedLabelDefinitions.Name;%初始化车辆检测器pretrained模型。algObj。探测器= vehicleDetectorACF (algObj.VehicleModelName);结束

接下来,运行函数定义了这个自动化类的核心车辆检测算法。的运行函数被调用的每一帧图像和点云序列和预计自动化类返回的一组标签。的运行函数MultiSignalVehicleDetector包含前面描述的逻辑检测二维图像帧和车辆碰撞盒子估计三维汽车点云帧的边界框。

函数autoLabels =运行(algObj,我)% autoLabels单元阵列的长度一样的%信号的数量。autoLabels =细胞(大小(我,1),1);%得到图像的索引和PointCloud帧。如果isa(我{1},“pointCloud”) pcIdx = 1;imIdx = 2;其他imIdx = 1;pcIdx = 2;%检测边界框在图像帧结束。selectedBboxes = detectVehicle (algObj,我{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

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

函数终止(~)

使用Multisignal车辆探测器自动化类应用

在前一节中描述的属性和方法的实现MultiSignalVehicleDetector自动化算法类文件。使用这个类的应用程序:

创建一个文件夹结构+视觉/ +贴标签机需要在当前文件夹,并自动化类复制到它。

请注意:MultiSignalVehicleDetector。m文件必须在同一文件夹创建+视觉/ +贴标签机文件夹结构。

mkdir(“+视觉/ +贴标签机”);拷贝文件(“MultiSignalVehicleDetector.m”、“+视觉/ +贴标签机”);

下载点云序列(PCD)和图像序列。出于演示的目的,这个示例使用WPI激光雷达在公路上收集的数据从一个下台OS1激光雷达传感器和WPI图像数据从一个前置摄像头安装在一个自我。执行以下代码块下载和激光雷达和图像数据保存在一个临时文件夹中。根据您的网络连接,下载过程可能需要一些时间。MATLAB®代码中止执行,直到下载过程完成。或者,您可以下载数据集到您的本地磁盘使用您的web浏览器并提取文件。

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

imageURL = ' //www.tianjin-qmedu.com万博1manbetx/supportfiles/lidar/data/WPI_ImageData.tar.gz ';imageDataFolder = fullfile (tempdir WPI_ImageData, filesep);imageDataTarFile = imageDataFolder +“WPI_ImageData.tar.gz”;如果~存在(imageDataFolder“dir”) mkdir (imageDataFolder)如果~存在(imageDataTarFile,“文件”)disp (WPI形象驱动下载数据(225 MB)…”);websave (imageDataTarFile imageURL);解压(imageDataTarFile imageDataFolder);结束%焦油检查图像。gz文件下载,但不是未压缩的。如果存在~ (fullfile (imageDataFolder imageData),“dir”)解压(imageDataTarFile imageDataFolder)结束

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

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

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

lidarURL = ' //www.tianjin-qmedu.com万博1manbetx/supportfiles/lidar/data/WPI_LidarData.tar.gz ';lidarDataFolder = fullfile (tempdir WPI_LidarData, filesep);lidarDataTarFile = lidarDataFolder +“WPI_LidarData.tar.gz”;如果~存在(lidarDataFolder) mkdir (lidarDataFolder)如果~存在(lidarDataTarFile,“文件”)disp (WPI激光雷达驱动下载数据(760 MB)…”);websave (lidarDataTarFile lidarURL);解压(lidarDataTarFile lidarDataFolder);%检查激光雷达焦油。gz文件下载,但不是未压缩的。如果存在~ (fullfile (lidarDataFolder WPI_LidarData.mat),“文件”)解压(lidarDataTarFile lidarDataFolder);结束

地面真理贴标签机应用程序支持加载点云序列组成的纤毛或厚度文万博1manbetx件。PCD文件保存下载的点云数据。出于演示的目的,在本例中,您只保存WPI点云数据的一个子集,从920 - 940帧。

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

校准信息的形式将内在和外在(刚性变换)参数如上所述激光雷达和摄像机标定(激光雷达工具箱)。存储在一个负载相机intrinsiccameraIntrinsics对象,camera-to-lidar刚性变换,这是存储在一个rigid3d对象,工作区。批发价格指数数据在这个例子中是校准和内在和外在(camera-to-lidar转换)参数保存在垫子上文件。

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

打开地面实况贴标签机应用。

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

在应用程序将来发布,选择进口然后添加信号。在添加/删除信号窗口中,加载图像序列。

  1. 源类型图像序列

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

  3. 使用默认时间戳,然后单击添加源。图像序列的文件夹,imageDataSequence源表,添加到信号。

在应用程序将来发布,选择进口然后添加信号。在添加/删除信号窗口中,加载点云序列。

  1. 源类型点云序列

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

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

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

ROI标签选项卡在左窗格中,单击标签,定义一个ROI标签的名字车辆和一个类型的矩形或长方体,如下所示。可选地,选择一种颜色,然后点击好吧

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

选择算法中,选择刷新列表。然后,选择算法然后Multisignal车辆检测器。如果您没有看到这个选项,确认当前工作文件夹的文件夹+视觉/ +贴标签机,文件命名MultiSignalVehicleDetector.m在里面。

AutomateVehicleDetectionSelectAlgorithm.png

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

内在的相机参数加载到自动化会话。

  1. 自动化选项卡上,单击设置

  2. Lidar-to-Camera校准参数选项卡上,单击进口相机intrinsic工作区

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

AutomateMultiSignalsLoadCameraParams.png

camera-to-lidar转换加载到自动化会话。

  1. Lidar-to-Camera校准参数选项卡上,单击从工作区导入camera-to-lidar转换

  2. 导入转换,camToLidar从MATLAB工作区。点击好吧

AutomateMultiSignalsLoadCamToLidar.png

根据需要修改其他车辆检测器设置并点击好吧。然后,在自动化选项卡上,单击运行。创建算法执行的每一帧序列和检测车辆通过车辆标签类型。应用程序完成后的自动化运行,使用滑块或箭头键滚动序列定位框架,自动化算法不正确的标签。手动调整结果发现通过调整边界盒子或添加新的边界框。

一旦你感到满意整个序列,发现车辆碰撞盒子点击接受。然后你可以继续手动调整标签或标签导出地面真理MATLAB工作区。

你可以使用这个示例中描述的概念来创建您自己的自定义multisignal自动化算法和扩展应用程序的功能。

另请参阅

应用程序

功能

对象

相关的话题