主要内容

自动地真实标记车道边界

这个例子展示了如何开发一种算法来自动标记车道边界地面真相标签应用程序。

Ground Truth Labeler应用

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

创建一个车道检测算法

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

configData = load(“birdsEyeConfig”);sensor = configdata . birdseyeconfig .传感器;monoSensor = helperMonoSensor(传感器);I = imread(“road.png”);sensorOut = processFrame(monoSensor, I);lb = sensorOut.leftEgoBoundary;图IwithLane = insertLaneBoundary(I, lb, sensor, [3 30],“颜色”“蓝”);imshow (IwithLane);标题(“检测到左车道边界模型”);

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

Mark Lane边界点

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

ROI = [3 30];xPoints = [3 3.5 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)标题(“自动标记车道边界点”);持有

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

准备车道检测自动化课程

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

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

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

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

%--------------------------------------------------------------------- % 第二步:定义属性中使用的算法。这些是%用户定义属性,可以定义为管理算法%执行。property %MonoCamera %与此视频关联的MonoCamera对象MonoCamera = [];%MonoCameraVarname MonoCameraVarname = ";创建鸟瞰视图所需的birdsEyeView对象BirdsEyeConfig = [];%MaxNumLanes %算法尝试注释的最大车道数MaxNumLanes = 2;%ROI %用于搜索%车道的车辆周围感兴趣区域ROI = [3,30, - 3,3];segmentLaneMarkerRidge函数中使用的灵敏度参数LaneMaskSensitivity = 0.25;车道边界宽度,用于find抛物线laneboundaries LaneBoundaryWidth = 0.6;%XPoints %标记车道边界的x轴点XPoints = [3 3.5 4 4.5 5 6 7 10 30]; end

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

(~, labelDef) %车道检测仅适用于Line类型标签TF = labelDef。Type == labelType.Line;结束

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

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

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

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

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

函数initialize(~, ~, ~)结束

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

函数autoLabels = run(algObj, I) Ig = im2gray(I);birdsEyeViewImage = transformImage(algObj.)BirdsEyeConfig,搞笑);birdsEyeViewBW = segmentLaneMarkerRidge(…algObj。BirdsEyeConfig algObj。LaneBoundaryWidth,……“敏感性”,algObj.LaneMaskSensitivity);
%获取世界坐标[imageX, imageY] = find(birdsEyeViewBW);boundaryPointsxy = imageToVehicle(algObj.;)BirdsEyeConfig, [imageY, imageX]);
匹配请求的边界数量到它lbs = find抛物线线边界(…boundaryPointsxy algObj。LaneBoundaryWidth,……MaxNumBoundaries, algObj.MaxNumLanes);numDetectedLanes =数字(磅);
将模型转换为指定% x坐标的离散点集合boundaryPoints = cell(1,numDetectedLanes);xPoints = algObj.XPoints';for ind = 1:数值(lbs) yPoints = lbs(ind).computeBoundaryModel(xPoints);boundaryPoints{ind} = 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 = load('birdsEyeConfig');sensor = configdata . birdseyeconfig .传感器;
groundTruthLabeler caltech_cordova1.avi
  • 在左侧窗格中,单击定义新的ROI标签按钮并定义所示的ROI线样式。单击“确定”。

  • 点击Algorithm >选择“Algorithm >刷新列表”

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

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

  • 点击设置,在弹出的对话框中输入传感器在第一个文本框中。单击前,可修改其他参数好吧

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

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

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

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

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

结论

该示例显示了将车道检测算法合并到地面真相标签您可以将此概念扩展到其他自定义算法,以简化和扩展应用程序的功能。

另请参阅

应用程序

对象

相关的话题