主要内容

用于语义分割的自动地面真值标注

此示例显示如何使用佩带的语义分段算法在图像中段分割天空和道路,并使用该算法在实践中自动化地面实况贴标签机应用程序。

地面真相标签应用程序

良好的地面真实数据对于开发自动驾驶算法和评估其性能至关重要。然而,创建和维护一组多样化和高质量的带注释的驾驶数据需要付出巨大的努力地面实况贴标签机此应用程序使此过程变得简单高效。此应用程序包括将对象注释为矩形、直线或像素标签的功能。像素标签是一个过程,在该过程中,图像中的每个像素都被分配一个类或类别,然后可用于训练像素级分割算法。尽管您可以使用此应用程序手动标记所有图像ata,此过程需要大量的时间和资源,尤其是在像素标记方面。作为替代方案,该应用程序还提供了一个框架,用于合并算法以扩展和自动化标记过程。您可以使用创建的算法自动标记整个数据集,然后以更高效、更短的时间结束手动验证步骤。您还可以编辑自动化步骤的结果,以考虑算法可能遗漏的具有挑战性的场景。

在这个例子中,你会:

  • 使用预先训练的分割算法分割属于“道路”和“天空”类别的像素。

  • 创建一个可以在Ground Truth Labeler应用程序中使用的自动化算法来自动标记道路和天空像素。

这些地面真值数据可以用来训练新的语义分割网络,或者重新训练现有的语义分割网络。

创建一个道路和天空检测算法

首先,创建一个语义分割算法,分割图像中的道路和天空像素。的基于深度学习的语义分割示例描述了如何训练一个用于语义分段的深度学习网络。该网络经过训练可预测11类语义标签,包括“Road”和“Sky”。这些网络的性能取决于它们的泛化程度。将这些网络应用于训练期间未遇到的情况可能会导致出现次等级r结果:在学习过程中反复引入自定义训练数据可以使网络在类似数据集上表现更好。

下载一个网络,这是预先训练的CamVid数据集[1][2]来自剑桥大学

pretrainedURL =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/vision/data/segnetVGG16CamVid.mat”;pretrainedFolder = fullfile (tempdir,“pretrainedSegNet”);pretrinedsegnet = fullfile(pretrinedfolder,“segnetVGG16CamVid.mat”);如果~存在(pretrainedSegNet“文件”如果~存在(pretrainedFolder“dir”)mkdir(预训练文件夹);结束disp('下载预训练SegNet(107 MB)…');websave(pretrainedSegNet,pretrainedURL);结束
下载预训练的SegNet (107 MB)…

分割图像并显示它。

%加载语义分段网络数据=负载(预训练SEGNET);从驱动数据加载一个测试映像RoadSequenceata = fullfile(toolboxdir(“开车”),“驱动数据”'逃跑'); I=imread(完整文件(roadSequenceData,“f00000.png”));%在映像上运行网络automatedLabels = semanticseg(I, data.net);%显示覆盖在图像上的标签,选择相关类别图中,imshow (labeloverlay (automatedLabels,我“包含标签”, [“天空”“路”]));

网络的输出在MATLAB®中表示为分类矩阵。列出的类别包括语义分割网络训练过的所有类别,而不仅仅是输出中出现的类别。此信息也可从网络对象本身获得。

data.net.Layers .ClassNames(结束)
%列出标记的像素类别类别(automatedLabels)
ans =11×1细胞{‘天空’}{“建筑”}{“极点”}{‘路’}{“路面”}{‘树’}{‘SignSymbol}{“栅栏”}{‘汽车’}{“行人”}{“骑自行车”}
%蓝色叠加表示“天空”类别,绿色叠加表示%表示“道路”。

回顾像素分割自动化类

通过创建从抽象基类继承的类来将此语义分段算法纳入应用程序的自动化工作流程vision.labeler.AutomationAlgorithm。此基类定义应用程序用于配置和运行算法的API。Ground Truth Labeler应用程序提供了获取初始自动化类模板的方便方法。有关详细信息,请参阅创建标签的自动化算法这个道路和天空分割类基于此模板,并为像素标签分割提供了一个随时可用的自动化类。

中的第一组属性道路和天空分割类指定算法的名称,提供它的简要描述,并给出使用它的说明。

属性(常数)
%Name %指定算法名称的字符向量。Name = ' RoadAndSkySegmentation '
%Description %指定算法简短描述的字符向量。Description = '该算法使用语义seg和预先训练的网络来标注道路和天空'
%UserDirections字符向量的单元格数组,指定用于使用算法的%算法用户要遵循的方向。UserDirections ={…[‘自动化算法是一种自动手动标记的方法’……的任务。这个AutomationAlgorithm自动创建像素',…“道路和天空”的标签。'],……['Review and Modify: Review automated labels over the interval ',…“使用播放控制。修改/删除/添加不属于'…'在这个阶段令人满意地自动化了。 If the results are ' ... 'satisfactory, click Accept to accept the automated labels.'], ... ['Accept/Cancel: If results of automation are satisfactory, ' ... 'click Accept to accept all automated labels and return to ' ... 'manual labeling. If results of automation are not ' ... 'satisfactory, click Cancel to return to manual labeling ' ... 'without saving automated labels.']}; end

报告的下一部分道路和天空分割类指定核心算法所需的自定义属性。的PretrainedNetwork属性持有预先训练的网络。的AllCategories属性保存所有类别的名称。

PretrainedNetwork保存SeriesNetwork对象,该对象执行语义%分割。PretrainedNetwork
% Categories保存默认的“背景”、“道路”和“天空”%类别类型。AllCategories ={‘背景’};
%存储“road”和“sky”的名称。RoadName SkyName结束

复选框定义中定义的第一个方法道路和天空分割,只检查类型的标签PixelLabel为自动化启用。PixelLabel是语义分割所需要的唯一类型。

函数TF = checkLabelDefinition(~, labelDef) isValid = false;
如果(strcmpi (labelDef。名称,'道路')&& labelDef。Type == labelType.PixelLabel) isValid = true;algObj。路Name = labelDef.Name; algObj.AllCategories{end+1} = labelDef.Name; elseif (strcmpi(labelDef.Name, 'sky') && labelDef.Type == labelType.PixelLabel) isValid = true; algObj.SkyName = labelDef.Name; algObj.AllCategories{end+1} = labelDef.Name; elseif(labelDef.Type == labelType.PixelLabel) isValid = true; end end

下一组函数控制算法的执行vision.labeler.AutomationAlgorithm类包含包含类似方法的接口“初始化”'跑'“终止”用于轻松设置和运行自动化初始化功能填充基于应用程序中现有标签的初始算法状态。在里面道路和天空分割班级初始化该函数已被定制,以从加载预训练语义分段网络tempdir并将其保存到PretrainedNetwork财产。

函数初始化(algObj,~,~)
%指向下载pretrainedSegNet的tempdir。pretrainedFolder = fullfile (tempdir pretrainedSegNet);pretrainedSegNet = fullfile (pretrainedFolder segnetVGG16CamVid.mat);data =负载(pretrainedSegNet);将网络存储在这个对象的“PretrainedNetwork”属性中。algObj。PretrainedNetwork = data.net;结束

接下来,运行函数定义了这个自动化类的核心语义分割算法。运行为每个视频帧调用,并期望自动化类返回一组标签。的运行作用于道路和天空分割包含前面介绍的用于创建对应于“道路”和“天空”的像素标签分类矩阵的逻辑。这可以扩展到网络训练的任何类别,仅限于这两个类别用于说明。

function autoLabels = run(algObj, I) %设置类别矩阵,类别包括道路和%天空autoLabels = categorical(zero (size(I,1), size(I,2)),0:2,algObj. allcategories,'Ordinal',true);
pixelCat=semanticseg(I,algObj.PretrainedNetwork);如果~isempty(pixelCat)%autoLabels(pixelCat==“Road”)=algObj.RoadName;autoLabels(pixelCat==“Sky”)=algObj.SkyName;end end

此算法不需要任何清理,因此终止函数是空的。

在应用程序中使用像素分割自动化类

上一节中描述的属性和方法已在道路和天空分割自动化算法类文件。要在应用程序中使用此类,请执行以下操作:

  • 创建文件夹结构+视觉/+贴标机,并将自动化类复制到其中。

mkdir(“+视觉/ +贴标签机”);拷贝文件(“RoadAndSkySegmentation.m”、“+视觉/ +贴标签机”);
  • 打开groundTruthLabeler应用程序与自定义数据标签。为说明起见,请打开caltech_cordova1.avi视频。

groundTruthLabeler caltech_cordova1.avi
  • 在左侧窗格中,单击定义新的ROI标签按钮,并定义两个带有名称的ROI标签天空类型的,像素标签如图所示。

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

  • 点击算法>道路和天空分割.如果没有看到此选项,请确保当前工作文件夹中有一个名为+视觉/+贴标机,文件名为RoadAndSkySegmentation.m在里面。

  • 点击自动化.一个新的面板打开,显示使用算法的方向。

  • 点击运行这个created algorithm executes on each frame of the video, segmenting "Road" and "Sky" categories. After the run is completed, use the slider or arrow keys to scroll through the video and verify the result of the automation algorithm.

  • 很明显,相机视野之外的区域被错误地标记为“天空”,而自我车辆本身的部分被标记为“道路”。这些结果表明,该网络以前没有对这些数据进行过训练。这个工作流程允许对这些结果进行手工更正,因此这是一个迭代的培训和标记过程(有时称为主动学习循环中的人)可用于进一步优化自定义数据集上网络的精度。您可以使用中的笔刷工具手动调整结果标签像素选项卡并添加或删除像素注释。其他工具,如洪水填充和智能多边形也可在标签像素选项卡,并可在适当时使用。

  • 对整个视频的像素标签类别满意后,单击接受

为视频的像素标记的自动化完成。您现在可以继续标记其他感兴趣的对象,保存会话,或导出此标签运行的结果。

结论

这个例子展示了如何使用预先训练的语义分割网络来加速地面真理标签应用程序中的道路和天空像素的标记AutomationAlgorithm接口。

参考

  1. Brostow,Gabriel J.,Jamie Shotton,Julien Fauqueur和Roberto Cipolla.“使用运动点云的结构进行分割和识别。”ECCV. 2008.

  2. 视频中的语义对象类:高清晰度地面真相数据库模式识别的字母. 2008.

另请参阅

应用程序

对象

相关话题