主要内容

自动地面真相标记车道边界

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

地面真相标签应用程序

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

创建一个车道检测算法

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

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);标题(“侦测左车道边界模型”);

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

马克巷边界点

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

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

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

准备车道检测自动化类

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

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

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

步骤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;结束

下一个函数是checkSetup.注意这个算法需要一个monoCamera准备好传感器配置。所有其他属性都定义了合理的默认值。

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

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

%描述输入提示={…输入moncamera变量名,…“最大车道数”,…};defaultAnswer ={…”,……num2str(2),……};
%创建一个输入对话框名称= '车道检测设置';numLines = 1;选项。调整= '在';选项。WindowStyle =“正常”;选项。翻译= '没有';回答= inputdlg(提示,名称、numLines defaultAnswer,选项);
%获取输入monoCameraVarname = answer{1};maxNumberOfLanes =回答{2};

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

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

接下来,运行函数定义了这个自动化类的核心车道检测算法。运行为每个视频帧调用,并期望自动化类返回一组标签。的运行函数AutoLaneMarking包含先前介绍的用于车道检测和点转换的逻辑。代码从helperMonoSensor也被折叠在一个更紧凑的参考。

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]);
% Fit请求的边界数量lbs = findParabolicLaneBoundaries(…boundaryPointsxy algObj。LaneBoundaryWidth,……MaxNumBoundaries, algObj.MaxNumLanes);numDetectedLanes =元素个数(磅);
将模型转换为指定% 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(“+视觉/ +贴标签机”);拷贝文件(fullfile (matlabroot,“工具箱”,“驾驶”,“drivingdemos”,“AutoLaneMarking.m”),“+视觉/ +贴标签机”);
configData =负载(“birdsEyeConfig”);传感器= configData.birdsEyeConfig.Sensor;
groundTruthLabeler caltech_cordova1.avi
  • 在左侧窗格中,单击定义新的ROI标签按钮,并定义所示的ROI线条样式。然后单击OK。

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

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

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

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

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

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

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

  • 一旦你对整个视频的车道边界感到满意,点击接受

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

结论

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

另请参阅

应用程序

对象

相关的话题