该示例演示了如何开发一种自动标记车道边界的算法地面真理贴标机应用程序。
良好的地面真实数据对于开发驾驶算法和评估其性能至关重要。然而,创建一组丰富多样的带注释的驾驶数据需要大量的时间和资源。的地面真理贴标机应用程序使此过程有效。您可以使用此应用程序作为标记车道边界,车辆边界框和视觉系统感兴趣对象的完整手动注释工具。但是,手动标签需要大量的时间和资源。此应用程序还提供了一个框架,用于创建算法以扩展和自动化标记过程。您可以使用您创建的算法快速标记整个数据集,然后使用更高效,更短的手动验证步骤进行跟踪。您还可以编辑自动化步骤的结果,以考虑自动化算法可能错过的具体场景。此示例描述了如何将车道检测算法插入应用程序的自动化工作流程。
首先,创建一个车道检测算法。这个单目相机的视觉感知示例描述了检测车道边界的过程helperMonoSensor
类将该算法打包为一个可重用的类。在单个视频帧上尝试该算法以检测左侧车道边界。
configdata = load(“birdsEyeConfig”); sensor=configData.birdsEyeConfig.sensor;单传感器=辅助单传感器(传感器);I=imread(“road.png”); sensorOut=processFrame(单传感器,I);lb=传感器输出。左边界;图I WithLane=插入式Lane基础(I、lb、传感器,[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)在绘图(边界点(:,1),boundaryPointsonImage(:,2),...“o”,...'markeredgecolor',“b”,...“MarkerFaceColor”,“b”,...'Markersize',10)头衔(“自动标记行车线边界点”); 持有远离的
要将此车道检测算法合并到应用程序的自动化工作流中,请构造一个从抽象基类继承的类vision.labeler.AutomationAlgorithm
. 此基类定义应用程序用于配置和运行自定义算法的方法的属性和签名。Ground Truth Labeler应用程序提供了获取初始自动化类模板的方便方法。有关详细信息,请参阅创建自动标记算法.的AutolanMarking.
类是基于此模板,并为您提供车道检测的即用自动化类。课程的评论概述了实现每个API调用所需的基本步骤。
步骤1包含定义算法名称和描述的属性,以及使用算法的说明。
%---------------------------------------------------------------------- % 步骤1:定义所需的属性描述算法。这%包括名称、描述和用户指示。属性(常数)
%名称:为您的算法命名。名称=‘车道检测器’;
%描述:提供算法的单行描述。描述='自动检测车道状功能';
% UserDirections:提供在调用此算法时显示的一组方向。方向%将作为字符%向量的单元数组提供,单元数组%中的每个元素表示方向列表中的一个步骤。UserDirections ={…“使用设置面板从工作区加载moncamera配置对象”,…“在设置面板中指定附加参数”,…“运行算法”,…'手动检查和修改结果,如果需要'};结束
步骤2包含核心算法所需的自定义属性。必要的属性是由前面的车道检测和车道点创建部分确定的。
%---------------------------------------------------------------------%2步:定义算法期间要使用的属性。这些是%用户定义的属性,可以定义这些属性来管理算法%的执行。属性%MonoCamera%与此视频关联的MonoCamera对象MonoCamera=[];%MonoCameraVarname%monoCamera对象的工作区变量名称MonoCameraVarname=''BirdsEyeConfig%创建鸟瞰视图BirdsEyeConfig=[];%MaxNumLanes%算法尝试注释MaxNumLanes的最大车道数=2;%ROI%用于搜索%车道ROI=[3,30,-3,3];%LaneMaskSensitivity%分段LaneMarkerRidge函数中使用的灵敏度参数LaneMaskSensitivity=0.25;%LaneBoundaryWidth%车道边界宽度,用于FindParabolicLaneBoundaryWidth=0.6;%XPoints%用于标记车道边界的x轴点XPoints=[3.5 4.5 5 6 7 10 30];结束
步骤3涉及函数定义。第一个函数,核对标准义法
,确保仅启用适当类型的标签以实现自动化。对于车道检测,您需要确保只有类型的标签行
已启用,因此此版本的函数将检查类型
的标签:
函数TF=checkLabelDefinition(~,LabelDefinition)%Lane detection仅适用于线型标签TF=LabelDefinition.type==labelType.Line;结束
下一个函数是checkSetup
.注意这个算法要求一个monoCamera
传感器配置可用。所有其他属性都定义了合理的默认值。
函数tf = checksetup(allobj,〜)%这是唯一必需的输入tf =〜isempty(allobj.monocamera);结束
接下来,setserstDialog.
函数获取并修改步骤2中定义的属性。这个API调用允许您创建一个对话框,当用户单击设置按钮自动化标签。要创建此对话框,请使用输入
函数快速创建一个简单的模式窗口,要求用户指定monoCamera
对象。下面的代码片段概述了基本语法。完整的AutolanMarking.
代码扩展了这个逻辑,并添加了输入验证步骤。
%描述了输入提示= {...'输入monocamera变量名',...'最大车道数量,...};defaultanswer = {...'',... num2str(2),...};
%创建一个输入对话框名称= '车道检测设置';numLines = 1;选项。调整= '在';选项。WindowStyle =“正常”;选项。翻译= '没有';回答= inputdlg(提示,名称、numLines defaultAnswer,选项);
%获取输入monoCameraVarname = answer{1};maxNumberOfLanes =回答{2};
步骤4指定执行函数。一些自动化算法需要实现一个初始化
例程根据应用程序中的现有标签填充初始算法状态。该车道检测算法独立地在每个帧上工作,因此模板的默认版本已被修剪以不采取任何动作。
函数初始化(~,~,~)结束
接下来,运行
功能定义了此自动化类的核心通道检测算法。运行
呼叫每个视频框架,并希望自动化类返回一组标签。的运行
功能在AutolanMarking.
包含先前介绍的用于车道检测和点转换的逻辑。代码从helperMonoSensor
也被折叠在一个更紧凑的参考。
函数autolabels =运行(allobj,i)ig = im2gray(i);BirdseyeviewImage = Transportimage(Algobj.birdseyeconfig,Ig);Birdseyeviewbw = segmentlanemarkerridge(birdseyeviewimage,... allobj.birdseyeconfig,Algobj.laneboundywidth,...'敏感性',Algobj.lanemasksity);
%获得世界坐标的车道候选点[imagex,imagey] = find(birdseyeviewbw);BuggenialPointsxy = ImageTovehicle(Algobj.birdseyeconfig,[Imagey,Imagex]);
% Fit请求的边界数量lbs = findParabolicLaneBoundaries(…boundaryPointsxy algObj。LaneBoundaryWidth,……MaxNumBoundaries, algObj.MaxNumLanes);numDetectedLanes =元素个数(磅);
%将模型转换为指定%x坐标边界点=单元格(1,NumDetcateLanes)的离散点。xpoints = algobj.xpoints';对于IND = 1:NUMER(LBS)YPOINTS = LBS(IND).computeBoutbaryModel(XPoints);边界点{ind} = vevicletoimage(allobj.monocamera,[xpoints,ypoints]);结束
%打包在表autolabels = table(... boundardpoint',... repmat(labeltype.line,[numdetectedlanes,1]),... repmat(algobj.selectedlabeldefefinitions.name,[numdetectedlanes,1]中的结果));autolabels.properties.variablenames = {'位置','type','name'};结束
最后,终止
函数处理自动化完成后所需的任何清理或拆除。此算法不需要任何清理,因此函数为空。
函数终止(~)
打包版本的车道检测算法现在已经准备好在AutolanMarking.
班级。要在应用程序中使用此类:
创建当前文件夹下所需的文件夹结构,然后将自动化类复制到其中。
mkdir(“+视觉/ +贴标签机”);拷贝文件(fullfile (matlabroot,“工具箱”,“驾驶”,“drivingdemos”,“AutoLaneMarking.m”),“+视觉/ +贴标签机”);
加载monoCamera
信息进入工作区。
configdata = load('birdseyeconfig');sensor = configdata.birdseyeconfig.sensor;
打开地面真理贴标机应用程序。
groundTruthLabeler caltech_cordova1.avi
在左侧窗格中,单击定义新的投资回报标签按钮,并定义所示的ROI线条样式。然后单击OK。
点击算法>选择算法>刷新列表.
点击算法>自动车道检测.如果没有看到此选项,请确保当前工作文件夹中有一个名为+ Vision / +贴标程序
,文件名为自动LaneMarking.m
在里面。
点击自动化.一个新的选项卡将打开,显示使用该算法的方向。
点击设置,然后在打开的对话框中,输入传感器
在第一个文本框中。如果需要修改其他参数,请单击好的.
点击运行. 车道检测算法在视频上进行。请注意,某些帧中的结果并不令人满意。
运行完成后,使用滑块或箭头键滚动视频以定位算法失败的帧。
通过移动车道边界点或删除整个边界手动调整结果。
一旦你对整个视频的车道边界感到满意,点击接受.
完成视频标注的自动车道检测部分。您可以继续标记其他感兴趣的对象、保存会话或导出此标记运行的结果。
此示例显示将车道检测算法结合到的步骤地面真理贴标机应用程序。您可以将此概念扩展到其他自定义算法,以简化和扩展应用程序的功能。