主要内容

针对地面实况数据的评估车道边界检测

这个例子展示了如何比较地面实况数据与结果的车道边界检测算法。它还演示了如何使用这种比较优化算法参数获得最佳的检测结果。

概述

地面实况数据通常是在图像坐标,而边界建模工具坐标系。比较这两个涉及到坐标转换,因此需要额外的照顾在解释结果。驾驶决策是基于距离的车辆坐标系。因此,更有用的表达和理解的准确性要求使用物理单位车辆坐标而不是像素坐标。

视觉感知使用单眼相机描述了单眼相机的内部传感器和车道边界建模的过程。这个例子展示了如何评估这些模型的准确性对手动验证地面实况数据。后建立一个比较框架,该框架扩展到调整参数的最优性能的边界检测算法。

加载和地面实况数据做好准备

您可以使用地面实况贴标签机应用程序标记和标签车道边界在视频。这些注释车道边界表示为一组点放置在感兴趣的边界。有一组丰富的手工注释车道边界的各种驾驶场景是至关重要的评估和微调自动车道边界检测算法。设置的一个例子caltech_cordova1.avi视频文件是可用的工具。

负载预定义的左派和右派自我车道边界图像中指定的坐标。每个边界是由一组M-by-2数字代表M像素位置沿边界。每个视频帧最多两套这样的代表左边和右边的车道。

加载=负载(“caltech_cordova1_EgoBoundaries.mat”);传感器= loaded.sensor;% monoCamera对象相关gtImageBoundaryPoints = loaded.groundTruthData.EgoLaneBoundaries;%显示一个示例地面真理在这个帧索引frameInd = 36;%加载视频帧frameTimeStamp =秒(loaded.groundTruthData (frameInd:) .Time);videoReader = videoReader (loaded.videoName);videoReader。CurrentTime = frameTimeStamp;帧= videoReader.readFrame ();%获得左边的车道分帧boundaryPoints = gtImageBoundaryPoints {frameInd};leftLanePoints = boundaryPoints {1};图imshow(帧)情节(leftLanePoints (: 1) leftLanePoints (:, 2),“+”,“MarkerSize”10“线宽”4);标题(“左车道边界样本地面实况数据”);

图包含一个坐标轴对象。坐标轴对象与标题左车道边界样本地面实况数据包含2图像类型的对象,线。

地面实况分图像坐标转换为车辆坐标与边界模型,以便直接比较。执行这种转换,使用imageToVehicle与相关的函数monoCamera对象来执行这种转换。

gtVehicleBoundaryPoints =细胞(元素个数(gtImageBoundaryPoints), 1);frameInd = 1:元素个数(gtImageBoundaryPoints) boundaryPoints = gtImageBoundaryPoints {frameInd};如果~ isempty (boundaryPoints) ptsInVehicle =细胞(1,元素个数(boundaryPoints));cInd = 1:元素个数(boundaryPoints) ptsInVehicle {cInd} = imageToVehicle(传感器、boundaryPoints {cInd});结束gtVehicleBoundaryPoints {frameInd} = ptsInVehicle;结束结束

使用单眼传感器模型上边界

运行一个车道边界建模算法对样本视频获得的测试数据比较。在这里,重用helperMonoSensor模块介绍了视觉感知使用单眼相机的例子。在处理视频,一个额外的步骤是需要返回检测到的边界模型。这个逻辑是裹着一个helper函数,detectBoundaries定义在这个例子。

monoSensor = helperMonoSensor(传感器);边界= detectBoundaries(加载。videoName monoSensor);

评估车道边界模型

使用evaluateLaneBoundaries函数中找到匹配这些边界的数量界限地面真理。地面真理是分配给一个测试边界只有点地面真理都是在指定的距离,外侧,从相应的测试边界。如果多个地面实况边界满足这个标准,最小最大横向距离的选择。其余的是标记为假阳性。

阈值= 0.25;%在车辆坐标系(米)[numMatches, numMisses numFalsePositives、作业]=evaluateLaneBoundaries(边界,gtVehicleBoundaryPoints,阈值);disp ([的匹配:num2str (numMatches)]);
匹配数量:402
disp ([的失误:num2str (numMisses)]);
想念:43
disp ([的假阳性的数量:num2str (numFalsePositives)]);
假阳性的数量:30

您可以使用这些原始计数来计算精度等统计数据,回忆,和F1分数:

精度= numMatches / (numMatches + numFalsePositives);disp ([的精度:num2str(精密)]);
精度:0.93056
回忆= numMatches / (numMatches + numMisses);disp ([的灵敏度/回忆:num2str(召回)]);
灵敏度/回忆:0.90337
f1Score = 2 *(精度*召回)/(精度+回忆);disp ([的F1分数:num2str (f1Score)]);
F1得分:0.91676

可视化结果使用一个鸟瞰的阴谋

evaluateLaneBoundaries此外返回每个成功匹配的任务指标地面真理和测试之间的边界。这可以用于可视化检测和地面真理边界更好地了解故障模式。

找到一个有一个匹配的帧边界和一个假阳性。每一帧的地面实况数据有两个边界。因此,候选人将有两个帧分配指标,其中一个是0来表示一个假阳性。

hasMatch = cellfun (@ (x)元素个数(x) = = 2,作业);hasFalsePositive = cellfun (@ (x) nnz (x) = = 1,作业);frameInd =找到(hasMatch&hasFalsePositive 1“第一”);frameVehiclePoints = gtVehicleBoundaryPoints {frameInd};frameImagePoints = gtImageBoundaryPoints {frameInd};frameModels = {frameInd}边界;

使用作业的输出evaluateLaneBoundaries找到匹配的模型(真阳性)和模型不匹配(假阳性)的地面真理。

matchedModels = frameModels(作业{frameInd} ~ = 0);fpModels = frameModels(作业{frameInd} = = 0);

建立一个鸟瞰的情节和可视化地面实况点和模型。

cep = birdsEyePlot ();gtPlotter = laneBoundaryPlotter (cep),“DisplayName的”,“地面实况”,“颜色”,“蓝”);tpPlotter = laneBoundaryPlotter (cep),“DisplayName的”,“真阳性”,“颜色”,“绿色”);fpPlotter = laneBoundaryPlotter (cep),“DisplayName的”,“假阳性”,“颜色”,“红色”);plotLaneBoundary (gtPlotter frameVehiclePoints);plotLaneBoundary (tpPlotter matchedModels);plotLaneBoundary (fpPlotter fpModels);标题(“鸟”眼中的情节比较的结果”);

图包含一个坐标轴对象。坐标轴对象与标题鸟瞰图的情节比较结果包含3线类型的对象。这些对象代表地面实况,真阳性、假阳性。

可视化的结果在一个视频摄像头和鸟瞰图

得到更好的结果,你也可以想象地面实况点和边界模型的视频。

得到相对应的框架感兴趣的框架。

videoReader = videoReader (loaded.videoName);videoReader。CurrentTime =秒(loaded.groundTruthData.Time (frameInd));帧= videoReader.readFrame ();

考虑到边界模型作为一个实线(无论多么传感器分类)可视化。

fpModels。BoundaryType =“固体”;matchedModels。BoundaryType =“固体”;

插入匹配模型,假阳性和地面真实点。这个情节是有用的在推导人行横道的存在构成了具有挑战性的场景边界建模算法。

xVehicle = 3;帧= insertLaneBoundary(框架、fpModels、传感器、xVehicle“颜色”,“红色”);帧= insertLaneBoundary(框架、matchedModels、传感器、xVehicle“颜色”,“绿色”);图哈=轴;imshow(帧,“父”,哈);%将左和右边界点boundaryPoints = [frameImagePoints {1}; frameImagePoints {2});持有情节(哈,boundaryPoints (: 1), boundaryPoints (:, 2),“+”,“MarkerSize”10“线宽”4);标题(比较结果的相机视图);

图包含一个坐标轴对象。坐标轴对象标题相机视图的比较结果包含2图像类型的对象,线。

你也可以想象中的结果这个框架的鸟瞰图。

birdsEyeImage = transformImage (monoSensor.BirdsEyeConfig,框架);xVehicle = 3;birdsEyeImage = insertLaneBoundary (birdsEyeImage fpModels monoSensor。BirdsEyeConfig xVehicle,“颜色”,“红色”);birdsEyeImage = insertLaneBoundary (birdsEyeImage matchedModels monoSensor。BirdsEyeConfig xVehicle,“颜色”,“绿色”);%将左和右边界点ptsInVehicle = [frameVehiclePoints {1}; frameVehiclePoints {2});gtPointsInBEV = vehicleToImage (monoSensor。BirdsEyeConfig ptsInVehicle);图imshow (birdsEyeImage);持有情节(gtPointsInBEV (: 1) gtPointsInBEV (:, 2),“+”,“MarkerSize”10“线宽”4);标题(“鸟”眼中的看法比较结果”);

图包含一个坐标轴对象。坐标轴对象标题鸟瞰图的比较结果包含2图像类型的对象,线。

优化边界建模参数

您可以使用前面描述的评价框架的调整参数车道边界检测算法。helperMonoSensor公开三个参数控制lane-finding算法的结果。

  • LaneSegmentationSensitivity——控制的灵敏度segmentLaneMarkerRidge函数。这个函数返回巷候选点以二进制的形式车道功能的面具。灵敏度的值可能会有所不同从0到1,缺省为0.25。增加这个数字导致更多巷候选点和潜在错误的检测。

  • LaneXExtentThreshold——指定的最小范围(长度)的车道。表示为一个检测车道长度比相机指定的最大车道长度的配置。默认值是0.4。增加这个数字拒绝短车道边界。

  • LaneStrengthThreshold——指定最小归一化强度接受检测车道边界。

LaneXExtentThresholdLaneStrengthThreshold是来自于XExtent强度的属性parabolicLaneBoundary对象。这些属性的一个例子可以放置在额外的约束边界建模算法来获得可接受的结果。不同的影响LaneStrengthThreshold有额外的细微差别值得探索。典型的车道边界是用实线或虚线标记。当比较实线,虚线较低数量的内围层点,导致较低的强度值。这使它具有挑战性的阈值设定一个共同的力量。检查该参数的影响,首先生成边界通过设置LaneStrengthThreshold为0。这个设置可以确保它没有对输出的影响。

monoSensor。LaneStrengthThreshold = 0;边界= detectBoundaries (“caltech_cordova1.avi”,monoSensor);

LaneStrengthThreshold的属性helperMonoSensor控制规范化强度参数的parabolicLaneBoundary模型。归一化因子,MaxLaneStrength,是一个虚拟的力量车道运行的全部鸟瞰的形象。这个值只取决于birdsEyeView的配置helperMonoSensor。评估的影响LaneStrengthThreshold,首先计算出所有检测到的规范化巷的优势分布边界在样例视频。注意存在两个明显的峰值,一个归一化强度为0.3和0.7。这两个峰分别对应冲和固体车道边界。从这个情节,可以根据经验确定,以确保虚线车道边界被检测到,LaneStrengthThreshold应低于0.3。

优势= cellfun (@ (b) (b。强度),边界,“UniformOutput”、假);优势=(优势{:});normalizedStrengths = / monoSensor.MaxLaneStrength优势;图;嘘(normalizedStrengths);标题(归一化的直方图巷优势”);

图包含一个坐标轴对象。坐标轴对象与标题的归一化直方图巷优势包含一个补丁类型的对象。该对象代表normalizedStrengths。

您可以使用比较框架进一步评估的影响LaneStrengthThreshold参数对建模算法的检测性能。请注意,阈值值控制模型和地面之间的最大物理距离真理仍然与以前一样。这个值是由ADAS系统的精度要求,通常不会改变。

阈值=升至;[~,~,~,作业]=evaluateLaneBoundaries(边界,gtVehicleBoundaryPoints,阈值);

本每个边界根据其归一化强度。的作业信息帮助每个分类边界是一个真正的积极(匹配)或假阳性。LaneStrengthThreshold是一个“敏”阈值,所以在给定边界划分为一个真正的积极价值将继续是一个真正的积极降低阈值。

nMatch = 0 (1100);%规范化巷力量斗成100箱nFP = 0 (1100);%从0.01到1.00不等。frameInd = 1:元素个数(边界)frameBoundaries = {frameInd}边界;frameAssignment =作业{frameInd};绑定= 1:元素个数(frameBoundaries) normalizedStrength = frameBoundaries(绑定).Strength / monoSensor.MaxLaneStrength;strengthBucket =地板(normalizedStrength * 100);如果frameAssignment(绑定)%这个边界是与地面真理边界,%记录作为一个真正的积极力量的所有值%其强度值。nMatch (1: strengthBucket) = nMatch (1: strengthBucket) + 1;其他的%这是一个假阳性nFP临界多边形求解(1:strengthBucket) = (1: strengthBucket) + 1;结束结束结束

使用这些信息来计算“错过”的数量界限,即地面实况边界算法未能在指定的检测LaneStrengthThreshold价值。和这些信息,计算精度和召回指标。

gtTotal =总和(cellfun (@ (x)元素个数(x) gtVehicleBoundaryPoints));nMiss = gtTotal - nMatch;precisionPlot = nMatch。/(临界多边形求解nMatch +);recallPlot = nMatch。/ (nMatch + nMiss);

图的精度和召回指标对各种车道强度阈值参数的值。这张图是有用的在决定巷强度参数的最优值。对于这个视频,回忆和精度指标,最大化LaneStrengthThreshold应该在0.20 - 0.25范围。

图;情节(precisionPlot);持有;情节(recallPlot);包含(“LaneStrengthThreshold * 100”);ylabel (的精度和召回);传奇(“精度”,“回忆”);标题(“LaneStrengthThreshold对精度和召回的影响指标”);

图包含一个坐标轴对象。坐标轴对象与标题LaneStrengthThreshold对精度和召回的影响指标包含2线类型的对象。这些对象代表精密,召回。

万博1manbetx支持函数

检测视频中的边界。

detectBoundaries使用一个预先配置的helperMonoSensor视频对象检测边界。

函数边界= detectBoundaries (videoName monoSensor) videoReader = videoReader (videoName);hwb = waitbar (0,“在视频检测和建模边界…”);closeBar = onCleanup(@()删除(hwb));frameInd = 0;边界= {};hasFrame (videoReader) frameInd = frameInd + 1;帧= readFrame (videoReader);sensorOut = processFrame (monoSensor,框架);%保存边界模型{结束+ 1}=边界[sensorOut。leftEgoBoundary sensorOut.rightEgoBoundary);% #好< AGROW >waitbar (frameInd / (videoReader.Duration * videoReader.FrameRate), hwb);结束结束

另请参阅

应用程序

功能

相关的话题