主要内容

自动化地面实况标签的车道边界

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

地面真理贴标签机应用

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

创建一个车道检测算法

首先,创建一个车道检测算法。的视觉感知使用单眼相机例子描述的过程检测车道边界,和helperMonoSensor成一个类包算法,可重用的类。试算法在单个视频帧检测左自我车道边界。

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

图包含一个坐标轴对象。坐标轴对象与标题发现左车道边界模型包含一个图像类型的对象。

马克车道边界点

在前一步是一个检测到的车道模型,必须转换为一组离散点。这些点类似用户可能手动在形象。在相机视图中,部分车道边界靠近车辆(低相机图像的一部分)将跨度比进一步部分像素。因此,用户将更多的分更高的信心较低地区的相机图像。复制这种行为,确定车道边界位置从边界模型更密集点靠近车辆。

投资回报率= 30 [3];xPoints = 3.5 [3 4 5 7 12 30];%更稠密靠近车辆yPoints = lb.computeBoundaryModel (xPoints);%找到对应的图像的位置。boundaryPointsOnImage = vehicleToImage(传感器、[xPoints yPoints]);imshow (I)情节(boundaryPointsOnImage (: 1) boundaryPointsOnImage (:, 2),“o”,“MarkerEdgeColor”,“b”,“MarkerFaceColor”,“b”,“MarkerSize”10)标题(“自动标记车道边界点”);持有

图包含一个坐标轴对象。坐标轴对象与标题自动标记车道边界点包含2图像类型的对象,线。

准备的车道检测自动化类

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

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

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %步骤1:定义所需的属性描述算法。这个百分比包括名称、描述和UserDirections。属性(常数)
%的名字:给你的算法的名称。Name = '巷探测器;
%描述:为你的算法提供一行描述。描述=“自动检测lane-like特性”;
% UserDirections:提供一组方向显示%时调用这个算法。方向%的单元阵列提供字符%向量,每个元素的单元阵列%代表的方向迈出的一步。UserDirections = {…“加载MonoCamera配置对象从工作区使用设置面板的,…“在设置面板中指定其他参数”,…“运行算法”,…如果需要手动检查和修改结果的};结束

步骤2包含核心算法所需的自定义属性。必要的属性确定的车道检测和莱恩点创建节以上。

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %步骤2:定义属性中使用的算法。这些都是% %用户定义的属性,可以定义管理算法执行。% MonoCamera % MonoCamera对象属性与这个视频MonoCamera = [];% MonoCameraVarname %工作区monoCamera对象的变量名MonoCameraVarname = ";% BirdsEyeConfig % birdsEyeView对象需要创建鸟瞰BirdsEyeConfig = [];% MaxNumLanes %的最大车道数算法试图注释MaxNumLanes = 2;% ROI %感兴趣的地区周围的车辆用于搜索%车道ROI =[3, 30日3,3];% LaneMaskSensitivity % segmentLaneMarkerRidge函数使用的参数敏感性LaneMaskSensitivity = 0.25;% LaneBoundaryWidth %车道边界宽度,用于findParabolicLaneBoundaries LaneBoundaryWidth = 0.6;% XPoints %的轴点的车道边界XPoints = 4.5 3.5 [3 4 5 6 7 10 30); end

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

labelDef函数= checkLabelDefinition特遣部队(~)%车道检测仅适用于线类型标签= labelDef特遣部队。类型= = labelType.Line;结束

下一个函数checkSetup。注意,这个算法需要一个monoCamera传感器配置可用。所有其他属性定义了合理的默认值。

函数= checkSetup特遣部队(algObj, ~)这是唯一需要输入TF = ~ isempty (algObj.MonoCamera);结束

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

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

步骤4指定的执行功能。一些自动化算法需要实现一个初始化常规填充算法的初始状态基于现有的标签应用。这车道检测算法适用于独立每一帧,所以默认版本的模板已经削减了不要采取任何行动。

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

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

函数autoLabels =运行(algObj,我)搞笑= im2gray(我);birdsEyeViewImage = transformImage (algObj。BirdsEyeConfig,搞笑);birdsEyeViewBW = segmentLaneMarkerRidge (birdsEyeViewImage,……algObj。BirdsEyeConfig algObj。LaneBoundaryWidth,……“敏感性”,algObj.LaneMaskSensitivity);
%获得巷候选点在世界坐标系中[imageX imageY] =找到(birdsEyeViewBW);boundaryPointsxy = imageToVehicle (algObj。BirdsEyeConfig [imageY imageX]);
%符合要求的数量界限磅= findParabolicLaneBoundaries (…boundaryPointsxy algObj。LaneBoundaryWidth,……MaxNumBoundaries, algObj.MaxNumLanes);numDetectedLanes =元素个数(磅);
%将模型转换为离散点集在指定% x坐标boundaryPoints =细胞(1,numDetectedLanes);xPoints = algObj.XPoints ';印第安纳州= 1:元素个数伦敦商学院(lbs) yPoints =(印第安纳州).computeBoundaryModel (xPoints);boundaryPoints{印第安纳}= vehicleToImage (algObj。MonoCamera [xPoints yPoints]);结束
%打包在一个结果表autoLabels =表(…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在里面。

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

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

  • 点击运行。视频上的车道检测算法的进展。注意,结果并不令人满意的帧。

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

  • 手动调整结果通过移动车道边界点或删除整个边界。

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

汽车车道检测视频完成标签的一部分。你可以进行标签感兴趣的其他对象,保存会话,或出口标识运行的结果。

结论

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

另请参阅

应用程序

对象

相关的话题