主要内容

用于语义分割的自动Ground Truth标签

这个例子展示了如何使用预先训练的语义分割算法在图像中分割天空和道路,并使用该算法在图像中自动标记地面真相地面真相标签应用程序。

Ground Truth Labeler应用

良好的地面真实数据对于开发自动驾驶算法和评估其性能至关重要。然而,创建和维护一组多样化的、高质量的带注释的驾驶数据需要付出大量的努力。的地面真相标签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 = load(pretrainedSegNet);从驱动数据加载一个测试图像roadSequenceData = fullfile(toolboxdir(“开车”),“drivingdata”“roadSequence”);I = imread(fullfile(roadSequenceData,“f00000.png”));在映像上运行网络automatedLabels = semanticseg(I, data.net);显示覆盖在图像上的标签,选择相关类别图,imshow(标签叠加(I, automatedLabels,“IncludedLabels”, (“天空”“路”)));

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

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

复习像素分割自动化类

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

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

属性(常数)
%Name %指定算法名称的字符向量。名称= 'RoadAndSkySegmentation'
%Description %指定算法简短描述的字符向量。描述= '此算法使用带有预训练网络的semanticseg来注释道路和天空'
%UserDirections字符向量的单元格数组,为%算法用户指定使用算法时遵循的方向。UserDirections ={…['自动化算法是一种自动手动标记的方法'…的任务。这个AutomationAlgorithm自动创建像素',…道路和天空的标签。'],……['审查和修改:在间隔内审查自动标签',…使用回放控制。修改/删除/添加不是“…”在这个阶段令人满意地自动化。 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包含默认的'background'、'road'和'sky' %分类类型。AllCategories = {'background'};
'路'和'天空'的店名。RoadName SkyName结束

checkLabelDefinition中定义的第一个方法RoadAndSkySegmentation,只检查类型的标签PixelLabel为自动化启用。PixelLabel是语义分割所需的唯一类型。

函数TF = checkLabelDefinition(~, labelDef) isValid = false;
如果(strcmpi (labelDef。名称,'road') && labelDef。类型== 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财产。

初始化(algObj, ~, ~)
指向下载预训练segnet的tempdir。pretrainedFolder = fullfile(tempdir,'pretrainedSegNet');pretrainedSegNet = fullfile(pretrainedFolder,' segnetvgg16camid .mat');data = load(pretrainedSegNet);将网络存储在该对象的PretrainedNetwork属性中。algObj。PretrainedNetwork = data.net;结束

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

autoLabels = categorical(零(大小(I,1),大小(I,2)),0:2,algObj. allcategories,'Ordinal',true);
pixelCat = semanticseg(I, algObj.PretrainedNetwork);if ~isempty(pixelCat) %在边界框位置添加所选标签(s) autoLabels(pixelCat == "Road") = algObj.RoadName;autoLabels(pixelCat == "Sky") = algObj.SkyName;结束结束

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

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

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

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

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

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

  • 点击Algorithm >选择“Algorithm >刷新列表”

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

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

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

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

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

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

结论

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

参考文献

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

  2. Brostow, Gabriel J., Julien Fauqueur和Roberto Cipolla。视频中的语义对象类:一个高清地面真相数据库。模式识别信.2008.

另请参阅

应用程序

对象

相关的话题