主要内容

自动化地面真理标记为语义分割

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

地面真相标签应用程序

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

在这个例子中,你会:

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

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

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

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

首先,创建一个语义分割算法,分割图像中的道路和天空像素。的基于深度学习的语义分割示例描述如何培训深度学习网络进行语义分割。该网络已被培训,以预测11类语义标签,包括“道路”和“天空”。这些网络的性能取决于它们的概括。将网络应用于他们在培训期间没有遇到的情况可能导致子达结果。将自定义培训数据迭代地引入学习过程可以使网络在类似的数据集上更好地执行。

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

pretrainedURL =“//www.tatmou.com/金宝appsupportfiles/vision/data/segnetVGG16CamVid.mat”;pretrainedFolder = fullfile (tempdir,“pretrainedSegNet”);pretrinedsegnet = fullfile(pretrinedfolder,“segnetVGG16CamVid.mat”);如果~存在(pretrainedSegNet“文件”如果~存在(pretrainedFolder'dir')MKDIR(PretrinedFolder);结束DISP('下载掠夺SEGNET(107 MB)...');Websave(PretRiveSegnet,Pretrowsurl);结束
下载预训练的SegNet (107 MB)…

分割图像并显示它。

%加载语义分段网络DATA = LOAD(PRETROWESEGNET);从驱动数据加载一个测试映像Roadsequenceata = fullfile(toolboxdir(“开车”),'divertdata''逃跑');我= imread (fullfile (roadSequenceData,'f00000.png'));%在映像上运行网络automatedLabels = semanticseg(I, data.net);%显示覆盖在图像上的标签,选择相关类别图中,imshow (labeloverlay (automatedLabels,我'carnessLabels',[“天空”“路”]));

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

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

回顾像素分割自动化类

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

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

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

下一节Roadandskysegation类指定核心算法所需的自定义属性。的PretrainedNetwork属性持有预先训练的网络。的AllCategories属性持有三个类别的名称。

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

核对标准义法中定义的第一个方法Roadandskysegation,只检查类型的标签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类包含包含类似方法的接口'初始化''跑步', 和'终止'便于设置和运行自动化。的初始化功能填充基于应用程序中现有标签的初始算法状态。在里面Roadandskysegation班级,这初始化函数已被定制,以加载预先灌注的语义分段网络tempdir保存到PretrainedNetwork财产。

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

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

function autoLabels = run(algObj, I) %设置类别矩阵,类别包括道路和%天空autoLabels = categorical(zero (size(I,1), size(I,2)),0:2,algObj. allcategories,'Ordinal',true);
pixelCat = semanticseg(I, this.PretrainedNetwork);如果~是空的(pixelCat) %添加选定的标签在边界框的位置(s) autoLabels(pixelCat == "Road") = algObj.RoadName;autoLabels(pixelCat == "天空")= algObj.SkyName;结束结束

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

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

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

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

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

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

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

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

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

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

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

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

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

结论

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

参考

  1. 布鲁斯托,加布里埃尔J.,Jamie Shothon,Julien Fauqueur和Roberto Cipolla。“使用运动点云的结构分割和识别。”ECCV..2008年。

  2. 布鲁斯托,加布里埃尔J.,Julien Fauqueur和Roberto Cipolla。“视频中的语义对象类:高清地面真相数据库。”模式识别的字母.2008年。

另请参阅

应用程序

对象

相关话题