自动化地面真相标记的语义分割

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

地面实况贴标应用

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

在本例中,您将:

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

  • 创建可以在地面真相贴标应用使用自动标示公路和天空像素的自动算法。

然后,该地面实况数据可以被用于训练新语义分割网络,或重新训练的现有之一。

创建道路和天空检测算法

首先,创建一个语义分割算法段道路和天空像素的图像。的语义分割使用Deep学习(计算机视觉工具箱)示例介绍了如何培养深度学习网络语义分割。该网络已经被训练来预测11个班的语义标签,包含“道”和“天空”的。这些网络的性能取决于他们是如何普及应用。运用网络培训期间,他们没有遇到的情况可能会导致欠佳的结果。迭代引入定制的训练数据学习过程可以使网络上的类似数据集更好地履行。

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

pretrainedURL =“//www.tatmou.com/金宝appsupportfiles/vision/data/segnetVGG16CamVid.mat”;pretrainedFolder = fullfile (tempdir,'pretrainedSegNet');pretrainedSegNet = fullfile (pretrainedFolder,“segnetVGG16CamVid.mat”);如果~存在(pretrainedSegNet“文件”)如果~存在(pretrainedFolder“dir”mkdir (pretrainedFolder);结束disp (下载预先训练过的赛格特(107mb)…);websave (pretrainedSegNet pretrainedURL);结束

分割图像并显示它。

%加载语义分割网络data =负载(pretrainedSegNet);%负载从drivingdata测试图像roadSequenceData = fullfile (toolboxdir (“驾驶”“drivingdata”,“roadSequence”);I = imread(完整文件(roadSequenceData,“f00000.png”));%运行的图像上的网络automatedLabels = semanticseg(I,data.net);%显示标签覆盖在图像上,选择相关类别人物,imshow(labeloverlay(I,automatedLabels,“IncludedLabels”,(“天空”,“路”)));

网络的输出在MATLAB被表示为分类矩阵。列出的类别包括所有那些语义分割网络已经培训了,不只是类存在于输出。这些信息也可以从网络对象本身。

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

回顾像素分割自动化类

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

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

属性(常数)
%名称%字符向量指定算法的名称。名称= 'RoadAndSkySegmentation'
%描述%字符向量指定算法的简短描述。描述=“这个算法使用与预训练的网络来注释道路和天空semanticseg”
%UserDirections %字符向量的单元数组,指定%算法用户使用算法时要遵循的方向。UserDirections = {…[‘自动化算法是一种自动手动标记的方法’……的任务。这个自动算法自动创建像素',…道路和天空的标签。'],……['审查和修改:每隔一段时间审查自动标签',…“使用播放控制。修改/删除/添加不属于…的roi。“这个阶段的自动化程度令人满意。 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属性包含预训练网络。的所有类别属性包含这三个类别的名称。

properties % PretrainedNetwork保存进行语义%分段的SeriesNetwork对象。PretrainedNetwork
%分类拥有默认的“背景”,“路”和“天空”%分类类型。AllCategories = { '背景'};
商店名称为“道路”和“天空”。RoadName SkyName结束

checkLabelDefinition,第一种方法中所定义RoadAndSkySegmentation,支票,只有标签类型的PixelLabel支持自动化。PixelLabel是语义分割所需的唯一类型。

函数TF = checkLabelDefinition(~, labelDef) isValid = false;
如果(strcmpi(labelDef.Name, '道路')&& labelDef.Type == labelType.PixelLabel)的isValid = TRUE;algObj.RoadName = labelDef.Name;algObj.AllCategories {端+ 1} = labelDef.Name;ELSEIF(strcmpi(labelDef.Name, '天空')&& labelDef.Type == labelType.PixelLabel)的isValid = TRUE;algObj.SkyName = labelDef.Name;algObj.AllCategories {端+ 1} = labelDef.Name;ELSEIF(labelDef.Type == labelType.PixelLabel)的isValid = TRUE;年底结束

下一组函数控制算法的执行。的vision.labeler.AutomationAlgorithm类包含一个接口,该接口包含以下方法“初始化”,“运行”,“终止”方便地设置和运行自动化。的初始化函数根据应用程序中现有的标签填充初始算法状态RoadAndSkySegmentation类,初始化自定义函数,加载预先训练好的语义分割网络TEMPDIR并把它保存到PretrainedNetwork财产。

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

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

功能autoLabels =运行(algObj,I)%设置分类矩阵与类别包括道路和%天空autoLabels =分类(零(大小(I,1),大小(I,2)),0:2,algObj.AllCategories,”序”,真正的);
pixelCat = semanticseg(I,this.PretrainedNetwork);如果〜的isEmpty(pixelCat)%添加所选择的标签的边界框(多个)位置autoLabels(pixelCat == “路”)= algObj.RoadName;autoLabels(pixelCat == “天空”)= algObj.SkyName;年底结束

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

使用App中的像素分割自动化类

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

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

MKDIR( '+视力/ +贴标');的CopyFile( 'RoadAndSkySegmentation.m', '+视力/ +贴标');
  • 打开groundTruthLabeler应用程序与自定义数据标签。为了便于说明,请打开caltech_cordova1.avi视频。

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

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

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

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

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

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

  • 一旦你对整个视频的像素标签类别感到满意,点击接受

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

结论

这个例子说明了如何使用预训练语义分割网络,以加速使用在地面真相贴标应用的道路和天空像素的标签AutomationAlgorithm接口。

参考文献

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

  2. Brostow, Gabriel J., Julien Fauqueur,和Roberto Cipolla。“视频中的语义对象类:高清地面真实数据库。”模式识别快报。2008.

也可以看看

应用程序

对象

相关的话题