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

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

地面真理标签应用程序

良好的地面真值数据是开发驱动算法和评估其性能的关键。然而,创建一组丰富多样的带注释的驾驶数据需要大量的时间和资源。的地面实况贴标签机应用使得这一过程中有效。你可以使用这个应用程序作为一个完全人工标注工具标记的车道边界,车辆包围盒,以及对视觉系统感兴趣的其他对象。然而,手动标记需要的时间和资源显著量。这个程序还提供了一种框架,以创建算法,以延伸和自动化贴标签过程。您可以使用您创建快速标记整个数据集的算法,然后用更高效,更短的人工验证步骤跟进。您还可以编辑的自动化步骤的结果,以考虑挑战场景的自动化算法可能会错过。这个例子说明如何插入一个车道检测算法到应用程序的自动化工作流程。

创建一个车道检测算法

首先,创建一个车道检测算法。的使用单目摄像机进行视觉感知实例描述了车道边界检测的过程helperMonoSensor类将该算法打包为单个可重用类。在单个视频帧上尝试该算法来检测左自我车道边界。

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

标记道界线点

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

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

准备车道检测自动化课程

要将此车道检测算法合并到app的自动化工作流中,需要构造一个继承自抽象基类的类vision.labeler.AutomationAlgorithm。这个基类定义了应用程序用于配置和运行自定义算法的方法的属性和签名。Ground Truth Labeler应用程序提供了一种获取初始自动化类模板的方便方法。有关详细信息,请参见创建自动标记算法(计算机视觉工具箱)。的AutoLaneMarking类此模板的基础关闭,为您提供了车道检测准备使用的自动化类。类的评论概述实现每个API调用所需的基本步骤。

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

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

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

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %步骤2:定义属性中使用的算法。这些是%用户定义的属性,可以定义它们来管理算法%的执行。属性%MonoCamera %MonoCamera对象与此视频MonoCamera = [];%MonoCameraVarname % monoCamera对象的工作空间变量名MonoCameraVarname = ";创建鸟瞰视图所需的鸟瞰视图对象BirdsEyeConfig = [];MaxNumLanes %最大车道数算法尝试标注MaxNumLanes = 2;%ROI %用于搜索车辆周围感兴趣区域的% lane ROI = [3, 30, -3, 3];lanemarkerridge函数中使用的灵敏度参数LaneMaskSensitivity = 0.25;车道边界宽度,在findParabolicLaneBoundaries中使用,laneywidth = 0.6;%XPoints %标记车道边界的x轴点XPoints = [3 3.5 4 4.5 5 6 7 10 30]; end

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

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

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

函数TF = 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 = run(algObj, I) Ig = rgb2gray(I);birdsEyeViewImage = transformImage (algObj。BirdsEyeConfig,搞笑);birdsEyeViewBW = segmentLaneMarkerRidge(birdsEyeViewImage,…algObj。BirdsEyeConfig algObj。LaneBoundaryWidth,……“敏感性”,algObj.LaneMaskSensitivity);
%获得世界坐标道候选点[IMAGEX,图像j] =查找(birdsEyeViewBW);boundaryPointsxy = imageToVehicle(algObj.BirdsEyeConfig,[宜美,IMAGEX]);
匹配请求的边界数,lbs = findParabolicLaneBoundaries(…boundaryPointsxy algObj。LaneBoundaryWidth,……MaxNumBoundaries, algObj.MaxNumLanes);numDetectedLanes =元素个数(磅);
%的模型转换为离散的点的集合在指定%X坐标boundaryPoints =细胞(1,numDetectedLanes);xPoints = algObj.XPoints';对于IND = 1:numel(磅)ypoints中=磅(IND).computeBoundaryModel(xPoints);boundaryPoints {IND} = vehicleToImage(algObj.MonoCamera,[xPoints,ypoints中]);结束
%包装起来的表autoLabels结果=表(... boundaryPoints',... repmat(labelType.Line,[numDetectedLanes,1]),... repmat(algObj.SelectedLabelDefinitions.Name,[numDetectedLanes,1]));autoLabels.Properties.VariableNames = { '位置', '类型', '名称'};结束

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

函数终止(~)

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

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

  • 创建当前文件夹下所需的文件夹结构,自动化类复制到它。

mkdir(“+视觉/ +贴标签机”);拷贝文件(fullfile (matlabroot,“工具箱”,“驾驶”,“drivingdemos”,“AutoLaneMarking.m”),“+视觉/ +贴标签机”);
configData =负载( 'birdsEyeConfig');传感器= configData.birdsEyeConfig.Sensor;
groundTruthLabeler caltech_cordova1.avi
  • 在左侧窗格中,单击定义新的ROI标签按钮并定义出的ROI线条样式。然后点击确定。

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

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

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

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

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

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

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

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

标记视频的自动车道检测部分已经完成。你可以用标记目的的其他对象,保存会话进行,或导出这个标签运行的结果。

结论

这个例子说明的步骤,将车道检测算法进地面实况贴标签机您可以将此概念扩展到其他自定义算法,以简化和扩展应用程序的功能。

另请参阅

应用程序

对象

相关话题