主要内容

自动标注车道边界的地面真实值

此示例显示了如何开发一种用于自动标记道路中车道边界的算法地面实况贴标签机应用程序。

地面真相标签应用程序

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

创建一个车道检测算法

首先,创建一个车道检测算法。的单目摄像机的视觉感知示例描述了检测车道边界的过程,以及辅助传感器类包将算法打包成一个单一的、可重用的类。在单个视频帧上尝试该算法,以检测左自我通道边界。

configData =负载(“birdsEyeConfig”);传感器= configData.birdsEyeConfig.Sensor;monoSensor = helperMonoSensor(传感器);我= imread (“road.png”);sensorOut = processFrame(monoSensor, I);磅= sensorOut.leftEgoBoundary;figure IwithLane = insertLaneBoundary(I, lb, sensor, [3 30],“颜色”,“蓝”);imshow (IwithLane);标题('检测到的左车道边界模型');

图中包含一个轴。检测到标题的轴左侧车道边界模型包含类型为image的对象。

标记车道边界点

在上一步中检测到的车道是模型并且必须转换成一组离散点。这些点与用户手动放置在图像上的点类似。在摄像头视图中,车道边界靠近车辆的部分(摄像头图像的下部)将比更远的部分跨越更多的像素。因此,用户将在相机图像的较低部分放置更多的点,置信度更高。为了复制这种行为,从边界模型中更密集地确定车道边界位置,在更靠近车辆的点。

ROI = [3 30];xPoints = [3 3.5 4 5 7 12 30]';%离车辆越近,密度越大yPoints = lb.computeBoundaryModel (xPoints);找到对应的图像位置边界点SONIMAGE=车辆图像(传感器,[xPoints,yPoints]);imshow(I)hold情节(boundaryPointsOnImage (: 1) boundaryPointsOnImage (:, 2),...“o”,...“MarkerEdgeColor”,“b”,...“MarkerFaceColor”,“b”,...“MarkerSize”10)标题(“自动标记的车道边界点”);持有

图中包含一个轴。标题为“自动标记车道边界点”的轴包含2个类型为“图像”、“直线”的对象。

准备车道检测自动化课程

为了将这个车道检测算法合并到应用程序的自动化工作流中,构造一个继承自抽象基类的类vision.labeler.AutomationAlgorithm。这个基类定义了应用程序用于配置和运行自定义算法的方法的属性和签名。Ground Truth Labeler应用程序提供了一种获取初始自动化类模板的方便方法。有关详细信息,请参见创建标签的自动化算法。的AutoLaneMarking类基于此模板,并为车道检测提供了一个随时可用的自动化类。类的注释概述了实现每个API调用所需的基本步骤。

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

%----------------------------------------------------------------------%1步:定义描述算法的必需属性。此%包括名称、说明和用户方向。属性(常数)
% Name:给你的算法一个名字。Name = '车道检测器';
% Description:为算法提供一行描述。Description = '自动检测类似车道的特征';
%UserDirections:提供一组在调用此算法时显示的方向。方向%将作为字符%向量的单元数组提供,单元数组%的每个元素表示方向列表中的一个步骤。UserDirections={…'使用“设置”面板从工作区加载MonoCamera配置对象',…'在“设置”面板中指定其他参数',…'运行算法',…'如果需要,手动检查和修改结果'};终止

步骤2包含核心算法所需的自定义属性。必要的属性由上面的车道检测和车道点创建部分确定。

%--------------------------------------------------------------------- % 第二步:定义属性中使用的算法。这些是%用户定义的属性,可以定义它们来管理算法%的执行。属性% moncamera %与此视频相关的moncamera对象moncamera = [];%MonoCameraVarname %MonoCameraVarname = ";创建鸟瞰图所需的birdsEyeView对象birdseeconfig = [];%MaxNumLanes %算法尝试注释MaxNumLanes的最大车道数= 2;%ROI %用于搜索车辆周围%车道ROI的感兴趣区域= [3,30,- 3,3];%在segmentLaneMarkerRidge函数中使用的灵敏度参数LaneMaskSensitivity = 0.25;% lane boundary width %在findParabolicLaneBoundaries中使用的lane boundary width = 0.6;XPoints = [3 3.5 4 4.5 5 6 7 10 30]; end

步骤3处理函数定义。第一个函数,checkLabelDefinition,确保只有适当类型的标签启用自动化。对于车道检测,您需要确保只有类型的标签线是启用的,所以这个版本的函数检查类型标签编号:

Lane检测只适用于Line类型的标签。类型= = labelType.Line;结束

下一个功能是检查设置. 请注意,此算法需要A.单眼准备好传感器配置。所有其他属性都定义了合理的默认值。

这是唯一需要输入的TF = ~isempty(algObj. moncamera);结束

其次是settingsDialog函数获取并修改步骤2中定义的属性。这个API调用允许您创建一个对话框,当用户单击设置按钮自动化选项卡。要创建此对话框,请使用inputdlg函数快速创建一个简单的模态窗口,以要求用户指定单眼对象下面的代码片段概述了基本语法。全部AutoLaneMarking代码扩展了此逻辑,还添加了输入验证步骤。

%描述输入提示={…输入moncamera变量名,…“最大车道数”,…};defaultAnswer ={…”,……num2str(2),……};
%创建一个输入对话框名称='车道检测设置';numLines=1;options.Resize='on';options.WindowStyle='normal';选项。解释器='none';answer=inputdlg(提示、名称、numLines、defaultAnswer、选项);
%获取输入monoCameraVarname=answer{1};maxNumberOfLanes=答案{2};

步骤4指定执行功能。一些自动化算法需要实现初始化例程来填充基于应用程序中现有标签的初始算法状态。该车道检测算法对每一帧都独立工作,因此模板的默认版本已被修剪,不采取任何行动。

函数初始化(~,~,~)结束

其次是函数定义了这个自动化类的核心车道检测算法。为每个视频帧调用,并期望自动化类返回一组标签。的函数AutoLaneMarking包含前面介绍的用于车道检测和点转换的逻辑。代码来自辅助传感器也被折叠起来,以便更紧凑地参考。

function autoLabels = run(algObj, I) Ig = im2gray(I);birdsEyeViewImage = transformImage (algObj。BirdsEyeConfig,搞笑);birdsEyeViewBW = segmentLaneMarkerRidge(birdsEyeViewImage,…algObj。BirdsEyeConfig algObj。LaneBoundaryWidth,……“敏感性”,algObj.LaneMaskSensitivity);
%获取车道候选点在世界坐标[imageX, imageY] = find(birdsEyeViewBW);boundaryPointsxy = imageToVehicle (algObj。BirdsEyeConfig [imageY imageX]);
%将请求的边界数拟合到它lbs=findParabolicLaneBoundaries(…boundaryPointsxy,algObj.LaneBoundaryWidth,'MaxNumbendaries',algObj.MaxNumLanes);numDetectedLanes=numel(磅);
将模型转换为指定% x坐标处的离散点集;xPoints = algObj.XPoints ';对于ind = 1:numel(lbs) yPoints = lbs(ind).computeBoundaryModel(xPoints);boundaryPoints{印第安纳}= vehicleToImage (algObj。MonoCamera [xPoints yPoints]);结束
%将结果打包到表中autoLabels = table(…boundaryPoints’,……repmat (labelType。线,[numDetectedLanes,1]),... repmat(algObj.SelectedLabelDefinitions.Name, [numDetectedLanes,1])); autoLabels.Properties.VariableNames = {'Position','Type','Name'}; end

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

函数终止(~)结束

在应用程序中使用AutoLaneMarking自动化类

车道检测算法的打包版本现在可以在AutoLaneMarking类。要在应用程序中使用这个类:

  • 在当前文件夹下创建所需的文件夹结构,并将自动化类复制到其中。

mkdir('+vision/+labeler');copyfile(完整文件(matlabroot、'toolbox'、'driving'、'drivingdemos'、'AutoLaneMarking.m')、'+vision/+labeler');
  • 加载单眼信息进入工作区。

configData =负载(“birdsEyeConfig”);传感器= configData.birdsEyeConfig.Sensor;
加州理工大学cordova1.avi groundTruthLabeler
  • 在左侧窗格中,单击定义新的ROI标签按钮,并定义所示的ROI线条样式。然后单击OK。

  • 点击算法>选择算法>刷新列表

  • 点击算法>自动车道检测. 如果未看到此选项,请确保当前工作文件夹中有一个名为+视觉/ +贴标签机,文件名为AutoLaneMarking.m在里面。

  • 点击自动化。将打开一个新标签,显示使用算法的方向。

  • 点击设置,并在打开的对话框中输入传感器在第一个文本框中。如果需要修改其他参数,请单击好吧

  • 点击。车道检测算法在视频上进行。注意,在某些框架中结果并不令人满意。

  • 运行完成后,使用滑块或箭头键在视频中滚动,以定位算法失败的帧。

  • 手动调整结果,要么移动通道边界点或删除整个边界。

  • 对整个视频的车道边界满意后,单击接受

完成视频标注的自动车道检测部分。您可以继续标记其他感兴趣的对象、保存会话或导出此标记运行的结果。

结论

这个例子展示了将车道检测算法合并到地面实况贴标签机你可以将这个概念扩展到其他自定义算法,以简化和扩展应用程序的功能。

另见

应用程序

物体

相关的话题