主要内容

自动化基础真理标记语义分割

这个例子展示了如何使用预先训练的语义分割算法来分割图像中的天空和道路,并使用该算法自动标记地面真值地面实况贴标签机(自动驾驶工具箱)应用程序。

地面真相标签应用程序

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

在这个例子中,你会:

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

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

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

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

首先,创建一个语义分割算法,分割图像中的道路和天空像素。的基于深度学习的语义分割实例描述了如何训练一个深度学习网络进行语义分割。这个网络经过训练可以预测11类语义标签,包括“路”和“天”。这些网络的性能取决于它们的泛化程度。将这些网络应用到他们在训练中没有遇到的情况中,可能会导致低于标准的结果。在学习过程中迭代地引入自定义训练数据可以使网络在相似数据集上表现得更好。

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

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

分割图像并显示它。

%加载语义分割网络data =负载(pretrainedSegNet);从驱动数据加载一个测试映像roadSequenceData = fullfile (toolboxdir (“开车”),“drivingdata”“roadSequence”);我= imread (fullfile (roadSequenceData,“f00000.png”));%在映像上运行网络automatedLabels = semanticseg(I, data.net);%显示覆盖在图像上的标签,选择相关类别图中,imshow (labeloverlay (automatedLabels,我“IncludedLabels”, (“天空”“路”]));

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

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

回顾像素分割自动化类

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

属性中的第一组属性RoadAndSkySegmentation类指定算法的名称,提供它的简要描述,并给出使用它的说明。

属性(常数)
%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

下一部分RoadAndSkySegmentation类指定核心算法所需的自定义属性。的PretrainedNetwork属性持有预先训练的网络。的AllCategories属性保存所有类别的名称。

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

checkLabelDefinition中定义的第一个方法RoadAndSkySegmentation,只检查类型的标签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类包含包含类似方法的接口“初始化”“运行”,“终止”便于设置和运行自动化。的初始化函数根据应用程序中已有的标签填充初始算法状态RoadAndSkySegmentation类,初始化函数已被定制为加载预先训练的语义分割网络tempdir保存到PretrainedNetwork财产。

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

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

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);如果~是空的(pixelCat) %添加选定的标签在边界框的位置(s) autoLabels(pixelCat == "Road") = algObj.RoadName;autoLabels(pixelCat == "天空")= algObj.SkyName;结束结束

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

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

上一节中描述的属性和方法已在RoadAndSkySegmentation自动化算法类文件。要在应用程序中使用这个类:

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

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

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

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

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

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

  • 点击运行.创建的算法在视频的每一帧上执行,分割“路”和“天空”类别。运行完成后,使用滑块或方向键滚动视频,并验证自动化算法的结果。

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

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

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

结论

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

参考文献

  1. 布罗斯托,加布里埃尔·J,杰米·肖顿,朱利安·福克尔和罗伯托·希波拉。“利用运动点云的结构进行分割和识别”。大会.2008.

  2. 布罗斯托,加布里埃尔·J,朱利安·福克尔和罗伯托·希波拉。《视频中的语义对象类:高清地面真实数据库》模式识别的字母.2008.